From 7b53de47d3150f608ecbaa82c8d5b62d9d843063 Mon Sep 17 00:00:00 2001 From: Guillermo Gaston Date: Wed, 14 Feb 2024 13:24:14 -0600 Subject: [PATCH] Go back to capi patch for CRD race condition (#2923) The patch in upstream controller-runtime left one scenario unsolved and we happen to now be hitting it. I'm working on fixing this upstream but in the meantime we are going back to the original patch. --- .../cluster-api/ATTRIBUTION.txt | 2 +- .../cluster-api/CAPD_ATTRIBUTION.txt | 2 +- .../kubernetes-sigs/cluster-api/CHECKSUMS | 20 +- ...0-Bump-controller-runtime-to-v0.16.4.patch | 101 -------- ...er-if-RESTMapping-outdated-cache-is-.patch | 217 ++++++++++++++++++ 5 files changed, 229 insertions(+), 113 deletions(-) delete mode 100644 projects/kubernetes-sigs/cluster-api/patches/0040-Bump-controller-runtime-to-v0.16.4.patch create mode 100644 projects/kubernetes-sigs/cluster-api/patches/0040-Restart-controller-if-RESTMapping-outdated-cache-is-.patch diff --git a/projects/kubernetes-sigs/cluster-api/ATTRIBUTION.txt b/projects/kubernetes-sigs/cluster-api/ATTRIBUTION.txt index 804621a85d..68011770e1 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.4 -- +** sigs.k8s.io/controller-runtime; version v0.16.3 -- 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 f90236f10d..f0d1c44e7a 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.4 -- +** sigs.k8s.io/controller-runtime; version v0.16.3 -- 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 5305917113..fcc4aee451 100644 --- a/projects/kubernetes-sigs/cluster-api/CHECKSUMS +++ b/projects/kubernetes-sigs/cluster-api/CHECKSUMS @@ -1,10 +1,10 @@ -edb650666212458d2933b237cc8e971a28c325ad991aa7867a6700a9955a1836 _output/bin/cluster-api/linux-amd64/cluster-api-provider-docker-manager -8bf3a6e1497a0bc7365b48696e6310fcadef949eeb50b77a8e8769622b6451e4 _output/bin/cluster-api/linux-amd64/clusterctl -09a9e9ce38948db589e036bce31fa566454b4a0cf4a39bb63226b7d2c95c43d4 _output/bin/cluster-api/linux-amd64/kubeadm-bootstrap-manager -3be6e1f055c662f872cb4059ce4489659db439312a4eb0326f16142322008f27 _output/bin/cluster-api/linux-amd64/kubeadm-control-plane-manager -64e208ec15e035c6818af46e4a097f890db3b1473f31c59d1d5a6b564f97aa83 _output/bin/cluster-api/linux-amd64/manager -78195694b39ddbac6a08be081b0ca457c8c795731d370fd86d918ef966987b52 _output/bin/cluster-api/linux-arm64/cluster-api-provider-docker-manager -aebe6f8a5af764f6f9bad56bab9bd811ce85e3bd2cec1effcc60c816aa96026d _output/bin/cluster-api/linux-arm64/clusterctl -0c6aed4aaf5c128759db833844c0663cb9a80d07975598f7f0176bfac045ebbc _output/bin/cluster-api/linux-arm64/kubeadm-bootstrap-manager -a7da98ce118f366689f05e36ef9f163e2395509a4e75b4139d8f147a6c1e9e0e _output/bin/cluster-api/linux-arm64/kubeadm-control-plane-manager -1375fa164a8b2679d4c3801101954ad8522ea34ab1f9c7db1df752cf34d6ff71 _output/bin/cluster-api/linux-arm64/manager +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 diff --git a/projects/kubernetes-sigs/cluster-api/patches/0040-Bump-controller-runtime-to-v0.16.4.patch b/projects/kubernetes-sigs/cluster-api/patches/0040-Bump-controller-runtime-to-v0.16.4.patch deleted file mode 100644 index 485af1bcff..0000000000 --- a/projects/kubernetes-sigs/cluster-api/patches/0040-Bump-controller-runtime-to-v0.16.4.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 185cbc7b384eb524b938b86563890e57f23a1163 Mon Sep 17 00:00:00 2001 -From: Guillermo Gaston -Date: Fri, 9 Feb 2024 10:24:20 -0600 -Subject: [PATCH 40/40] Bump controller-runtime to v0.16.4 - ---- - 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, 9 insertions(+), 9 deletions(-) - -diff --git a/go.mod b/go.mod -index 5fd1ce90d..c4f3f779e 100644 ---- a/go.mod -+++ b/go.mod -@@ -46,7 +46,7 @@ require ( - k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 - k8s.io/kubectl v0.28.4 - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 -- sigs.k8s.io/controller-runtime v0.16.3 -+ sigs.k8s.io/controller-runtime v0.16.4 - sigs.k8s.io/yaml v1.4.0 - ) - -diff --git a/go.sum b/go.sum -index d8012dfe8..dd84b7595 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.4 h1:XMh7dF19MlyvMfQCHvH929YGg2WFrIuJ4N5sx3G7U+k= -+sigs.k8s.io/controller-runtime v0.16.4/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..91d24afb7 100644 ---- a/hack/tools/go.mod -+++ b/hack/tools/go.mod -@@ -22,7 +22,7 @@ require ( - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 - sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000 - sigs.k8s.io/cluster-api/test v0.0.0-00010101000000-000000000000 -- sigs.k8s.io/controller-runtime v0.16.3 -+ sigs.k8s.io/controller-runtime v0.16.4 - sigs.k8s.io/controller-tools v0.13.0 - sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d - sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 -diff --git a/hack/tools/go.sum b/hack/tools/go.sum -index 5fdaed1bd..aa8023fc1 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.4 h1:XMh7dF19MlyvMfQCHvH929YGg2WFrIuJ4N5sx3G7U+k= -+sigs.k8s.io/controller-runtime v0.16.4/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..4f839280d 100644 ---- a/test/go.mod -+++ b/test/go.mod -@@ -32,7 +32,7 @@ require ( - k8s.io/klog/v2 v2.100.1 - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 - sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000 -- sigs.k8s.io/controller-runtime v0.16.3 -+ sigs.k8s.io/controller-runtime v0.16.4 - sigs.k8s.io/kind v0.20.0 - sigs.k8s.io/yaml v1.4.0 - ) -diff --git a/test/go.sum b/test/go.sum -index 88a2ba2a8..c63b7a13f 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.4 h1:XMh7dF19MlyvMfQCHvH929YGg2WFrIuJ4N5sx3G7U+k= -+sigs.k8s.io/controller-runtime v0.16.4/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 - 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 new file mode 100644 index 0000000000..78c7fadd80 --- /dev/null +++ b/projects/kubernetes-sigs/cluster-api/patches/0040-Restart-controller-if-RESTMapping-outdated-cache-is-.patch @@ -0,0 +1,217 @@ +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 +