344 lines
16 KiB
Go
Executable File
344 lines
16 KiB
Go
Executable File
/*
|
|
Copyright 2024 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 (
|
|
"github.com/onsi/ginkgo/v2"
|
|
appsv1 "k8s.io/api/apps/v1"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
"k8s.io/apimachinery/pkg/util/rand"
|
|
"k8s.io/utils/pointer"
|
|
|
|
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("[Preemption] propagation policy preemption testing", func() {
|
|
preemptingClusterName := "member2"
|
|
preemptedClusterName := "member1"
|
|
|
|
ginkgo.When("[PropagationPolicy Preemption] PropagationPolicy preempts another (Cluster)PropagationPolicy", func() {
|
|
ginkgo.Context("High-priority PropagationPolicy preempts low-priority PropagationPolicy", func() {
|
|
var highPriorityPolicy, lowPriorityPolicy *policyv1alpha1.PropagationPolicy
|
|
var deployment *appsv1.Deployment
|
|
ginkgo.BeforeEach(func() {
|
|
deployment = testhelper.NewDeployment(testNamespace, deploymentNamePrefix+rand.String(RandomStrLength))
|
|
highPriorityPolicy = testhelper.NewExplicitPriorityPropagationPolicy(deployment.Namespace, deployment.Name+"high-pp", []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptingClusterName},
|
|
}}, 10)
|
|
// enable preemption.
|
|
highPriorityPolicy.Spec.Preemption = policyv1alpha1.PreemptAlways
|
|
|
|
lowPriorityPolicy = testhelper.NewExplicitPriorityPropagationPolicy(deployment.Namespace, deployment.Name+"low-pp", []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptedClusterName},
|
|
}}, 5)
|
|
})
|
|
|
|
ginkgo.BeforeEach(func() {
|
|
framework.CreateDeployment(kubeClient, deployment)
|
|
framework.CreatePropagationPolicy(karmadaClient, lowPriorityPolicy)
|
|
ginkgo.DeferCleanup(func() {
|
|
framework.RemovePropagationPolicy(karmadaClient, lowPriorityPolicy.Namespace, lowPriorityPolicy.Name)
|
|
framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
|
|
})
|
|
})
|
|
|
|
ginkgo.It("Propagate the deployment with the low-priority PropagationPolicy and then create the high-priority PropagationPolicy to preempt it", func() {
|
|
ginkgo.By("Wait for propagating deployment by the low-priority PropagationPolicy", func() {
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptedClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
|
|
ginkgo.By("Create the high-priority PropagationPolicy to preempt the low-priority PropagationPolicy", func() {
|
|
framework.CreatePropagationPolicy(karmadaClient, highPriorityPolicy)
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptingClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
|
|
ginkgo.By("Delete the high-priority PropagationPolicy to let the low-priority PropagationPolicy preempt the deployment", func() {
|
|
framework.RemovePropagationPolicy(karmadaClient, highPriorityPolicy.Namespace, highPriorityPolicy.Name)
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptedClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
})
|
|
})
|
|
|
|
ginkgo.Context("PropagationPolicy preempts ClusterPropagationPolicy", func() {
|
|
var propagationPolicy *policyv1alpha1.PropagationPolicy
|
|
var clusterPropagationPolicy *policyv1alpha1.ClusterPropagationPolicy
|
|
var deployment *appsv1.Deployment
|
|
ginkgo.BeforeEach(func() {
|
|
deployment = testhelper.NewDeployment(testNamespace, deploymentNamePrefix+rand.String(RandomStrLength))
|
|
propagationPolicy = testhelper.NewPropagationPolicy(deployment.Namespace, deployment.Name, []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptingClusterName},
|
|
}})
|
|
// enable preemption.
|
|
propagationPolicy.Spec.Preemption = policyv1alpha1.PreemptAlways
|
|
|
|
clusterPropagationPolicy = testhelper.NewClusterPropagationPolicy(deployment.Name, []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptedClusterName},
|
|
}})
|
|
})
|
|
|
|
ginkgo.BeforeEach(func() {
|
|
framework.CreateDeployment(kubeClient, deployment)
|
|
framework.CreateClusterPropagationPolicy(karmadaClient, clusterPropagationPolicy)
|
|
ginkgo.DeferCleanup(func() {
|
|
framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
|
|
framework.RemoveClusterPropagationPolicy(karmadaClient, clusterPropagationPolicy.Name)
|
|
})
|
|
})
|
|
|
|
ginkgo.It("Propagate the deployment with the ClusterPropagationPolicy and then create the PropagationPolicy to preempt it", func() {
|
|
ginkgo.By("Wait for propagating deployment by the ClusterPropagationPolicy", func() {
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptedClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
|
|
ginkgo.By("Create the PropagationPolicy to preempt the ClusterPropagationPolicy", func() {
|
|
framework.CreatePropagationPolicy(karmadaClient, propagationPolicy)
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptingClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
|
|
ginkgo.By("Delete the PropagationPolicy to let the ClusterPropagationPolicy preempt the deployment", func() {
|
|
framework.RemovePropagationPolicy(karmadaClient, propagationPolicy.Namespace, propagationPolicy.Name)
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptedClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
})
|
|
})
|
|
|
|
ginkgo.Context("High-priority PropagationPolicy reduces priority to be preempted by low-priority PropagationPolicy", func() {
|
|
var highPriorityPolicy, lowPriorityPolicy *policyv1alpha1.PropagationPolicy
|
|
var deployment *appsv1.Deployment
|
|
ginkgo.BeforeEach(func() {
|
|
deployment = testhelper.NewDeployment(testNamespace, deploymentNamePrefix+rand.String(RandomStrLength))
|
|
highPriorityPolicy = testhelper.NewExplicitPriorityPropagationPolicy(deployment.Namespace, deployment.Name+"high-pp", []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptedClusterName},
|
|
}}, 10)
|
|
// enable preemption.
|
|
highPriorityPolicy.Spec.Preemption = policyv1alpha1.PreemptAlways
|
|
|
|
lowPriorityPolicy = testhelper.NewExplicitPriorityPropagationPolicy(deployment.Namespace, deployment.Name+"low-pp", []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptingClusterName},
|
|
}}, 5)
|
|
// enable preemption.
|
|
lowPriorityPolicy.Spec.Preemption = policyv1alpha1.PreemptAlways
|
|
})
|
|
|
|
ginkgo.BeforeEach(func() {
|
|
framework.CreateDeployment(kubeClient, deployment)
|
|
framework.CreatePropagationPolicy(karmadaClient, highPriorityPolicy)
|
|
framework.CreatePropagationPolicy(karmadaClient, lowPriorityPolicy)
|
|
ginkgo.DeferCleanup(func() {
|
|
framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
|
|
framework.RemovePropagationPolicy(karmadaClient, lowPriorityPolicy.Namespace, lowPriorityPolicy.Name)
|
|
framework.RemovePropagationPolicy(karmadaClient, highPriorityPolicy.Namespace, highPriorityPolicy.Name)
|
|
})
|
|
})
|
|
|
|
ginkgo.It("Propagate the deployment with the high-priority PropagationPolicy and then reduce it's priority to be preempted by the low-priority PropagationPolicy", func() {
|
|
ginkgo.By("Wait for propagating deployment by the high-priority PropagationPolicy", func() {
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptedClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
|
|
ginkgo.By("Reduce the priority of the high-priority PropagationPolicy to be preempted by the low-priority PropagationPolicy", func() {
|
|
highPriorityPolicy.Spec.Priority = pointer.Int32(4)
|
|
patch := []map[string]interface{}{
|
|
{
|
|
"path": "/spec/priority",
|
|
"op": "replace",
|
|
"value": 4,
|
|
},
|
|
}
|
|
framework.PatchPropagationPolicy(karmadaClient, highPriorityPolicy.Namespace, highPriorityPolicy.Name, patch, types.JSONPatchType)
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptingClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
})
|
|
})
|
|
})
|
|
|
|
ginkgo.When("[ClusterPropagationPolicy Preemption] ClusterPropagationPolicy preempts another ClusterPropagationPolicy", func() {
|
|
ginkgo.Context("High-priority ClusterPropagationPolicy preempts low-priority ClusterPropagationPolicy", func() {
|
|
var highPriorityPolicy, lowPriorityPolicy *policyv1alpha1.ClusterPropagationPolicy
|
|
var deployment *appsv1.Deployment
|
|
ginkgo.BeforeEach(func() {
|
|
deployment = testhelper.NewDeployment(testNamespace, deploymentNamePrefix+rand.String(RandomStrLength))
|
|
highPriorityPolicy = testhelper.NewExplicitPriorityClusterPropagationPolicy(deployment.Name+"high-cpp", []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptingClusterName},
|
|
}}, 10)
|
|
// enable preemption.
|
|
highPriorityPolicy.Spec.Preemption = policyv1alpha1.PreemptAlways
|
|
|
|
lowPriorityPolicy = testhelper.NewExplicitPriorityClusterPropagationPolicy(deployment.Name+"low-cpp", []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptedClusterName},
|
|
}}, 5)
|
|
})
|
|
|
|
ginkgo.BeforeEach(func() {
|
|
framework.CreateDeployment(kubeClient, deployment)
|
|
framework.CreateClusterPropagationPolicy(karmadaClient, lowPriorityPolicy)
|
|
ginkgo.DeferCleanup(func() {
|
|
framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
|
|
framework.RemoveClusterPropagationPolicy(karmadaClient, lowPriorityPolicy.Name)
|
|
})
|
|
})
|
|
|
|
ginkgo.It("Propagate the deployment with the low-priority ClusterPropagationPolicy and then create the high-priority ClusterPropagationPolicy to preempt it", func() {
|
|
ginkgo.By("Wait for propagating deployment by the low-priority ClusterPropagationPolicy", func() {
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptedClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
|
|
ginkgo.By("Create the high-priority ClusterPropagationPolicy to preempt the low-priority ClusterPropagationPolicy", func() {
|
|
framework.CreateClusterPropagationPolicy(karmadaClient, highPriorityPolicy)
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptingClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
|
|
ginkgo.By("Delete the high-priority ClusterPropagationPolicy to let the low-priority ClusterPropagationPolicy preempt the deployment", func() {
|
|
framework.RemoveClusterPropagationPolicy(karmadaClient, highPriorityPolicy.Name)
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptedClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
})
|
|
})
|
|
|
|
ginkgo.Context("High-priority ClusterPropagationPolicy reduces priority to be preempted by low-priority ClusterPropagationPolicy", func() {
|
|
var highPriorityPolicy, lowPriorityPolicy *policyv1alpha1.ClusterPropagationPolicy
|
|
var deployment *appsv1.Deployment
|
|
ginkgo.BeforeEach(func() {
|
|
deployment = testhelper.NewDeployment(testNamespace, deploymentNamePrefix+rand.String(RandomStrLength))
|
|
highPriorityPolicy = testhelper.NewExplicitPriorityClusterPropagationPolicy(deployment.Name+"high-cpp", []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptedClusterName},
|
|
}}, 10)
|
|
// enable preemption.
|
|
highPriorityPolicy.Spec.Preemption = policyv1alpha1.PreemptAlways
|
|
|
|
lowPriorityPolicy = testhelper.NewExplicitPriorityClusterPropagationPolicy(deployment.Name+"low-cpp", []policyv1alpha1.ResourceSelector{
|
|
{
|
|
APIVersion: deployment.APIVersion,
|
|
Kind: deployment.Kind,
|
|
Namespace: deployment.Namespace,
|
|
Name: deployment.Name,
|
|
},
|
|
}, policyv1alpha1.Placement{
|
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{preemptingClusterName},
|
|
}}, 5)
|
|
// enable preemption.
|
|
lowPriorityPolicy.Spec.Preemption = policyv1alpha1.PreemptAlways
|
|
})
|
|
|
|
ginkgo.BeforeEach(func() {
|
|
framework.CreateDeployment(kubeClient, deployment)
|
|
framework.CreateClusterPropagationPolicy(karmadaClient, highPriorityPolicy)
|
|
framework.CreateClusterPropagationPolicy(karmadaClient, lowPriorityPolicy)
|
|
ginkgo.DeferCleanup(func() {
|
|
framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
|
|
framework.RemoveClusterPropagationPolicy(karmadaClient, lowPriorityPolicy.Name)
|
|
framework.RemoveClusterPropagationPolicy(karmadaClient, highPriorityPolicy.Name)
|
|
})
|
|
})
|
|
|
|
ginkgo.It("Propagate the deployment with the high-priority ClusterPropagationPolicy and then reduce it's priority to be preempted by the low-priority ClusterPropagationPolicy", func() {
|
|
ginkgo.By("Wait for propagating deployment by the high-priority ClusterPropagationPolicy", func() {
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptedClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
|
|
ginkgo.By("Reduce the priority of the high-priority ClusterPropagationPolicy to be preempted by the low-priority ClusterPropagationPolicy", func() {
|
|
highPriorityPolicy.Spec.Priority = pointer.Int32(4)
|
|
patch := []map[string]interface{}{
|
|
{
|
|
"path": "/spec/priority",
|
|
"op": "replace",
|
|
"value": 4,
|
|
},
|
|
}
|
|
framework.PatchClusterPropagationPolicy(karmadaClient, highPriorityPolicy.Name, patch, types.JSONPatchType)
|
|
framework.WaitDeploymentPresentOnClusterFitWith(preemptingClusterName, deployment.Namespace, deployment.Name, func(deployment *appsv1.Deployment) bool { return true })
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|