From 081a720aa09bb5cc385d699e199c6432f24b7574 Mon Sep 17 00:00:00 2001 From: Guillermo Gaston Date: Thu, 15 Feb 2024 15:18:11 +0000 Subject: [PATCH] Swap capi race condition patch for new CR version All the known bugs have been fixed in controller-runtime so now we don't need to detect the error and restart the pod. CR has cut a release yet so capi hasn't bumped its version yet. Bumping our fork before all of that to verify this fix indeed solves the observed race condition. --- .../cluster-api/ATTRIBUTION.txt | 2 +- .../cluster-api/CAPD_ATTRIBUTION.txt | 2 +- .../kubernetes-sigs/cluster-api/CHECKSUMS | 20 +- ...er-if-RESTMapping-outdated-cache-is-.patch | 217 ------------------ ...r-runtime-patch-for-restmapper-cache.patch | 97 ++++++++ 5 files changed, 109 insertions(+), 229 deletions(-) delete mode 100644 projects/kubernetes-sigs/cluster-api/patches/0040-Restart-controller-if-RESTMapping-outdated-cache-is-.patch create mode 100644 projects/kubernetes-sigs/cluster-api/patches/0040-Use-controller-runtime-patch-for-restmapper-cache.patch diff --git a/projects/kubernetes-sigs/cluster-api/ATTRIBUTION.txt b/projects/kubernetes-sigs/cluster-api/ATTRIBUTION.txt index 68011770e1..fef3588bce 100644 --- a/projects/kubernetes-sigs/cluster-api/ATTRIBUTION.txt +++ b/projects/kubernetes-sigs/cluster-api/ATTRIBUTION.txt @@ -230,7 +230,7 @@ https://github.com/kubernetes-sigs/apiserver-network-proxy ** sigs.k8s.io/cluster-api; version v1.6.0 -- https://github.com/kubernetes-sigs/cluster-api -** sigs.k8s.io/controller-runtime; version v0.16.3 -- +** sigs.k8s.io/controller-runtime; version v0.16.5-0.20240215143111-dca5e8b2b00a -- https://github.com/kubernetes-sigs/controller-runtime ** sigs.k8s.io/json; version v0.0.0-20221116044647-bc3834ca7abd -- diff --git a/projects/kubernetes-sigs/cluster-api/CAPD_ATTRIBUTION.txt b/projects/kubernetes-sigs/cluster-api/CAPD_ATTRIBUTION.txt index f0d1c44e7a..d4fc2485f6 100644 --- a/projects/kubernetes-sigs/cluster-api/CAPD_ATTRIBUTION.txt +++ b/projects/kubernetes-sigs/cluster-api/CAPD_ATTRIBUTION.txt @@ -200,7 +200,7 @@ https://github.com/kubernetes-sigs/cluster-api ** sigs.k8s.io/cluster-api/test/infrastructure/kind; version v1.6.0 -- https://github.com/kubernetes-sigs/cluster-api -** sigs.k8s.io/controller-runtime; version v0.16.3 -- +** sigs.k8s.io/controller-runtime; version v0.16.5-0.20240215143111-dca5e8b2b00a -- https://github.com/kubernetes-sigs/controller-runtime ** sigs.k8s.io/json; version v0.0.0-20221116044647-bc3834ca7abd -- diff --git a/projects/kubernetes-sigs/cluster-api/CHECKSUMS b/projects/kubernetes-sigs/cluster-api/CHECKSUMS index fcc4aee451..a8a384416f 100644 --- a/projects/kubernetes-sigs/cluster-api/CHECKSUMS +++ b/projects/kubernetes-sigs/cluster-api/CHECKSUMS @@ -1,10 +1,10 @@ -9cc600dbbd7b6aba2f799da0dc566676188cc95dfbf833beca162295aa18d57e _output/bin/cluster-api/linux-amd64/cluster-api-provider-docker-manager -8aa761dd700376a5ac1750c41b6e412b1b8b66ea24e4c65ca503b90836a68ab6 _output/bin/cluster-api/linux-amd64/clusterctl -f6b7ce3009f058f28b1136d1144a5c0dcb3a44278bd9947e034d4428d1300c62 _output/bin/cluster-api/linux-amd64/kubeadm-bootstrap-manager -4c7fac42e79e0c4c8847f3b976835da8c7c39cfa592819639d24a5534f7ee189 _output/bin/cluster-api/linux-amd64/kubeadm-control-plane-manager -2950db4742b814f727389f8d315bab4905f40cf907e9de089743b7e67fe96897 _output/bin/cluster-api/linux-amd64/manager -0c1588ede3ab75a0213416d0772a7422326fea282cdee39671038e45cb7f5fcb _output/bin/cluster-api/linux-arm64/cluster-api-provider-docker-manager -1ac5248d227318f8ee776c69959250ae2d3c05d9e66f549aafab4fc35dcfecec _output/bin/cluster-api/linux-arm64/clusterctl -64bb7ffb8f6feaf6a5d78cea83f90ac3d4605b5179befbc391584a53ee65705e _output/bin/cluster-api/linux-arm64/kubeadm-bootstrap-manager -9dccfc56c3b0179700312295d02d29b008b2fd9c2c988728c979751764371eeb _output/bin/cluster-api/linux-arm64/kubeadm-control-plane-manager -ddae3144474404243a96bce43ad42af71e38f05b8fd006848f4f6f7b3c017af0 _output/bin/cluster-api/linux-arm64/manager +8c64007e98aa6bbd7c9092e4fd52e622d099f3dad646e163c8844189004391f8 _output/bin/cluster-api/linux-amd64/cluster-api-provider-docker-manager +c2a1a4b2473f2a6b986441baab2c7cf0cbc5b522b4b8161e8b88d9363e1e3df0 _output/bin/cluster-api/linux-amd64/clusterctl +bd7610d4f16019347dbfe6bb558c7150dbe2466ad8a0343fe1e88df52cd0221c _output/bin/cluster-api/linux-amd64/kubeadm-bootstrap-manager +084afb5792605ff20574fdbbc58cdee9261f22a65f4e7c29577c10c1c7d59863 _output/bin/cluster-api/linux-amd64/kubeadm-control-plane-manager +6aeaa911153fedcab42fa7761a6988b6a1c9b387c0ae217a9d53d20fb56e55f9 _output/bin/cluster-api/linux-amd64/manager +cd2845117cccbbe072680361fed034ee298b6b45b6aac2a7cf513361b9bf1cf8 _output/bin/cluster-api/linux-arm64/cluster-api-provider-docker-manager +4c64a4f9b0a0db127cf02b3f5d6b41a4fbb9a0546e118fdf4e7e4e8f2fdd3631 _output/bin/cluster-api/linux-arm64/clusterctl +5bff86e0142f4fd68b6fd96d3e73a4fda14a86604d85fac812fe253c894359e8 _output/bin/cluster-api/linux-arm64/kubeadm-bootstrap-manager +e64b52cfd91a784e6f0d1384356445abb0e79a83db8496b02d858d1d3f57c1db _output/bin/cluster-api/linux-arm64/kubeadm-control-plane-manager +0d05b3a3444927731e22a37cf8a2236150fccb2e4ac34b9e2eea9794b9a647d3 _output/bin/cluster-api/linux-arm64/manager diff --git a/projects/kubernetes-sigs/cluster-api/patches/0040-Restart-controller-if-RESTMapping-outdated-cache-is-.patch b/projects/kubernetes-sigs/cluster-api/patches/0040-Restart-controller-if-RESTMapping-outdated-cache-is-.patch deleted file mode 100644 index 78c7fadd80..0000000000 --- a/projects/kubernetes-sigs/cluster-api/patches/0040-Restart-controller-if-RESTMapping-outdated-cache-is-.patch +++ /dev/null @@ -1,217 +0,0 @@ -From 12158d086f242c6e7fa2930689fa01ef38ab9ece Mon Sep 17 00:00:00 2001 -From: Guillermo Gaston -Date: Sat, 20 Jan 2024 22:05:04 +0000 -Subject: [PATCH 37/37] Restart controller if RESTMapping outdated cache is - detected when reconciling external object - ---- - controllers/external/util.go | 28 +++++++- - controllers/external/util_test.go | 116 +++++++++++++++++++++++++++++- - 2 files changed, 140 insertions(+), 4 deletions(-) - -diff --git a/controllers/external/util.go b/controllers/external/util.go -index 5b6443c78..62ed07959 100644 ---- a/controllers/external/util.go -+++ b/controllers/external/util.go -@@ -19,13 +19,17 @@ package external - import ( - "context" - "strings" -+ "syscall" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" -+ "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apiserver/pkg/storage/names" - "sigs.k8s.io/controller-runtime/pkg/client" -+ "sigs.k8s.io/controller-runtime/pkg/client/apiutil" -+ "sigs.k8s.io/controller-runtime/pkg/log" - - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - ) -@@ -40,12 +44,34 @@ func Get(ctx context.Context, c client.Reader, ref *corev1.ObjectReference, name - obj.SetKind(ref.Kind) - obj.SetName(ref.Name) - key := client.ObjectKey{Name: obj.GetName(), Namespace: namespace} -- if err := c.Get(ctx, key, obj); err != nil { -+ err := c.Get(ctx, key, obj) -+ if isV1alpha4NotFoundFromDiscoveryError(err) { -+ logErrorAndGracefulShutdown( -+ ctx, -+ err, -+ "Client RESTMapper returned an error from an invalid cache referencing infrastructure.cluster.x-k8s.io/v1alpha4, exiting the program to force a new cache to be built", -+ ) -+ } -+ if err != nil { - return nil, errors.Wrapf(err, "failed to retrieve %s external object %q/%q", obj.GetKind(), key.Namespace, key.Name) - } - return obj, nil - } - -+func isV1alpha4NotFoundFromDiscoveryError(err error) bool { -+ discoverFailedErr := &apiutil.ErrResourceDiscoveryFailed{} -+ noResourceMatchErr := &meta.NoResourceMatchError{} -+ return errors.As(err, &discoverFailedErr) && -+ errors.As(err, &noResourceMatchErr) && // This is the error that ErrResourceDiscoveryFailed will unwrap when the original error is NotFound. -+ strings.Contains(err.Error(), "cluster.x-k8s.io/v1alpha4") -+} -+ -+func logErrorAndGracefulShutdown(ctx context.Context, err error, msg string) { -+ logger := log.FromContext(ctx) -+ logger.Error(err, msg) -+ syscall.Kill(syscall.Getpid(), syscall.SIGINT) -+} -+ - // Delete uses the client and reference to delete an external, unstructured object. - func Delete(ctx context.Context, c client.Writer, ref *corev1.ObjectReference) error { - obj := new(unstructured.Unstructured) -diff --git a/controllers/external/util_test.go b/controllers/external/util_test.go -index 012445478..570cd4dae 100644 ---- a/controllers/external/util_test.go -+++ b/controllers/external/util_test.go -@@ -17,6 +17,7 @@ limitations under the License. - package external - - import ( -+ "fmt" - "testing" - - . "github.com/onsi/gomega" -@@ -25,16 +26,16 @@ import ( - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" -+ "k8s.io/apimachinery/pkg/runtime/schema" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" -+ "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - ) - --var ( -- ctx = ctrl.SetupSignalHandler() --) -+var ctx = ctrl.SetupSignalHandler() - - const ( - testClusterName = "test-cluster" -@@ -323,3 +324,112 @@ func TestCloneTemplateMissingSpecTemplate(t *testing.T) { - }) - g.Expect(err).To(HaveOccurred()) - } -+ -+func TestIsV1alpha4NotFoundFromDiscoveryError(t *testing.T) { -+ tests := []struct { -+ name string -+ err error -+ want bool -+ }{ -+ { -+ name: "the error we are looking for", -+ err: &apiutil.ErrResourceDiscoveryFailed{ -+ schema.GroupVersion{ -+ Group: "infrastructure.cluster.x-k8s.io", -+ Version: "v1alpha4", -+ }: apierrors.NewNotFound(schema.GroupResource{}, "infrastructure.cluster.x-k8s.io/v1alpha4"), -+ }, -+ want: true, -+ }, -+ { -+ name: "the error we are looking for infra api for but wrapped", -+ err: fmt.Errorf("failed to get restmapping: %w", -+ &apiutil.ErrResourceDiscoveryFailed{ -+ schema.GroupVersion{ -+ Group: "infrastructure.cluster.x-k8s.io", -+ Version: "v1alpha4", -+ }: apierrors.NewNotFound(schema.GroupResource{}, "infrastructure.cluster.x-k8s.io/v1alpha4"), -+ }, -+ ), -+ want: true, -+ }, -+ { -+ name: "the error we are looking for bootstrap api for but wrapped", -+ err: fmt.Errorf("failed to get restmapping: %w", -+ &apiutil.ErrResourceDiscoveryFailed{ -+ schema.GroupVersion{ -+ Group: "bootstrap.cluster.x-k8s.io", -+ Version: "v1beta1", -+ }: apierrors.NewNotFound(schema.GroupResource{}, "bootstrap.cluster.x-k8s.io/v1alpha4"), -+ }, -+ ), -+ want: true, -+ }, -+ { -+ name: "v1alpha4 not found with different group", -+ err: &apiutil.ErrResourceDiscoveryFailed{ -+ schema.GroupVersion{ -+ Group: "different.group", -+ Version: "v1alpha4", -+ }: apierrors.NewNotFound(schema.GroupResource{}, "different.group/v1alpha4"), -+ }, -+ want: false, -+ }, -+ { -+ name: "infrastructure.cluster.x-k8s.io not found error with different version", -+ err: &apiutil.ErrResourceDiscoveryFailed{ -+ schema.GroupVersion{ -+ Group: "infrastructure.cluster.x-k8s.io", -+ Version: "differentkind", -+ }: apierrors.NewNotFound(schema.GroupResource{}, "infrastructure.cluster.x-k8s.io/differentkind"), -+ }, -+ want: false, -+ }, -+ { -+ name: "infrastructure.cluster.x-k8s.io/v1alpha4 but different error that is not NotFound", -+ err: &apiutil.ErrResourceDiscoveryFailed{ -+ schema.GroupVersion{ -+ Group: "infrastructure.cluster.x-k8s.io", -+ Version: "v1alpha4", -+ }: errors.New("some other error"), -+ }, -+ want: false, -+ }, -+ { -+ name: "plain not found error", -+ err: &apierrors.StatusError{ -+ ErrStatus: metav1.Status{ -+ Reason: metav1.StatusReasonNotFound, -+ }, -+ }, -+ want: false, -+ }, -+ { -+ name: "infrastructure.cluster.x-k8s.io/v1alpha4 not found error", -+ err: &apierrors.StatusError{ -+ ErrStatus: metav1.Status{ -+ Reason: metav1.StatusReasonNotFound, -+ Message: "infrastructure.cluster.x-k8s.io/v1alpha4", -+ }, -+ }, -+ want: false, -+ }, -+ { -+ name: "not error", -+ err: nil, -+ want: false, -+ }, -+ { -+ name: "other error", -+ err: errors.New("some other error"), -+ want: false, -+ }, -+ } -+ -+ for _, test := range tests { -+ t.Run(test.name, func(t *testing.T) { -+ g := NewWithT(t) -+ g.Expect(isV1alpha4NotFoundFromDiscoveryError(test.err)).To(Equal(test.want)) -+ }) -+ } -+} --- -2.34.1 - diff --git a/projects/kubernetes-sigs/cluster-api/patches/0040-Use-controller-runtime-patch-for-restmapper-cache.patch b/projects/kubernetes-sigs/cluster-api/patches/0040-Use-controller-runtime-patch-for-restmapper-cache.patch new file mode 100644 index 0000000000..ee0d62031b --- /dev/null +++ b/projects/kubernetes-sigs/cluster-api/patches/0040-Use-controller-runtime-patch-for-restmapper-cache.patch @@ -0,0 +1,97 @@ +From 4c16d5689eb67b4d756ec53f28d83d7b07cfb6c4 Mon Sep 17 00:00:00 2001 +From: Guillermo Gaston +Date: Thu, 15 Feb 2024 15:04:46 +0000 +Subject: [PATCH 40/40] Use controller-runtime patch for restmapper cache + +This fixes the issue with a race condition when making v1alpha4 not +served. + +Using a merged but unreleased change. Will update to the release tag +once this is cut. +--- + go.mod | 2 ++ + go.sum | 4 ++-- + hack/tools/go.mod | 2 ++ + hack/tools/go.sum | 4 ++-- + test/go.mod | 2 ++ + test/go.sum | 4 ++-- + 6 files changed, 12 insertions(+), 6 deletions(-) + +diff --git a/go.mod b/go.mod +index 5fd1ce90d..ef3b70d54 100644 +--- a/go.mod ++++ b/go.mod +@@ -185,3 +185,5 @@ require ( + sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + ) ++ ++replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a +diff --git a/go.sum b/go.sum +index d8012dfe8..554e1f742 100644 +--- a/go.sum ++++ b/go.sum +@@ -1042,8 +1042,8 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= + rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 h1:trsWhjU5jZrx6UvFu4WzQDrN7Pga4a7Qg+zcfcj64PA= + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0= +-sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= +-sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= ++sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a h1:1veEwfhXsw2Afqx7EkhS9wOslyLuw6O8sRfGx23PfWs= ++sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= + sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= +diff --git a/hack/tools/go.mod b/hack/tools/go.mod +index 9ef6f6fa0..7e50e43e6 100644 +--- a/hack/tools/go.mod ++++ b/hack/tools/go.mod +@@ -139,3 +139,5 @@ require ( + sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + ) ++ ++replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a +diff --git a/hack/tools/go.sum b/hack/tools/go.sum +index 5fdaed1bd..e8a5d2fc6 100644 +--- a/hack/tools/go.sum ++++ b/hack/tools/go.sum +@@ -747,8 +747,8 @@ k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt + rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= + rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= + rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +-sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= +-sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= ++sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a h1:1veEwfhXsw2Afqx7EkhS9wOslyLuw6O8sRfGx23PfWs= ++sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= + sigs.k8s.io/controller-tools v0.13.0 h1:NfrvuZ4bxyolhDBt/rCZhDnx3M2hzlhgo5n3Iv2RykI= + sigs.k8s.io/controller-tools v0.13.0/go.mod h1:5vw3En2NazbejQGCeWKRrE7q4P+CW8/klfVqP8QZkgA= + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +diff --git a/test/go.mod b/test/go.mod +index 320e9d4de..cf2a4829e 100644 +--- a/test/go.mod ++++ b/test/go.mod +@@ -161,3 +161,5 @@ require ( + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + ) ++ ++replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a +diff --git a/test/go.sum b/test/go.sum +index 88a2ba2a8..31c05ac35 100644 +--- a/test/go.sum ++++ b/test/go.sum +@@ -865,8 +865,8 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= + rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 h1:trsWhjU5jZrx6UvFu4WzQDrN7Pga4a7Qg+zcfcj64PA= + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0= +-sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= +-sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= ++sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a h1:1veEwfhXsw2Afqx7EkhS9wOslyLuw6O8sRfGx23PfWs= ++sigs.k8s.io/controller-runtime v0.16.5-0.20240215143111-dca5e8b2b00a/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= + sigs.k8s.io/kind v0.20.0 h1:f0sc3v9mQbGnjBUaqSFST1dwIuiikKVGgoTwpoP33a8= +-- +2.34.1 +