diff --git a/Makefile b/Makefile index 02cf70f..fa15221 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,5 @@ - # Image URL to use all building/pushing image targets IMG ?= controller:latest -# Produce CRDs that work back to Kubernetes 1.11 (no version conversion) -CRD_OPTIONS ?= "crd:generateEmbeddedObjectMeta=true" # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) @@ -37,9 +34,11 @@ help: ## Display this help. ##@ Development +.PHONY: manifests manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. - $(CONTROLLER_GEN) $(CRD_OPTIONS) rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases + $(CONTROLLER_GEN) rbac:roleName=manager-role crd:generateEmbeddedObjectMeta=true webhook paths="./..." output:crd:artifacts:config=config/crd/bases +.PHONY: generate generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..." @@ -49,6 +48,9 @@ addlicense: ## Add license headers to all go files. fmt: ## Run go fmt against code. go fmt ./... +vet: ## Run go vet against code. + go vet ./... + .PHONY: checklicense checklicense: ## Check that every file has a license header present. find . -name '*.go' -exec go run github.com/google/addlicense -check -c 'OnMetal authors' {} + @@ -56,13 +58,11 @@ checklicense: ## Check that every file has a license header present. lint: ## Lint code golangci-lint run ./... -ENVTEST_ASSETS_DIR=$(shell pwd)/testbin -test: manifests generate fmt checklicense ## Run tests. - mkdir -p ${ENVTEST_ASSETS_DIR} - test -f ${ENVTEST_ASSETS_DIR}/setup-envtest.sh || curl -sSLo ${ENVTEST_ASSETS_DIR}/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.8.3/hack/setup-envtest.sh - source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); go test ./... -coverprofile cover.out +.PHONY: test +test: manifests generate fmt vet envtest ## Run tests. + KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out -check: lint test ## Lint and run tests. +check: manifests generate addlicense lint test ## Lint and run tests. ##@ Build @@ -95,12 +95,19 @@ undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/confi CONTROLLER_GEN = $(shell pwd)/bin/controller-gen +.PHONY: controller-gen controller-gen: ## Download controller-gen locally if necessary. - $(call go-get-tool,$(CONTROLLER_GEN),sigs.k8s.io/controller-tools/cmd/controller-gen@v0.7.0) + $(call go-get-tool,$(CONTROLLER_GEN),sigs.k8s.io/controller-tools/cmd/controller-gen@v0.9.0) KUSTOMIZE = $(shell pwd)/bin/kustomize +.PHONY: kustomize kustomize: ## Download kustomize locally if necessary. - $(call go-get-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/v4@v4.5.5) + $(call go-get-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/v4@v4.5.3) + +ENVTEST = $(shell pwd)/bin/setup-envtest +.PHONY: envtest +envtest: ## Download envtest-setup locally if necessary. + $(call go-get-tool,$(ENVTEST),sigs.k8s.io/controller-runtime/tools/setup-envtest@latest) # go-get-tool will 'go get' any package $2 and install it to $1. PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) diff --git a/config/crd/bases/matryoshka.onmetal.de_kubeapiservers.yaml b/config/crd/bases/matryoshka.onmetal.de_kubeapiservers.yaml index 66aac91..1c47ea2 100644 --- a/config/crd/bases/matryoshka.onmetal.de_kubeapiservers.yaml +++ b/config/crd/bases/matryoshka.onmetal.de_kubeapiservers.yaml @@ -1,10 +1,9 @@ - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.9.0 creationTimestamp: null name: kubeapiservers.matryoshka.onmetal.de spec: @@ -3218,13 +3217,12 @@ spec: when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity - \ tracking are needed, c) the storage driver is - specified through a storage class, and d) the storage - driver supports dynamic volume provisioning through - \ a PersistentVolumeClaim (see EphemeralVolumeSource - for more information on the connection between - this volume type and PersistentVolumeClaim). \n - Use PersistentVolumeClaim or one of the vendor-specific + tracking are needed, c) the storage driver is specified + through a storage class, and d) the storage driver + supports dynamic volume provisioning through a PersistentVolumeClaim + (see EphemeralVolumeSource for more information on + the connection between this volume type and PersistentVolumeClaim). + \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant @@ -3349,13 +3347,13 @@ spec: are two important differences between DataSource and DataSourceRef: * While DataSource only allows two specific types - of objects, DataSourceRef allows any - non-core object, as well as PersistentVolumeClaim + of objects, DataSourceRef allows any non-core + object, as well as PersistentVolumeClaim objects. * While DataSource ignores disallowed - values (dropping them), DataSourceRef preserves - all values, and generates an error if - a disallowed value is specified. (Beta) - Using this field requires the AnyVolumeDataSource + values (dropping them), DataSourceRef + preserves all values, and generates an + error if a disallowed value is specified. + (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.' properties: apiGroup: @@ -6294,13 +6292,13 @@ spec: with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler - to schedule the pod in any location, but giving - higher precedence to topologies that would help reduce - the skew. A constraint is considered "Unsatisfiable" - for an incoming pod if and only if every possible - node assignment for that pod would violate "MaxSkew" - on some topology. For example, in a 3-zone cluster, - MaxSkew is set to 1, and pods with the same labelSelector + to schedule the pod in any location, but giving higher + precedence to topologies that would help reduce the + skew. A constraint is considered "Unsatisfiable" for + an incoming pod if and only if every possible node + assignment for that pod would violate "MaxSkew" on + some topology. For example, in a 3-zone cluster, MaxSkew + is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) @@ -6460,13 +6458,12 @@ spec: description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" + type FooStatus struct{ // Represents the observations of a foo's + current state. // Known .status.conditions.type are: \"Available\", + \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge + // +listType=map // +listMapKey=type Conditions []metav1.Condition + `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" + protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" properties: lastTransitionTime: description: lastTransitionTime is the last time the condition @@ -6545,9 +6542,3 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/config/crd/bases/matryoshka.onmetal.de_kubeconfigs.yaml b/config/crd/bases/matryoshka.onmetal.de_kubeconfigs.yaml index 87e9203..54bcd80 100644 --- a/config/crd/bases/matryoshka.onmetal.de_kubeconfigs.yaml +++ b/config/crd/bases/matryoshka.onmetal.de_kubeconfigs.yaml @@ -1,10 +1,9 @@ - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.9.0 creationTimestamp: null name: kubeconfigs.matryoshka.onmetal.de spec: @@ -214,9 +213,3 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/config/crd/bases/matryoshka.onmetal.de_kubecontrollermanagers.yaml b/config/crd/bases/matryoshka.onmetal.de_kubecontrollermanagers.yaml index 29f1ae2..677fb15 100644 --- a/config/crd/bases/matryoshka.onmetal.de_kubecontrollermanagers.yaml +++ b/config/crd/bases/matryoshka.onmetal.de_kubecontrollermanagers.yaml @@ -1,10 +1,9 @@ - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.7.0 + controller-gen.kubebuilder.io/version: v0.9.0 creationTimestamp: null name: kubecontrollermanagers.matryoshka.onmetal.de spec: @@ -3217,13 +3216,12 @@ spec: when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity - \ tracking are needed, c) the storage driver is - specified through a storage class, and d) the storage - driver supports dynamic volume provisioning through - \ a PersistentVolumeClaim (see EphemeralVolumeSource - for more information on the connection between - this volume type and PersistentVolumeClaim). \n - Use PersistentVolumeClaim or one of the vendor-specific + tracking are needed, c) the storage driver is specified + through a storage class, and d) the storage driver + supports dynamic volume provisioning through a PersistentVolumeClaim + (see EphemeralVolumeSource for more information on + the connection between this volume type and PersistentVolumeClaim). + \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant @@ -3348,13 +3346,13 @@ spec: are two important differences between DataSource and DataSourceRef: * While DataSource only allows two specific types - of objects, DataSourceRef allows any - non-core object, as well as PersistentVolumeClaim + of objects, DataSourceRef allows any non-core + object, as well as PersistentVolumeClaim objects. * While DataSource ignores disallowed - values (dropping them), DataSourceRef preserves - all values, and generates an error if - a disallowed value is specified. (Beta) - Using this field requires the AnyVolumeDataSource + values (dropping them), DataSourceRef + preserves all values, and generates an + error if a disallowed value is specified. + (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.' properties: apiGroup: @@ -6293,13 +6291,13 @@ spec: with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler - to schedule the pod in any location, but giving - higher precedence to topologies that would help reduce - the skew. A constraint is considered "Unsatisfiable" - for an incoming pod if and only if every possible - node assignment for that pod would violate "MaxSkew" - on some topology. For example, in a 3-zone cluster, - MaxSkew is set to 1, and pods with the same labelSelector + to schedule the pod in any location, but giving higher + precedence to topologies that would help reduce the + skew. A constraint is considered "Unsatisfiable" for + an incoming pod if and only if every possible node + assignment for that pod would violate "MaxSkew" on + some topology. For example, in a 3-zone cluster, MaxSkew + is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) @@ -6439,13 +6437,12 @@ spec: description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" + type FooStatus struct{ // Represents the observations of a foo's + current state. // Known .status.conditions.type are: \"Available\", + \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge + // +listType=map // +listMapKey=type Conditions []metav1.Condition + `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" + protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" properties: lastTransitionTime: description: lastTransitionTime is the last time the condition @@ -6524,9 +6521,3 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index a1e04ed..f7258ed 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -1,4 +1,3 @@ - --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/controllers/matryoshka/kubeapiserver_controller_test.go b/controllers/matryoshka/kubeapiserver_controller_test.go index 0a43522..1f9956b 100644 --- a/controllers/matryoshka/kubeapiserver_controller_test.go +++ b/controllers/matryoshka/kubeapiserver_controller_test.go @@ -17,19 +17,17 @@ package matryoshka import ( "context" "fmt" - "time" - . "github.com/onsi/ginkgo" + matryoshkav1alpha1 "github.com/onmetal/matryoshka/apis/matryoshka/v1alpha1" + "github.com/onmetal/matryoshka/controllers/matryoshka/internal/kubeapiserver" + "github.com/onmetal/matryoshka/controllers/matryoshka/internal/utils" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" - - matryoshkav1alpha1 "github.com/onmetal/matryoshka/apis/matryoshka/v1alpha1" - "github.com/onmetal/matryoshka/controllers/matryoshka/internal/kubeapiserver" - "github.com/onmetal/matryoshka/controllers/matryoshka/internal/utils" ) var _ = Describe("KubeAPIServerController", func() { @@ -47,9 +45,11 @@ var _ = Describe("KubeAPIServerController", func() { By("waiting for a deployment to be created") deployment := &appsv1.Deployment{} - Eventually(func() error { - return k8sClient.Get(ctx, client.ObjectKey{Namespace: ns.Name, Name: "apiserver-sample"}, deployment) - }, 3*time.Second).Should(Succeed()) + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, client.ObjectKey{Namespace: ns.Name, Name: "apiserver-sample"}, deployment) + Expect(client.IgnoreNotFound(err)).NotTo(HaveOccurred()) + g.Expect(err).NotTo(HaveOccurred()) + }).Should(Succeed()) By("inspecting the deployment") Expect(deployment.Spec.Selector).To(Equal(&metav1.LabelSelector{ diff --git a/controllers/matryoshka/kubeconfig_controller_test.go b/controllers/matryoshka/kubeconfig_controller_test.go index f84e937..7384c6a 100644 --- a/controllers/matryoshka/kubeconfig_controller_test.go +++ b/controllers/matryoshka/kubeconfig_controller_test.go @@ -16,12 +16,10 @@ package matryoshka import ( "context" - "time" - - matryoshkav1alpha1 "github.com/onmetal/matryoshka/apis/matryoshka/v1alpha1" "github.com/onmetal/controller-utils/clientutils" - . "github.com/onsi/ginkgo" + matryoshkav1alpha1 "github.com/onmetal/matryoshka/apis/matryoshka/v1alpha1" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -65,7 +63,7 @@ var _ = Describe("KubeconfigController", func() { secret := &corev1.Secret{} Eventually(func() error { return k8sClient.Get(ctx, client.ObjectKey{Namespace: ns.Name, Name: "my-kubeconfig"}, secret) - }, 3*time.Second).Should(Succeed()) + }).Should(Succeed()) By("inspecting the secret") Expect(secret.Data).To(Equal(map[string][]byte{ diff --git a/controllers/matryoshka/kubecontrollermanager_controller_test.go b/controllers/matryoshka/kubecontrollermanager_controller_test.go index baa534e..8415cc1 100644 --- a/controllers/matryoshka/kubecontrollermanager_controller_test.go +++ b/controllers/matryoshka/kubecontrollermanager_controller_test.go @@ -17,9 +17,11 @@ package matryoshka import ( "context" "fmt" - "time" - . "github.com/onsi/ginkgo" + matryoshkav1alpha1 "github.com/onmetal/matryoshka/apis/matryoshka/v1alpha1" + "github.com/onmetal/matryoshka/controllers/matryoshka/internal/kubecontrollermanager" + "github.com/onmetal/matryoshka/controllers/matryoshka/internal/utils" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -27,10 +29,6 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" - - matryoshkav1alpha1 "github.com/onmetal/matryoshka/apis/matryoshka/v1alpha1" - "github.com/onmetal/matryoshka/controllers/matryoshka/internal/kubecontrollermanager" - "github.com/onmetal/matryoshka/controllers/matryoshka/internal/utils" ) var _ = Describe("KubeControllerManagerController", func() { @@ -49,9 +47,11 @@ var _ = Describe("KubeControllerManagerController", func() { By("waiting for a deployment to be created") deployment := &appsv1.Deployment{} - Eventually(func() error { - return k8sClient.Get(ctx, client.ObjectKey{Namespace: ns.Name, Name: "kubecontrollermanager-sample"}, deployment) - }, 3*time.Second).Should(Succeed()) + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, client.ObjectKey{Namespace: ns.Name, Name: "kubecontrollermanager-sample"}, deployment) + Expect(client.IgnoreNotFound(err)).NotTo(HaveOccurred()) + g.Expect(err).NotTo(HaveOccurred()) + }).Should(Succeed()) By("inspecting the deployment") Expect(deployment.Spec.Selector).To(Equal(&metav1.LabelSelector{ diff --git a/controllers/matryoshka/suite_test.go b/controllers/matryoshka/suite_test.go index 9bcf4b7..a6f7649 100644 --- a/controllers/matryoshka/suite_test.go +++ b/controllers/matryoshka/suite_test.go @@ -18,16 +18,17 @@ package matryoshka import ( "context" - "path/filepath" "testing" + "time" "github.com/onmetal/controller-utils/clientutils" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - - . "github.com/onsi/ginkgo" + "github.com/onmetal/controller-utils/modutils" + matryoshkav1alpha1 "github.com/onmetal/matryoshka/apis/matryoshka/v1alpha1" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" @@ -35,8 +36,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/envtest" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - - matryoshkav1alpha1 "github.com/onmetal/matryoshka/apis/matryoshka/v1alpha1" //+kubebuilder:scaffold:imports ) @@ -49,6 +48,8 @@ var testEnv *envtest.Environment func TestAPIs(t *testing.T) { RegisterFailHandler(Fail) + SetDefaultEventuallyTimeout(3 * time.Second) + SetDefaultEventuallyPollingInterval(250 * time.Millisecond) RunSpecs(t, "Controller Suite") } @@ -58,7 +59,9 @@ var _ = BeforeSuite(func() { By("bootstrapping test environment") testEnv = &envtest.Environment{ - CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")}, + CRDDirectoryPaths: []string{ + modutils.Dir("github.com/onmetal/matryoshka", "config", "crd", "bases"), + }, ErrorIfCRDPathMissing: true, } @@ -81,7 +84,7 @@ var _ = BeforeSuite(func() { k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) Expect(err).NotTo(HaveOccurred()) Expect(k8sClient).NotTo(BeNil()) -}, 60) +}) var _ = AfterSuite(func() { By("tearing down the test environment") @@ -137,8 +140,8 @@ func ApplyFile(ctx context.Context, c client.Client, namespace, filename string) return clientutils.PatchMultipleFromFile(ctx, client.NewNamespacedClient(c, namespace), filename, clientutils.ApplyAll, client.FieldOwner("test")) } -const ( - SamplesPath = "../../config/samples" +var ( + SamplesPath = modutils.Dir("github.com/onmetal/matryoshka", "config", "samples") KubeAPIServerSampleFilename = SamplesPath + "/matryoshka_v1alpha1_kubeapiserver.yaml" KubeControllerManagerSampleFilename = SamplesPath + "/matryoshka_v1alpha1_kubecontrollermanager.yaml" ) diff --git a/go.mod b/go.mod index 68f68cd..e8c014f 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/golang/mock v1.6.0 github.com/google/addlicense v1.0.0 github.com/onmetal/controller-utils v0.6.3 - github.com/onsi/ginkgo v1.16.5 + github.com/onsi/ginkgo/v2 v2.1.4 github.com/onsi/gomega v1.20.0 k8s.io/api v0.24.3 k8s.io/apimachinery v0.24.3 @@ -53,7 +53,6 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/nxadm/tail v1.4.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect @@ -78,7 +77,6 @@ require ( google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/apiextensions-apiserver v0.24.3 // indirect diff --git a/go.sum b/go.sum index 9c97207..a8d08cb 100644 --- a/go.sum +++ b/go.sum @@ -175,7 +175,6 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -367,7 +366,6 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onmetal/controller-utils v0.6.3 h1:VRZt9ubnbnF/v7ADP+3uOKqaR8LRLFdKtn76hQ8mTRs= github.com/onmetal/controller-utils v0.6.3/go.mod h1:U5AzcYhIjRIcMMFkYaoLGQRt5CDwF/FQcD91a9nGsYE= @@ -376,8 +374,8 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -689,7 +687,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -782,7 +779,6 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=