Source code for stacker.lookups.handlers.output
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import re
from collections import namedtuple
from . import LookupHandler
TYPE_NAME = "output"
Output = namedtuple("Output", ("stack_name", "output_name"))
[docs]class OutputLookup(LookupHandler):
[docs] @classmethod
def handle(cls, value, context=None, **kwargs):
"""Fetch an output from the designated stack.
Args:
value (str): string with the following format:
<stack_name>::<output_name>, ie. some-stack::SomeOutput
context (:class:`stacker.context.Context`): stacker context
Returns:
str: output from the specified stack
"""
if context is None:
raise ValueError('Context is required')
d = deconstruct(value)
stack = context.get_stack(d.stack_name)
return stack.outputs[d.output_name]
[docs] @classmethod
def dependencies(cls, lookup_data):
# try to get the stack name
stack_name = ''
for data_item in lookup_data:
if not data_item.resolved():
# We encountered an unresolved substitution.
# StackName is calculated dynamically based on context:
# e.g. ${output ${default var::source}::name}
# Stop here
return set()
stack_name = stack_name + data_item.value()
match = re.search(r'::', stack_name)
if match:
stack_name = stack_name[0:match.start()]
return {stack_name}
# else: try to append the next item
# We added all lookup_data, and still couldn't find a `::`...
# Probably an error...
return set()
[docs]def deconstruct(value):
try:
stack_name, output_name = value.split("::")
except ValueError:
raise ValueError("output handler requires syntax "
"of <stack>::<output>. Got: %s" % value)
return Output(stack_name, output_name)