karmada/test/e2e/hpareplicassyncer_test.go

92 lines
3.2 KiB
Go

package e2e
import (
"context"
"time"
"github.com/onsi/ginkgo/v2"
"github.com/onsi/gomega"
appsv1 "k8s.io/api/apps/v1"
autoscalingv2 "k8s.io/api/autoscaling/v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"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"
"github.com/karmada-io/karmada/test/helper"
)
var _ = ginkgo.Describe("hpa replicas synchronization testing", func() {
ginkgo.Context("Replicas synchronization testing", func() {
var policyNamespace, policyName string
var namespace, deploymentName, hpaName string
var deployment *appsv1.Deployment
var hpa *autoscalingv2.HorizontalPodAutoscaler
var policy *policyv1alpha1.PropagationPolicy
ginkgo.BeforeEach(func() {
policyNamespace = testNamespace
namespace = testNamespace
policyName = deploymentNamePrefix + rand.String(RandomStrLength)
deploymentName = policyName
hpaName = policyName
deployment = helper.NewDeployment(namespace, deploymentName)
deployment.Spec.Replicas = pointer.Int32(1)
hpa = helper.NewHPA(namespace, hpaName, deploymentName)
hpa.Spec.MinReplicas = pointer.Int32(2)
policy = helper.NewPropagationPolicy(policyNamespace, policyName, []policyv1alpha1.ResourceSelector{
{
APIVersion: deployment.APIVersion,
Kind: deployment.Kind,
Name: deployment.Name,
},
{
APIVersion: hpa.APIVersion,
Kind: hpa.Kind,
Name: hpa.Name,
},
}, policyv1alpha1.Placement{
ClusterAffinity: &policyv1alpha1.ClusterAffinity{
ClusterNames: framework.ClusterNames(),
},
})
})
ginkgo.BeforeEach(func() {
framework.CreatePropagationPolicy(karmadaClient, policy)
framework.CreateDeployment(kubeClient, deployment)
framework.CreateHPA(kubeClient, hpa)
ginkgo.DeferCleanup(func() {
framework.RemovePropagationPolicy(karmadaClient, policy.Namespace, policy.Name)
framework.RemoveDeployment(kubeClient, deployment.Namespace, deployment.Name)
framework.RemoveHPA(kubeClient, namespace, hpa.Name)
framework.WaitDeploymentDisappearOnClusters(framework.ClusterNames(), deployment.Namespace, deployment.Name)
})
})
ginkgo.It("deployment has been scaled up and synchronized to Karmada", func() {
framework.WaitDeploymentPresentOnClustersFitWith(framework.ClusterNames(), deployment.Namespace, deployment.Name,
func(deployment *appsv1.Deployment) bool {
return true
})
framework.WaitDeploymentPresentOnClustersFitWith(framework.ClusterNames(), deployment.Namespace, deployment.Name,
func(deployment *appsv1.Deployment) bool {
return *deployment.Spec.Replicas == *hpa.Spec.MinReplicas
})
expectedReplicas := *hpa.Spec.MinReplicas * int32(len(framework.ClusterNames()))
gomega.Eventually(func() bool {
deploymentExist, err := kubeClient.AppsV1().Deployments(deployment.Namespace).Get(context.TODO(), deployment.Name, metav1.GetOptions{})
if err != nil {
return false
}
return (*deploymentExist.Spec.Replicas == expectedReplicas) && (deploymentExist.Generation == deploymentExist.Status.ObservedGeneration)
}, time.Minute, pollInterval).Should(gomega.Equal(true))
})
})
})