diff --git a/pkg/cloudprovider/fake/factory.go b/pkg/cloudprovider/fake/factory.go index 8924e3470670..3c2375570eff 100644 --- a/pkg/cloudprovider/fake/factory.go +++ b/pkg/cloudprovider/fake/factory.go @@ -19,7 +19,6 @@ import ( "github.com/awslabs/karpenter/pkg/apis/autoscaling/v1alpha1" "github.com/awslabs/karpenter/pkg/cloudprovider" - "knative.dev/pkg/ptr" ) var ( @@ -29,14 +28,15 @@ var ( type Factory struct { WantErr error // NodeReplicas is use by tests to control observed replicas. - NodeReplicas map[string]int32 - - nodegroup *NodeGroup + NodeReplicas map[string]*int32 + NodeGroupStable bool + NodeGroupMessage string } func NewFactory(options cloudprovider.Options) *Factory { return &Factory{ - NodeReplicas: make(map[string]int32), + NodeReplicas: make(map[string]*int32), + NodeGroupStable: true, } } @@ -45,14 +45,12 @@ func NewNotImplementedFactory() *Factory { } func (f *Factory) NodeGroupFor(sng *v1alpha1.ScalableNodeGroupSpec) cloudprovider.NodeGroup { - if f.nodegroup == nil { - f.nodegroup = &NodeGroup{ - WantErr: f.WantErr, - Stable: true, - Replicas: ptr.Int32(f.NodeReplicas[sng.ID]), - } + return &NodeGroup{ + WantErr: f.WantErr, + Stable: f.NodeGroupStable, + Message: f.NodeGroupMessage, + Replicas: f.NodeReplicas[sng.ID], } - return f.nodegroup } func (f *Factory) QueueFor(spec *v1alpha1.QueueSpec) cloudprovider.Queue { diff --git a/pkg/controllers/horizontalautoscaler/v1alpha1/suite_test.go b/pkg/controllers/horizontalautoscaler/v1alpha1/suite_test.go index b10288121cdc..1fb67dc954ac 100644 --- a/pkg/controllers/horizontalautoscaler/v1alpha1/suite_test.go +++ b/pkg/controllers/horizontalautoscaler/v1alpha1/suite_test.go @@ -91,7 +91,7 @@ var _ = Describe("Examples", func() { It("should scale to average utilization target, metric=85, target=60, replicas=5, want=8", func() { Expect(ns.ParseResources("docs/examples/reserved-capacity-utilization.yaml", ha, sng)).To(Succeed()) sng.Spec.Replicas = ptr.Int32(5) - fakeCloudProvider.NodeReplicas[sng.Spec.ID] = *sng.Spec.Replicas + fakeCloudProvider.NodeReplicas[sng.Spec.ID] = ptr.Int32(*sng.Spec.Replicas) MockMetricValue(fakeServer, .85) ExpectCreated(ns.Client, sng, ha) @@ -105,7 +105,7 @@ var _ = Describe("Examples", func() { It("should scale to average value target, metric=41, target=4, want=11", func() { Expect(ns.ParseResources("docs/examples/queue-length-average-value.yaml", ha, sng)).To(Succeed()) sng.Spec.Replicas = ptr.Int32(1) - fakeCloudProvider.NodeReplicas[sng.Spec.ID] = *sng.Spec.Replicas + fakeCloudProvider.NodeReplicas[sng.Spec.ID] = ptr.Int32(*sng.Spec.Replicas) MockMetricValue(fakeServer, 41) ExpectCreated(ns.Client, sng, ha) diff --git a/pkg/controllers/scalablenodegroup/v1alpha1/suite_test.go b/pkg/controllers/scalablenodegroup/v1alpha1/suite_test.go index d96ec70697ae..a9203526655f 100644 --- a/pkg/controllers/scalablenodegroup/v1alpha1/suite_test.go +++ b/pkg/controllers/scalablenodegroup/v1alpha1/suite_test.go @@ -56,82 +56,70 @@ var _ = Describe("Examples", func() { var ns *environment.Namespace var desiredReplicas = ptr.Int32(5) var dummyMessage = "test message" - var nodeGroupObject *fake.NodeGroup var sng *v1alpha1.ScalableNodeGroup - var ng cloudprovider.NodeGroup - var defaultNodeGroupObject fake.NodeGroup BeforeEach(func() { var err error - sng = &v1alpha1.ScalableNodeGroup{} - ng = fakeController.CloudProvider.NodeGroupFor(&sng.Spec) - defaultNodeGroupObject = *ng.(*fake.NodeGroup) ns, err = env.NewNamespace() Expect(err).NotTo(HaveOccurred()) + sng = &v1alpha1.ScalableNodeGroup{} + fakeCloudProvider.NodeGroupStable = true + fakeCloudProvider.NodeGroupMessage = "" + fakeCloudProvider.WantErr = nil sng.Spec.Replicas = desiredReplicas - nodeGroupObject = ng.(*fake.NodeGroup) - }) - - AfterEach(func() { - nodeGroupObject.Stable = defaultNodeGroupObject.Stable - nodeGroupObject.Message = defaultNodeGroupObject.Message - nodeGroupObject.WantErr = defaultNodeGroupObject.WantErr - sng.Spec.Replicas = desiredReplicas - ng = fakeController.CloudProvider.NodeGroupFor(&sng.Spec) + sng.Spec.ID = "dummyID" + fakeCloudProvider.NodeReplicas[sng.Spec.ID] = ptr.Int32(0) }) Context("ScalableNodeGroup", func() { It("should be created", func() { Expect(ns.ParseResources("docs/examples/reserved-capacity-utilization.yaml", sng)).To(Succeed()) + fakeCloudProvider.NodeReplicas[sng.Spec.ID] = ptr.Int32(*sng.Spec.Replicas) ExpectCreated(ns.Client, sng) ExpectEventuallyHappy(ns.Client, sng) ExpectDeleted(ns.Client, sng) }) }) - Context("Basic ScalableNodeGroup Reconcile tests", func() { + Context("ScalableNodeGroup Reconcile tests", func() { It("Test reconciler to scale up nodes", func() { Expect(fakeController.Reconcile(sng)).To(Succeed()) - Expect(ng.GetReplicas()).To(Equal(*desiredReplicas)) + Expect(fakeCloudProvider.NodeReplicas[sng.Spec.ID]).To(Equal(desiredReplicas)) }) It("Test reconciler to scale down nodes", func() { - Expect(ng.SetReplicas(10)).To(Succeed()) // set existing replicas higher than desired + fakeCloudProvider.NodeReplicas[sng.Spec.ID] = ptr.Int32(10) // set existing replicas higher than desired Expect(fakeController.Reconcile(sng)).To(Succeed()) - Expect(ng.GetReplicas()).To(Equal(*desiredReplicas)) + Expect(fakeCloudProvider.NodeReplicas[sng.Spec.ID]).To(Equal(desiredReplicas)) }) It("Test reconciler to make no change to node count", func() { - Expect(ng.SetReplicas(*desiredReplicas)).To(Succeed()) // set existing replicas equal to desired + fakeCloudProvider.NodeReplicas[sng.Spec.ID] = desiredReplicas // set existing replicas equal to desired Expect(fakeController.Reconcile(sng)).To(Succeed()) - Expect(ng.GetReplicas()).To(Equal(*desiredReplicas)) + Expect(fakeCloudProvider.NodeReplicas[sng.Spec.ID]).To(Equal(desiredReplicas)) }) - }) - Context("Advanced ScalableNodeGroup Reconcile tests", func() { It("Scale up nodes when not node group is stabilized and check status condition", func() { Expect(fakeController.Reconcile(sng)).To(Succeed()) - Expect(ng.GetReplicas()).To(Equal(*desiredReplicas)) + Expect(fakeCloudProvider.NodeReplicas[sng.Spec.ID]).To(Equal(desiredReplicas)) Expect(sng.StatusConditions().GetCondition(v1alpha1.Stabilized).IsTrue()).To(Equal(true)) Expect(sng.StatusConditions().GetCondition(v1alpha1.Stabilized).Message).To(Equal("")) }) It("Scale up nodes when not node group is NOT stabilized and check status condition", func() { - nodeGroupObject.Stable = false - nodeGroupObject.Message = dummyMessage + fakeCloudProvider.NodeGroupStable = false + fakeCloudProvider.NodeGroupMessage = dummyMessage Expect(fakeController.Reconcile(sng)).To(Succeed()) - Expect(ng.GetReplicas()).To(Equal(*desiredReplicas)) + Expect(fakeCloudProvider.NodeReplicas[sng.Spec.ID]).To(Equal(desiredReplicas)) Expect(sng.StatusConditions().GetCondition(v1alpha1.Stabilized).IsFalse()).To(Equal(true)) Expect(sng.StatusConditions().GetCondition(v1alpha1.Stabilized).Message).To(Equal(dummyMessage)) }) It("Retryable error while reconciling", func() { - nodeGroupObject.WantErr = fake.RetryableError(fmt.Errorf(dummyMessage)) // retryable error - existingReplicas, _ := ng.GetReplicas() + fakeCloudProvider.WantErr = fake.RetryableError(fmt.Errorf(dummyMessage)) // retryable error + existingReplicas := fakeCloudProvider.NodeReplicas[sng.Spec.ID] Expect(fakeController.Reconcile(sng)).To(Succeed()) - replicas, err := ng.GetReplicas() - Expect(replicas).To(Equal(existingReplicas)) - Expect(err).To(Equal(fake.RetryableError(fmt.Errorf(dummyMessage)))) + Expect(fakeCloudProvider.NodeReplicas[sng.Spec.ID]).To(Equal(existingReplicas)) Expect(sng.StatusConditions().GetCondition(v1alpha1.AbleToScale).IsFalse()).To(Equal(true)) Expect(sng.StatusConditions().GetCondition(v1alpha1.AbleToScale).Message).To(Equal(dummyMessage)) })