Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions touchdown/aws/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,10 @@ def can_delete(self):
def get_actions(self):
self.object = self.describe_object()

if 'never-destroy' in self.resource.ensure:
logger.debug('Resource "{}" not considered for deletion due to ensure policy'.format(resource))
return

if not self.object:
logger.debug('Resource "{}" not found - assuming already destroyed'.format(self.resource))
return
Expand Down
4 changes: 1 addition & 3 deletions touchdown/goals/destroy.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ class Destroy(ActionGoalMixin, Goal):
execute_in_reverse = True

def get_plan_class(self, resource):
if 'never-destroy' not in resource.ensure:
return resource.meta.get_plan('destroy') or resource.meta.get_plan('describe') or resource.meta.get_plan('null')
return resource.meta.get_plan('describe') or resource.meta.get_plan('null')
return resource.meta.get_plan('destroy') or resource.meta.get_plan('describe') or resource.meta.get_plan('null')


register(Destroy)
43 changes: 43 additions & 0 deletions touchdown/tests/test_aws_s3_bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,49 @@ def test_create_bucket_idempotent(self):

class TestBucketDeletion(StubberTestCase):

def test_delete_bucket_forbidden(self):
# If a bucket is marked as never-destroy then it's destroy plan is
# still used, but it should never harm it
goal = self.create_goal('destroy')

bucket = self.fixtures.enter_context(BucketStubber(
goal.get_service(
self.aws.add_bucket(
name='my-bucket',
ensure=['never-destroy'],
),
'destroy',
)
))

bucket.add_list_buckets_one_response()
bucket.add_head_bucket()
bucket.add_get_bucket_location()
bucket.add_get_bucket_cors()
bucket.add_get_bucket_policy()
bucket.add_get_bucket_notification_configuration()
bucket.add_get_bucket_accelerate_configuration()

self.assertRaises(errors.NothingChanged, goal.execute)

def test_delete_bucket_forbidden_not_found(self):
# If a bucket is marked as never-destroy then it's destroy plan is
# still used, but it should never harm it
goal = self.create_goal('destroy')

bucket = self.fixtures.enter_context(BucketStubber(
goal.get_service(
self.aws.add_bucket(
name='my-bucket',
ensure=['never-destroy'],
),
'destroy',
)
))
bucket.add_list_buckets_empty_response()

self.assertRaises(errors.NothingChanged, goal.execute)

def test_delete_bucket(self):
goal = self.create_goal('destroy')

Expand Down