diff --git a/Makefile b/Makefile index 4f9f207fe66..6bb1ca57f48 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ generate-test-certs: # Run Controller tests against the configured cluster .PHONY: test-integration-controllers test-integration-controllers: generate fmt vet manifests - TEST_RESOURCE_PREFIX=$(TEST_RESOURCE_PREFIX) TEST_USE_EXISTING_CLUSTER=true REQUEUE_AFTER=20 \ + TEST_RESOURCE_PREFIX=$(TEST_RESOURCE_PREFIX) TEST_USE_EXISTING_CLUSTER=false REQUEUE_AFTER=20 \ go test -v -tags "$(BUILD_TAGS)" -coverprofile=reports/integration-controllers-coverage-output.txt -coverpkg=./... -covermode count -parallel 4 -timeout 45m \ ./controllers/... #2>&1 | tee reports/integration-controllers-output.txt @@ -242,11 +242,11 @@ generate-template: # TODO: These kind-delete / kind-create targets were stolen from k8s-infra and # TODO: should be merged back together when the projects more closely align .PHONY: kind-delete -kind-delete: install-kind +kind-delete: install-test-dependencies kind delete cluster --name=$(KIND_CLUSTER_NAME) || true .PHONY: kind-create -kind-create: install-kind +kind-create: install-test-dependencies kind get clusters | grep -E $(KIND_CLUSTER_NAME) > /dev/null;\ EXISTS=$$?;\ if [ $$EXISTS -eq 0 ]; then \ @@ -256,12 +256,12 @@ kind-create: install-kind fi; \ .PHONY: set-kindcluster -set-kindcluster: install-kind kind-create -ifeq (${shell kind get kubeconfig-path --name="kind"},${KUBECONFIG}) +set-kindcluster: kind-create +ifeq (${shell kind get kubeconfig-path --name=$(KIND_CLUSTER_NAME)},${KUBECONFIG}) @echo "kubeconfig-path points to kind path" else @echo "please run below command in your shell and then re-run make set-kindcluster" - @echo "\e[31mexport KUBECONFIG=$(shell kind get kubeconfig-path --name="kind")\e[0m" + @echo "\e[31mexport KUBECONFIG=$(shell kind get kubeconfig-path --name="$(KIND_CLUSTER_NAME)")\e[0m" @exit 111 endif @echo "getting value of KUBECONFIG" @@ -282,7 +282,7 @@ endif #create image and load it into cluster make install IMG="docker.io/controllertest:1" make docker-build - kind load docker-image docker.io/controllertest:1 --loglevel "trace" + kind load docker-image docker.io/controllertest:1 --loglevel "trace" --name=$(KIND_CLUSTER_NAME) kubectl get namespaces kubectl get pods --namespace cert-manager @@ -292,48 +292,25 @@ endif make deploy sed -i'' -e 's@image: .*@image: '"IMAGE_URL"'@' ./config/default/manager_image_patch.yaml -.PHONY: install-kind -install-kind: -ifeq (,$(shell which kind)) - @echo "installing kind" - GO111MODULE="on" go get sigs.k8s.io/kind@v0.8.1 -else - @echo "kind has been installed" -endif - .PHONY: install-kubebuilder install-kubebuilder: ifeq (,$(shell which kubebuilder)) @echo "installing kubebuilder" # download kubebuilder and extract it to tmp - curl -sL https://go.kubebuilder.io/dl/2.0.0/$(shell go env GOOS)/$(shell go env GOARCH) | tar -xz -C $(TMPDIR) + curl -sL https://go.kubebuilder.io/dl/2.3.1/$(shell go env GOOS)/$(shell go env GOARCH) | tar -xz -C $(TMPDIR) # move to a long-term location and put it on your path # (you'll need to set the KUBEBUILDER_ASSETS env var if you put it somewhere else) - mv $(TMPDIR)/kubebuilder_2.0.0_$(shell go env GOOS)_$(shell go env GOARCH) /usr/local/kubebuilder - export PATH=$$PATH:/usr/local/kubebuilder/bin + mv $(TMPDIR)/kubebuilder_2.3.1_$(shell go env GOOS)_$(shell go env GOARCH) $(shell go env GOPATH)/kubebuilder + export PATH=$$PATH:$(shell go env GOPATH)/kubebuilder/bin else @echo "kubebuilder has been installed" endif -.PHONY: install-kustomize -install-kustomize: -ifeq (,$(shell which kustomize)) - @echo "installing kustomize" - mkdir -p /usr/local/kubebuilder/bin - # download kustomize - curl -o /usr/local/kubebuilder/bin/kustomize -sL "https://go.kubebuilder.io/kustomize/$(shell go env GOOS)/$(shell go env GOARCH)" - # set permission - chmod a+x /usr/local/kubebuilder/bin/kustomize - $(shell which kustomize) -else - @echo "kustomize has been installed" -endif - .PHONY: install-cert-manager install-cert-manager: kubectl create namespace cert-manager kubectl label namespace cert-manager cert-manager.io/disable-validation=true - kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.12.0/cert-manager.yaml + kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager.yaml .PHONY: install-aad-pod-identity install-aad-pod-identity: @@ -344,7 +321,11 @@ install-test-dependencies: go get github.com/jstemmer/go-junit-report \ && go get github.com/axw/gocov/gocov \ && go get github.com/AlekSi/gocov-xml \ - && go get github.com/wadey/gocovmerge + && go get github.com/wadey/gocovmerge \ + && go get k8s.io/code-generator/cmd/conversion-gen@v0.18.2 \ + && go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.4.0 \ + && go get sigs.k8s.io/kind@v0.9.0 \ + && go get sigs.k8s.io/kustomize/kustomize/v3@v3.8.6 # Operator-sdk release version RELEASE_VERSION ?= v1.0.1 diff --git a/api/v1alpha1/apimgmt_types.go b/api/v1alpha1/apimgmt_types.go index c2a7820b422..d8830c0f8b2 100644 --- a/api/v1alpha1/apimgmt_types.go +++ b/api/v1alpha1/apimgmt_types.go @@ -11,7 +11,7 @@ import ( type APIMgmtSpec struct { Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` APIService string `json:"apiService"` diff --git a/api/v1alpha1/appinsights_types.go b/api/v1alpha1/appinsights_types.go index 0da8e532f32..c7561681487 100644 --- a/api/v1alpha1/appinsights_types.go +++ b/api/v1alpha1/appinsights_types.go @@ -16,7 +16,7 @@ type AppInsightsSpec struct { Location string `json:"location"` ApplicationType string `json:"applicationType"` // Possible values include 'web' or 'other' // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` KeyVaultToStoreSecrets string `json:"keyVaultToStoreSecrets,omitempty"` diff --git a/api/v1alpha1/azureloadbalancer_types.go b/api/v1alpha1/azureloadbalancer_types.go index f6f4c53b954..b95f0b1881a 100644 --- a/api/v1alpha1/azureloadbalancer_types.go +++ b/api/v1alpha1/azureloadbalancer_types.go @@ -16,7 +16,7 @@ type AzureLoadBalancerSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` PublicIPAddressName string `json:"publicIPAddressName"` diff --git a/api/v1alpha1/azurenetworkinterface_types.go b/api/v1alpha1/azurenetworkinterface_types.go index e30d41d157c..4933a99727e 100644 --- a/api/v1alpha1/azurenetworkinterface_types.go +++ b/api/v1alpha1/azurenetworkinterface_types.go @@ -16,7 +16,7 @@ type AzureNetworkInterfaceSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` VNetName string `json:"vnetName"` diff --git a/api/v1alpha1/azurepublicipaddress_types.go b/api/v1alpha1/azurepublicipaddress_types.go index 2fb36da89af..83ce0feebb7 100644 --- a/api/v1alpha1/azurepublicipaddress_types.go +++ b/api/v1alpha1/azurepublicipaddress_types.go @@ -17,7 +17,7 @@ type AzurePublicIPAddressSpec struct { Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` PublicIPAllocationMethod string `json:"publicIPAllocationMethod"` diff --git a/api/v1alpha1/azuresqlaction_types.go b/api/v1alpha1/azuresqlaction_types.go index 5c4e64a77c9..fdacd1e525b 100644 --- a/api/v1alpha1/azuresqlaction_types.go +++ b/api/v1alpha1/azuresqlaction_types.go @@ -15,7 +15,7 @@ type AzureSqlActionSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` ActionName string `json:"actionName"` diff --git a/api/v1alpha1/azuresqldatabase_types.go b/api/v1alpha1/azuresqldatabase_types.go index bcc4a2cbfb6..888f51aa777 100644 --- a/api/v1alpha1/azuresqldatabase_types.go +++ b/api/v1alpha1/azuresqldatabase_types.go @@ -16,7 +16,7 @@ type AzureSqlDatabaseSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourcegroup"` Server string `json:"server"` diff --git a/api/v1alpha1/azuresqlfailovergroup_types.go b/api/v1alpha1/azuresqlfailovergroup_types.go index 3dd074f4662..107b2835b07 100644 --- a/api/v1alpha1/azuresqlfailovergroup_types.go +++ b/api/v1alpha1/azuresqlfailovergroup_types.go @@ -14,7 +14,7 @@ type AzureSqlFailoverGroupSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourcegroup"` Server string `json:"server"` diff --git a/api/v1alpha1/azuresqlfirewallrule_types.go b/api/v1alpha1/azuresqlfirewallrule_types.go index ab26c22056e..f5bf424ba32 100644 --- a/api/v1alpha1/azuresqlfirewallrule_types.go +++ b/api/v1alpha1/azuresqlfirewallrule_types.go @@ -16,7 +16,7 @@ type AzureSqlFirewallRuleSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourcegroup"` Server string `json:"server"` diff --git a/api/v1alpha1/azuresqlmanageduser_types.go b/api/v1alpha1/azuresqlmanageduser_types.go index 2269eade470..8f981fe6aef 100644 --- a/api/v1alpha1/azuresqlmanageduser_types.go +++ b/api/v1alpha1/azuresqlmanageduser_types.go @@ -14,17 +14,27 @@ import ( type AzureSQLManagedUserSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file + + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required Server string `json:"server"` + + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required DbName string `json:"dbName"` + // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required + ResourceGroup string `json:"resourceGroup"` + // +kubebuilder:validation:Required - ResourceGroup string `json:"resourceGroup"` - Roles []string `json:"roles"` - ManagedIdentityName string `json:"managedIdentityName,omitempty"` - ManagedIdentityClientId string `json:"managedIdentityClientId"` - KeyVaultSecretPrefix string `json:"keyVaultSecretPrefix,omitempty"` - KeyVaultToStoreSecrets string `json:"keyVaultToStoreSecrets,omitempty"` + Roles []string `json:"roles"` + + ManagedIdentityName string `json:"managedIdentityName,omitempty"` + ManagedIdentityClientId string `json:"managedIdentityClientId"` + KeyVaultSecretPrefix string `json:"keyVaultSecretPrefix,omitempty"` + KeyVaultToStoreSecrets string `json:"keyVaultToStoreSecrets,omitempty"` } // +kubebuilder:object:root=true diff --git a/api/v1alpha1/azuresqlmanageduser_webhook.go b/api/v1alpha1/azuresqlmanageduser_webhook.go new file mode 100644 index 00000000000..03ddadfa375 --- /dev/null +++ b/api/v1alpha1/azuresqlmanageduser_webhook.go @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/runtime" + ctrl "sigs.k8s.io/controller-runtime" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/webhook" +) + +// log is for logging in this package. +var azuresqlmanageduserlog = logf.Log.WithName("azuresqlmanageduser-resource") + +func (r *AzureSQLManagedUser) SetupWebhookWithManager(mgr ctrl.Manager) error { + return ctrl.NewWebhookManagedBy(mgr). + For(r). + Complete() +} + +// +kubebuilder:webhook:verbs=create;update,path=/validate-azure-microsoft-com-v1alpha1-azuresqlmanageduser,mutating=false,failurePolicy=fail,groups=azure.microsoft.com,resources=azuresqlmanagedusers,versions=v1alpha1,name=vazuresqlmanageduser.kb.io + +var _ webhook.Validator = &AzureSQLManagedUser{} + +// ValidateCreate implements webhook.Validator so a webhook will be registered for the type +func (r *AzureSQLManagedUser) ValidateCreate() error { + azuresqlmanageduserlog.Info("validate create", "name", r.Name) + + return ValidateAzureSQLDBName(r.Spec.DbName) +} + +// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type +func (r *AzureSQLManagedUser) ValidateUpdate(old runtime.Object) error { + azuresqlmanageduserlog.Info("validate update", "name", r.Name) + + return ValidateAzureSQLDBName(r.Spec.DbName) +} + +// ValidateDelete implements webhook.Validator so a webhook will be registered for the type +func (r *AzureSQLManagedUser) ValidateDelete() error { + azuresqlmanageduserlog.Info("validate delete", "name", r.Name) + + // TODO(user): fill in your validation logic upon object deletion. + return nil +} diff --git a/api/v1alpha1/azuresqlserver_types.go b/api/v1alpha1/azuresqlserver_types.go index 00c4a35cb29..1c4ea433de8 100644 --- a/api/v1alpha1/azuresqlserver_types.go +++ b/api/v1alpha1/azuresqlserver_types.go @@ -17,7 +17,7 @@ type AzureSqlServerSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourcegroup"` KeyVaultToStoreSecrets string `json:"keyVaultToStoreSecrets,omitempty"` diff --git a/api/v1alpha1/azuresqluser_types.go b/api/v1alpha1/azuresqluser_types.go index 630d8a103d1..26c369d0e59 100644 --- a/api/v1alpha1/azuresqluser_types.go +++ b/api/v1alpha1/azuresqluser_types.go @@ -14,13 +14,23 @@ import ( type AzureSQLUserSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file + + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required Server string `json:"server"` + + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required DbName string `json:"dbName"` + // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required + ResourceGroup string `json:"resourceGroup"` + // +kubebuilder:validation:Required - ResourceGroup string `json:"resourceGroup"` - Roles []string `json:"roles"` + Roles []string `json:"roles"` + // optional AdminSecret string `json:"adminSecret,omitempty"` AdminSecretKeyVault string `json:"adminSecretKeyVault,omitempty"` diff --git a/api/v1alpha1/azuresqluser_webhook.go b/api/v1alpha1/azuresqluser_webhook.go new file mode 100644 index 00000000000..6f1fabd808a --- /dev/null +++ b/api/v1alpha1/azuresqluser_webhook.go @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +package v1alpha1 + +import ( + "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/runtime" + ctrl "sigs.k8s.io/controller-runtime" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/webhook" +) + +// log is for logging in this package. +var azuresqluserlog = logf.Log.WithName("azuresqluser-resource") + +func (r *AzureSQLUser) SetupWebhookWithManager(mgr ctrl.Manager) error { + return ctrl.NewWebhookManagedBy(mgr). + For(r). + Complete() +} + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! + +// +kubebuilder:webhook:verbs=create;update,path=/validate-azure-microsoft-com-v1alpha1-azuresqluser,mutating=false,failurePolicy=fail,groups=azure.microsoft.com,resources=azuresqlusers,versions=v1alpha1,name=vazuresqluser.kb.io + +func ValidateAzureSQLDBName(name string) error { + if name == "master" { + return errors.Errorf("'master' is a reserved database name and cannot be used") + } + + return nil +} + +var _ webhook.Validator = &AzureSQLUser{} + +// ValidateCreate implements webhook.Validator so a webhook will be registered for the type +func (r *AzureSQLUser) ValidateCreate() error { + azuresqluserlog.Info("validate create", "name", r.Name) + + return ValidateAzureSQLDBName(r.Spec.DbName) +} + +// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type +func (r *AzureSQLUser) ValidateUpdate(old runtime.Object) error { + azuresqluserlog.Info("validate update", "name", r.Name) + + return ValidateAzureSQLDBName(r.Spec.DbName) +} + +// ValidateDelete implements webhook.Validator so a webhook will be registered for the type +func (r *AzureSQLUser) ValidateDelete() error { + azuresqluserlog.Info("validate delete", "name", r.Name) + return nil +} diff --git a/api/v1alpha1/azuresqlvnetrule_types.go b/api/v1alpha1/azuresqlvnetrule_types.go index 24dc6b7bbe5..9ac0c29eb52 100644 --- a/api/v1alpha1/azuresqlvnetrule_types.go +++ b/api/v1alpha1/azuresqlvnetrule_types.go @@ -13,9 +13,11 @@ type AzureSQLVNetRuleSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required + ResourceGroup string `json:"resourceGroup"` + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required - ResourceGroup string `json:"resourceGroup"` Server string `json:"server"` VNetResourceGroup string `json:"vNetResourceGroup"` VNetName string `json:"vNetName"` diff --git a/api/v1alpha1/azurevirtualmachine_types.go b/api/v1alpha1/azurevirtualmachine_types.go index 83079f1c3f1..be8aa55d466 100644 --- a/api/v1alpha1/azurevirtualmachine_types.go +++ b/api/v1alpha1/azurevirtualmachine_types.go @@ -16,7 +16,7 @@ type AzureVirtualMachineSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` VMSize string `json:"vmSize"` diff --git a/api/v1alpha1/azurevirtualmachineextension_types.go b/api/v1alpha1/azurevirtualmachineextension_types.go index ca5428a885f..7a764ff68de 100644 --- a/api/v1alpha1/azurevirtualmachineextension_types.go +++ b/api/v1alpha1/azurevirtualmachineextension_types.go @@ -16,7 +16,7 @@ type AzureVirtualMachineExtensionSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` VMName string `json:"vmName"` diff --git a/api/v1alpha1/azurevmscaleset_types.go b/api/v1alpha1/azurevmscaleset_types.go index a989f5675e4..b432d4a861f 100644 --- a/api/v1alpha1/azurevmscaleset_types.go +++ b/api/v1alpha1/azurevmscaleset_types.go @@ -16,7 +16,7 @@ type AzureVMScaleSetSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` VMSize string `json:"vmSize"` diff --git a/api/v1alpha1/blobcontainer_types.go b/api/v1alpha1/blobcontainer_types.go index 01ab9e6e3d0..7c0fa9bafa1 100644 --- a/api/v1alpha1/blobcontainer_types.go +++ b/api/v1alpha1/blobcontainer_types.go @@ -18,7 +18,7 @@ type BlobContainerSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourcegroup"` AccountName string `json:"accountname,omitempty"` diff --git a/api/v1alpha1/consumergroup_types.go b/api/v1alpha1/consumergroup_types.go index 164b1eae8cc..b4c067e8742 100644 --- a/api/v1alpha1/consumergroup_types.go +++ b/api/v1alpha1/consumergroup_types.go @@ -16,7 +16,7 @@ type ConsumerGroupSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Namespace string `json:"namespace,omitempty"` diff --git a/api/v1alpha1/cosmosdb_types.go b/api/v1alpha1/cosmosdb_types.go index 4a80e3a41ac..6aa0d23f8ee 100644 --- a/api/v1alpha1/cosmosdb_types.go +++ b/api/v1alpha1/cosmosdb_types.go @@ -19,7 +19,7 @@ type CosmosDBSpec struct { Location string `json:"location,omitempty"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Kind CosmosDBKind `json:"kind,omitempty"` diff --git a/api/v1alpha1/eventhub_types.go b/api/v1alpha1/eventhub_types.go index 75da43db8ee..9211560ff1a 100644 --- a/api/v1alpha1/eventhub_types.go +++ b/api/v1alpha1/eventhub_types.go @@ -19,7 +19,7 @@ type EventhubSpec struct { Namespace string `json:"namespace,omitempty"` Properties EventhubProperties `json:"properties,omitempty"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` AuthorizationRule EventhubAuthorizationRule `json:"authorizationRule,omitempty"` @@ -40,7 +40,7 @@ type EventhubAuthorizationRule struct { type EventHubStorageAccount struct { // ResourceGroup - Name of the storage account resource group // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 ResourceGroup string `json:"resourceGroup,omitempty"` // AccountName - Name of the storage account // +kubebuilder:validation:MaxLength=24 diff --git a/api/v1alpha1/eventhubnamespace_types.go b/api/v1alpha1/eventhubnamespace_types.go index c87a9bd2586..6fe4515aa00 100644 --- a/api/v1alpha1/eventhubnamespace_types.go +++ b/api/v1alpha1/eventhubnamespace_types.go @@ -19,7 +19,7 @@ type EventhubNamespaceSpec struct { Sku EventhubNamespaceSku `json:"sku,omitempty"` Properties EventhubNamespaceProperties `json:"properties,omitempty"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` NetworkRule *EventhubNamespaceNetworkRule `json:"networkRule,omitempty"` diff --git a/api/v1alpha1/keyvault_types.go b/api/v1alpha1/keyvault_types.go index 81a997f1535..f7d876c006b 100644 --- a/api/v1alpha1/keyvault_types.go +++ b/api/v1alpha1/keyvault_types.go @@ -11,7 +11,7 @@ import ( type KeyVaultSpec struct { Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` EnableSoftDelete bool `json:"enableSoftDelete,omitempty"` diff --git a/api/v1alpha1/keyvaultkey_types.go b/api/v1alpha1/keyvaultkey_types.go index b916ed04895..b6d9aa87f15 100644 --- a/api/v1alpha1/keyvaultkey_types.go +++ b/api/v1alpha1/keyvaultkey_types.go @@ -17,7 +17,7 @@ type KeyVaultKeySpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` KeyVault string `json:"keyVault,omitempty"` diff --git a/api/v1alpha1/mysqlaaduser_types.go b/api/v1alpha1/mysqlaaduser_types.go index 2461918044e..38080e0a06c 100644 --- a/api/v1alpha1/mysqlaaduser_types.go +++ b/api/v1alpha1/mysqlaaduser_types.go @@ -11,28 +11,28 @@ import ( // MySQLAADUserSpec defines the desired state of MySQLAADUser type MySQLAADUserSpec struct { - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required Server string `json:"server"` - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required DBName string `json:"dbName"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` // The roles assigned to the user. A user must have at least one role. - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinItems=1 // +kubebuilder:validation:Required Roles []string `json:"roles"` // AAD ID is the ID of the user in Azure Active Directory. // When creating a user for a managed identity this must be the client id (sometimes called app id) of the managed identity. // When creating a user for a "normal" (non-managed identity) user or group, this is the OID of the user or group. - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required AADID string `json:"aadId,omitempty"` diff --git a/api/v1alpha1/mysqldatabase_types.go b/api/v1alpha1/mysqldatabase_types.go index 67d0198e081..ecc6a605b5a 100644 --- a/api/v1alpha1/mysqldatabase_types.go +++ b/api/v1alpha1/mysqldatabase_types.go @@ -13,7 +13,7 @@ import ( // MySQLDatabaseSpec defines the desired state of MySQLDatabase type MySQLDatabaseSpec struct { // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Server string `json:"server,omitempty"` diff --git a/api/v1alpha1/mysqlfirewallrule_types.go b/api/v1alpha1/mysqlfirewallrule_types.go index da0c8fd0a76..31e7490612a 100644 --- a/api/v1alpha1/mysqlfirewallrule_types.go +++ b/api/v1alpha1/mysqlfirewallrule_types.go @@ -13,7 +13,7 @@ import ( // MySQLFirewallRuleSpec defines the desired state of MySQLFirewallRule type MySQLFirewallRuleSpec struct { // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Server string `json:"server"` diff --git a/api/v1alpha1/mysqlserver_types.go b/api/v1alpha1/mysqlserver_types.go index 56eff221a36..a5d3fbc3441 100644 --- a/api/v1alpha1/mysqlserver_types.go +++ b/api/v1alpha1/mysqlserver_types.go @@ -14,7 +14,7 @@ import ( type MySQLServerSpec struct { Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Sku AzureDBsSQLSku `json:"sku,omitempty"` diff --git a/api/v1alpha1/mysqlserveradministrator_types.go b/api/v1alpha1/mysqlserveradministrator_types.go index c02406a86ed..bb53ada5743 100644 --- a/api/v1alpha1/mysqlserveradministrator_types.go +++ b/api/v1alpha1/mysqlserveradministrator_types.go @@ -33,7 +33,7 @@ type MySQLServerAdministratorList struct { type MySQLServerAdministratorSpec struct { // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` diff --git a/api/v1alpha1/mysqluser_types.go b/api/v1alpha1/mysqluser_types.go index 4b7c62effa7..c264fc8ae82 100644 --- a/api/v1alpha1/mysqluser_types.go +++ b/api/v1alpha1/mysqluser_types.go @@ -17,7 +17,7 @@ type MySQLUserSpec struct { Server string `json:"server"` DbName string `json:"dbName"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Roles []string `json:"roles"` diff --git a/api/v1alpha1/mysqlvnetrule_types.go b/api/v1alpha1/mysqlvnetrule_types.go index abef812353b..ce90febf205 100644 --- a/api/v1alpha1/mysqlvnetrule_types.go +++ b/api/v1alpha1/mysqlvnetrule_types.go @@ -15,7 +15,7 @@ type MySQLVNetRuleSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Server string `json:"server"` diff --git a/api/v1alpha1/postgresqldatabase_types.go b/api/v1alpha1/postgresqldatabase_types.go index dabe5f298e9..f6940d6edc7 100644 --- a/api/v1alpha1/postgresqldatabase_types.go +++ b/api/v1alpha1/postgresqldatabase_types.go @@ -15,7 +15,7 @@ type PostgreSQLDatabaseSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Server string `json:"server"` diff --git a/api/v1alpha1/postgresqlfirewallrule_types.go b/api/v1alpha1/postgresqlfirewallrule_types.go index c45ab5663e0..30c0550ae3f 100644 --- a/api/v1alpha1/postgresqlfirewallrule_types.go +++ b/api/v1alpha1/postgresqlfirewallrule_types.go @@ -15,7 +15,7 @@ type PostgreSQLFirewallRuleSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Server string `json:"server"` diff --git a/api/v1alpha1/postgresqlserver_types.go b/api/v1alpha1/postgresqlserver_types.go index 80b1d4a0f4d..f32b80d6148 100644 --- a/api/v1alpha1/postgresqlserver_types.go +++ b/api/v1alpha1/postgresqlserver_types.go @@ -14,7 +14,7 @@ import ( type PostgreSQLServerSpec struct { Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Sku AzureDBsSQLSku `json:"sku,omitempty"` diff --git a/api/v1alpha1/postgresqluser_types.go b/api/v1alpha1/postgresqluser_types.go index e3ee234c437..4a9479aab21 100644 --- a/api/v1alpha1/postgresqluser_types.go +++ b/api/v1alpha1/postgresqluser_types.go @@ -17,7 +17,7 @@ type PostgreSQLUserSpec struct { Server string `json:"server"` DbName string `json:"dbName"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Roles []string `json:"roles"` diff --git a/api/v1alpha1/postgresqlvnetrule_types.go b/api/v1alpha1/postgresqlvnetrule_types.go index f246cd7a55d..03a617c349a 100644 --- a/api/v1alpha1/postgresqlvnetrule_types.go +++ b/api/v1alpha1/postgresqlvnetrule_types.go @@ -15,7 +15,7 @@ type PostgreSQLVNetRuleSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Server string `json:"server"` diff --git a/api/v1alpha1/rediscache_types.go b/api/v1alpha1/rediscache_types.go index 79b1ccf4021..8d696fd44da 100644 --- a/api/v1alpha1/rediscache_types.go +++ b/api/v1alpha1/rediscache_types.go @@ -19,8 +19,9 @@ type RedisCacheSpec struct { Location string `json:"location,omitempty"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required + ResourceGroupName string `json:"resourceGroup"` Properties RedisCacheProperties `json:"properties,omitempty"` SecretName string `json:"secretName,omitempty"` diff --git a/api/v1alpha1/rediscacheaction_types.go b/api/v1alpha1/rediscacheaction_types.go index eec206f588f..e2361060a20 100644 --- a/api/v1alpha1/rediscacheaction_types.go +++ b/api/v1alpha1/rediscacheaction_types.go @@ -22,7 +22,7 @@ const ( // RedisCacheActionSpec defines the desired state of RedisCacheAction type RedisCacheActionSpec struct { // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` CacheName string `json:"cacheName"` diff --git a/api/v1alpha1/rediscachefirewallrule_types.go b/api/v1alpha1/rediscachefirewallrule_types.go index a405a7b7afa..f13508c320b 100644 --- a/api/v1alpha1/rediscachefirewallrule_types.go +++ b/api/v1alpha1/rediscachefirewallrule_types.go @@ -16,7 +16,7 @@ type RedisCacheFirewallRuleSpec struct { // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` CacheName string `json:"redisCache"` diff --git a/api/v1alpha1/storageaccount_types.go b/api/v1alpha1/storageaccount_types.go index 484a278049b..2eb8e366ffe 100644 --- a/api/v1alpha1/storageaccount_types.go +++ b/api/v1alpha1/storageaccount_types.go @@ -19,7 +19,7 @@ type StorageAccountSpec struct { Location string `json:"location,omitempty"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` diff --git a/api/v1alpha1/virtualnetwork_types.go b/api/v1alpha1/virtualnetwork_types.go index 532a1b5c476..eb526b90b47 100644 --- a/api/v1alpha1/virtualnetwork_types.go +++ b/api/v1alpha1/virtualnetwork_types.go @@ -25,7 +25,7 @@ type VirtualNetworkSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` AddressSpace string `json:"addressSpace"` diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 3517dd89fdd..80d768d45a3 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -9,7 +9,7 @@ package v1alpha1 import ( "github.com/Azure/azure-sdk-for-go/services/keyvault/v7.0/keyvault" - runtime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. diff --git a/api/v1alpha2/blobcontainer_types.go b/api/v1alpha2/blobcontainer_types.go index 884b47e84fa..d1873b19785 100644 --- a/api/v1alpha2/blobcontainer_types.go +++ b/api/v1alpha2/blobcontainer_types.go @@ -18,7 +18,7 @@ type BlobContainerSpec struct { // Important: Run "make" to regenerate code after modifying this file Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` AccountName string `json:"accountName,omitempty"` diff --git a/api/v1alpha2/mysqlserver_types.go b/api/v1alpha2/mysqlserver_types.go index 32f4f9b14d5..681d9cfe838 100644 --- a/api/v1alpha2/mysqlserver_types.go +++ b/api/v1alpha2/mysqlserver_types.go @@ -15,7 +15,7 @@ import ( type MySQLServerSpec struct { Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Sku AzureDBsSQLSku `json:"sku,omitempty"` diff --git a/api/v1alpha2/postgresqlserver_types.go b/api/v1alpha2/postgresqlserver_types.go index e3dba051f17..2fdd65e8128 100644 --- a/api/v1alpha2/postgresqlserver_types.go +++ b/api/v1alpha2/postgresqlserver_types.go @@ -14,7 +14,7 @@ import ( type PostgreSQLServerSpec struct { Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` Sku AzureDBsSQLSku `json:"sku,omitempty"` diff --git a/api/v1beta1/azuresqldatabase_types.go b/api/v1beta1/azuresqldatabase_types.go index aa39f831762..aba5bdd0088 100644 --- a/api/v1beta1/azuresqldatabase_types.go +++ b/api/v1beta1/azuresqldatabase_types.go @@ -27,7 +27,7 @@ const ( type SqlDatabaseSku struct { // Name - The name of the SKU, typically, a letter + Number code, e.g. P3. // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 Name string `json:"name"` // optional // Tier - The tier or edition of the particular SKU, e.g. Basic, Premium. @@ -44,12 +44,19 @@ type SqlDatabaseSku struct { type AzureSqlDatabaseSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file + + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required Location string `json:"location"` + // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` - Server string `json:"server"` + + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required + Server string `json:"server"` // +kubebuilder:validation:Optional Edition DBEdition `json:"edition"` // TODO: Remove this in v1beta2 diff --git a/api/v1beta1/azuresqlfailovergroup_types.go b/api/v1beta1/azuresqlfailovergroup_types.go index 228ef3f26d0..6a5210ecad8 100644 --- a/api/v1beta1/azuresqlfailovergroup_types.go +++ b/api/v1beta1/azuresqlfailovergroup_types.go @@ -13,11 +13,15 @@ type ReadWriteEndpointFailoverPolicy string // AzureSqlFailoverGroupSpec defines the desired state of AzureSqlFailoverGroup type AzureSqlFailoverGroupSpec struct { // Important: Run "make" to regenerate code after modifying this file + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required + ResourceGroup string `json:"resourceGroup"` + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required - ResourceGroup string `json:"resourceGroup"` Server string `json:"server"` FailoverPolicy ReadWriteEndpointFailoverPolicy `json:"failoverPolicy"` FailoverGracePeriod int32 `json:"failoverGracePeriod"` diff --git a/api/v1beta1/azuresqlfirewallrule_types.go b/api/v1beta1/azuresqlfirewallrule_types.go index 317526eeed7..ac4fc83c313 100644 --- a/api/v1beta1/azuresqlfirewallrule_types.go +++ b/api/v1beta1/azuresqlfirewallrule_types.go @@ -16,9 +16,11 @@ type AzureSqlFirewallRuleSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required + ResourceGroup string `json:"resourceGroup"` + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required - ResourceGroup string `json:"resourceGroup"` Server string `json:"server"` StartIPAddress string `json:"startIpAddress,omitempty"` EndIPAddress string `json:"endIpAddress,omitempty"` diff --git a/api/v1beta1/azuresqlserver_types.go b/api/v1beta1/azuresqlserver_types.go index 2714c229e75..3396197e023 100644 --- a/api/v1beta1/azuresqlserver_types.go +++ b/api/v1beta1/azuresqlserver_types.go @@ -15,9 +15,11 @@ import ( type AzureSqlServerSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Required Location string `json:"location"` // +kubebuilder:validation:Pattern=^[-\w\._\(\)]+$ - // +kubebuilder:validation:MinLength:1 + // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:Required ResourceGroup string `json:"resourceGroup"` KeyVaultToStoreSecrets string `json:"keyVaultToStoreSecrets,omitempty"` diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 16a63bc1aab..c0bce33425e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -88,43 +88,29 @@ steps: - task: Bash@3 displayName: Install kubebuilder, kustomize and test dependencies condition: eq(variables['check_changes.SOURCE_CODE_CHANGED'], 'true') + continueOnError: 'false' inputs: targetType: 'inline' script: | - set -x + set -x -e mkdir -p $(System.DefaultWorkingDirectory)/bin go env os=$(go env GOOS) arch=$(go env GOARCH) - curl -sL https://go.kubebuilder.io/dl/2.3.1/${os}/${arch} | tar -xz -C $(go env GOPATH)/bin - export PATH=$PATH:$(go env path)/bin - echo '##vso[task.prependpath]$(go env path)/bin' - # download kustomize - curl -o $(System.DefaultWorkingDirectory)/bin/kustomize -sL https://go.kubebuilder.io/kustomize/${os}/${arch} - # set permission - chmod a+x $(System.DefaultWorkingDirectory)/bin/* - chmod a+x $(System.DefaultWorkingDirectory)/bin/kustomize - export PATH=$PATH:$(System.DefaultWorkingDirectory)/bin - echo '##vso[task.prependpath]$(System.DefaultWorkingDirectory)/bin' - which kustomize - kustomize version - cp $(System.DefaultWorkingDirectory)/bin/kustomize $(System.DefaultWorkingDirectory)/kustomize go mod download + make install-kubebuilder make install-test-dependencies + make generate-test-certs workingDirectory: '$(System.DefaultWorkingDirectory)' - script: | set -e - export PATH=$PATH:$(go env GOPATH)/bin - GO111MODULE="on" go get sigs.k8s.io/kind@v0.7.0 - kind create cluster - export KUBECONFIG=$(kind get kubeconfig-path --name="kind") - kubectl cluster-info - make install + export PATH=$PATH:$(go env GOPATH)/bin:$(go env GOPATH)/kubebuilder/bin + export KUBEBUILDER_ASSETS=$(go env GOPATH)/kubebuilder/bin export TEST_APIM_RG=$(TEST_APIM_RG) export TEST_APIM_NAME=$(TEST_APIM_NAME) make test-integration-controllers - displayName: Run tests on a Kind Cluster + displayName: Run envtest tests condition: eq(variables['check_changes.SOURCE_CODE_CHANGED'], 'true') continueOnError: 'false' env: @@ -134,6 +120,20 @@ steps: AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET) REQUEUE_AFTER: $(REQUEUE_AFTER) + BUILD_ID: $(Build.BuildId) + workingDirectory: '$(System.DefaultWorkingDirectory)' + + - script: | + set -e + export PATH=$PATH:$(go env GOPATH)/bin + make kind-create + kubectl cluster-info + make install + displayName: Install CRDs into kind cluster + condition: eq(variables['check_changes.SOURCE_CODE_CHANGED'], 'true') + continueOnError: 'false' + env: + GO111MODULE: on KUBEBUILDER_ASSETS: $(go env GOPATH)/bin BUILD_ID: $(Build.BuildId) workingDirectory: '$(System.DefaultWorkingDirectory)' diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml index db74bc4e2ef..5e663df4d6b 100644 --- a/config/default/kustomization.yaml +++ b/config/default/kustomization.yaml @@ -40,8 +40,8 @@ patchesStrategicMerge: # [CAINJECTION] Uncomment next line to enable the CA injection in the admission webhooks. # Uncomment 'CAINJECTION' in crd/kustomization.yaml to enable the CA injection in the admission webhooks. # 'CERTMANAGER' needs to be enabled to use ca injection -# - webhookcainjection_patch.yaml -# the following config is for teaching kustomize how to do var substitution +- webhookcainjection_patch.yaml + # the following config is for teaching kustomize how to do var substitution vars: # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. diff --git a/config/default/webhookcainjection_patch.yaml b/config/default/webhookcainjection_patch.yaml index 7e0e7931fa3..17aa9aa2126 100644 --- a/config/default/webhookcainjection_patch.yaml +++ b/config/default/webhookcainjection_patch.yaml @@ -1,11 +1,15 @@ # This patch add annotation to admission webhook config and -# the variables $(NAMESPACE) and $(CERTIFICATENAME) will be substituted by kustomize. -apiVersion: admissionregistration.k8s.io/v1beta1 -kind: MutatingWebhookConfiguration -metadata: - name: mutating-webhook-configuration - annotations: - cert-manager.io/inject-ca-from: $(NAMESPACE)/$(CERTIFICATENAME) +# the variables $(NAMESPACE) and $(CERTIFICATENAME) will be substituted by kustomize. + +# NOTE: This section on mutating webhooks is commented out for now because we don't have any +# and Kustomize doesn't like apply something to nothing + +#apiVersion: admissionregistration.k8s.io/v1beta1 +#kind: MutatingWebhookConfiguration +#metadata: +# name: mutating-webhook-configuration +# annotations: +# cert-manager.io/inject-ca-from: $(NAMESPACE)/$(CERTIFICATENAME) --- apiVersion: admissionregistration.k8s.io/v1beta1 kind: ValidatingWebhookConfiguration diff --git a/config/webhook/manifests.yaml b/config/webhook/manifests.yaml index e69de29bb2d..1a2e2c74232 100755 --- a/config/webhook/manifests.yaml +++ b/config/webhook/manifests.yaml @@ -0,0 +1,44 @@ + +--- +apiVersion: admissionregistration.k8s.io/v1beta1 +kind: ValidatingWebhookConfiguration +metadata: + creationTimestamp: null + name: validating-webhook-configuration +webhooks: +- clientConfig: + caBundle: Cg== + service: + name: webhook-service + namespace: system + path: /validate-azure-microsoft-com-v1alpha1-azuresqlmanageduser + failurePolicy: Fail + name: vazuresqlmanageduser.kb.io + rules: + - apiGroups: + - azure.microsoft.com + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - azuresqlmanagedusers +- clientConfig: + caBundle: Cg== + service: + name: webhook-service + namespace: system + path: /validate-azure-microsoft-com-v1alpha1-azuresqluser + failurePolicy: Fail + name: vazuresqluser.kb.io + rules: + - apiGroups: + - azure.microsoft.com + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - azuresqlusers diff --git a/controllers/azuresqlmanageduser_controller_test.go b/controllers/azuresqlmanageduser_controller_test.go new file mode 100644 index 00000000000..717b3436c79 --- /dev/null +++ b/controllers/azuresqlmanageduser_controller_test.go @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// +build all azuresqlserver azuresqluser + +package controllers + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + azurev1alpha1 "github.com/Azure/azure-service-operator/api/v1alpha1" + "github.com/Azure/azure-service-operator/pkg/helpers" +) + +func TestAzureSQLManagedUserValidatesDatabaseName(t *testing.T) { + t.Parallel() + defer PanicRecover(t) + ctx := context.Background() + var sqlUser *azurev1alpha1.AzureSQLManagedUser + + sqlServerName := GenerateTestResourceNameWithRandom("sqlusr-test", 10) + sqlDatabaseName := "master" + + username := "sql-test-user" + helpers.RandomString(10) + roles := []string{"db_owner"} + + sqlUser = &azurev1alpha1.AzureSQLManagedUser{ + ObjectMeta: metav1.ObjectMeta{ + Name: username, + Namespace: "default", + }, + Spec: azurev1alpha1.AzureSQLManagedUserSpec{ + Server: sqlServerName, + DbName: sqlDatabaseName, + Roles: roles, + ResourceGroup: "fakerg" + helpers.RandomString(10), + }, + } + + assert := assert.New(t) + + err := tc.k8sClient.Create(ctx, sqlUser) + assert.Error(err) + assert.Contains(err.Error(), "'master' is a reserved database name and cannot be used") +} diff --git a/controllers/azuresqluser_controller_test.go b/controllers/azuresqluser_controller_test.go index ec63becd719..7fdf3f6dde2 100644 --- a/controllers/azuresqluser_controller_test.go +++ b/controllers/azuresqluser_controller_test.go @@ -22,11 +22,10 @@ func TestAzureSQLUserControllerNoAdminSecret(t *testing.T) { defer PanicRecover(t) ctx := context.Background() - var sqlServerName string - var sqlDatabaseName string var sqlUser *azurev1alpha1.AzureSQLUser - sqlServerName = GenerateTestResourceNameWithRandom("sqlusr-test", 10) + sqlServerName := GenerateTestResourceNameWithRandom("sqlusr-test", 10) + sqlDatabaseName := GenerateTestResourceNameWithRandom("sqldb-test", 10) resourceGroup := GenerateTestResourceNameWithRandom("myrg", 10) username := "sql-test-user" + helpers.RandomString(10) @@ -57,11 +56,10 @@ func TestAzureSQLUserControllerNoResourceGroup(t *testing.T) { ctx := context.Background() assert := assert.New(t) var err error - var sqlServerName string - var sqlDatabaseName string var sqlUser *azurev1alpha1.AzureSQLUser - sqlServerName = GenerateTestResourceNameWithRandom("sqlusr-test", 10) + sqlServerName := GenerateTestResourceNameWithRandom("sqlusr-test", 10) + sqlDatabaseName := GenerateTestResourceNameWithRandom("sqldb-test", 10) username := "sql-test-user" + helpers.RandomString(10) roles := []string{"db_owner"} @@ -100,5 +98,37 @@ func TestAzureSQLUserControllerNoResourceGroup(t *testing.T) { EnsureInstanceWithResult(ctx, t, tc, sqlUser, errhelp.ResourceGroupNotFoundErrorCode, false) EnsureDelete(ctx, t, tc, sqlUser) +} + +func TestAzureSQLUserValidatesDatabaseName(t *testing.T) { + t.Parallel() + defer PanicRecover(t) + ctx := context.Background() + var sqlUser *azurev1alpha1.AzureSQLUser + + sqlServerName := GenerateTestResourceNameWithRandom("sqlusr-test", 10) + sqlDatabaseName := "master" + + username := "sql-test-user" + helpers.RandomString(10) + roles := []string{"db_owner"} + + sqlUser = &azurev1alpha1.AzureSQLUser{ + ObjectMeta: metav1.ObjectMeta{ + Name: username, + Namespace: "default", + }, + Spec: azurev1alpha1.AzureSQLUserSpec{ + Server: sqlServerName, + DbName: sqlDatabaseName, + AdminSecret: "", + Roles: roles, + ResourceGroup: "fakerg" + helpers.RandomString(10), + }, + } + + assert := assert.New(t) + err := tc.k8sClient.Create(ctx, sqlUser) + assert.Error(err) + assert.Contains(err.Error(), "'master' is a reserved database name and cannot be used") } diff --git a/controllers/suite_test.go b/controllers/suite_test.go index 3cf8a1b4fa5..ad6c4b76986 100644 --- a/controllers/suite_test.go +++ b/controllers/suite_test.go @@ -103,10 +103,6 @@ func setup() error { var timeout time.Duration - testEnv = &envtest.Environment{ - CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")}, - } - var cfg *rest.Config if os.Getenv("TEST_USE_EXISTING_CLUSTER") == "true" { t := true @@ -120,12 +116,18 @@ func setup() error { } else { testEnv = &envtest.Environment{ CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")}, + WebhookInstallOptions: envtest.WebhookInstallOptions{ + DirectoryPaths: []string{ + "../config/webhook", + }, + }, } cfg, err = testEnv.Start() if err != nil { return err } } + if cfg == nil { return fmt.Errorf("rest config nil") } @@ -152,6 +154,8 @@ func setup() error { // +kubebuilder:scaffold:scheme k8sManager, err = ctrl.NewManager(cfg, ctrl.Options{ Scheme: scheme.Scheme, + CertDir: testEnv.WebhookInstallOptions.LocalServingCertDir, + Port: testEnv.WebhookInstallOptions.LocalServingPort, }) if err != nil { return err @@ -886,6 +890,14 @@ func setup() error { return err } + // Webhooks + if err = (&azurev1alpha1.AzureSQLUser{}).SetupWebhookWithManager(k8sManager); err != nil { + return err + } + if err = (&azurev1alpha1.AzureSQLManagedUser{}).SetupWebhookWithManager(k8sManager); err != nil { + return err + } + go func() { err = k8sManager.Start(ctrl.SetupSignalHandler()) if err != nil { diff --git a/go.mod b/go.mod index 0b51172d58a..9da0b9f420c 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/go-logr/logr v0.1.0 github.com/go-sql-driver/mysql v1.5.0 github.com/gobuffalo/envy v1.7.0 - github.com/google/go-cmp v0.3.0 + github.com/google/go-cmp v0.4.0 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/google/uuid v1.1.1 github.com/hashicorp/go-multierror v1.0.0 @@ -26,8 +26,8 @@ require ( github.com/marstr/randname v0.0.0-20181206212954-d5b0f288ab8c github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.3.0 // indirect - github.com/onsi/ginkgo v1.11.0 - github.com/onsi/gomega v1.8.1 + github.com/onsi/ginkgo v1.12.1 + github.com/onsi/gomega v1.10.1 github.com/pelletier/go-toml v1.7.0 // indirect github.com/pkg/errors v0.8.1 github.com/prometheus/client_golang v1.0.0 @@ -39,12 +39,12 @@ require ( github.com/spf13/viper v1.6.3 github.com/stretchr/testify v1.5.1 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 - golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa + golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 // indirect gopkg.in/ini.v1 v1.55.0 // indirect - k8s.io/api v0.17.2 - k8s.io/apimachinery v0.17.2 - k8s.io/client-go v0.17.2 - sigs.k8s.io/controller-runtime v0.5.0 + k8s.io/api v0.18.6 + k8s.io/apimachinery v0.18.6 + k8s.io/client-go v0.18.6 + sigs.k8s.io/controller-runtime v0.6.2 sigs.k8s.io/controller-tools v0.2.5 // indirect ) diff --git a/go.sum b/go.sum index 7ced41982fb..4072f6a72fa 100644 --- a/go.sum +++ b/go.sum @@ -74,9 +74,12 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -118,8 +121,11 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -192,6 +198,8 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -206,15 +214,27 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= @@ -251,6 +271,8 @@ github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= @@ -258,6 +280,8 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= @@ -280,6 +304,8 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= @@ -332,6 +358,8 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -340,11 +368,16 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -369,6 +402,9 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1: github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -381,6 +417,8 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= @@ -472,6 +510,7 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -507,6 +546,8 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= @@ -516,6 +557,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -535,7 +577,12 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 h1:5B6i6EAiSYyejWfvc5Rc9BbI3rzIsrrXfAQBWnYfn+w= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -543,6 +590,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= @@ -566,6 +615,8 @@ golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= @@ -575,22 +626,34 @@ google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMt google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= @@ -616,6 +679,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -625,40 +690,68 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc= k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/api v0.18.6 h1:osqrAXbOQjkKIWDTjrqxWQ3w0GkKb1KA1XkUGHHYpeE= +k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= k8s.io/apiextensions-apiserver v0.17.0/go.mod h1:XiIFUakZywkUl54fVXa7QTEHcqQz9HG55nHd1DCoHj8= k8s.io/apiextensions-apiserver v0.17.2 h1:cP579D2hSZNuO/rZj9XFRzwJNYb41DbNANJb6Kolpss= k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= +k8s.io/apiextensions-apiserver v0.18.6 h1:vDlk7cyFsDyfwn2rNAO2DbmUbvXy5yT5GE3rrqOzaMo= +k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.17.2 h1:hwDQQFbdRlpnnsR64Asdi55GyCaIP/3WQpMmbNBeWr4= k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.18.6 h1:RtFHnfGNfd1N0LeSrKCUznz5xtUP1elRGvHJbL3Ntag= +k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= k8s.io/apiserver v0.17.0/go.mod h1:ABM+9x/prjINN6iiffRVNCBR2Wk7uY4z+EtEGZD48cg= k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= +k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= k8s.io/client-go v0.17.2 h1:ndIfkfXEGrNhLIgkr0+qhRguSD3u6DCmonepn1O6NYc= k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= +k8s.io/client-go v0.18.6 h1:I+oWqJbibLSGsZj8Xs8F0aWVXJVIoUHWaaJV3kUN/Zw= +k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= k8s.io/code-generator v0.17.0/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc= k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs= +k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7MpmSnvtrOieolJKoE= +k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/controller-runtime v0.5.0 h1:CbqIy5fbUX+4E9bpnBFd204YAzRYlM9SWW77BbrcDQo= sigs.k8s.io/controller-runtime v0.5.0/go.mod h1:REiJzC7Y00U+2YkMbT8wxgrsX5USpXKGhb2sCtAXiT8= +sigs.k8s.io/controller-runtime v0.6.2 h1:jkAnfdTYBpFwlmBn3pS5HFO06SfxvnTZ1p5PeEF/zAA= +sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= sigs.k8s.io/controller-tools v0.2.5/go.mod h1:+t0Hz6tOhJQCdd7IYO0mNzimmiM9sqMU0021u6UCF2o= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/main.go b/main.go index fc516caf312..e0c58ef25d2 100644 --- a/main.go +++ b/main.go @@ -973,6 +973,14 @@ func main() { os.Exit(1) } + if err = (&azurev1alpha1.AzureSQLUser{}).SetupWebhookWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create webhook", "webhook", "AzureSQLUser") + os.Exit(1) + } + if err = (&azurev1alpha1.AzureSQLManagedUser{}).SetupWebhookWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create webhook", "webhook", "AzureSQLManagedUser") + os.Exit(1) + } // +kubebuilder:scaffold:builder setupLog.Info("starting manager")