karmada/test/e2e/suites/base/clusteroverridepolicy_test.go

197 lines
6.8 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 base
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: policyv1alpha1.OverriderOpReplace,
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)
})
})
})