Skip to content

Conversation

@silv-io
Copy link
Member

@silv-io silv-io commented Dec 10, 2025

Motivation

As part of the IaC initiative we want to add the possibility to ignore only specific resource types when checking for their support.

Changes

  • Add new utility function should_ignore_unsupported_resource_type which is used in place of the general ignore of all unsupported resources in all locations.

Tests

  • Add new test to check end-to-end functionality with catalog of that toggle

Related

Fixes FLC-84
Fixes FLC-198

@github-actions
Copy link

github-actions bot commented Dec 10, 2025

S3 Image Test Results (AMD64 / ARM64)

    2 files      2 suites   8m 4s ⏱️
  552 tests   500 ✅  52 💤 0 ❌
1 104 runs  1 000 ✅ 104 💤 0 ❌

Results for commit 977e8dd.

♻️ This comment has been updated with latest results.

@github-actions
Copy link

github-actions bot commented Dec 10, 2025

Test Results - Preflight, Unit

23 000 tests  ±0   21 157 ✅ ±0   6m 36s ⏱️ +6s
     1 suites ±0    1 843 💤 ±0 
     1 files   ±0        0 ❌ ±0 

Results for commit 977e8dd. ± Comparison against base commit bad8808.

♻️ This comment has been updated with latest results.

@github-actions
Copy link

github-actions bot commented Dec 10, 2025

Test Results (amd64) - Acceptance

7 tests  ±0   5 ✅ ±0   3m 0s ⏱️ -1s
1 suites ±0   2 💤 ±0 
1 files   ±0   0 ❌ ±0 

Results for commit 977e8dd. ± Comparison against base commit bad8808.

♻️ This comment has been updated with latest results.

@github-actions
Copy link

github-actions bot commented Dec 10, 2025

Test Results - Alternative Providers

583 tests   325 ✅  17m 49s ⏱️
  1 suites  258 💤
  1 files      0 ❌

Results for commit 977e8dd.

♻️ This comment has been updated with latest results.

@github-actions
Copy link

github-actions bot commented Dec 10, 2025

Test Results (amd64) - Integration, Bootstrap

    5 files      5 suites   2h 33m 45s ⏱️
5 527 tests 4 971 ✅ 556 💤 0 ❌
5 533 runs  4 971 ✅ 562 💤 0 ❌

Results for commit 977e8dd.

♻️ This comment has been updated with latest results.

@github-actions
Copy link

github-actions bot commented Dec 10, 2025

LocalStack Community integration with Pro

    2 files  ±0      2 suites  ±0   1h 55m 47s ⏱️ - 1m 22s
5 146 tests ±0  4 750 ✅ ±0  396 💤 ±0  0 ❌ ±0 
5 148 runs  ±0  4 750 ✅ ±0  398 💤 ±0  0 ❌ ±0 

Results for commit 977e8dd. ± Comparison against base commit bad8808.

♻️ This comment has been updated with latest results.

@silv-io silv-io added the semver: minor Non-breaking changes which can be included in minor releases, but not in patch releases label Dec 11, 2025
@localstack-bot
Copy link
Contributor

localstack-bot commented Dec 11, 2025

Currently, only patch changes are allowed on main. Your PR labels (semver: minor, docs: needed, notes: needed) indicate that it cannot be merged into the main at this time.

@silv-io silv-io added docs: needed Pull request requires documentation updates notes: needed Pull request should be mentioned in the release notes labels Dec 11, 2025
@silv-io silv-io requested a review from k-a-il December 11, 2025 13:41
@silv-io silv-io marked this pull request as ready for review December 11, 2025 13:41
simonrw added a commit that referenced this pull request Dec 15, 2025
# Motivation

While discusing #13496 I asserted that we can safely access `resource["Type"]` in the visitors since we validate that the `Type` key is always present. However this _was not true_! This PR resolves this

# Changes

* Add test deploying resource without a `Type` key
* Validate that the type is present during the modelling phase
Copy link
Contributor

@simonrw simonrw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a few minor suggestions/nits but I would like the test to be updated to use direct boto calls where possible. This is for clarity and ease of understanding the test going forward.

TITLE_MESSAGE = "Unsupported resources detected:"

def __init__(self):
def __init__(self, change_set_type: ChangeSetType | str | None = None):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: it would be nice to not need the str type here, and surely it's always known so surely None is not a valid type?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah you're right. I think in some place I defined it as a string once and then had curly lines below, which I then auto-fixed. Just setting ChangeSetType should work fine.



def should_ignore_unsupported_resource_type(
resource_type: str, change_set_type: ChangeSetType | str | None
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: as stated above, under what circumstances is change_set_type either str or None?


# template with one supported and one unsupported resource
bucket_name = f"cfn-toggle-{short_uid()}"
template_body = textwrap.dedent(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: for inline templates like this, using a dictionary and rendering to a JSON string might be nicer

Comment on lines 115 to 125
def _wait_for_complete_change_set(change_set_id: str):
def _describe():
result = aws_client.cloudformation.describe_change_set(ChangeSetName=change_set_id)
status = result["Status"]
if status == "CREATE_COMPLETE":
return result
if status == "FAILED":
pytest.fail(f"change set unexpectedly failed: {result.get('StatusReason')}")
raise Exception("still waiting for change set")

return retry(_describe, retries=15, sleep=2)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: this function can be replaced by aws_client.cloudformation.get_waiter("change_set_create_complete").wait(...)

def test_ignore_unsupported_resources_toggle(testing_catalog, aws_client, monkeypatch, cleanups):
unsupported_resource = "AWS::LatestService::NotSupported"

def _create_change_set(stack_name: str, template_body: str):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit I personally don't like this helper and would prefer the actual cfn function calls in the test, however I can see it's value as we perform this operation twice.

cs_id_ok, stack_id_ok = _create_change_set(stack_name_ok, template_body)
_wait_for_complete_change_set(cs_id_ok)
aws_client.cloudformation.execute_change_set(ChangeSetName=cs_id_ok)
_wait_for_stack_status(stack_name_ok, "CREATE_COMPLETE")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit can we use the waiters here?

Suggested change
_wait_for_stack_status(stack_name_ok, "CREATE_COMPLETE")
aws_client.cloudformation.get_waiter("stack_create_complete").wait(StackName=stack_name_ok)

monkeypatch.setattr(config, "CFN_IGNORE_UNSUPPORTED_TYPE_CREATE", [unsupported_resource])
stack_name_ok = f"stack-ok-{short_uid()}"
cs_id_ok, stack_id_ok = _create_change_set(stack_name_ok, template_body)
_wait_for_complete_change_set(cs_id_ok)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
_wait_for_complete_change_set(cs_id_ok)
aws_client.cloudformation.get_waiter("change_set_create_complete").wait(ChangeSetName=cs_id_ok)

Comment on lines 159 to 162
failed_cs = _wait_for_failed_change_set(cs_id_fail)
status_reason = failed_cs.get("StatusReason", "")
assert ChangeSetResourceSupportChecker.TITLE_MESSAGE in status_reason
assert unsupported_resource in status_reason
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: then we don't need the inner function

Suggested change
failed_cs = _wait_for_failed_change_set(cs_id_fail)
status_reason = failed_cs.get("StatusReason", "")
assert ChangeSetResourceSupportChecker.TITLE_MESSAGE in status_reason
assert unsupported_resource in status_reason
with pytest.raises(WaiterError) as exc_info:
aws_client.cloudformation.get_waiter("change_set_create_complete").wait(
ChangeSetName=cs_id_fail
)
assert exc_info.value.last_response["Status"] == "FAILED"
status_reason = exc_info.value.last_response["StatusReason"]
assert ChangeSetResourceSupportChecker.TITLE_MESSAGE in status_reason
assert unsupported_resource in status_reason



@markers.aws.only_localstack
def test_ignore_unsupported_resources_toggle(testing_catalog, aws_client, monkeypatch, cleanups):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue: in general I would prefer not defining inner functions (especially if they only have one use), and to use the waiters where possible. I don't find them easy to use, and the waiters code is more straightforward to read in the test itself. For the successful cases we swap a function definition and call with a single line, and for the failure cases using the WaiterError is clearer IMO.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks I didn't like it too much either but also didn't know about the waiters. Will switch it over :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've fixed it and also went ahead and fixed the old test to use the waiters. It's much cleaner now :)

@silv-io silv-io requested a review from simonrw December 15, 2025 12:53
@thrau thrau removed their request for review December 18, 2025 14:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs: needed Pull request requires documentation updates notes: needed Pull request should be mentioned in the release notes semver: minor Non-breaking changes which can be included in minor releases, but not in patch releases

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants