From d7e4f2858fe2b8a225b1451ec71a272e62cd76d6 Mon Sep 17 00:00:00 2001 From: Jordan Keister Date: Wed, 4 Sep 2024 15:50:05 -0500 Subject: [PATCH 1/2] paging lister for CRDs Signed-off-by: Jordan Keister --- pkg/controller/operators/catalog/operator.go | 22 +++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/pkg/controller/operators/catalog/operator.go b/pkg/controller/operators/catalog/operator.go index 0d4449b619..3156bb0f19 100644 --- a/pkg/controller/operators/catalog/operator.go +++ b/pkg/controller/operators/catalog/operator.go @@ -45,6 +45,7 @@ import ( "k8s.io/client-go/metadata/metadatalister" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/tools/pager" "k8s.io/client-go/tools/record" "k8s.io/client-go/util/retry" "k8s.io/client-go/util/workqueue" @@ -2230,15 +2231,15 @@ func validateExistingCRs(dynamicClient dynamic.Interface, gr schema.GroupResourc return fmt.Errorf("error creating validator for schema version %s: %s", version, err) } gvr := schema.GroupVersionResource{Group: gr.Group, Version: version, Resource: gr.Resource} - crList, err := dynamicClient.Resource(gvr).List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return fmt.Errorf("error listing resources in GroupVersionResource %#v: %s", gvr, err) - } - - // validate each CR against this version schema - for _, cr := range crList.Items { - err = validation.ValidateCustomResource(field.NewPath(""), cr.UnstructuredContent(), validator).ToAggregate() + pager := pager.New(pager.SimplePageFunc(func(opts metav1.ListOptions) (runtime.Object, error) { + return dynamicClient.Resource(gvr).List(context.TODO(), metav1.ListOptions{}) + })) + validationFn := func(obj runtime.Object) error { + err = validation.ValidateCustomResource(field.NewPath(""), obj, validator).ToAggregate() if err != nil { + // lister will only provide unstructured objects as runtime.Object, so this should never fail to convert + // if it does, it's a programming error + cr := obj.(*unstructured.Unstructured) var namespacedName string if cr.GetNamespace() == "" { namespacedName = cr.GetName() @@ -2247,6 +2248,11 @@ func validateExistingCRs(dynamicClient dynamic.Interface, gr schema.GroupResourc } return validationError{fmt.Errorf("error validating %s %q: updated validation is too restrictive: %v", cr.GroupVersionKind(), namespacedName, err)} } + return nil + } + err = pager.EachListItem(context.Background(), metav1.ListOptions{}, validationFn) + if err != nil { + return err } } return nil From ca452bec6f199a9c686c9581c83d6ef5008b14b1 Mon Sep 17 00:00:00 2001 From: Jordan Keister Date: Thu, 5 Sep 2024 09:07:21 -0500 Subject: [PATCH 2/2] review resolutions Signed-off-by: Jordan Keister --- pkg/controller/operators/catalog/operator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/operators/catalog/operator.go b/pkg/controller/operators/catalog/operator.go index 3156bb0f19..7b16b62f3e 100644 --- a/pkg/controller/operators/catalog/operator.go +++ b/pkg/controller/operators/catalog/operator.go @@ -2232,7 +2232,7 @@ func validateExistingCRs(dynamicClient dynamic.Interface, gr schema.GroupResourc } gvr := schema.GroupVersionResource{Group: gr.Group, Version: version, Resource: gr.Resource} pager := pager.New(pager.SimplePageFunc(func(opts metav1.ListOptions) (runtime.Object, error) { - return dynamicClient.Resource(gvr).List(context.TODO(), metav1.ListOptions{}) + return dynamicClient.Resource(gvr).List(context.TODO(), opts) })) validationFn := func(obj runtime.Object) error { err = validation.ValidateCustomResource(field.NewPath(""), obj, validator).ToAggregate()