def test_wait_for_execute_no_changes(self): stack_name = "stack_name" changeset_type = "CREATE" mock_client = Mock() mock_deployer = Deployer(mock_client) mock_waiter = Mock() mock_client.get_waiter.return_value = mock_waiter waiter_error = botocore.exceptions.WaiterError(name="name", reason="reason", last_response={}) mock_waiter.wait.side_effect = waiter_error with self.assertRaises(exceptions.DeployFailedError): mock_deployer.wait_for_execute(stack_name, changeset_type) waiter_config = { 'Delay': 5, 'MaxAttempts': 720, } mock_waiter.wait.assert_called_once_with(StackName=stack_name, WaiterConfig=waiter_config) mock_client.get_waiter.assert_called_once_with( "stack_create_complete")
def test_wait_for_execute_no_changes(self): stack_name = "stack_name" changeset_type = "CREATE" mock_client = mock.Mock() mock_deployer = Deployer(mock_client) mock_waiter = mock.Mock() mock_client.get_waiter.return_value = mock_waiter waiter_error = botocore.exceptions.WaiterError(name="name", reason="reason", last_response={}) mock_waiter.wait.side_effect = waiter_error with self.assertRaises(exceptions.DeployFailedError): mock_deployer.wait_for_execute(stack_name, changeset_type) waiter_config = { 'Delay': 30, 'MaxAttempts': 120, } mock_waiter.wait.assert_called_once_with(StackName=stack_name, WaiterConfig=waiter_config) mock_client.get_waiter.assert_called_once_with("stack_create_complete")
def publish(self, stack_name): d = Deployer(boto3.client('cloudformation')) result = d.create_and_wait_for_changeset( stack_name=stack_name, cfn_template=self.get_template(), parameter_values=[], capabilities=['CAPABILITY_IAM']) d.execute_changeset(result.changeset_id, stack_name) d.wait_for_execute(stack_name, result.changeset_type)
def deploy_template(session, config, packaged_yaml, approve=False): success = True print('\nDeploying...') client = session.create_client('cloudformation') stack_name = conventions.generate_stack_name(config['Parameters']) deployer = Deployer(client) tags = conventions.merge_tags(config.get('Tags', {}), config['Parameters']) try: result = deployer.create_and_wait_for_changeset( stack_name=stack_name, cfn_template=packaged_yaml, parameter_values=deploy_template_parameters_builder( config['Parameters']), capabilities=['CAPABILITY_NAMED_IAM'], role_arn=None, notification_arns=None, s3_uploader=None, tags=deploy_template_tags_builder(tags)) display_changeset(session, stack_name, result.changeset_id) if not approve: utils.get_confirmation() execute_changeset_token = str(uuid.uuid4()) client.execute_change_set(ChangeSetName=result.changeset_id, StackName=stack_name, ClientRequestToken=execute_changeset_token) deployer.wait_for_execute(stack_name, result.changeset_type) except exceptions.ChangeEmptyError as ex: logging.error(ex) success = False except exceptions.DeployFailedError as ex: logging.error(ex) # print(colored(ex.response['Error']['Message'], 'red')) stack_events = get_stack_events(session, stack_name, execute_changeset_token) aws.display_cfn_stack_events(stack_events) success = False except botocore.exceptions.ClientError as ex: logging.error(ex) success = False print('Done.') return success