Merge pull request #1824 from wuyingjun-lucky/promote_bug

Fix promoting failed if a resource with other kind used same name has promoted before
This commit is contained in:
karmada-bot 2022-06-08 11:54:58 +08:00 committed by GitHub
commit 3791cd5815
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 20 deletions

View File

@ -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{

View File

@ -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()))))
}

View File

@ -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())
})