Skip to content

Commit

Permalink
[Resolve #1493] Complete DisableRollback implementation (#1494)
Browse files Browse the repository at this point in the history
* [Resolve #1493] Complete DisableRollback implementation

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.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
alex-harvey-z3q and pre-commit-ci[bot] authored Aug 25, 2024
1 parent e2f2b2c commit ed67151
Show file tree
Hide file tree
Showing 3 changed files with 45 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
6 changes: 6 additions & 0 deletions sceptre/plan/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,12 @@ 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
38 changes: 38 additions & 0 deletions tests/test_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,44 @@ 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 ed67151

Please sign in to comment.