commit
ad7a0880e9
|
@ -242,6 +242,240 @@ var _ = framework.SerialDescribe("failover testing", func() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
ginkgo.Context("Application failover testing with purgeMode graciously", func() {
|
||||||
|
var policyNamespace, policyName string
|
||||||
|
var deploymentNamespace, deploymentName string
|
||||||
|
var deployment *appsv1.Deployment
|
||||||
|
var policy *policyv1alpha1.PropagationPolicy
|
||||||
|
var overridePolicy *policyv1alpha1.OverridePolicy
|
||||||
|
var maxGroups, minGroups int
|
||||||
|
ginkgo.BeforeEach(func() {
|
||||||
|
policyNamespace = testNamespace
|
||||||
|
policyName = deploymentNamePrefix + rand.String(RandomStrLength)
|
||||||
|
deploymentNamespace = testNamespace
|
||||||
|
deploymentName = policyName
|
||||||
|
deployment = testhelper.NewDeployment(deploymentNamespace, deploymentName)
|
||||||
|
maxGroups = 1
|
||||||
|
minGroups = 1
|
||||||
|
|
||||||
|
policy = &policyv1alpha1.PropagationPolicy{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Namespace: policyNamespace,
|
||||||
|
Name: policyName,
|
||||||
|
},
|
||||||
|
Spec: policyv1alpha1.PropagationSpec{
|
||||||
|
ResourceSelectors: []policyv1alpha1.ResourceSelector{
|
||||||
|
{
|
||||||
|
APIVersion: deployment.APIVersion,
|
||||||
|
Kind: deployment.Kind,
|
||||||
|
Name: deployment.Name,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Placement: policyv1alpha1.Placement{
|
||||||
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
||||||
|
ClusterNames: framework.ClusterNames(),
|
||||||
|
},
|
||||||
|
SpreadConstraints: []policyv1alpha1.SpreadConstraint{
|
||||||
|
{
|
||||||
|
SpreadByField: policyv1alpha1.SpreadByFieldCluster,
|
||||||
|
MaxGroups: maxGroups,
|
||||||
|
MinGroups: minGroups,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
PropagateDeps: true,
|
||||||
|
Failover: &policyv1alpha1.FailoverBehavior{
|
||||||
|
Application: &policyv1alpha1.ApplicationFailoverBehavior{
|
||||||
|
DecisionConditions: policyv1alpha1.DecisionConditions{
|
||||||
|
TolerationSeconds: pointer.Int32(30),
|
||||||
|
},
|
||||||
|
PurgeMode: policyv1alpha1.Graciously,
|
||||||
|
GracePeriodSeconds: pointer.Int32(30),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.BeforeEach(func() {
|
||||||
|
framework.CreatePropagationPolicy(karmadaClient, policy)
|
||||||
|
framework.CreateDeployment(kubeClient, deployment)
|
||||||
|
ginkgo.DeferCleanup(func() {
|
||||||
|
framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
|
||||||
|
framework.RemovePropagationPolicy(karmadaClient, policy.Namespace, policy.Name)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.It("application failover", func() {
|
||||||
|
disabledClusters := framework.ExtractTargetClustersFrom(controlPlaneClient, deployment)
|
||||||
|
ginkgo.By("create an error op", func() {
|
||||||
|
overridePolicy = testhelper.NewOverridePolicyByOverrideRules(policyNamespace, policyName, []policyv1alpha1.ResourceSelector{
|
||||||
|
{
|
||||||
|
APIVersion: deployment.APIVersion,
|
||||||
|
Kind: deployment.Kind,
|
||||||
|
Name: deployment.Name,
|
||||||
|
},
|
||||||
|
}, []policyv1alpha1.RuleWithCluster{
|
||||||
|
{
|
||||||
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
||||||
|
ClusterNames: disabledClusters,
|
||||||
|
},
|
||||||
|
Overriders: policyv1alpha1.Overriders{
|
||||||
|
ImageOverrider: []policyv1alpha1.ImageOverrider{
|
||||||
|
{
|
||||||
|
Component: "Registry",
|
||||||
|
Operator: "replace",
|
||||||
|
Value: "fake",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
framework.CreateOverridePolicy(karmadaClient, overridePolicy)
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.By("check whether the failed deployment disappears in the disabledClusters", func() {
|
||||||
|
framework.WaitDeploymentDisappearOnClusters(disabledClusters, deploymentNamespace, deploymentName)
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.By("check whether the failed deployment is rescheduled to other available cluster", func() {
|
||||||
|
gomega.Eventually(func() int {
|
||||||
|
targetClusterNames := framework.ExtractTargetClustersFrom(controlPlaneClient, deployment)
|
||||||
|
for _, targetClusterName := range targetClusterNames {
|
||||||
|
// the target cluster should be overwritten to another available cluster
|
||||||
|
if !testhelper.IsExclude(targetClusterName, disabledClusters) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(targetClusterNames)
|
||||||
|
}, pollTimeout, pollInterval).Should(gomega.Equal(minGroups))
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.By("delete the error op", func() {
|
||||||
|
framework.RemoveOverridePolicy(karmadaClient, policyNamespace, policyName)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.Context("Application failover testing with purgeMode never", func() {
|
||||||
|
var policyNamespace, policyName string
|
||||||
|
var deploymentNamespace, deploymentName string
|
||||||
|
var deployment *appsv1.Deployment
|
||||||
|
var policy *policyv1alpha1.PropagationPolicy
|
||||||
|
var overridePolicy *policyv1alpha1.OverridePolicy
|
||||||
|
var maxGroups, minGroups int
|
||||||
|
ginkgo.BeforeEach(func() {
|
||||||
|
policyNamespace = testNamespace
|
||||||
|
policyName = deploymentNamePrefix + rand.String(RandomStrLength)
|
||||||
|
deploymentNamespace = testNamespace
|
||||||
|
deploymentName = policyName
|
||||||
|
deployment = testhelper.NewDeployment(deploymentNamespace, deploymentName)
|
||||||
|
maxGroups = 1
|
||||||
|
minGroups = 1
|
||||||
|
|
||||||
|
policy = &policyv1alpha1.PropagationPolicy{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Namespace: policyNamespace,
|
||||||
|
Name: policyName,
|
||||||
|
},
|
||||||
|
Spec: policyv1alpha1.PropagationSpec{
|
||||||
|
ResourceSelectors: []policyv1alpha1.ResourceSelector{
|
||||||
|
{
|
||||||
|
APIVersion: deployment.APIVersion,
|
||||||
|
Kind: deployment.Kind,
|
||||||
|
Name: deployment.Name,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Placement: policyv1alpha1.Placement{
|
||||||
|
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
|
||||||
|
ClusterNames: framework.ClusterNames(),
|
||||||
|
},
|
||||||
|
SpreadConstraints: []policyv1alpha1.SpreadConstraint{
|
||||||
|
{
|
||||||
|
SpreadByField: policyv1alpha1.SpreadByFieldCluster,
|
||||||
|
MaxGroups: maxGroups,
|
||||||
|
MinGroups: minGroups,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
PropagateDeps: true,
|
||||||
|
Failover: &policyv1alpha1.FailoverBehavior{
|
||||||
|
Application: &policyv1alpha1.ApplicationFailoverBehavior{
|
||||||
|
DecisionConditions: policyv1alpha1.DecisionConditions{
|
||||||
|
TolerationSeconds: pointer.Int32(30),
|
||||||
|
},
|
||||||
|
PurgeMode: policyv1alpha1.Never,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.BeforeEach(func() {
|
||||||
|
framework.CreatePropagationPolicy(karmadaClient, policy)
|
||||||
|
framework.CreateDeployment(kubeClient, deployment)
|
||||||
|
ginkgo.DeferCleanup(func() {
|
||||||
|
framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
|
||||||
|
framework.RemovePropagationPolicy(karmadaClient, policy.Namespace, policy.Name)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.It("application failover", func() {
|
||||||
|
disabledClusters := framework.ExtractTargetClustersFrom(controlPlaneClient, deployment)
|
||||||
|
ginkgo.By("create an error op", func() {
|
||||||
|
overridePolicy = testhelper.NewOverridePolicyByOverrideRules(policyNamespace, policyName, []policyv1alpha1.ResourceSelector{
|
||||||
|
{
|
||||||
|
APIVersion: deployment.APIVersion,
|
||||||
|
Kind: deployment.Kind,
|
||||||
|
Name: deployment.Name,
|
||||||
|
},
|
||||||
|
}, []policyv1alpha1.RuleWithCluster{
|
||||||
|
{
|
||||||
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
||||||
|
ClusterNames: disabledClusters,
|
||||||
|
},
|
||||||
|
Overriders: policyv1alpha1.Overriders{
|
||||||
|
ImageOverrider: []policyv1alpha1.ImageOverrider{
|
||||||
|
{
|
||||||
|
Component: "Registry",
|
||||||
|
Operator: "replace",
|
||||||
|
Value: "fake",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
framework.CreateOverridePolicy(karmadaClient, overridePolicy)
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.By("check whether the failed deployment is rescheduled to other available cluster", func() {
|
||||||
|
gomega.Eventually(func() int {
|
||||||
|
targetClusterNames := framework.ExtractTargetClustersFrom(controlPlaneClient, deployment)
|
||||||
|
for _, targetClusterName := range targetClusterNames {
|
||||||
|
// the target cluster should be overwritten to another available cluster
|
||||||
|
if !testhelper.IsExclude(targetClusterName, disabledClusters) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(targetClusterNames)
|
||||||
|
}, pollTimeout, pollInterval).Should(gomega.Equal(minGroups))
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.By("check whether the failed deployment is present on the disabledClusters", func() {
|
||||||
|
framework.WaitDeploymentPresentOnClustersFitWith(disabledClusters, deploymentNamespace, deploymentName, func(deployment *appsv1.Deployment) bool { return true })
|
||||||
|
})
|
||||||
|
|
||||||
|
ginkgo.By("delete the error op", func() {
|
||||||
|
framework.RemoveOverridePolicy(karmadaClient, policyNamespace, policyName)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// disableCluster will set wrong API endpoint of current cluster
|
// disableCluster will set wrong API endpoint of current cluster
|
||||||
|
|
Loading…
Reference in New Issue