From dd7b8ed183092c8ccb0d2a1ed0747e007d04e854 Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Tue, 26 Aug 2025 09:43:28 -0700 Subject: [PATCH 1/2] test: delete created change sets in companion stack if empty --- integration/conftest.py | 6 +++--- integration/helpers/deployer/deployer.py | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/integration/conftest.py b/integration/conftest.py index 849f35e279..f0058b630f 100644 --- a/integration/conftest.py +++ b/integration/conftest.py @@ -63,12 +63,12 @@ def clean_all_integ_buckets(): @pytest.fixture() def setup_companion_stack_once(tmpdir_factory, get_prefix): tests_integ_dir = Path(__file__).resolve().parents[1] - template_foler = Path(tests_integ_dir, "integration", "setup") - companion_stack_tempalte_path = Path(template_foler, COMPANION_STACK_TEMPLATE) + template_folder = Path(tests_integ_dir, "integration", "setup") + companion_stack_template_path = Path(template_folder, COMPANION_STACK_TEMPLATE) cfn_client = ClientProvider().cfn_client output_dir = tmpdir_factory.mktemp("data") stack_name = get_prefix + COMPANION_STACK_NAME - companion_stack = Stack(stack_name, companion_stack_tempalte_path, cfn_client, output_dir) + companion_stack = Stack(stack_name, companion_stack_template_path, cfn_client, output_dir) companion_stack.create_or_update(_stack_exists(stack_name)) diff --git a/integration/helpers/deployer/deployer.py b/integration/helpers/deployer/deployer.py index c8073f512a..137e9fedec 100644 --- a/integration/helpers/deployer/deployer.py +++ b/integration/helpers/deployer/deployer.py @@ -373,6 +373,13 @@ def create_and_wait_for_changeset( self.describe_changeset(result["Id"], stack_name) return result except deploy_exceptions.ChangeEmptyError: + try: + # Delete the most recent change set that failed to create because it was empty + changeset = sorted(self._client.list_change_sets(StackName=stack_name).get("Summaries"), key=lambda c: c["CreationTime"])[-1] + if changeset.get("Status") == "FAILED" and changeset.get("ExecutionStatus") == "UNAVAILABLE": + self._client.delete_change_set(ChangeSetName=changeset["ChangeSetId"], StackName=stack_name) + except Exception as ex: + LOG.warning("Failed to clean up empty changeset", exc_info=ex) return {} except botocore.exceptions.ClientError as ex: raise deploy_exceptions.DeployFailedError(stack_name=stack_name, msg=str(ex)) From 8e34018b75794f0e66a44bcde7ec54d42aa49a58 Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Tue, 26 Aug 2025 09:58:50 -0700 Subject: [PATCH 2/2] format --- integration/helpers/deployer/deployer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/integration/helpers/deployer/deployer.py b/integration/helpers/deployer/deployer.py index 137e9fedec..65bb73595d 100644 --- a/integration/helpers/deployer/deployer.py +++ b/integration/helpers/deployer/deployer.py @@ -375,7 +375,10 @@ def create_and_wait_for_changeset( except deploy_exceptions.ChangeEmptyError: try: # Delete the most recent change set that failed to create because it was empty - changeset = sorted(self._client.list_change_sets(StackName=stack_name).get("Summaries"), key=lambda c: c["CreationTime"])[-1] + changeset = sorted( + self._client.list_change_sets(StackName=stack_name).get("Summaries"), + key=lambda c: c["CreationTime"], + )[-1] if changeset.get("Status") == "FAILED" and changeset.get("ExecutionStatus") == "UNAVAILABLE": self._client.delete_change_set(ChangeSetName=changeset["ChangeSetId"], StackName=stack_name) except Exception as ex: