diff --git a/cluster-autoscaler/cloudprovider/aws/auto_scaling_groups.go b/cluster-autoscaler/cloudprovider/aws/auto_scaling_groups.go index ac344c3dbc2bf940c5c3e51e5505ecf3afab9b60..d39f4685f63b48c48382e5b54a0b54110a63711a 100644 --- a/cluster-autoscaler/cloudprovider/aws/auto_scaling_groups.go +++ b/cluster-autoscaler/cloudprovider/aws/auto_scaling_groups.go @@ -67,7 +67,7 @@ type asg struct { minSize int maxSize int curSize int - lastUpdateTime *time.Time + lastUpdateTime time.Time AvailabilityZones []string LaunchConfigurationName string @@ -254,7 +254,7 @@ func (m *asgCache) setAsgSizeNoLock(asg *asg, size int) error { } // Proactively set the ASG size so autoscaler makes better decisions - asg.lastUpdateTime = &start + asg.lastUpdateTime = start asg.curSize = size return nil @@ -489,12 +489,13 @@ func (m *asgCache) isNodeGroupAvailable(group *autoscaling.Group) (bool, error) return true, err // If we can't describe the scaling activities we assume the node group is available } - if len(response.Activities) > 0 { - activity := response.Activities[0] + for _, activity := range response.Activities { asgRef := AwsRef{Name: *group.AutoScalingGroupName} if a, ok := m.registeredAsgs[asgRef]; ok { lut := a.lastUpdateTime - if lut != nil && activity.StartTime.After(*lut) && *activity.StatusCode == "Failed" { + if activity.StartTime.Before(lut) { + break + } else if *activity.StatusCode == "Failed" { return false, nil } } else { diff --git a/cluster-autoscaler/cloudprovider/aws/auto_scaling_groups_test.go b/cluster-autoscaler/cloudprovider/aws/auto_scaling_groups_test.go index d28519f29c0ceba807b7d08264ba33ec58c9d236..f619af1e2da679e29e832715fa33e8090904e4a4 100644 --- a/cluster-autoscaler/cloudprovider/aws/auto_scaling_groups_test.go +++ b/cluster-autoscaler/cloudprovider/aws/auto_scaling_groups_test.go @@ -59,7 +59,7 @@ func TestCreatePlaceholders(t *testing.T) { name string desiredCapacity *int64 activities []*autoscaling.Activity - groupLastUpdateTime *time.Time + groupLastUpdateTime time.Time describeErr error asgToCheck *string }{ @@ -85,7 +85,7 @@ func TestCreatePlaceholders(t *testing.T) { StartTime: aws.Time(time.Unix(10, 0)), }, }, - groupLastUpdateTime: aws.Time(time.Unix(9, 0)), + groupLastUpdateTime: time.Unix(9, 0), }, { name: "AWS scaling failed event before CA scale_up", @@ -96,7 +96,7 @@ func TestCreatePlaceholders(t *testing.T) { StartTime: aws.Time(time.Unix(9, 0)), }, }, - groupLastUpdateTime: aws.Time(time.Unix(10, 0)), + groupLastUpdateTime: time.Unix(10, 0), }, { name: "asg not registered", @@ -107,7 +107,7 @@ func TestCreatePlaceholders(t *testing.T) { StartTime: aws.Time(time.Unix(10, 0)), }, }, - groupLastUpdateTime: aws.Time(time.Unix(9, 0)), + groupLastUpdateTime: time.Unix(9, 0), asgToCheck: aws.String("unregisteredAsgName"), }, } @@ -158,7 +158,7 @@ func TestCreatePlaceholders(t *testing.T) { } asgCache.createPlaceholdersForDesiredNonStartedInstances(groups) assert.Equal(t, int64(len(groups[0].Instances)), *tc.desiredCapacity) - if tc.activities != nil && *tc.activities[0].StatusCode == "Failed" && tc.activities[0].StartTime.After(*tc.groupLastUpdateTime) && asgName == registeredAsgName { + if tc.activities != nil && *tc.activities[0].StatusCode == "Failed" && tc.activities[0].StartTime.After(tc.groupLastUpdateTime) && asgName == registeredAsgName { assert.Equal(t, *groups[0].Instances[0].HealthStatus, placeholderUnfulfillableStatus) } else if len(groups[0].Instances) > 0 { assert.Equal(t, *groups[0].Instances[0].HealthStatus, "")