in rostran/providers/terraform/template.py [0:0]
def _transform_func_get_att(self, resource_id, attrname):
tf_resource_type = None
for resource in self.plan[self.P_PLANNED_VALUES][self.P_ROOT_MODULE].get(
self.P_RESOURCES, []
):
if resource_id == resource[self.P_ADDRESS]:
tf_resource_type = resource[self.P_TYPE]
resource_rule: ResourceRule = self.rule_manager.resource_rules.get(
tf_resource_type
)
if tf_resource_type is None or resource_rule is None:
typer.secho(
f"Resource type {tf_resource_type!r} is not supported and will be ignored.",
fg="yellow",
)
return None
if (
attrname not in resource_rule.attributes
or "To" not in resource_rule.attributes[attrname]
):
typer.secho(
f"Resource attribute {attrname!r} of {tf_resource_type!r} is not supported and will be ignored.",
fg="yellow",
)
return None
def parse(n):
names = n.split(".")
final_attrname = names[0]
result = {"Fn::GetAtt": [resource_id, final_attrname]}
if len(names) > 1:
# using JQ to get value
jq_expr = "."
for name in names[1:]:
try:
index = int(name)
jq_expr += f"[{index}]"
except ValueError:
jq_expr += f".{name}"
result = {"Fn::Jq": ["First", jq_expr, result]}
return result
attr_rule = resource_rule.attributes[attrname]
to_name = attr_rule["To"]
if isinstance(to_name, str):
final_value = parse(to_name)
elif isinstance(to_name, (list, tuple)):
final_value = [parse(each) for each in to_name]
else:
raise InvalidRuleSchema(
path=resource_rule.rule_id,
reason=f"The type of To={to_name} is invalid. Expect str or list",
)
handler_name = attr_rule.get("Handler")
if handler_name is not None:
handler_func = getattr(basic_handler_module, handler_name)
final_value = handler_func(final_value, False)
return final_value