in samcli/hook_packages/terraform/hooks/prepare/resource_linking.py [0:0]
def _resolve_module_output(module: TFModule, output_name: str) -> List[Union[ConstantValue, ResolvedReference]]:
"""
Resolves any references in the output section of the module
Parameters
----------
module : Module
The module with outputs to search
output_name : str
The value to resolve
Returns
-------
List[Union[ConstantValue, ResolvedReference]]
A list of resolved values
"""
results: List[Union[ConstantValue, ResolvedReference]] = []
output = module.outputs.get(output_name)
if not output:
raise InvalidResourceLinkingException(f"Output {output_name} was not found in module {module.full_address}")
output_value = output.value
LOG.debug("Resolving output {%s} for module {%s}", output_name, module.full_address)
if isinstance(output, ConstantValue):
LOG.debug(
"Resolved constant value {%s} for module {%s} for output {%s}",
output.value,
module.full_address,
output_name,
)
results.append(output)
elif isinstance(output, References):
LOG.debug("Found references for module {%s} for output {%s}", module.full_address, output_name)
cleaned_references = _clean_references_list(output_value)
for reference in cleaned_references:
if reference.startswith("var."):
LOG.debug(
"Resolving variable reference {%s} for module {%s} for output {%s}",
reference,
module.full_address,
output_name,
)
stripped_reference = get_configuration_address(reference[reference.find(".") + 1 :])
results += _resolve_module_variable(module, stripped_reference)
elif reference.startswith("module."):
LOG.debug(
"Resolving module reference {%s} for module {%s} for output {%s}",
reference,
module.full_address,
output_name,
)
# validate that the reference is in the format: module.name.output
if re.fullmatch(r"module(?:\.[^\.]+){2}", reference) is None:
raise InvalidResourceLinkingException(
f"Module {module.full_address} contains an invalid reference {reference}"
)
# module.bbb.ccc => bbb
module_name = reference[reference.find(".") + 1 : reference.rfind(".")]
# module.bbb.ccc => ccc
output_name = reference[reference.rfind(".") + 1 :]
stripped_reference = get_configuration_address(module_name)
if not module.child_modules:
raise InvalidResourceLinkingException(
f"Module {module.full_address} does not have child modules defined"
)
child_module = module.child_modules.get(stripped_reference)
if not child_module:
raise InvalidResourceLinkingException(
f"Module {module.full_address} does not have {stripped_reference} as a child module"
)
results += _resolve_module_output(child_module, output_name)
else:
LOG.debug(
"Resolved reference {%s} for module {%s} for output {%s}",
reference,
module.full_address,
output_name,
)
results.append(ResolvedReference(reference, module.full_address))
return results