in rostran/providers/cloudformation/template.py [0:0]
def _transform_resources(self, out_resources: Resources):
cf_resources = self.source.get("Resources", {})
resources_to_handle = []
for resource_id, cf_resource in cf_resources.items():
cf_resource_type = cf_resource["Type"]
cf_resource_props = cf_resource.get("Properties") or {}
typer.secho(f"Transforming resource {resource_id}<{cf_resource_type}>")
# Get rule by resource type
resource_rule: ResourceRule = self.rule_manager.resource_rules.get(
cf_resource_type
)
if resource_rule is None:
typer.secho(
f" Resource type {cf_resource_type!r} is not supported and will be ignored.",
fg="yellow",
)
continue
self.rules[resource_id] = resource_rule
resource = Resource(
resource_id=resource_id,
resource_type=resource_rule.target_resource_type,
depends_on=cf_resource.get("DependsOn"),
condition=cf_resource.get("Condition"),
deletion_policy=cf_resource.get("DeletionPolicy"),
)
if resource.type:
props = self._transform_resource_props(
cf_resource_type,
cf_resource_props,
resource_rule.properties,
resource_rule.rule_id,
)
for k, v in props.items():
p = Property.initialize(k, v)
resource.properties.add(p)
out_resources.add(resource)
else:
resource.type = cf_resource_type
for k, v in cf_resource_props.items():
p = Property.initialize(k, v)
resource.properties.add(p)
if resource_rule.handler:
resources_to_handle.append((resource, resource_rule.handler))
for resource, handler in resources_to_handle:
handler(resource, out_resources)