From fc2eeb912b539b3743ba7717ba263a13ee3f22c1 Mon Sep 17 00:00:00 2001 From: Camila Macedo <7708031+camilamacedo86@users.noreply.github.com> Date: Tue, 31 Mar 2026 18:53:56 +0200 Subject: [PATCH] Rename ClusterExtensionRevision to ClusterObjectSet --- cmd/cluster-olm-operator/main.go | 2 +- .../0000_51_olm_02_operator_clusterrole.yaml | 2 +- pkg/clients/clients.go | 76 +++++++++--------- .../incompatible_operator_controller.go | 80 +++++++++---------- .../incompatible_operator_controller_test.go | 72 ++++++++--------- 5 files changed, 116 insertions(+), 116 deletions(-) diff --git a/cmd/cluster-olm-operator/main.go b/cmd/cluster-olm-operator/main.go index af11f770c..2c05aa6b9 100644 --- a/cmd/cluster-olm-operator/main.go +++ b/cmd/cluster-olm-operator/main.go @@ -171,7 +171,7 @@ func runOperator(ctx context.Context, cc *controllercmd.ControllerContext) error currentOCPMinorVersion, cl.KubeClient, cl.ClusterExtensionClient, - cl.ClusterExtensionRevisionClient, + cl.ClusterObjectSetClient, cl.OperatorClient, currentFeatureGates, cc.EventRecorder.ForComponent("OLMIncompatibleOperatorController"), diff --git a/manifests/0000_51_olm_02_operator_clusterrole.yaml b/manifests/0000_51_olm_02_operator_clusterrole.yaml index 9b09c74a4..7a040d8bb 100644 --- a/manifests/0000_51_olm_02_operator_clusterrole.yaml +++ b/manifests/0000_51_olm_02_operator_clusterrole.yaml @@ -262,7 +262,7 @@ rules: - olm.operatorframework.io resources: - clusterextensions - - clusterextensionrevisions + - clusterobjectsets verbs: - get - list diff --git a/pkg/clients/clients.go b/pkg/clients/clients.go index 5b0323519..13f4644f2 100644 --- a/pkg/clients/clients.go +++ b/pkg/clients/clients.go @@ -54,22 +54,22 @@ import ( const defaultResyncPeriod = 10 * time.Minute type Clients struct { - KubeClient kubernetes.Interface - APIExtensionsClient apiextensionsclient.Interface - DynamicClient dynamic.Interface - RESTMapper meta.RESTMapper - OperatorClient *OperatorClient - OperatorInformers operatorinformers.SharedInformerFactory - ClusterExtensionClient *ClusterExtensionClient - ClusterExtensionRevisionClient *ClusterExtensionRevisionClient - ClusterCatalogClient *ClusterCatalogClient - ProxyClient *ProxyClient - ConfigClient configclient.Interface - KubeInformerFactory informers.SharedInformerFactory - ConfigInformerFactory configinformer.SharedInformerFactory - KubeInformersForNamespaces v1helpers.KubeInformersForNamespaces - FeatureGatesAccessor featuregates.FeatureGateAccess - FeatureGateMapper internalfeatures.MapperInterface + KubeClient kubernetes.Interface + APIExtensionsClient apiextensionsclient.Interface + DynamicClient dynamic.Interface + RESTMapper meta.RESTMapper + OperatorClient *OperatorClient + OperatorInformers operatorinformers.SharedInformerFactory + ClusterExtensionClient *ClusterExtensionClient + ClusterObjectSetClient *ClusterObjectSetClient + ClusterCatalogClient *ClusterCatalogClient + ProxyClient *ProxyClient + ConfigClient configclient.Interface + KubeInformerFactory informers.SharedInformerFactory + ConfigInformerFactory configinformer.SharedInformerFactory + KubeInformersForNamespaces v1helpers.KubeInformersForNamespaces + FeatureGatesAccessor featuregates.FeatureGateAccess + FeatureGateMapper internalfeatures.MapperInterface } func New(cc *controllercmd.ControllerContext) (*Clients, error) { @@ -118,21 +118,21 @@ func New(cc *controllercmd.ControllerContext) (*Clients, error) { configInformerFactory := configinformer.NewSharedInformerFactory(configClient, defaultResyncPeriod) return &Clients{ - KubeClient: kubeClient, - APIExtensionsClient: apiExtensionsClient, - DynamicClient: dynClient, - RESTMapper: rm, - OperatorClient: opClient, - OperatorInformers: operatorInformersFactory, - ClusterExtensionClient: NewClusterExtensionClient(dynClient), - ClusterCatalogClient: NewClusterCatalogClient(dynClient), - ClusterExtensionRevisionClient: NewClusterExtensionRevisionClient(dynClient), - ProxyClient: NewProxyClient(configInformerFactory), - ConfigClient: configClient, - KubeInformerFactory: informers.NewSharedInformerFactory(kubeClient, defaultResyncPeriod), - ConfigInformerFactory: configInformerFactory, - FeatureGatesAccessor: setupFeatureGatesAccessor(kubeClient, configInformerFactory, cc.OperatorNamespace), - FeatureGateMapper: internalfeatures.NewMapper(), + KubeClient: kubeClient, + APIExtensionsClient: apiExtensionsClient, + DynamicClient: dynClient, + RESTMapper: rm, + OperatorClient: opClient, + OperatorInformers: operatorInformersFactory, + ClusterExtensionClient: NewClusterExtensionClient(dynClient), + ClusterCatalogClient: NewClusterCatalogClient(dynClient), + ClusterObjectSetClient: NewClusterObjectSetClient(dynClient), + ProxyClient: NewProxyClient(configInformerFactory), + ConfigClient: configClient, + KubeInformerFactory: informers.NewSharedInformerFactory(kubeClient, defaultResyncPeriod), + ConfigInformerFactory: configInformerFactory, + FeatureGatesAccessor: setupFeatureGatesAccessor(kubeClient, configInformerFactory, cc.OperatorNamespace), + FeatureGateMapper: internalfeatures.NewMapper(), }, nil } @@ -142,7 +142,7 @@ func (c *Clients) StartInformers(ctx context.Context) { c.ConfigInformerFactory.Start(ctx.Done()) c.OperatorInformers.Start(ctx.Done()) c.ClusterExtensionClient.factory.Start(ctx.Done()) - c.ClusterExtensionRevisionClient.factory.Start(ctx.Done()) + c.ClusterObjectSetClient.factory.Start(ctx.Done()) c.ClusterCatalogClient.factory.Start(ctx.Done()) c.ProxyClient.factory.Start(ctx.Done()) if c.KubeInformersForNamespaces != nil { @@ -218,21 +218,21 @@ func NewClusterExtensionClient(dynClient dynamic.Interface) *ClusterExtensionCli } } -type ClusterExtensionRevisionClient struct { +type ClusterObjectSetClient struct { factory dynamicinformer.DynamicSharedInformerFactory informer informers.GenericInformer } -func (c ClusterExtensionRevisionClient) Informer() informers.GenericInformer { +func (c ClusterObjectSetClient) Informer() informers.GenericInformer { return c.informer } -func NewClusterExtensionRevisionClient(dynClient dynamic.Interface) *ClusterExtensionRevisionClient { +func NewClusterObjectSetClient(dynClient dynamic.Interface) *ClusterObjectSetClient { infFact := dynamicinformer.NewDynamicSharedInformerFactory(dynClient, defaultResyncPeriod) - clusterExtensionRevisionGVR := ocv1.GroupVersion.WithResource("clusterextensionrevisions") - inf := infFact.ForResource(clusterExtensionRevisionGVR) + clusterObjectSetGVR := ocv1.GroupVersion.WithResource("clusterobjectsets") + inf := infFact.ForResource(clusterObjectSetGVR) - return &ClusterExtensionRevisionClient{ + return &ClusterObjectSetClient{ factory: infFact, informer: inf, } diff --git a/pkg/controller/incompatible_operator_controller.go b/pkg/controller/incompatible_operator_controller.go index 106d7d9b0..b2f877b3d 100644 --- a/pkg/controller/incompatible_operator_controller.go +++ b/pkg/controller/incompatible_operator_controller.go @@ -48,14 +48,14 @@ const ( ) type incompatibleOperatorController struct { - name string - currentOCPMinorVersion *semver.Version - kubeclient kubernetes.Interface - clusterExtensionClient *clients.ClusterExtensionClient - clusterExtensionRevisionClient *clients.ClusterExtensionRevisionClient - operatorClient v1helpers.OperatorClient - featureGate featuregates.FeatureGate - logger logr.Logger + name string + currentOCPMinorVersion *semver.Version + kubeclient kubernetes.Interface + clusterExtensionClient *clients.ClusterExtensionClient + clusterObjectSetClient *clients.ClusterObjectSetClient + operatorClient v1helpers.OperatorClient + featureGate featuregates.FeatureGate + logger logr.Logger } func NewIncompatibleOperatorController( @@ -63,20 +63,20 @@ func NewIncompatibleOperatorController( currentOCPMinorVersion *semver.Version, kubeclient kubernetes.Interface, clusterExtensionClient *clients.ClusterExtensionClient, - clusterExtensionRevisionClient *clients.ClusterExtensionRevisionClient, + clusterObjectSetClient *clients.ClusterObjectSetClient, operatorClient v1helpers.OperatorClient, featureGate featuregates.FeatureGate, eventRecorder events.Recorder, ) factory.Controller { c := &incompatibleOperatorController{ - name: name, - currentOCPMinorVersion: currentOCPMinorVersion, - kubeclient: kubeclient, - clusterExtensionClient: clusterExtensionClient, - clusterExtensionRevisionClient: clusterExtensionRevisionClient, - operatorClient: operatorClient, - featureGate: featureGate, - logger: klog.NewKlogr().WithName(name), + name: name, + currentOCPMinorVersion: currentOCPMinorVersion, + kubeclient: kubeclient, + clusterExtensionClient: clusterExtensionClient, + clusterObjectSetClient: clusterObjectSetClient, + operatorClient: operatorClient, + featureGate: featureGate, + logger: klog.NewKlogr().WithName(name), } return factory.New().WithSync(c.sync).WithSyncDegradedOnError(operatorClient).WithInformers(operatorClient.Informer(), clusterExtensionClient.Informer().Informer()).ToController(name, eventRecorder) @@ -128,7 +128,7 @@ func (c *incompatibleOperatorController) sync(ctx context.Context, _ factory.Syn func (c *incompatibleOperatorController) getIncompatibleOperators() ([]string, error) { if c.isBoxCutterRuntimeEnabled() { - return c.getIncompatibleOperatorsFromExtensionRevision() + return c.getIncompatibleOperatorsFromObjectSet() } return c.getIncompatibleOperatorsFromHelmRelease() } @@ -195,7 +195,7 @@ func (c *incompatibleOperatorController) getIncompatibleOperatorsFromHelmRelease return incompatibleOperators, errors.Join(errs...) } -func (c *incompatibleOperatorController) getIncompatibleOperatorsFromExtensionRevision() ([]string, error) { +func (c *incompatibleOperatorController) getIncompatibleOperatorsFromObjectSet() ([]string, error) { var incompatibleOperators []string ceList, err := c.clusterExtensionClient.Informer().Lister().List(labels.NewSelector()) @@ -215,39 +215,39 @@ func (c *incompatibleOperatorController) getIncompatibleOperatorsFromExtensionRe name := metaObj.GetName() logger := c.logger.WithValues("clusterextension", name) - // Get extension revisions + // Get ClusterObjectSets owned by the extension selector, err := labels.Parse(fmt.Sprintf("%s=%s,%s=%s", ownerKindKey, ocv1.ClusterExtensionKind, ownerNameKey, name)) if err != nil { - errs = append(errs, fmt.Errorf("error parsing label selector for cluster extension revision %s: %v", name, err)) + errs = append(errs, fmt.Errorf("error parsing label selector for cluster object set %s: %v", name, err)) continue } - cerList, err := c.clusterExtensionRevisionClient.Informer().Lister().List(selector) + cosList, err := c.clusterObjectSetClient.Informer().Lister().List(selector) if err != nil { - errs = append(errs, fmt.Errorf("error listing cluster extension revision %s: %v", name, err)) + errs = append(errs, fmt.Errorf("error listing cluster object set %s: %v", name, err)) continue } - // Get most recent active revision - cer, err := getLatestRevision(cerList) + // Get most recent active object set + cos, err := getLatestObjectSet(cosList) if err != nil { errs = append(errs, err) continue } - if cer == nil { - logger.Info("No active revisions found for cluster extension") + if cos == nil { + logger.Info("No active object sets found for cluster extension") continue } - cerAnns := cer.GetAnnotations() + cosAnns := cos.GetAnnotations() - if _, ok := cerAnns[olmPropertiesKey]; !ok { + if _, ok := cosAnns[olmPropertiesKey]; !ok { logger.V(1).Info("Bundle has no olm properties") continue } - bundleName := cerAnns[bundleNameKey] + bundleName := cosAnns[bundleNameKey] logger = logger.WithValues("bundleName", bundleName) - props, err := propertyListFromPropertiesAnnotation(cerAnns[olmPropertiesKey]) + props, err := propertyListFromPropertiesAnnotation(cosAnns[olmPropertiesKey]) if err != nil { err = fmt.Errorf("could not convert olm.properties: %v", err) errs = append(errs, fmt.Errorf("error with cluster extension %s: error in bundle %s: %v", name, bundleName, err)) @@ -314,16 +314,16 @@ func (c *incompatibleOperatorController) checkIncompatibility(logger logr.Logger return isIncompatible, errs } -func getLatestRevision(cerList []runtime.Object) (metav1.Object, error) { - var cer metav1.Object +func getLatestObjectSet(objList []runtime.Object) (metav1.Object, error) { + var selected metav1.Object var maxRev int64 - for _, runtimeObj := range cerList { + for _, runtimeObj := range objList { obj, ok := runtimeObj.(*unstructured.Unstructured) if !ok { return nil, fmt.Errorf("metav1.Object type assertion failed for object %v", runtimeObj) } - // avoiding using ClusterExtensionRevision directly in case there are breaking changes in the serialization + // avoiding using ClusterObjectSet directly in case there are breaking changes in the serialization // of fields that we don't care about here as we iterate while in technical preview. // This helps avoid deadlocks where changes coming from the upstream break the OTE tests because // cluster-olm-operator is suffering from deserialization errors. These issues are not completely avoidable, @@ -336,20 +336,20 @@ func getLatestRevision(cerList []runtime.Object) (metav1.Object, error) { }{} if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, shortRev); err != nil { - return nil, fmt.Errorf("error converting revision object: %w", err) + return nil, fmt.Errorf("error converting object set: %w", err) } if shortRev.Spec.LifecycleState != revisionStateActive { continue } - // Take latest active revision - if cer == nil || shortRev.Spec.Revision > maxRev { + // Take latest active object set (highest spec.revision) + if selected == nil || shortRev.Spec.Revision > maxRev { maxRev = shortRev.Spec.Revision - cer = obj + selected = obj } } - return cer, nil + return selected, nil } func propertyListFromPropertiesAnnotation(raw string) ([]property.Property, error) { diff --git a/pkg/controller/incompatible_operator_controller_test.go b/pkg/controller/incompatible_operator_controller_test.go index d6af43e49..2e58a344a 100644 --- a/pkg/controller/incompatible_operator_controller_test.go +++ b/pkg/controller/incompatible_operator_controller_test.go @@ -35,11 +35,11 @@ import ( // based on the presence of incompatible operators func TestIncompatibleOperatorController_Sync(t *testing.T) { type args struct { - clusterExtensions []runtime.Object - clusterExtensionRevisions []runtime.Object - helmReleases []runtime.Object - currentOCPVersion string - boxCutterEnabled bool + clusterExtensions []runtime.Object + clusterObjectSets []runtime.Object + helmReleases []runtime.Object + currentOCPVersion string + boxCutterEnabled bool } type wants struct { expectErr bool @@ -82,8 +82,8 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { clusterExtensions: []runtime.Object{ createClusterExtension("test-operator"), }, - clusterExtensionRevisions: []runtime.Object{ - createRevision("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.18"}]`)), + clusterObjectSets: []runtime.Object{ + createObjectSet("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.18"}]`)), }, currentOCPVersion: "4.17.0", boxCutterEnabled: true, @@ -99,8 +99,8 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { clusterExtensions: []runtime.Object{ createClusterExtension("test-operator"), }, - clusterExtensionRevisions: []runtime.Object{ - createRevision("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", nil), + clusterObjectSets: []runtime.Object{ + createObjectSet("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", nil), }, currentOCPVersion: "4.17.0", boxCutterEnabled: true, @@ -116,8 +116,8 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { clusterExtensions: []runtime.Object{ createClusterExtension("test-operator"), }, - clusterExtensionRevisions: []runtime.Object{ - createRevision("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", olmPropertyAnnotation("")), + clusterObjectSets: []runtime.Object{ + createObjectSet("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", olmPropertyAnnotation("")), }, currentOCPVersion: "4.17.0", boxCutterEnabled: true, @@ -135,8 +135,8 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { clusterExtensions: []runtime.Object{ createClusterExtension("test-operator"), }, - clusterExtensionRevisions: []runtime.Object{ - createRevision("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", olmPropertyAnnotation("abcd")), + clusterObjectSets: []runtime.Object{ + createObjectSet("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", olmPropertyAnnotation("abcd")), }, currentOCPVersion: "4.17.0", boxCutterEnabled: true, @@ -154,8 +154,8 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { clusterExtensions: []runtime.Object{ createClusterExtension("test-operator"), }, - clusterExtensionRevisions: []runtime.Object{ - createRevision("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.17"}]`)), + clusterObjectSets: []runtime.Object{ + createObjectSet("test-operator-rev1", 1, "Active", "test-operator", "test-bundle-1.0", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.17"}]`)), }, currentOCPVersion: "4.17.0", boxCutterEnabled: true, @@ -173,9 +173,9 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { createClusterExtension("test-operator"), createClusterExtension("test-operator-2"), }, - clusterExtensionRevisions: []runtime.Object{ - createRevision("test-operator-rev3", 3, "Active", "test-operator", "test-bundle-1.2", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.17"}]`)), - createRevision("test-operator-rev1", 1, "Active", "test-operator-2", "test-bundle-1.2", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.18"}]`)), + clusterObjectSets: []runtime.Object{ + createObjectSet("test-operator-rev3", 3, "Active", "test-operator", "test-bundle-1.2", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.17"}]`)), + createObjectSet("test-operator-rev1", 1, "Active", "test-operator-2", "test-bundle-1.2", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.18"}]`)), }, currentOCPVersion: "4.17.0", boxCutterEnabled: true, @@ -192,11 +192,11 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { clusterExtensions: []runtime.Object{ createClusterExtension("test-operator"), }, - clusterExtensionRevisions: []runtime.Object{ - createRevision("test-operator-rev1", 1, "Archived", "test-operator", "test-bundle-1.0", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.17"}]`)), + clusterObjectSets: []runtime.Object{ + createObjectSet("test-operator-rev1", 1, "Archived", "test-operator", "test-bundle-1.0", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.17"}]`)), // set the non-latest revision to a compatible value to ensure the latest revision value is the one being used - createRevision("test-operator-rev2", 2, "Active", "test-operator", "test-bundle-1.1", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.18"}]`)), - createRevision("test-operator-rev3", 3, "Active", "test-operator", "test-bundle-1.2", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.17"}]`)), + createObjectSet("test-operator-rev2", 2, "Active", "test-operator", "test-bundle-1.1", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.18"}]`)), + createObjectSet("test-operator-rev3", 3, "Active", "test-operator", "test-bundle-1.2", olmPropertyAnnotation(`[{"type":"olm.maxOpenShiftVersion","value":"4.17"}]`)), }, currentOCPVersion: "4.17.0", boxCutterEnabled: true, @@ -344,11 +344,11 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { _ = operatorv1.AddToScheme(scheme) _ = corev1.AddToScheme(scheme) - allObjects := slices.Concat(tt.args.clusterExtensions, tt.args.clusterExtensionRevisions) + allObjects := slices.Concat(tt.args.clusterExtensions, tt.args.clusterObjectSets) dynClient := dynamicfake.NewSimpleDynamicClient(scheme, allObjects...) clusterExtensionClient := clients.NewClusterExtensionClient(dynClient) - clusterExtensionRevisionClient := clients.NewClusterExtensionRevisionClient(dynClient) + clusterObjectSetClient := clients.NewClusterObjectSetClient(dynClient) // Setup kube client with Helm releases kubeClient := fake.NewClientset(tt.args.helmReleases...) @@ -362,22 +362,22 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { // Create controller controller := &incompatibleOperatorController{ - name: "test-controller", - currentOCPMinorVersion: &version, - kubeclient: kubeClient, - clusterExtensionClient: clusterExtensionClient, - clusterExtensionRevisionClient: clusterExtensionRevisionClient, - operatorClient: operatorClient, - featureGate: featureGate, - logger: klog.NewKlogr(), + name: "test-controller", + currentOCPMinorVersion: &version, + kubeclient: kubeClient, + clusterExtensionClient: clusterExtensionClient, + clusterObjectSetClient: clusterObjectSetClient, + operatorClient: operatorClient, + featureGate: featureGate, + logger: klog.NewKlogr(), } // Add objects to informer cache for _, ce := range tt.args.clusterExtensions { _ = clusterExtensionClient.Informer().Informer().GetIndexer().Add(ce) } - for _, rev := range tt.args.clusterExtensionRevisions { - _ = clusterExtensionRevisionClient.Informer().Informer().GetIndexer().Add(rev) + for _, obj := range tt.args.clusterObjectSets { + _ = clusterObjectSetClient.Informer().Informer().GetIndexer().Add(obj) } // Call sync @@ -415,7 +415,7 @@ func TestIncompatibleOperatorController_Sync(t *testing.T) { } } -func createRevision(name string, revision int64, lifecycleState string, ownerName string, bundleName string, annotations map[string]string) *unstructured.Unstructured { +func createObjectSet(name string, revision int64, lifecycleState string, ownerName string, bundleName string, annotations map[string]string) *unstructured.Unstructured { revAnnotations := map[string]interface{}{ bundleNameKey: bundleName, } @@ -426,7 +426,7 @@ func createRevision(name string, revision int64, lifecycleState string, ownerNam return &unstructured.Unstructured{ Object: map[string]interface{}{ "apiVersion": "olm.operatorframework.io/v1", - "kind": "ClusterExtensionRevision", + "kind": "ClusterObjectSet", "metadata": map[string]interface{}{ "name": name, "annotations": revAnnotations,