diff --git a/go.mod b/go.mod index 455b41ea9..40811e994 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( k8s.io/component-base v0.24.3 k8s.io/klog/v2 v2.70.0 k8s.io/kube-aggregator v0.24.3 - open-cluster-management.io/api v0.9.1-0.20221116150238-55691c2c5f04 + open-cluster-management.io/api v0.10.1-0.20230208112741-9a2b4f0edd3d sigs.k8s.io/controller-runtime v0.12.3 sigs.k8s.io/kube-storage-version-migrator v0.0.5 ) @@ -70,7 +70,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.1.2 // indirect + github.com/google/uuid v1.2.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect diff --git a/go.sum b/go.sum index a46ea881e..ed0e25c80 100644 --- a/go.sum +++ b/go.sum @@ -345,8 +345,9 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= @@ -1234,8 +1235,8 @@ k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -open-cluster-management.io/api v0.9.1-0.20221116150238-55691c2c5f04 h1:lXewKgs1MeWN1wPIlMGQxfQj83CgjkNXQKVJVYQEB5I= -open-cluster-management.io/api v0.9.1-0.20221116150238-55691c2c5f04/go.mod h1:9KkJPh/zpDevXj2P+zkvSVjC2pq2PQ1JDNLLEes8TEc= +open-cluster-management.io/api v0.10.1-0.20230208112741-9a2b4f0edd3d h1:y18swHf6uA6UoAkqOx9ZXL7GJxGkale0H9qA1oeI3mk= +open-cluster-management.io/api v0.10.1-0.20230208112741-9a2b4f0edd3d/go.mod h1:6BB/Y6r3hXlPjpJgDwIs6Ubxyx/kXXOg6D9Cntg1I9E= 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= diff --git a/manifests/cluster-manager/cluster-manager-managedclustersetbindings-migration.yaml b/manifests/cluster-manager/cluster-manager-managedclustersetbindings-migration.yaml new file mode 100644 index 000000000..1277ea862 --- /dev/null +++ b/manifests/cluster-manager/cluster-manager-managedclustersetbindings-migration.yaml @@ -0,0 +1,9 @@ +apiVersion: migration.k8s.io/v1alpha1 +kind: StorageVersionMigration +metadata: + name: managedclustersetbindings.cluster.open-cluster-management.io +spec: + resource: + group: cluster.open-cluster-management.io + resource: managedclustersetbindings + version: v1beta1 diff --git a/manifests/cluster-manager/cluster-manager-managedclustersets-migration.yaml b/manifests/cluster-manager/cluster-manager-managedclustersets-migration.yaml new file mode 100644 index 000000000..0d955666c --- /dev/null +++ b/manifests/cluster-manager/cluster-manager-managedclustersets-migration.yaml @@ -0,0 +1,9 @@ +apiVersion: migration.k8s.io/v1alpha1 +kind: StorageVersionMigration +metadata: + name: managedclustersets.cluster.open-cluster-management.io +spec: + resource: + group: cluster.open-cluster-management.io + resource: managedclustersets + version: v1beta1 diff --git a/manifests/cluster-manager/hub/0000_00_clusters.open-cluster-management.io_managedclustersets.crd-hosted.yaml b/manifests/cluster-manager/hub/0000_00_clusters.open-cluster-management.io_managedclustersets.crd-hosted.yaml deleted file mode 100644 index a543045ff..000000000 --- a/manifests/cluster-manager/hub/0000_00_clusters.open-cluster-management.io_managedclustersets.crd-hosted.yaml +++ /dev/null @@ -1,146 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: managedclustersets.cluster.open-cluster-management.io -spec: - group: cluster.open-cluster-management.io - names: - kind: ManagedClusterSet - listKind: ManagedClusterSetList - plural: managedclustersets - shortNames: - - mclset - - mclsets - singular: managedclusterset - scope: Cluster - preserveUnknownFields: false - versions: - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="ClusterSetEmpty")].status - name: Empty - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: "ManagedClusterSet defines a group of ManagedClusters that user's workload can run on. A workload can be defined to deployed on a ManagedClusterSet, which mean: 1. The workload can run on any ManagedCluster in the ManagedClusterSet 2. The workload cannot run on any ManagedCluster outside the ManagedClusterSet 3. The service exposed by the workload can be shared in any ManagedCluster in the ManagedClusterSet \n In order to assign a ManagedCluster to a certian ManagedClusterSet, add a label with name `cluster.open-cluster-management.io/clusterset` on the ManagedCluster to refers to the ManagedClusterSet. User is not allow to add/remove this label on a ManagedCluster unless they have a RBAC rule to CREATE on a virtual subresource of managedclustersets/join. In order to update this label, user must have the permission on both the old and new ManagedClusterSet." - type: object - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec defines the attributes of the ManagedClusterSet - type: object - default: - clusterSelector: - selectorType: LegacyClusterSetLabel - properties: - clusterSelector: - description: ClusterSelector represents a selector of ManagedClusters - type: object - default: - selectorType: LegacyClusterSetLabel - properties: - labelSelector: - description: LabelSelector define the general labelSelector which clusterset will use to select target managedClusters - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - selectorType: - description: SelectorType could only be "LegacyClusterSetLabel" or "LabelSelector" "LegacyClusterSetLabel" means to use label "cluster.open-cluster-management.io/clusterset:"" to select target clusters. "LabelSelector" means use labelSelector to select target managedClusters - type: string - default: LegacyClusterSetLabel - enum: - - LegacyClusterSetLabel - - LabelSelector - status: - description: Status represents the current status of the ManagedClusterSet - type: object - properties: - conditions: - description: Conditions contains the different condition statuses for this ManagedClusterSet. - type: array - items: - 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: object - required: - - lastTransitionTime - - message - - reason - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - type: string - format: date-time - message: - description: message is a human readable message indicating details about the transition. This may be an empty string. - type: string - maxLength: 32768 - observedGeneration: - description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. - type: integer - format: int64 - minimum: 0 - reason: - description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. - type: string - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - status: - description: status of the condition, one of True, False, Unknown. - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - type: string - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/manifests/cluster-manager/hub/0000_00_clusters.open-cluster-management.io_managedclustersets.crd.yaml b/manifests/cluster-manager/hub/0000_00_clusters.open-cluster-management.io_managedclustersets.crd.yaml index cad76cd6c..548be13bd 100644 --- a/manifests/cluster-manager/hub/0000_00_clusters.open-cluster-management.io_managedclustersets.crd.yaml +++ b/manifests/cluster-manager/hub/0000_00_clusters.open-cluster-management.io_managedclustersets.crd.yaml @@ -212,7 +212,7 @@ spec: type: object type: object served: true - storage: true + storage: false subresources: status: {} - additionalPrinterColumns: @@ -396,7 +396,7 @@ spec: type: object type: object served: true - storage: false + storage: true subresources: status: {} status: diff --git a/manifests/cluster-manager/hub/0000_01_clusters.open-cluster-management.io_managedclustersetbindings.crd.yaml b/manifests/cluster-manager/hub/0000_01_clusters.open-cluster-management.io_managedclustersetbindings.crd.yaml index bf35bb406..156816f6d 100644 --- a/manifests/cluster-manager/hub/0000_01_clusters.open-cluster-management.io_managedclustersetbindings.crd.yaml +++ b/manifests/cluster-manager/hub/0000_01_clusters.open-cluster-management.io_managedclustersetbindings.crd.yaml @@ -88,7 +88,7 @@ spec: maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ served: true - storage: true + storage: false subresources: status: {} - name: v1beta2 @@ -162,7 +162,7 @@ spec: maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ served: true - storage: false + storage: true subresources: status: {} status: diff --git a/pkg/operators/clustermanager/controllers/clustermanagercontroller/clustermanager_crd_reconcile.go b/pkg/operators/clustermanager/controllers/clustermanagercontroller/clustermanager_crd_reconcile.go index 749a28a2d..c84120bc0 100644 --- a/pkg/operators/clustermanager/controllers/clustermanagercontroller/clustermanager_crd_reconcile.go +++ b/pkg/operators/clustermanager/controllers/clustermanagercontroller/clustermanager_crd_reconcile.go @@ -7,6 +7,8 @@ package clustermanagercontroller import ( "context" "fmt" + "reflect" + "github.com/openshift/library-go/pkg/assets" "github.com/openshift/library-go/pkg/operator/events" "github.com/openshift/library-go/pkg/operator/resource/resourceapply" @@ -21,7 +23,6 @@ import ( "open-cluster-management.io/registration-operator/pkg/helpers" "open-cluster-management.io/registration-operator/pkg/operators/clustermanager/controllers/migrationcontroller" "open-cluster-management.io/registration-operator/pkg/operators/crdmanager" - "reflect" migrationclient "sigs.k8s.io/kube-storage-version-migrator/pkg/clients/clientset/typed/migration/v1alpha1" ) @@ -51,10 +52,8 @@ var ( // removed CRD StoredVersions removedCRDStoredVersions = map[string]string{ - "placements.cluster.open-cluster-management.io": "v1alpha1", - "placementdecisions.cluster.open-cluster-management.io": "v1alpha1", - "managedclustersets.cluster.open-cluster-management.io": "v1alpha1", - "managedclustersetbindings.cluster.open-cluster-management.io": "v1alpha1", + "managedclustersets.cluster.open-cluster-management.io": "v1beta1", + "managedclustersetbindings.cluster.open-cluster-management.io": "v1beta1", } ) @@ -163,7 +162,7 @@ func (c *crdReconcile) updateStoredVersion(ctx context.Context) error { continue } - // remove v1alpha1 from its status + // remove old versions from its status oldStoredVersions := crd.Status.StoredVersions newStoredVersions := make([]string, 0, len(oldStoredVersions)) for _, stored := range oldStoredVersions { diff --git a/pkg/operators/clustermanager/controllers/migrationcontroller/migration_controller.go b/pkg/operators/clustermanager/controllers/migrationcontroller/migration_controller.go index eca368b42..f25f36ab9 100644 --- a/pkg/operators/clustermanager/controllers/migrationcontroller/migration_controller.go +++ b/pkg/operators/clustermanager/controllers/migrationcontroller/migration_controller.go @@ -44,7 +44,10 @@ var ( // migrationRequestFiles = []string{ // "cluster-manager/cluster-manager-managedclustersets-migration.yaml", // } - migrationRequestFiles = []string{} + migrationRequestFiles = []string{ + "cluster-manager/cluster-manager-managedclustersets-migration.yaml", + "cluster-manager/cluster-manager-managedclustersetbindings-migration.yaml", + } ) const ( diff --git a/pkg/operators/clustermanager/controllers/migrationcontroller/migration_controller_test.go b/pkg/operators/clustermanager/controllers/migrationcontroller/migration_controller_test.go index 85e4b71ed..26a63a9bf 100644 --- a/pkg/operators/clustermanager/controllers/migrationcontroller/migration_controller_test.go +++ b/pkg/operators/clustermanager/controllers/migrationcontroller/migration_controller_test.go @@ -61,15 +61,11 @@ func TestApplyStorageVersionMigrations(t *testing.T) { { name: "created", validateActions: func(t *testing.T, actions []clienttesting.Action) { - assertActions(t, actions, "get", "create", "get", "create", "get", "create", "get", "create") + assertActions(t, actions, "get", "create", "get", "create") actual := actions[1].(clienttesting.CreateActionImpl).Object assertStorageVersionMigration(t, "managedclustersets.cluster.open-cluster-management.io", actual) actual = actions[3].(clienttesting.CreateActionImpl).Object assertStorageVersionMigration(t, "managedclustersetbindings.cluster.open-cluster-management.io", actual) - actual = actions[5].(clienttesting.CreateActionImpl).Object - assertStorageVersionMigration(t, "placements.cluster.open-cluster-management.io", actual) - actual = actions[7].(clienttesting.CreateActionImpl).Object - assertStorageVersionMigration(t, "placementdecisions.cluster.open-cluster-management.io", actual) }, }, { @@ -87,15 +83,11 @@ func TestApplyStorageVersionMigrations(t *testing.T) { }, }, validateActions: func(t *testing.T, actions []clienttesting.Action) { - assertActions(t, actions, "get", "create", "get", "update", "get", "create", "get", "update") + assertActions(t, actions, "get", "create", "get", "update") actual := actions[1].(clienttesting.CreateActionImpl).Object assertStorageVersionMigration(t, "managedclustersets.cluster.open-cluster-management.io", actual) actual = actions[3].(clienttesting.UpdateActionImpl).Object assertStorageVersionMigration(t, "managedclustersetbindings.cluster.open-cluster-management.io", actual) - actual = actions[5].(clienttesting.CreateActionImpl).Object - assertStorageVersionMigration(t, "placements.cluster.open-cluster-management.io", actual) - actual = actions[7].(clienttesting.UpdateActionImpl).Object - assertStorageVersionMigration(t, "placementdecisions.cluster.open-cluster-management.io", actual) }, }, } diff --git a/test/e2e/clusterset_test.go b/test/e2e/clusterset_test.go index 56d294625..489763fd3 100644 --- a/test/e2e/clusterset_test.go +++ b/test/e2e/clusterset_test.go @@ -12,6 +12,11 @@ import ( clusterv1beta2 "open-cluster-management.io/api/cluster/v1beta2" ) +const ( + clustersetCrdName = "managedclustersets.cluster.open-cluster-management.io" + clustersetBindingCrdName = "managedclustersetbindings.cluster.open-cluster-management.io" +) + var _ = ginkgo.Describe("Create v1beta2 managedclusterset", func() { ginkgo.It("Create a v1beta2 labelselector based ManagedClusterSet and get/update/delete with v1beta2 client", func() { ginkgo.By("Create a v1beta2 ManagedClusterSet") @@ -113,4 +118,34 @@ var _ = ginkgo.Describe("Create v1beta2 managedclusterset", func() { err := t.ClusterClient.ClusterV1beta1().ManagedClusterSets().Delete(context.Background(), managedClusterSetName, metav1.DeleteOptions{}) gomega.Expect(err).ToNot(gomega.HaveOccurred()) }) + ginkgo.It("Check if the v1beta1 storageversion is removed from clusterset crd", func() { + gomega.Eventually(func() error { + clustersetCrd, err := t.HubAPIExtensionClient.ApiextensionsV1().CustomResourceDefinitions().Get(context.Background(), clustersetCrdName, metav1.GetOptions{}) + if err != nil { + return err + } + if len(clustersetCrd.Status.StoredVersions) != 1 { + return fmt.Errorf("clustersetCrd.Status.StoredVersions should be v1beta2, but got:%v", clustersetCrd.Status.StoredVersions) + } + if clustersetCrd.Status.StoredVersions[0] != "v1beta2" { + return fmt.Errorf("clustersetCrd.Status.StoredVersions should be v1beta2, but got:%v", clustersetCrd.Status.StoredVersions) + } + return nil + }, t.EventuallyTimeout*5, t.EventuallyInterval*5).Should(gomega.Succeed()) + }) + ginkgo.It("Check if the v1beta1 storageversion is removed from clustersetbinding crd", func() { + gomega.Eventually(func() error { + clustersetBindingCrd, err := t.HubAPIExtensionClient.ApiextensionsV1().CustomResourceDefinitions().Get(context.Background(), clustersetBindingCrdName, metav1.GetOptions{}) + if err != nil { + return err + } + if len(clustersetBindingCrd.Status.StoredVersions) != 1 { + return fmt.Errorf("clustersetBindingCrd.Status.StoredVersions should be v1beta2, but got:%v", clustersetBindingCrd.Status.StoredVersions) + } + if clustersetBindingCrd.Status.StoredVersions[0] != "v1beta2" { + return fmt.Errorf("clustersetBindingCrd.Status.StoredVersions should be v1beta2, but got:%v", clustersetBindingCrd.Status.StoredVersions) + } + return nil + }, t.EventuallyTimeout*5, t.EventuallyInterval*5).Should(gomega.Succeed()) + }) }) diff --git a/test/e2e/common.go b/test/e2e/common.go index eb1b2a483..8efaa99a2 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -12,6 +12,7 @@ import ( "k8s.io/klog/v2" "github.com/onsi/gomega" + apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" certificatesv1 "k8s.io/api/certificates/v1" coordv1 "k8s.io/api/coordination/v1" @@ -38,6 +39,7 @@ import ( type Tester struct { kubeconfigPath string KubeClient kubernetes.Interface + HubAPIExtensionClient apiextensionsclient.Interface ClusterCfg *rest.Config OperatorClient operatorclient.Interface ClusterClient clusterclient.Interface @@ -95,6 +97,11 @@ func (t *Tester) Init() error { klog.Errorf("failed to get KubeClient. %v", err) return err } + + if t.HubAPIExtensionClient, err = apiextensionsclient.NewForConfig(t.ClusterCfg); err != nil { + klog.Errorf("failed to get HubApiExtensionClient. %v", err) + return err + } if t.OperatorClient, err = operatorclient.NewForConfig(t.ClusterCfg); err != nil { klog.Errorf("failed to get OperatorClient. %v", err) return err diff --git a/vendor/github.com/google/uuid/hash.go b/vendor/github.com/google/uuid/hash.go index b17461631..b404f4bec 100644 --- a/vendor/github.com/google/uuid/hash.go +++ b/vendor/github.com/google/uuid/hash.go @@ -26,8 +26,8 @@ var ( // NewMD5 and NewSHA1. func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { h.Reset() - h.Write(space[:]) - h.Write(data) + h.Write(space[:]) //nolint:errcheck + h.Write(data) //nolint:errcheck s := h.Sum(nil) var uuid UUID copy(uuid[:], s) diff --git a/vendor/github.com/google/uuid/sql.go b/vendor/github.com/google/uuid/sql.go index f326b54db..2e02ec06c 100644 --- a/vendor/github.com/google/uuid/sql.go +++ b/vendor/github.com/google/uuid/sql.go @@ -9,7 +9,7 @@ import ( "fmt" ) -// Scan implements sql.Scanner so UUIDs can be read from databases transparently +// Scan implements sql.Scanner so UUIDs can be read from databases transparently. // Currently, database types that map to string and []byte are supported. Please // consult database-specific driver documentation for matching types. func (uuid *UUID) Scan(src interface{}) error { diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go index 524404cc5..60d26bb50 100644 --- a/vendor/github.com/google/uuid/uuid.go +++ b/vendor/github.com/google/uuid/uuid.go @@ -35,6 +35,12 @@ const ( var rander = rand.Reader // random function +type invalidLengthError struct{ len int } + +func (err invalidLengthError) Error() string { + return fmt.Sprintf("invalid UUID length: %d", err.len) +} + // Parse decodes s into a UUID or returns an error. Both the standard UUID // forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the @@ -68,7 +74,7 @@ func Parse(s string) (UUID, error) { } return uuid, nil default: - return uuid, fmt.Errorf("invalid UUID length: %d", len(s)) + return uuid, invalidLengthError{len(s)} } // s is now at least 36 bytes long // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx @@ -112,7 +118,7 @@ func ParseBytes(b []byte) (UUID, error) { } return uuid, nil default: - return uuid, fmt.Errorf("invalid UUID length: %d", len(b)) + return uuid, invalidLengthError{len(b)} } // s is now at least 36 bytes long // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go index c110465db..86160fbd0 100644 --- a/vendor/github.com/google/uuid/version4.go +++ b/vendor/github.com/google/uuid/version4.go @@ -14,6 +14,14 @@ func New() UUID { return Must(NewRandom()) } +// NewString creates a new random UUID and returns it as a string or panics. +// NewString is equivalent to the expression +// +// uuid.New().String() +func NewString() string { + return Must(NewRandom()).String() +} + // NewRandom returns a Random (Version 4) UUID. // // The strength of the UUIDs is based on the strength of the crypto/rand diff --git a/vendor/modules.txt b/vendor/modules.txt index e4de047ec..b28c29ea5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -95,7 +95,7 @@ github.com/google/go-cmp/cmp/internal/value # github.com/google/gofuzz v1.1.0 ## explicit; go 1.12 github.com/google/gofuzz -# github.com/google/uuid v1.1.2 +# github.com/google/uuid v1.2.0 ## explicit github.com/google/uuid # github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 @@ -1170,7 +1170,7 @@ k8s.io/utils/path k8s.io/utils/pointer k8s.io/utils/strings/slices k8s.io/utils/trace -# open-cluster-management.io/api v0.9.1-0.20221116150238-55691c2c5f04 +# open-cluster-management.io/api v0.10.1-0.20230208112741-9a2b4f0edd3d ## explicit; go 1.19 open-cluster-management.io/api/addon/v1alpha1 open-cluster-management.io/api/client/addon/clientset/versioned diff --git a/vendor/open-cluster-management.io/api/addon/v1alpha1/types_managedclusteraddon.go b/vendor/open-cluster-management.io/api/addon/v1alpha1/types_managedclusteraddon.go index 9fe2d16a0..f7ce437ec 100644 --- a/vendor/open-cluster-management.io/api/addon/v1alpha1/types_managedclusteraddon.go +++ b/vendor/open-cluster-management.io/api/addon/v1alpha1/types_managedclusteraddon.go @@ -216,3 +216,57 @@ type ManagedClusterAddOnList struct { Items []ManagedClusterAddOn `json:"items"` } + +const ( + // Label and annotation keys set on ManagedClusterAddon. + + // AddonLabelKey is the label key to set addon name. It is to set on the resources on the hub relating + // to an addon + AddonLabelKey = "open-cluster-management.io/addon-name" + + // DisableAddonAutomaticInstallationAnnotationKey is the annotation key for disabling the functionality of + // installing addon automatically. it should be set on ManagedClusterAddon resource only. + DisableAddonAutomaticInstallationAnnotationKey = "addon.open-cluster-management.io/disable-automatic-installation" + + // AddonNamespaceLabelKey is the label key to set namespace of ManagedClusterAddon. + AddonNamespaceLabelKey = "open-cluster-management.io/addon-namespace" + + // Label and annotation keys set on manifests of addon agent. + + // AddonPreDeleteHookLabelKey is the label key to identify that a resource manifest is used as pre-delete hook for an addon + // and should be created and deleted before the specified ManagedClusterAddon is deleted. + // Deprecated, and will be removed in the future release, please use annotation AddonPreDeleteHookAnnotationKey from v0.10.0. + AddonPreDeleteHookLabelKey = "open-cluster-management.io/addon-pre-delete" + + // AddonPreDeleteHookAnnotationKey is the annotation key to identify that a resource manifest is used as pre-delete hook for an addon + // and should be created and deleted before the specified ManagedClusterAddon is deleted. + AddonPreDeleteHookAnnotationKey = "addon.open-cluster-management.io/addon-pre-delete" + + // HostingClusterNameAnnotationKey is the annotation key for indicating the hosting cluster name, it should be set + // on ManagedClusterAddon resource only. + HostingClusterNameAnnotationKey = "addon.open-cluster-management.io/hosting-cluster-name" + + // DeletionOrphanAnnotationKey is an annotation for the manifest of addon indicating that it will not be cleaned up + // after the addon is deleted. + DeletionOrphanAnnotationKey = "addon.open-cluster-management.io/deletion-orphan" + + // HostedManifestLocationLabelKey is the label key to identify where a resource manifest of addon agent + // with this label should be deployed in Hosted mode. + // Deprecated, will be removed in the future release, please use annotation HostedManifestLocationAnnotationKey from v0.10.0. + HostedManifestLocationLabelKey = "addon.open-cluster-management.io/hosted-manifest-location" + + // HostedManifestLocationAnnotationKey is the annotation key to identify where a resource manifest of addon agent + // with this annotation should be deployed in Hosted mode. + HostedManifestLocationAnnotationKey = "addon.open-cluster-management.io/hosted-manifest-location" + + // HostedManifestLocationManagedValue is a value of the annotation HostedManifestLocationAnnotationKey, + // indicates the manifest will be deployed on the managed cluster in Hosted mode, + // it is the default value of a manifest in Hosted mode. + HostedManifestLocationManagedValue = "managed" + // HostedManifestLocationHostingValue is a value of the annotation HostedManifestLocationAnnotationKey, + // indicates the manifest will be deployed on the hosting cluster in Hosted mode. + HostedManifestLocationHostingValue = "hosting" + // HostedManifestLocationNoneValue is a value of the annotation HostedManifestLocationAnnotationKey,, + // indicates the manifest will not be deployed in Hosted mode. + HostedManifestLocationNoneValue = "none" +) diff --git a/vendor/open-cluster-management.io/api/client/addon/clientset/versioned/clientset.go b/vendor/open-cluster-management.io/api/client/addon/clientset/versioned/clientset.go index 557d422fd..49a244d9b 100644 --- a/vendor/open-cluster-management.io/api/client/addon/clientset/versioned/clientset.go +++ b/vendor/open-cluster-management.io/api/client/addon/clientset/versioned/clientset.go @@ -45,6 +45,10 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c + if configShallowCopy.UserAgent == "" { + configShallowCopy.UserAgent = rest.DefaultKubernetesUserAgent() + } + // share the transport between all clients httpClient, err := rest.HTTPClientFor(&configShallowCopy) if err != nil { diff --git a/vendor/open-cluster-management.io/api/client/cluster/clientset/versioned/clientset.go b/vendor/open-cluster-management.io/api/client/cluster/clientset/versioned/clientset.go index dfc37ff6f..042fe684d 100644 --- a/vendor/open-cluster-management.io/api/client/cluster/clientset/versioned/clientset.go +++ b/vendor/open-cluster-management.io/api/client/cluster/clientset/versioned/clientset.go @@ -69,6 +69,10 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c + if configShallowCopy.UserAgent == "" { + configShallowCopy.UserAgent = rest.DefaultKubernetesUserAgent() + } + // share the transport between all clients httpClient, err := rest.HTTPClientFor(&configShallowCopy) if err != nil { diff --git a/vendor/open-cluster-management.io/api/client/operator/clientset/versioned/clientset.go b/vendor/open-cluster-management.io/api/client/operator/clientset/versioned/clientset.go index bcad5d724..8e2015dd4 100644 --- a/vendor/open-cluster-management.io/api/client/operator/clientset/versioned/clientset.go +++ b/vendor/open-cluster-management.io/api/client/operator/clientset/versioned/clientset.go @@ -45,6 +45,10 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c + if configShallowCopy.UserAgent == "" { + configShallowCopy.UserAgent = rest.DefaultKubernetesUserAgent() + } + // share the transport between all clients httpClient, err := rest.HTTPClientFor(&configShallowCopy) if err != nil { diff --git a/vendor/open-cluster-management.io/api/client/work/clientset/versioned/clientset.go b/vendor/open-cluster-management.io/api/client/work/clientset/versioned/clientset.go index b786f70dd..b23452dad 100644 --- a/vendor/open-cluster-management.io/api/client/work/clientset/versioned/clientset.go +++ b/vendor/open-cluster-management.io/api/client/work/clientset/versioned/clientset.go @@ -53,6 +53,10 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c + if configShallowCopy.UserAgent == "" { + configShallowCopy.UserAgent = rest.DefaultKubernetesUserAgent() + } + // share the transport between all clients httpClient, err := rest.HTTPClientFor(&configShallowCopy) if err != nil { diff --git a/vendor/open-cluster-management.io/api/cluster/v1/types.go b/vendor/open-cluster-management.io/api/cluster/v1/types.go index 95bd347b1..848a50e82 100644 --- a/vendor/open-cluster-management.io/api/cluster/v1/types.go +++ b/vendor/open-cluster-management.io/api/cluster/v1/types.go @@ -229,3 +229,8 @@ type ManagedClusterList struct { // Items is a list of managed clusters. Items []ManagedCluster `json:"items"` } + +const ( + // ClusterNameLabelKey is the key of a label to set ManagedCluster name. + ClusterNameLabelKey = "open-cluster-management.io/cluster-name" +) diff --git a/vendor/open-cluster-management.io/api/cluster/v1beta2/0000_00_clusters.open-cluster-management.io_managedclustersets.crd.yaml b/vendor/open-cluster-management.io/api/cluster/v1beta2/0000_00_clusters.open-cluster-management.io_managedclustersets.crd.yaml index 3f601df4d..20fc25f93 100644 --- a/vendor/open-cluster-management.io/api/cluster/v1beta2/0000_00_clusters.open-cluster-management.io_managedclustersets.crd.yaml +++ b/vendor/open-cluster-management.io/api/cluster/v1beta2/0000_00_clusters.open-cluster-management.io_managedclustersets.crd.yaml @@ -26,7 +26,7 @@ spec: deprecated: true deprecationWarning: "cluster.open-cluster-management.io/v1beta1 ManagedClusterSet is deprecated; use cluster.open-cluster-management.io/v1beta2 ManagedClusterSet" served: true - storage: true + storage: false subresources: status: {} "schema": @@ -149,7 +149,7 @@ spec: type: date name: v1beta2 served: true - storage: false + storage: true subresources: status: {} "schema": diff --git a/vendor/open-cluster-management.io/api/cluster/v1beta2/0000_01_clusters.open-cluster-management.io_managedclustersetbindings.crd.yaml b/vendor/open-cluster-management.io/api/cluster/v1beta2/0000_01_clusters.open-cluster-management.io_managedclustersetbindings.crd.yaml index bf35bb406..156816f6d 100644 --- a/vendor/open-cluster-management.io/api/cluster/v1beta2/0000_01_clusters.open-cluster-management.io_managedclustersetbindings.crd.yaml +++ b/vendor/open-cluster-management.io/api/cluster/v1beta2/0000_01_clusters.open-cluster-management.io_managedclustersetbindings.crd.yaml @@ -88,7 +88,7 @@ spec: maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ served: true - storage: true + storage: false subresources: status: {} - name: v1beta2 @@ -162,7 +162,7 @@ spec: maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ served: true - storage: false + storage: true subresources: status: {} status: diff --git a/vendor/open-cluster-management.io/api/work/v1alpha1/0000_00_work.open-cluster-management.io_placemanifestworks.crd.yaml b/vendor/open-cluster-management.io/api/work/v1alpha1/0000_00_work.open-cluster-management.io_placemanifestworks.crd.yaml index 047cc2154..6f79dc2eb 100644 --- a/vendor/open-cluster-management.io/api/work/v1alpha1/0000_00_work.open-cluster-management.io_placemanifestworks.crd.yaml +++ b/vendor/open-cluster-management.io/api/work/v1alpha1/0000_00_work.open-cluster-management.io_placemanifestworks.crd.yaml @@ -1,13 +1,13 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: placementmanifestworks.work.open-cluster-management.io + name: placemanifestworks.work.open-cluster-management.io spec: group: work.open-cluster-management.io names: kind: PlaceManifestWork listKind: PlaceManifestWorkList - plural: placementmanifestworks + plural: placemanifestworks shortNames: - pmw - pmws diff --git a/vendor/open-cluster-management.io/api/work/v1alpha1/types.go b/vendor/open-cluster-management.io/api/work/v1alpha1/types.go index 555792cdb..6bf683887 100644 --- a/vendor/open-cluster-management.io/api/work/v1alpha1/types.go +++ b/vendor/open-cluster-management.io/api/work/v1alpha1/types.go @@ -28,7 +28,7 @@ import ( // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +kubebuilder:object:root=true -// +kubebuilder:resource:path=placementmanifestworks,shortName=pmw;pmws,scope=Namespaced +// +kubebuilder:resource:path=placemanifestworks,shortName=pmw;pmws,scope=Namespaced // +kubebuilder:storageversion // +kubebuilder:subresource:status // +kubebuilder:printcolumn:name="Placement",type="string",JSONPath=".status.conditions[?(@.type==\"PlacementVerified\")].reason",description="Reason"