From 3f25956d7117c8b67031dcc173d3f00a86ca23f4 Mon Sep 17 00:00:00 2001 From: Joseph Manley Date: Tue, 14 Jan 2020 13:17:26 -0500 Subject: [PATCH 1/2] DPY-57: Wait for stack rest --- deployer/cloudformation.py | 2 ++ deployer/stack_sets.py | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/deployer/cloudformation.py b/deployer/cloudformation.py index 5bdac2e..4b6b675 100644 --- a/deployer/cloudformation.py +++ b/deployer/cloudformation.py @@ -225,6 +225,8 @@ def create_stack(self): self.client.create_stack(**args) self.create_waiter(start_time) + def wait_for_complete(self): + self.create_waiter(datetime.now(pytz.utc)) def create_waiter(self, start_time): waiter = self.client.get_waiter('stack_create_complete') diff --git a/deployer/stack_sets.py b/deployer/stack_sets.py index d38328f..ce92354 100644 --- a/deployer/stack_sets.py +++ b/deployer/stack_sets.py @@ -23,6 +23,9 @@ def __init__(self, profile, config_file, stack, disable_rollback=False, print_ev self.validate_account() + if not self.accounts or not self.regions: + return super(StackSet, self).wait_for_complete() + @property def current_instances(self): result = self.client.list_stack_instances(StackSetName=self.stack_name) @@ -69,6 +72,22 @@ def stack_set_status(self): except ClientError: return None + def wait_for_complete(self): + NextToken = None + response = self.client.list_stack_set_operations(StackSetName=self.stack_name) + for operation in response['Summaries']: + if operation['Status'] in ['RUNNING', 'STOPPING']: + self.stack_set_waiter(operation['OperationId'], "Waiting...") + + while 'NextToken' in response: + response = self.client.list_stack_set_operations(StackSetName=self.stack_name, NextToken=NextToken) + NextToken = response['NextToken '] + for operation in response['Summaries']: + if operation['Status'] in ['RUNNING', 'STOPPING']: + self.stack_set_waiter(operation['OperationId'], "Waiting...") + + + def validate_account(self): current = self.current_account if self.account is not None and current != self.account: From 1ba517869157a1237a9a442a8db7af608043f6a4 Mon Sep 17 00:00:00 2001 From: Joseph Manley Date: Tue, 14 Jan 2020 13:50:19 -0500 Subject: [PATCH 2/2] DPY-57: Remove additional ' ' TEST TEST TEST --- deployer/cloudformation.py | 20 +++++++++++++++++++- deployer/stack_sets.py | 4 ++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/deployer/cloudformation.py b/deployer/cloudformation.py index 4b6b675..26e91bd 100644 --- a/deployer/cloudformation.py +++ b/deployer/cloudformation.py @@ -226,7 +226,25 @@ def create_stack(self): self.create_waiter(start_time) def wait_for_complete(self): - self.create_waiter(datetime.now(pytz.utc)) + try: + cloudformation = self.session.resource('cloudformation') + stack = cloudformation.Stack(self.stack_name) + stack.load() + + if stack.stack_status == "CREATE_IN_PROGRESS": + self.create_waiter(datetime.now(pytz.utc)) + elif stack.stack_status == "UPDATE_IN_PROGRESS": + self.update_waiter(datetime.now(pytz.utc)) + elif stack.stack_status == "DELETE_IN_PROGRESS": + logger.info("Waiting for 'DELETE_COMPLETE'") + while stack.stack_status == "DELETE_IN_PROGRESS": + time.sleep(1) + stack.reload() + logger.debug(stack.stack_status) + except ClientError as e: + if e.response['Error']['Code'] != "ValidationError": + raise e + def create_waiter(self, start_time): waiter = self.client.get_waiter('stack_create_complete') diff --git a/deployer/stack_sets.py b/deployer/stack_sets.py index ce92354..a61d433 100644 --- a/deployer/stack_sets.py +++ b/deployer/stack_sets.py @@ -81,8 +81,8 @@ def wait_for_complete(self): while 'NextToken' in response: response = self.client.list_stack_set_operations(StackSetName=self.stack_name, NextToken=NextToken) - NextToken = response['NextToken '] - for operation in response['Summaries']: + NextToken = response['NextToken'] + for operation in response['Summaries']: if operation['Status'] in ['RUNNING', 'STOPPING']: self.stack_set_waiter(operation['OperationId'], "Waiting...")