[docs]classOutputLookup(LookupHandler["CfnginContext"]):"""AWS CloudFormation Output lookup."""DEPRECATION_MSG=('lookup query syntax "<relative-stack-name>::<OutputName>" has been deprecated; '"to learn how to use the new lookup query syntax visit "f"{DOC_SITE}/page/cfngin/lookups/output.html")TYPE_NAME:ClassVar[str]="output""""Name that the Lookup is registered as."""
[docs]@classmethoddeflegacy_parse(cls,value:str)->tuple[OutputQuery,ParsedArgsTypeDef]:"""Retain support for legacy lookup syntax. Format of value: <relative-stack-name>::<OutputName> """LOGGER.warning("${%s%s}: %s",cls.TYPE_NAME,value,cls.DEPRECATION_MSG)returndeconstruct(value),{}
[docs]@classmethoddefhandle(cls,value:str,context:CfnginContext,**_:Any)->str:"""Fetch an output from the designated stack. Args: value: Parameter(s) given to this lookup. ``<relative-stack-name>.<OutputName>`` context: Context instance. Returns: Output from the specified stack. Raises: OutputDoesNotExist: Output not found for Stack. StackDoesNotExist: Stack not found for the name provided. """try:raw_query,args=cls.parse(value)query=OutputQuery(*raw_query.split("."))exceptValueError:query,args=cls.legacy_parse(value)stack=context.get_stack(query.stack_name)ifnotstack:if"default"inargs:returncls.format_results(args["default"],**args)raiseStackDoesNotExist(context.get_fqn(query.stack_name))if"default"inargs:# handle falsy defaultreturncls.format_results(stack.outputs.get(query.output_name,args["default"]),**args)try:returncls.format_results(stack.outputs[query.output_name],**args)exceptKeyError:raiseOutputDoesNotExist(stack_name=context.get_fqn(query.stack_name),output=query.output_name)fromNone
[docs]@classmethoddefdependencies(cls,lookup_query:VariableValue)->set[str]:"""Calculate any dependencies required to perform this lookup. Note that lookup_query may not be (completely) resolved at this time. Args: lookup_query: Parameter(s) given to this lookup. Returns: Stack names this lookup depends on. """# try to get the stack namestack_name=""fordata_iteminlookup_query:ifnotdata_item.resolved:# We encountered an unresolved substitution.# StackName is calculated dynamically based on context:# e.g. ${output ${default var::source}.name}# Stop herereturnset()stack_name+=data_item.valuematch=re.search(r"(::|\.)",stack_name)ifmatch:stack_name=stack_name[0:match.start()]return{stack_name}# else: try to append the next item# We added all lookup_query, and still couldn't find a `::`...# Probably an error...returnset()
[docs]defdeconstruct(value:str)->OutputQuery:# TODO (kyle): remove in next major release"""Deconstruct the value."""try:stack_name,output_name=value.split("::")exceptValueError:raiseValueError(f"output handler requires syntax of <stack>::<output>. Got: {value}")fromNonereturnOutputQuery(stack_name,output_name)