diff --git a/pkg/controller/deployment_trigger_controller.go b/pkg/controller/deployment_trigger_controller.go index 78f78d8..9448962 100644 --- a/pkg/controller/deployment_trigger_controller.go +++ b/pkg/controller/deployment_trigger_controller.go @@ -114,7 +114,11 @@ func (r *DeploymentTriggerController) SetupWithManager(mgr ctrl.Manager) error { newMaxPods, _ = newObj.GetAnnotations()[reco.OttoscalrMaxPodAnnotation] oldMaxPods, _ = oldObj.GetAnnotations()[reco.OttoscalrMaxPodAnnotation] - if newMaxPods != oldMaxPods { + var newDefaultPolicy, oldDefaultPolicy string + newDefaultPolicy, _ = newObj.GetAnnotations()[reco.DefaultPolicyAnnotation] + oldDefaultPolicy, _ = oldObj.GetAnnotations()[reco.DefaultPolicyAnnotation] + + if newMaxPods != oldMaxPods || newDefaultPolicy != oldDefaultPolicy { return true } diff --git a/pkg/controller/deployment_trigger_controller_test.go b/pkg/controller/deployment_trigger_controller_test.go index 3b5914f..cc1689a 100644 --- a/pkg/controller/deployment_trigger_controller_test.go +++ b/pkg/controller/deployment_trigger_controller_test.go @@ -4,15 +4,17 @@ import ( "context" "encoding/json" "fmt" + "time" + rolloutv1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" ottoscaleriov1alpha1 "github.com/flipkart-incubator/ottoscalr/api/v1alpha1" + "github.com/flipkart-incubator/ottoscalr/pkg/reco" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "time" ) //+kubebuilder:docs-gen:collapse=Imports @@ -363,4 +365,116 @@ var _ = Describe("Deployment controller", func() { }) }) + Context("When updating the default annotation for a Deployment", func() { + var deployment *appsv1.Deployment + var policyreco *ottoscaleriov1alpha1.PolicyRecommendation + ctx := context.TODO() + now := metav1.Now() + BeforeEach(func() { + deployment = &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: DeploymentName, + Namespace: DeploymentNamespace, + Annotations: map[string]string{ + "ottoscalr.io/max-pods": "60", + }, + }, + + Spec: appsv1.DeploymentSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "test-app", + }, + }, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app": "test-app", + }, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "test-container", + Image: "nginx:1.17.5", + }, + }, + }, + }, + }, + } + + policyreco = &ottoscaleriov1alpha1.PolicyRecommendation{ + ObjectMeta: metav1.ObjectMeta{ + Name: DeploymentName, + Namespace: DeploymentNamespace, + }, + Spec: ottoscaleriov1alpha1.PolicyRecommendationSpec{ + WorkloadMeta: ottoscaleriov1alpha1.WorkloadMeta{ + Name: DeploymentName, + }, + Policy: "test-policy", + GeneratedAt: &now, + TransitionedAt: &now, + QueuedForExecution: &falseBool, + QueuedForExecutionAt: &now, + }, + } + Expect(k8sClient1.Create(ctx, policyreco)).Should(Succeed()) + + Expect(k8sClient1.Create(ctx, deployment)).Should(Succeed()) + }) + AfterEach(func() { + Expect(k8sClient1.Delete(ctx, deployment)).Should(Succeed()) + Expect(k8sClient1.Delete(ctx, policyreco)).Should(Succeed()) + }) + It("Should requeue the policyreco", func() { + By("By updating the max pod annotation for a Deployment") + + createdDeployment := &appsv1.Deployment{} + createdPolicy := &ottoscaleriov1alpha1.PolicyRecommendation{} + + time.Sleep(5 * time.Second) + + Eventually(func() bool { + err := k8sClient1.Get(ctx, + types.NamespacedName{Name: DeploymentName, Namespace: DeploymentNamespace}, + createdDeployment) + if err != nil { + return false + } + + err = k8sClient1.Get(ctx, + types.NamespacedName{Name: DeploymentName, Namespace: DeploymentNamespace}, + createdPolicy) + if err != nil { + return false + } + return true + }, timeout, interval).Should(BeTrue()) + + Expect(createdDeployment.Name).Should(Equal(DeploymentName)) + + createdPolicyString, _ := json.MarshalIndent(createdPolicy, "", " ") + fmt.Fprintf(GinkgoWriter, "%s\n", createdPolicyString) + + Expect(createdPolicy.Spec.QueuedForExecution).Should(Equal(&falseBool)) + + createdDeployment.Annotations[reco.DefaultPolicyAnnotation] = "p-target-30" + Expect(k8sClient1.Update(ctx, createdDeployment)).Should(Succeed()) + updatedPolicy := &ottoscaleriov1alpha1.PolicyRecommendation{} + + time.Sleep(5 * time.Second) + + k8sClient1.Get(ctx, + types.NamespacedName{Name: DeploymentName, Namespace: DeploymentNamespace}, + updatedPolicy) + updatedPolicyRecoString, _ := json.MarshalIndent(updatedPolicy, "", " ") + fmt.Fprintf(GinkgoWriter, "Updated: %s\n", updatedPolicyRecoString) + + Expect(updatedPolicy.Spec.QueuedForExecution).Should(Equal(&trueBool)) + + }) + }) + })