in functions/source/nic-attachment/lib/aws/index.js [3026:3091]
async checkAutoScalingGroupState(scalingGroupName) {
try {
logger.info('calling checkAutoScalingGroupState');
let state = 'in-service',
noScale = false,
instanceInService = false,
instanceTerminated = false,
instanceStateInTransition = false,
noInstance = false;
let groupCheck = await this.platform.describeAutoScalingGroups(scalingGroupName);
if (!groupCheck) {
throw new Error(`auto scaling group (${scalingGroupName})` + 'does not exist.');
}
// check if capacity set to (desired:0, minSize: 0, maxSize: any number)
if (groupCheck.DesiredCapacity === 0 && groupCheck.MinSize === 0) {
noScale = true;
}
instanceInService = true;
if (groupCheck.Instances && groupCheck.Instances.length === 0) {
instanceInService = false;
noInstance = true;
}
groupCheck.Instances.forEach(instance => {
if (instance.LifecycleState !== 'InService') {
instanceInService = false;
}
if (
instance.LifecycleState === 'Pending' ||
instance.LifecycleState === 'Pending:Wait' ||
instance.LifecycleState === 'Pending:Proceed' ||
instance.LifecycleState === 'Terminating' ||
instance.LifecycleState === 'Terminating:Wait' ||
instance.LifecycleState === 'Terminating:Proceed' ||
instance.LifecycleState === 'Detaching' ||
instance.LifecycleState === 'EnteringStandby'
) {
instanceStateInTransition = true;
}
if (instance.LifecycleState === 'Terminated') {
instanceTerminated = true;
}
});
// if any instance is in service, the group is in-service
if (instanceInService) {
state = 'in-service';
}
// if any instance is in transition, the group is in-transition
if (instanceStateInTransition) {
state = 'in-transition';
}
// if the group is not-scaled and all instances are terminated, the group is stopped
if (noScale && instanceTerminated) {
state = 'stopped';
}
// this is the fully stopped case
if (noScale && !instanceInService && noInstance) {
state = 'stopped';
}
logger.info(`called checkAutoScalingGroupState: state: ${state} `);
return state;
} catch (error) {
logger.error(error);
return null;
}
}