From 667e0ee9d52ffd5b90231482d5b8ee545299a69f Mon Sep 17 00:00:00 2001 From: wuyingjun Date: Wed, 18 May 2022 14:48:37 +0800 Subject: [PATCH] fix promoting failed if a resource with other kind used same name has promoted before Signed-off-by: wuyingjun --- pkg/karmadactl/promote.go | 12 +++---- pkg/util/names/names.go | 8 +++++ test/e2e/karmadactl_test.go | 62 ++++++++++++++++++++++++++++--------- 3 files changed, 62 insertions(+), 20 deletions(-) diff --git a/pkg/karmadactl/promote.go b/pkg/karmadactl/promote.go index 3c636a94c..3e31ba766 100644 --- a/pkg/karmadactl/promote.go +++ b/pkg/karmadactl/promote.go @@ -26,6 +26,7 @@ import ( "github.com/karmada-io/karmada/pkg/karmadactl/options" "github.com/karmada-io/karmada/pkg/resourceinterpreter/defaultinterpreter/prune" "github.com/karmada-io/karmada/pkg/util/gclient" + "github.com/karmada-io/karmada/pkg/util/names" "github.com/karmada-io/karmada/pkg/util/restmapper" ) @@ -403,7 +404,7 @@ func addOverwriteAnnotation(obj *unstructured.Unstructured) { // createOrUpdatePropagationPolicy create PropagationPolicy in karmada control plane func createOrUpdatePropagationPolicy(karmadaClient *karmadaclientset.Clientset, gvr schema.GroupVersionResource, opts CommandPromoteOption) error { - name := opts.name + "-propagation" + name := names.GeneratePolicyName(opts.Namespace, opts.name, opts.gvk.String()) _, err := karmadaClient.PolicyV1alpha1().PropagationPolicies(opts.Namespace).Get(context.TODO(), name, metav1.GetOptions{}) if err != nil && apierrors.IsNotFound(err) { @@ -422,7 +423,7 @@ func createOrUpdatePropagationPolicy(karmadaClient *karmadaclientset.Clientset, // createOrUpdateClusterPropagationPolicy create ClusterPropagationPolicy in karmada control plane func createOrUpdateClusterPropagationPolicy(karmadaClient *karmadaclientset.Clientset, gvr schema.GroupVersionResource, opts CommandPromoteOption) error { - name := opts.name + "-propagation" + name := names.GeneratePolicyName("", opts.name, opts.gvk.String()) _, err := karmadaClient.PolicyV1alpha1().ClusterPropagationPolicies().Get(context.TODO(), name, metav1.GetOptions{}) if err != nil && apierrors.IsNotFound(err) { @@ -441,13 +442,12 @@ func createOrUpdateClusterPropagationPolicy(karmadaClient *karmadaclientset.Clie // buildPropagationPolicy build PropagationPolicy according to resource and cluster func buildPropagationPolicy(gvr schema.GroupVersionResource, opts CommandPromoteOption) *policyv1alpha1.PropagationPolicy { - name := opts.name + "-propagation" - ns := opts.Namespace + name := names.GeneratePolicyName(opts.Namespace, opts.name, opts.gvk.String()) pp := &policyv1alpha1.PropagationPolicy{ ObjectMeta: metav1.ObjectMeta{ Name: name, - Namespace: ns, + Namespace: opts.Namespace, }, Spec: policyv1alpha1.PropagationSpec{ ResourceSelectors: []policyv1alpha1.ResourceSelector{ @@ -470,7 +470,7 @@ func buildPropagationPolicy(gvr schema.GroupVersionResource, opts CommandPromote // buildClusterPropagationPolicy build ClusterPropagationPolicy according to resource and cluster func buildClusterPropagationPolicy(gvr schema.GroupVersionResource, opts CommandPromoteOption) *policyv1alpha1.ClusterPropagationPolicy { - name := opts.name + "-propagation" + name := names.GeneratePolicyName("", opts.name, opts.gvk.String()) cpp := &policyv1alpha1.ClusterPropagationPolicy{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/util/names/names.go b/pkg/util/names/names.go index d49f34040..69927f193 100644 --- a/pkg/util/names/names.go +++ b/pkg/util/names/names.go @@ -121,3 +121,11 @@ func IsReservedNamespace(namespace string) bool { func GenerateImpersonationSecretName(clusterName string) string { return fmt.Sprintf("%s-impersonator", clusterName) } + +// GeneratePolicyName generates the propagationPolicy name +func GeneratePolicyName(namespace, name, gvk string) string { + hash := fnv.New32a() + hashutil.DeepHashObject(hash, namespace+gvk) + + return strings.ToLower(fmt.Sprintf("%s-%s", name, rand.SafeEncodeString(fmt.Sprint(hash.Sum32())))) +} diff --git a/test/e2e/karmadactl_test.go b/test/e2e/karmadactl_test.go index a3383a7ab..3a4b43a9a 100644 --- a/test/e2e/karmadactl_test.go +++ b/test/e2e/karmadactl_test.go @@ -11,6 +11,7 @@ import ( rbacv1 "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/rand" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" @@ -21,6 +22,7 @@ import ( policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1" "github.com/karmada-io/karmada/pkg/karmadactl" "github.com/karmada-io/karmada/pkg/karmadactl/options" + "github.com/karmada-io/karmada/pkg/util/names" "github.com/karmada-io/karmada/test/e2e/framework" "github.com/karmada-io/karmada/test/helper" ) @@ -39,6 +41,7 @@ var _ = ginkgo.Describe("Karmadactl promote testing", func() { ginkgo.Context("Test promoting namespaced resource: deployment", func() { var deployment *appsv1.Deployment var deploymentNamespace, deploymentName string + var deploymentOpts, namespaceOpts karmadactl.CommandPromoteOption ginkgo.BeforeEach(func() { deploymentNamespace = fmt.Sprintf("karmadatest-%s", rand.String(RandomStrLength)) @@ -47,9 +50,22 @@ var _ = ginkgo.Describe("Karmadactl promote testing", func() { }) ginkgo.AfterEach(func() { + deploymentGVK := schema.GroupVersionKind{ + Group: "apps", + Version: "v1", + Kind: "Deployment", + } + namespaceGVK := schema.GroupVersionKind{ + Group: "", + Version: "v1", + Kind: "Namespace", + } + ppName := names.GeneratePolicyName(deploymentNamespace, deploymentName, deploymentGVK.String()) + cppName := names.GeneratePolicyName("", deploymentNamespace, namespaceGVK.String()) framework.RemoveDeployment(kubeClient, deploymentNamespace, deploymentName) - framework.RemovePropagationPolicy(karmadaClient, deploymentNamespace, deploymentName+"-propagation") + framework.RemovePropagationPolicy(karmadaClient, deploymentNamespace, ppName) framework.RemoveNamespace(kubeClient, deploymentNamespace) + framework.RemoveClusterPropagationPolicy(karmadaClient, cppName) }) ginkgo.It("Test promoting a deployment from cluster member", func() { @@ -63,17 +79,17 @@ var _ = ginkgo.Describe("Karmadactl promote testing", func() { // Step 2, promote namespace used by the deployment from member1 to karmada ginkgo.By(fmt.Sprintf("Promoting namespace %s from member: %s to karmada control plane", deploymentNamespace, member1), func() { - opts := karmadactl.CommandPromoteOption{ + namespaceOpts = karmadactl.CommandPromoteOption{ Cluster: member1, ClusterNamespace: options.DefaultKarmadaClusterNamespace, } args := []string{"namespace", deploymentNamespace} // init args: place namespace name to CommandPromoteOption.name - err := opts.Complete(args) + err := namespaceOpts.Complete(args) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) // use karmadactl to promote a namespace from member1 - err = karmadactl.RunPromote(karmadaConfig, opts, args) + err = karmadactl.RunPromote(karmadaConfig, namespaceOpts, args) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) framework.WaitNamespacePresentOnClusterByClient(kubeClient, deploymentNamespace) @@ -81,18 +97,18 @@ var _ = ginkgo.Describe("Karmadactl promote testing", func() { // Step 3, promote deployment from cluster member1 to karmada ginkgo.By(fmt.Sprintf("Promoting deployment %s from member: %s to karmada", deploymentName, member1), func() { - opts := karmadactl.CommandPromoteOption{ + deploymentOpts = karmadactl.CommandPromoteOption{ Namespace: deploymentNamespace, Cluster: member1, ClusterNamespace: options.DefaultKarmadaClusterNamespace, } args := []string{"deployment", deploymentName} // init args: place deployment name to CommandPromoteOption.name - err := opts.Complete(args) + err := deploymentOpts.Complete(args) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) // use karmadactl to promote a deployment from member1 - err = karmadactl.RunPromote(karmadaConfig, opts, args) + err = karmadactl.RunPromote(karmadaConfig, deploymentOpts, args) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) }) @@ -122,6 +138,7 @@ var _ = ginkgo.Describe("Karmadactl promote testing", func() { var clusterRoleName, clusterRoleBindingName string var clusterRole *rbacv1.ClusterRole var clusterRoleBinding *rbacv1.ClusterRoleBinding + var clusterRoleOpts, clusterRoleBindingOpts karmadactl.CommandPromoteOption ginkgo.BeforeEach(func() { var nameFlag = rand.String(RandomStrLength) @@ -141,11 +158,23 @@ var _ = ginkgo.Describe("Karmadactl promote testing", func() { }) ginkgo.AfterEach(func() { + clusterRoleGVK := schema.GroupVersionKind{ + Group: "rbac.authorization.k8s.io", + Version: "v1", + Kind: "ClusterRole", + } + clusterRoleBindingGVK := schema.GroupVersionKind{ + Group: "rbac.authorization.k8s.io", + Version: "v1", + Kind: "ClusterRoleBinding", + } + clusterRoleClusterPropagationPolicy := names.GeneratePolicyName("", clusterRoleName, clusterRoleGVK.String()) + clusterRoleBindingClusterPropagationPolicy := names.GeneratePolicyName("", clusterRoleBindingName, clusterRoleBindingGVK.String()) framework.RemoveClusterRole(kubeClient, clusterRoleName) - framework.RemoveClusterPropagationPolicy(karmadaClient, clusterRoleName+"-propagation") + framework.RemoveClusterPropagationPolicy(karmadaClient, clusterRoleClusterPropagationPolicy) framework.RemoveClusterRoleBinding(kubeClient, clusterRoleBindingName) - framework.RemoveClusterPropagationPolicy(karmadaClient, clusterRoleBindingName+"-propagation") + framework.RemoveClusterPropagationPolicy(karmadaClient, clusterRoleBindingClusterPropagationPolicy) }) ginkgo.It("Test promoting clusterrole and clusterrolebindings", func() { @@ -158,27 +187,32 @@ var _ = ginkgo.Describe("Karmadactl promote testing", func() { // Step2, promote clusterrole and clusterrolebinding from member1 ginkgo.By(fmt.Sprintf("Promoting clusterrole %s and clusterrolebindings %s from member to karmada", clusterRoleName, clusterRoleBindingName), func() { - opts := karmadactl.CommandPromoteOption{ + clusterRoleOpts = karmadactl.CommandPromoteOption{ Cluster: member1, ClusterNamespace: options.DefaultKarmadaClusterNamespace, } args := []string{"clusterrole", clusterRoleName} // init args: place clusterrole name to CommandPromoteOption.name - err := opts.Complete(args) + err := clusterRoleOpts.Complete(args) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) // use karmadactl to promote clusterrole from member1 - err = karmadactl.RunPromote(karmadaConfig, opts, args) + err = karmadactl.RunPromote(karmadaConfig, clusterRoleOpts, args) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) + clusterRoleBindingOpts = karmadactl.CommandPromoteOption{ + Cluster: member1, + ClusterNamespace: options.DefaultKarmadaClusterNamespace, + } + args = []string{"clusterrolebinding", clusterRoleBindingName} // init args: place clusterrolebinding name to CommandPromoteOption.name - err = opts.Complete(args) + err = clusterRoleBindingOpts.Complete(args) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) // use karmadactl to promote clusterrolebinding from member1 - err = karmadactl.RunPromote(karmadaConfig, opts, args) + err = karmadactl.RunPromote(karmadaConfig, clusterRoleBindingOpts, args) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) })