Thanks to visit codestin.com
Credit goes to github.com

Skip to content

CloudFormation v2 Engine: Batch of Parity Improvements #12589

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 8, 2025
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -367,15 +367,17 @@ def __init__(self, scope: Scope, value: Any):
OutputsKey: Final[str] = "Outputs"
# TODO: expand intrinsic functions set.
RefKey: Final[str] = "Ref"
FnIf: Final[str] = "Fn::If"
FnNot: Final[str] = "Fn::Not"
FnIfKey: Final[str] = "Fn::If"
FnNotKey: Final[str] = "Fn::Not"
FnJoinKey: Final[str] = "Fn::Join"
FnGetAttKey: Final[str] = "Fn::GetAtt"
FnEqualsKey: Final[str] = "Fn::Equals"
FnFindInMapKey: Final[str] = "Fn::FindInMap"
INTRINSIC_FUNCTIONS: Final[set[str]] = {
RefKey,
FnIf,
FnNot,
FnIfKey,
FnNotKey,
FnJoinKey,
FnEqualsKey,
FnGetAttKey,
FnFindInMapKey,
Expand Down Expand Up @@ -587,7 +589,12 @@ def _visit_array(
scope=value_scope, before_value=before_value, after_value=after_value
)
array.append(value)
change_type = self._change_type_for_parent_of([value.change_type for value in array])
if self._is_created(before=before_array, after=after_array):
change_type = ChangeType.CREATED
elif self._is_removed(before=before_array, after=after_array):
change_type = ChangeType.REMOVED
else:
change_type = self._change_type_for_parent_of([value.change_type for value in array])
return NodeArray(scope=scope, change_type=change_type, array=array)

def _visit_object(
Expand All @@ -596,8 +603,12 @@ def _visit_object(
node_object = self._visited_scopes.get(scope)
if isinstance(node_object, NodeObject):
return node_object

change_type = ChangeType.UNCHANGED
if self._is_created(before=before_object, after=after_object):
change_type = ChangeType.CREATED
elif self._is_removed(before=before_object, after=after_object):
change_type = ChangeType.REMOVED
else:
change_type = ChangeType.UNCHANGED
binding_names = self._safe_keys_of(before_object, after_object)
bindings: dict[str, ChangeSetEntity] = dict()
for binding_name in binding_names:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def get_changes(self) -> cfn_api.Changes:
def visit_node_intrinsic_function_fn_get_att(
self, node_intrinsic_function: NodeIntrinsicFunction
) -> PreprocEntityDelta:
# TODO: If we can properly compute the before and after value, why should we
# Consideration: If we can properly compute the before and after value, why should we
# artificially limit the precision of our output to match AWS's?

arguments_delta = self.visit(node_intrinsic_function.arguments)
Expand All @@ -71,17 +71,37 @@ def visit_node_intrinsic_function_fn_get_att(
after_node_resource = self._get_node_resource_for(
resource_name=after_logical_name_of_resource, node_template=self._node_template
)
after_property_delta: PreprocEntityDelta
after_node_property = self._get_node_property_for(
property_name=after_attribute_name, node_resource=after_node_resource
)
after_property_delta = self.visit(after_node_property)
if after_node_property is not None:
after_property_delta = self.visit(after_node_property)
else:
after_property_delta = PreprocEntityDelta(after=CHANGESET_KNOWN_AFTER_APPLY)
if after_property_delta.before == after_property_delta.after:
after = after_property_delta.after
else:
after = CHANGESET_KNOWN_AFTER_APPLY

return PreprocEntityDelta(before=before, after=after)

def visit_node_intrinsic_function_fn_join(
self, node_intrinsic_function: NodeIntrinsicFunction
) -> PreprocEntityDelta:
# TODO: investigate the behaviour and impact of this logic with the user defining
# {{changeSet:KNOWN_AFTER_APPLY}} string literals as delimiters or arguments.
delta = super().visit_node_intrinsic_function_fn_join(
node_intrinsic_function=node_intrinsic_function
)
delta_before = delta.before
if isinstance(delta_before, str) and CHANGESET_KNOWN_AFTER_APPLY in delta_before:
delta.before = CHANGESET_KNOWN_AFTER_APPLY
delta_after = delta.after
if isinstance(delta_after, str) and CHANGESET_KNOWN_AFTER_APPLY in delta_after:
delta.after = CHANGESET_KNOWN_AFTER_APPLY
return delta

def _register_resource_change(
self,
logical_id: str,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,17 @@ def visit_node_parameter(self, node_parameter: NodeParameter) -> PreprocEntityDe
self.resolved_parameters[node_parameter.name] = delta.after
return delta

def _after_resource_physical_id(self, resource_logical_id: str) -> Optional[str]:
def _after_deployed_property_value_of(
self, resource_logical_id: str, property_name: str
) -> str:
after_resolved_resources = self.resources
return self._deployed_property_value_of(
resource_logical_id=resource_logical_id,
property_name=property_name,
resolved_resources=after_resolved_resources,
)

def _after_resource_physical_id(self, resource_logical_id: str) -> str:
after_resolved_resources = self.resources
return self._resource_physical_resource_id_from(
logical_resource_id=resource_logical_id, resolved_resources=after_resolved_resources
Expand Down
Loading
Loading