Skip to content
This repository has been archived by the owner on Jan 19, 2022. It is now read-only.

Commit

Permalink
Merge 85a329a into 194ffb4
Browse files Browse the repository at this point in the history
  • Loading branch information
filipposc5 committed Mar 9, 2017
2 parents 194ffb4 + 85a329a commit 8da9b8f
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 0 deletions.
7 changes: 7 additions & 0 deletions bootstrap_cfn/cloudformation.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ def stack_done(self, stack_id):
return True
return False

def stack_delete_done(self, stack_id):
stack_events = self.conn_cfn.describe_stack_events(stack_id)
if stack_events[0].resource_type == 'AWS::CloudFormation::Stack'\
and stack_events[0].resource_status in ['DELETE_COMPLETE', 'DELETE_FAILED']:
return True
return False

def wait_for_stack_done(self, stack_id, timeout=3600, interval=30):
return utils.timeout(timeout, interval)(self.stack_done)(stack_id)

Expand Down
2 changes: 2 additions & 0 deletions bootstrap_cfn/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ def tail_print(e):
break
elif stack.stack_done(stack_name):
break
elif stack.stack_delete_done(stack_name):
break
events = get_events(stack, stack_name)
for e in events:
if e.event_id not in seen:
Expand Down
54 changes: 54 additions & 0 deletions tests/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,60 @@ def test_stack_not_done(self):
self.assertFalse(cloudformation.Cloudformation(
self.env.aws_profile).stack_done(self.stack_name))

def test_stack_delete_done(self):
stack_evt_mock = mock.Mock()
rt = mock.PropertyMock(return_value='AWS::CloudFormation::Stack')
rs = mock.PropertyMock(return_value='DELETE_COMPLETE')
type(stack_evt_mock).resource_type = rt
type(stack_evt_mock).resource_status = rs
mock_config = {'describe_stack_events.return_value': [stack_evt_mock]}

cf_mock = mock.Mock()
cf_connect_result = mock.Mock(name='cf_connect')
cf_mock.return_value = cf_connect_result
cf_connect_result.configure_mock(**mock_config)

boto.cloudformation.connect_to_region = cf_mock

self.assertTrue(cloudformation.Cloudformation(
self.env.aws_profile).stack_delete_done(self.stack_name))

def test_stack_delete_failed_but_done(self):
stack_evt_mock = mock.Mock()
rt = mock.PropertyMock(return_value='AWS::CloudFormation::Stack')
rs = mock.PropertyMock(return_value='DELETE_FAILED')
type(stack_evt_mock).resource_type = rt
type(stack_evt_mock).resource_status = rs
mock_config = {'describe_stack_events.return_value': [stack_evt_mock]}

cf_mock = mock.Mock()
cf_connect_result = mock.Mock(name='cf_connect')
cf_mock.return_value = cf_connect_result
cf_connect_result.configure_mock(**mock_config)

boto.cloudformation.connect_to_region = cf_mock

self.assertTrue(cloudformation.Cloudformation(
self.env.aws_profile).stack_delete_done(self.stack_name))

def test_stack_not_delete_done(self):
stack_evt_mock = mock.Mock()
rt = mock.PropertyMock(return_value='AWS::CloudFormation::Stack')
rs = mock.PropertyMock(return_value='DELETE_ME')
type(stack_evt_mock).resource_type = rt
type(stack_evt_mock).resource_status = rs
mock_config = {'describe_stack_events.return_value': [stack_evt_mock]}

cf_mock = mock.Mock()
cf_connect_result = mock.Mock(name='cf_connect')
cf_mock.return_value = cf_connect_result
cf_connect_result.configure_mock(**mock_config)

boto.cloudformation.connect_to_region = cf_mock

self.assertFalse(cloudformation.Cloudformation(
self.env.aws_profile).stack_delete_done(self.stack_name))

def test_ssl_upload(self):
iam_mock = mock.Mock()
iam_connect_result = mock.Mock(name='iam_connect')
Expand Down

0 comments on commit 8da9b8f

Please sign in to comment.