@@ -2,14 +2,14 @@ package transitioner
22
33import (
44 "errors"
5- "fmt"
65 "testing"
76 "time"
87
98 v1 "github.com/atlassian-labs/cyclops/pkg/apis/atlassian/v1"
109 "github.com/atlassian-labs/cyclops/pkg/cloudprovider"
1110 "github.com/atlassian-labs/cyclops/pkg/controller"
1211 "github.com/aws/aws-sdk-go/aws/awserr"
12+ "github.com/go-logr/logr/testr"
1313 corev1 "k8s.io/api/core/v1"
1414 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1515 "k8s.io/apimachinery/pkg/runtime"
@@ -237,7 +237,7 @@ func TestEndToEnd_EquilibriumTimeout(t *testing.T) {
237237 node := createTestNode ("test-node-1" , "aws:///us-west-2a/i-1234567890abcdef0" )
238238
239239 // Set equilibrium wait to past the timeout
240- cnr .Status .EquilibriumWaitStarted = metav1.Time {
240+ cnr .Status .EquilibriumWaitStarted = & metav1.Time {
241241 Time : time .Now ().Add (- 10 * time .Minute ), // Past the 5 minute limit
242242 }
243243
@@ -331,7 +331,7 @@ func createTestCycleNodeRequest(name string, phase v1.CycleNodeRequestPhase) *v1
331331 },
332332 Status : v1.CycleNodeRequestStatus {
333333 Phase : phase ,
334- EquilibriumWaitStarted : metav1.Time {
334+ EquilibriumWaitStarted : & metav1.Time {
335335 Time : time .Now (),
336336 },
337337 },
@@ -354,7 +354,7 @@ func createTestNode(name, providerID string) *corev1.Node {
354354
355355func createTestResourceManager (t * testing.T , cnr * v1.CycleNodeRequest , node * corev1.Node , cp cloudprovider.CloudProvider ) * controller.ResourceManager {
356356 scheme := runtime .NewScheme ()
357- _ = v1 .AddToScheme (scheme )
357+ _ = v1 .SchemeBuilder . AddToScheme (scheme )
358358 _ = corev1 .AddToScheme (scheme )
359359 fakeClient := fake .NewClientBuilder ().
360360 WithScheme (scheme ).
@@ -364,7 +364,7 @@ func createTestResourceManager(t *testing.T, cnr *v1.CycleNodeRequest, node *cor
364364 return & controller.ResourceManager {
365365 Client : fakeClient ,
366366 CloudProvider : cp ,
367- Logger : & testLogger { t : t } ,
367+ Logger : testr . NewWithOptions ( t , testr. Options { Verbosity : 10 }) ,
368368 }
369369}
370370
@@ -385,18 +385,83 @@ func (m *mockCloudProviderAlwaysFails) TerminateInstance(providerID string) erro
385385 return m .error
386386}
387387
388- func (m * mockCloudProviderAlwaysFails ) DetachInstance ( nodeGroupName , providerID string ) error {
389- return m . error
388+ func (m * mockCloudProviderAlwaysFails ) Name () string {
389+ return "mock-aws-failing"
390390}
391391
392- func (m * mockCloudProviderAlwaysFails ) AttachInstance (nodeGroupName , providerID string ) error {
393- return m .error
392+ // mockCloudProviderWithTransientErrors simulates AWS transient failures
393+ type mockCloudProviderWithTransientErrors struct {
394+ callCount int
395+ failuresBeforeSuccess int
396+ errorToReturn error
394397}
395398
396- func (m * mockCloudProviderAlwaysFails ) AddInstanceToNodeGroup (nodeGroupName string , nodeGroup cloudprovider.NodeGroupOptions ) error {
397- return m .error
399+ func (m * mockCloudProviderWithTransientErrors ) GetNodeGroups (names []string ) (cloudprovider.NodeGroups , error ) {
400+ m .callCount ++
401+ if m .callCount <= m .failuresBeforeSuccess {
402+ return nil , m .errorToReturn
403+ }
404+ // Success after N failures
405+ return & mockNodeGroups {}, nil
398406}
399407
400- func (m * mockCloudProviderAlwaysFails ) Name () string {
401- return "mock-aws-failing"
408+ func (m * mockCloudProviderWithTransientErrors ) InstancesExist (providerIDs []string ) (map [string ]interface {}, error ) {
409+ return make (map [string ]interface {}), nil
410+ }
411+
412+ func (m * mockCloudProviderWithTransientErrors ) TerminateInstance (providerID string ) error {
413+ return nil
414+ }
415+
416+ func (m * mockCloudProviderWithTransientErrors ) Name () string {
417+ return "mock-aws"
418+ }
419+
420+ // mockNodeGroups is a simple mock implementation
421+ type mockNodeGroups struct {}
422+
423+ func (m * mockNodeGroups ) Instances () map [string ]cloudprovider.Instance {
424+ return map [string ]cloudprovider.Instance {
425+ "aws:///us-west-2a/i-1234567890abcdef0" : & mockInstance {
426+ id : "i-1234567890abcdef0" ,
427+ providerID : "aws:///us-west-2a/i-1234567890abcdef0" ,
428+ },
429+ }
430+ }
431+
432+ func (m * mockNodeGroups ) DetachInstance (providerID string ) (bool , error ) {
433+ return false , nil
434+ }
435+
436+ func (m * mockNodeGroups ) AttachInstance (providerID , nodeGroup string ) (bool , error ) {
437+ return false , nil
438+ }
439+
440+ func (m * mockNodeGroups ) ReadyInstances () map [string ]cloudprovider.Instance {
441+ return m .Instances ()
442+ }
443+
444+ func (m * mockNodeGroups ) NotReadyInstances () map [string ]cloudprovider.Instance {
445+ return make (map [string ]cloudprovider.Instance )
446+ }
447+
448+ type mockInstance struct {
449+ id string
450+ providerID string
451+ }
452+
453+ func (m * mockInstance ) ID () string {
454+ return m .id
455+ }
456+
457+ func (m * mockInstance ) OutOfDate () bool {
458+ return false
459+ }
460+
461+ func (m * mockInstance ) MatchesProviderID (providerID string ) bool {
462+ return m .providerID == providerID
463+ }
464+
465+ func (m * mockInstance ) NodeGroupName () string {
466+ return "test-nodegroup"
402467}
0 commit comments