diff --git a/src/cfn/getStackDescription.ts b/src/cfn/getStackDescription.ts index 5589488..54bd717 100644 --- a/src/cfn/getStackDescription.ts +++ b/src/cfn/getStackDescription.ts @@ -1,9 +1,18 @@ +import { TERMINAL } from './statusTypes'; + import * as _ from 'lodash'; import * as aws from 'aws-sdk' -export async function getStackDescription(StackName: string): Promise { +export async function getStackDescription(StackName: string, expectTerminalStatus: boolean = false): Promise { const cfn = new aws.CloudFormation(); - const stacks = await cfn.describeStacks({StackName}).promise(); + const stacks = await (async () => { + if (expectTerminalStatus) { + while (!_.includes(TERMINAL, (await cfn.describeStacks({StackName}).promise()).Stacks![0].StackStatus)) { + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + return await cfn.describeStacks({StackName}).promise(); + })(); if (_.isUndefined(stacks.Stacks) || stacks.Stacks.length < 1) { throw new Error(`${StackName} not found. Has it been deleted? Check the AWS Console.`); } else { diff --git a/src/cfn/index.ts b/src/cfn/index.ts index 8a7350a..4766380 100644 --- a/src/cfn/index.ts +++ b/src/cfn/index.ts @@ -40,7 +40,7 @@ class CreateStack extends AbstractCloudFormationStackCommand { class UpdateStack extends AbstractCloudFormationStackCommand { cfnOperation: CfnOperation = 'UPDATE_STACK'; - expectedFinalStackStatus = ['UPDATE_COMPLETE', 'UPDATE_COMPLETE_CLEANUP_IN_PROGRESS']; + expectedFinalStackStatus = ['UPDATE_COMPLETE']; async _run() { return this._runUpdate(); @@ -130,7 +130,7 @@ export class CreateChangeSet extends AbstractCloudFormationStackCommand { class ExecuteChangeSet extends AbstractCloudFormationStackCommand { cfnOperation: CfnOperation = 'EXECUTE_CHANGESET' - expectedFinalStackStatus = ['UPDATE_COMPLETE', 'UPDATE_COMPLETE_CLEANUP_IN_PROGRESS', 'CREATE_COMPLETE'] + expectedFinalStackStatus = ['UPDATE_COMPLETE', 'CREATE_COMPLETE'] async _run() { await this.cfn.executeChangeSet( diff --git a/src/cfn/summarizeStackContents.ts b/src/cfn/summarizeStackContents.ts index 6d943fb..47fcb78 100644 --- a/src/cfn/summarizeStackContents.ts +++ b/src/cfn/summarizeStackContents.ts @@ -26,7 +26,7 @@ export async function summarizeStackContents( const resourcesPromise = cfn.describeStackResources({StackName: StackId}).promise(); const exportsPromise = getAllStackExportsWithImports(StackId); const changeSetsPromise = cfn.listChangeSets({StackName: StackId}).promise(); - const stack = await (stackPromise || getStackDescription(StackId)); + const stack = await (stackPromise || getStackDescription(StackId, true)); const resources = def([], (await resourcesPromise).StackResources); // TODO paginate resource lookup ^ if (resources.length > 0) {