Skip to content

Commit

Permalink
[Resolve Sceptre#1493] Complete DisableRollback implementation
Browse files Browse the repository at this point in the history
This adds missing code to complete the implementation of the
DisableRollback feature.

The implementation in 99c839a is clear that it was intended that this
feature would cover both cases of creating and updating stacks, and this
code and unit test was missed.
  • Loading branch information
alex-harvey-z3q committed Aug 3, 2024
1 parent deef08e commit 6ab4551
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
1 change: 1 addition & 0 deletions sceptre/cli/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ def update_command(
:type verbose: bool
:param yes: A flag to answer 'yes' to all CLI questions.
:type yes: bool
:param disable_rollback: A flag to disable cloudformation rollback.
"""

context = SceptreContext(
Expand Down
4 changes: 4 additions & 0 deletions sceptre/plan/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ def update(self):
{"Key": str(k), "Value": str(v)} for k, v in self.stack.tags.items()
],
}

if self.stack.disable_rollback:
update_stack_kwargs.update({"DisableRollback": self.stack.disable_rollback})

update_stack_kwargs.update(self.stack.template.get_boto_call_parameter())
update_stack_kwargs.update(self._get_role_arn())
response = self.connection_manager.call(
Expand Down
36 changes: 36 additions & 0 deletions tests/test_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,42 @@ def test_update_sends_correct_request(self, mock_wait_for_completion):
sentinel.stack_timeout, boto_response=ANY
)

@patch("sceptre.plan.actions.StackActions._wait_for_completion")
@patch("sceptre.plan.actions.StackActions._get_stack_timeout")
def test_update_disable_rollback_overrides_on_failure(
self, mock_get_stack_timeout, mock_wait_for_completion
):
self.actions.stack._template = Mock(spec=Template)
self.actions.stack._template.get_boto_call_parameter.return_value = {
"Template": sentinel.template
}

self.actions.stack.on_failure = "ROLLBACK"
self.actions.stack.disable_rollback = True

mock_get_stack_timeout.return_value = {"TimeoutInMinutes": sentinel.timeout}

self.actions.update()
self.actions.connection_manager.call.assert_called_with(
service="cloudformation",
command="update_stack",
kwargs={
"StackName": sentinel.external_name,
"Template": sentinel.template,
"Parameters": [{"ParameterKey": "key1", "ParameterValue": "val1"}],
"Capabilities": [
"CAPABILITY_IAM",
"CAPABILITY_NAMED_IAM",
"CAPABILITY_AUTO_EXPAND",
],
"RoleARN": sentinel.cloudformation_service_role,
"NotificationARNs": [sentinel.notification],
"Tags": [{"Key": "tag1", "Value": "val1"}],
"DisableRollback": True,
},
)
mock_wait_for_completion.assert_called_once_with(sentinel.stack_timeout, boto_response=ANY)

@patch("sceptre.plan.actions.StackActions._wait_for_completion")
def test_update_cancels_after_timeout(self, mock_wait_for_completion):
self.actions.stack._template = Mock(spec=Template)
Expand Down

0 comments on commit 6ab4551

Please sign in to comment.