197 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						|
Copyright 2022 The Karmada Authors.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
package e2e
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"fmt"
 | 
						|
 | 
						|
	"github.com/onsi/ginkgo/v2"
 | 
						|
	"github.com/onsi/gomega"
 | 
						|
	appsv1 "k8s.io/api/apps/v1"
 | 
						|
	corev1 "k8s.io/api/core/v1"
 | 
						|
	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 | 
						|
	apierrors "k8s.io/apimachinery/pkg/api/errors"
 | 
						|
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						|
	"k8s.io/apimachinery/pkg/util/rand"
 | 
						|
	"k8s.io/klog/v2"
 | 
						|
 | 
						|
	policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
 | 
						|
	"github.com/karmada-io/karmada/test/e2e/framework"
 | 
						|
	testhelper "github.com/karmada-io/karmada/test/helper"
 | 
						|
)
 | 
						|
 | 
						|
var _ = ginkgo.Describe("The basic ClusterOverridePolicy testing", func() {
 | 
						|
	ginkgo.Context("Namespace propagation testing", func() {
 | 
						|
		var (
 | 
						|
			randNamespace string
 | 
						|
			ns            *corev1.Namespace
 | 
						|
			namespaceCop  *policyv1alpha1.ClusterOverridePolicy
 | 
						|
 | 
						|
			customLabelKey          = "hello"
 | 
						|
			customLabelVal          = "world"
 | 
						|
			plaintextOverriderValue = fmt.Sprintf("{ \"%s\": \"%s\"}", customLabelKey, customLabelVal)
 | 
						|
		)
 | 
						|
 | 
						|
		ginkgo.BeforeEach(func() {
 | 
						|
			randNamespace = "cop-test-ns-" + rand.String(RandomStrLength)
 | 
						|
			ns = testhelper.NewNamespace(randNamespace)
 | 
						|
			namespaceCop = testhelper.NewClusterOverridePolicyByOverrideRules(ns.Name,
 | 
						|
				[]policyv1alpha1.ResourceSelector{
 | 
						|
					{
 | 
						|
						APIVersion: "v1",
 | 
						|
						Kind:       "Namespace",
 | 
						|
						Name:       ns.Name,
 | 
						|
					},
 | 
						|
				},
 | 
						|
				[]policyv1alpha1.RuleWithCluster{
 | 
						|
					{
 | 
						|
						TargetCluster: &policyv1alpha1.ClusterAffinity{
 | 
						|
							ClusterNames: framework.ClusterNames(),
 | 
						|
						},
 | 
						|
						Overriders: policyv1alpha1.Overriders{
 | 
						|
							Plaintext: []policyv1alpha1.PlaintextOverrider{
 | 
						|
								{
 | 
						|
									Path:     "/metadata/labels",
 | 
						|
									Operator: policyv1alpha1.OverriderOpAdd,
 | 
						|
									Value:    apiextensionsv1.JSON{Raw: []byte(plaintextOverriderValue)},
 | 
						|
								},
 | 
						|
							},
 | 
						|
						},
 | 
						|
					},
 | 
						|
				})
 | 
						|
		})
 | 
						|
 | 
						|
		ginkgo.BeforeEach(func() {
 | 
						|
			framework.CreateClusterOverridePolicy(karmadaClient, namespaceCop)
 | 
						|
			framework.CreateNamespace(kubeClient, ns)
 | 
						|
			ginkgo.DeferCleanup(func() {
 | 
						|
				framework.RemoveClusterOverridePolicy(karmadaClient, namespaceCop.Name)
 | 
						|
				framework.RemoveNamespace(kubeClient, ns.Name)
 | 
						|
				framework.WaitNamespaceDisappearOnClusters(framework.ClusterNames(), ns.Name)
 | 
						|
			})
 | 
						|
		})
 | 
						|
 | 
						|
		ginkgo.It("Namespace labelOverride testing", func() {
 | 
						|
			ginkgo.By(fmt.Sprintf("Check if namespace(%s) present on member clusters", ns.Name), func() {
 | 
						|
				for _, clusterName := range framework.ClusterNames() {
 | 
						|
					clusterClient := framework.GetClusterClient(clusterName)
 | 
						|
					gomega.Expect(clusterClient).ShouldNot(gomega.BeNil())
 | 
						|
 | 
						|
					klog.Infof("Waiting for namespace present on cluster(%s)", clusterName)
 | 
						|
					gomega.Eventually(func(gomega.Gomega) (bool, error) {
 | 
						|
						clusterNs, err := clusterClient.CoreV1().Namespaces().Get(context.TODO(), ns.Name, metav1.GetOptions{})
 | 
						|
						if err != nil {
 | 
						|
							if apierrors.IsNotFound(err) {
 | 
						|
								return false, nil
 | 
						|
							}
 | 
						|
							return false, err
 | 
						|
						}
 | 
						|
						// Check if the cluster's customLabel is correct value
 | 
						|
						v, ok := clusterNs.Labels[customLabelKey]
 | 
						|
						if ok && v == customLabelVal {
 | 
						|
							return true, nil
 | 
						|
						}
 | 
						|
						return false, nil
 | 
						|
					}, pollTimeout, pollInterval).Should(gomega.Equal(true))
 | 
						|
				}
 | 
						|
			})
 | 
						|
		})
 | 
						|
	})
 | 
						|
})
 | 
						|
 | 
						|
var _ = framework.SerialDescribe("The ClusterOverridePolicy with nil resourceSelectors testing", func() {
 | 
						|
	var deploymentNamespace, deploymentName string
 | 
						|
	var propagationPolicyNamespace, propagationPolicyName string
 | 
						|
	var clusterOverridePolicyName string
 | 
						|
	var deployment *appsv1.Deployment
 | 
						|
	var propagationPolicy *policyv1alpha1.PropagationPolicy
 | 
						|
	var clusterOverridePolicy *policyv1alpha1.ClusterOverridePolicy
 | 
						|
 | 
						|
	ginkgo.BeforeEach(func() {
 | 
						|
		deploymentNamespace = testNamespace
 | 
						|
		deploymentName = deploymentNamePrefix + rand.String(RandomStrLength)
 | 
						|
		propagationPolicyNamespace = testNamespace
 | 
						|
		propagationPolicyName = deploymentName
 | 
						|
		clusterOverridePolicyName = deploymentName
 | 
						|
 | 
						|
		deployment = testhelper.NewDeployment(deploymentNamespace, deploymentName)
 | 
						|
		propagationPolicy = testhelper.NewPropagationPolicy(propagationPolicyNamespace, propagationPolicyName, []policyv1alpha1.ResourceSelector{
 | 
						|
			{
 | 
						|
				APIVersion: deployment.APIVersion,
 | 
						|
				Kind:       deployment.Kind,
 | 
						|
				Name:       deployment.Name,
 | 
						|
			},
 | 
						|
		}, policyv1alpha1.Placement{
 | 
						|
			ClusterAffinity: &policyv1alpha1.ClusterAffinity{
 | 
						|
				ClusterNames: framework.ClusterNames(),
 | 
						|
			},
 | 
						|
		})
 | 
						|
 | 
						|
		clusterOverridePolicy = testhelper.NewClusterOverridePolicyByOverrideRules(clusterOverridePolicyName, nil, []policyv1alpha1.RuleWithCluster{
 | 
						|
			{
 | 
						|
				TargetCluster: &policyv1alpha1.ClusterAffinity{
 | 
						|
					ClusterNames: framework.ClusterNames(),
 | 
						|
				},
 | 
						|
				Overriders: policyv1alpha1.Overriders{
 | 
						|
					ImageOverrider: []policyv1alpha1.ImageOverrider{
 | 
						|
						{
 | 
						|
							Predicate: &policyv1alpha1.ImagePredicate{
 | 
						|
								Path: "/spec/template/spec/containers/0/image",
 | 
						|
							},
 | 
						|
							Component: "Registry",
 | 
						|
							Operator:  "replace",
 | 
						|
							Value:     "fictional.registry.us",
 | 
						|
						},
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
		})
 | 
						|
	})
 | 
						|
 | 
						|
	ginkgo.Context("Deployment override testing", func() {
 | 
						|
		ginkgo.BeforeEach(func() {
 | 
						|
			framework.CreatePropagationPolicy(karmadaClient, propagationPolicy)
 | 
						|
			framework.CreateDeployment(kubeClient, deployment)
 | 
						|
			ginkgo.DeferCleanup(func() {
 | 
						|
				framework.RemovePropagationPolicy(karmadaClient, propagationPolicy.Namespace, propagationPolicy.Name)
 | 
						|
				framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
 | 
						|
			})
 | 
						|
		})
 | 
						|
 | 
						|
		ginkgo.It("deployment imageOverride testing", func() {
 | 
						|
			ginkgo.By("Check if deployment have presented on member clusters", func() {
 | 
						|
				framework.WaitDeploymentPresentOnClustersFitWith(framework.ClusterNames(), deployment.Namespace, deployment.Name,
 | 
						|
					func(*appsv1.Deployment) bool {
 | 
						|
						return true
 | 
						|
					})
 | 
						|
			})
 | 
						|
 | 
						|
			framework.CreateClusterOverridePolicy(karmadaClient, clusterOverridePolicy)
 | 
						|
 | 
						|
			ginkgo.By("Check if deployment presented on member clusters have correct image value", func() {
 | 
						|
				framework.WaitDeploymentPresentOnClustersFitWith(framework.ClusterNames(), deployment.Namespace, deployment.Name,
 | 
						|
					func(deployment *appsv1.Deployment) bool {
 | 
						|
						return deployment.Spec.Template.Spec.Containers[0].Image == "fictional.registry.us/nginx:1.19.0"
 | 
						|
					})
 | 
						|
			})
 | 
						|
 | 
						|
			framework.RemoveClusterOverridePolicy(karmadaClient, clusterOverridePolicy.Name)
 | 
						|
		})
 | 
						|
	})
 | 
						|
})
 |