Add Fn::ImportValue support
This commit is contained in:
parent
8e4c79625c
commit
f5106f2cc8
4 changed files with 101 additions and 5 deletions
|
|
@ -15,7 +15,7 @@ from .exceptions import ValidationError
|
|||
|
||||
class FakeStack(BaseModel):
|
||||
|
||||
def __init__(self, stack_id, name, template, parameters, region_name, notification_arns=None, tags=None, role_arn=None):
|
||||
def __init__(self, stack_id, name, template, parameters, region_name, notification_arns=None, tags=None, role_arn=None, cross_stack_resources=None):
|
||||
self.stack_id = stack_id
|
||||
self.name = name
|
||||
self.template = template
|
||||
|
|
@ -30,6 +30,7 @@ class FakeStack(BaseModel):
|
|||
resource_status_reason="User Initiated")
|
||||
|
||||
self.description = self.template_dict.get('Description')
|
||||
self.cross_stack_resources = cross_stack_resources or []
|
||||
self.resource_map = self._create_resource_map()
|
||||
self.output_map = self._create_output_map()
|
||||
self._add_stack_event("CREATE_COMPLETE")
|
||||
|
|
@ -37,7 +38,7 @@ class FakeStack(BaseModel):
|
|||
|
||||
def _create_resource_map(self):
|
||||
resource_map = ResourceMap(
|
||||
self.stack_id, self.name, self.parameters, self.tags, self.region_name, self.template_dict)
|
||||
self.stack_id, self.name, self.parameters, self.tags, self.region_name, self.template_dict, self.cross_stack_resources)
|
||||
resource_map.create()
|
||||
return resource_map
|
||||
|
||||
|
|
@ -148,6 +149,7 @@ class CloudFormationBackend(BaseBackend):
|
|||
notification_arns=notification_arns,
|
||||
tags=tags,
|
||||
role_arn=role_arn,
|
||||
cross_stack_resources=self.exports,
|
||||
)
|
||||
self.stacks[stack_id] = new_stack
|
||||
self._validate_export_uniqueness(new_stack)
|
||||
|
|
|
|||
|
|
@ -187,6 +187,12 @@ def clean_json(resource_json, resources_map):
|
|||
return fn_sub_value
|
||||
pass
|
||||
|
||||
if 'Fn::ImportValue' in resource_json:
|
||||
cleaned_val = clean_json(resource_json['Fn::ImportValue'], resources_map)
|
||||
values = [x.value for x in resources_map.cross_stack_resources.values() if x.name == cleaned_val]
|
||||
if any(values):
|
||||
return values[0]
|
||||
|
||||
cleaned_json = {}
|
||||
for key, value in resource_json.items():
|
||||
cleaned_val = clean_json(value, resources_map)
|
||||
|
|
@ -326,13 +332,14 @@ class ResourceMap(collections.Mapping):
|
|||
each resources is passed this lazy map that it can grab dependencies from.
|
||||
"""
|
||||
|
||||
def __init__(self, stack_id, stack_name, parameters, tags, region_name, template):
|
||||
def __init__(self, stack_id, stack_name, parameters, tags, region_name, template, cross_stack_resources):
|
||||
self._template = template
|
||||
self._resource_json_map = template['Resources']
|
||||
self._region_name = region_name
|
||||
self.input_parameters = parameters
|
||||
self.tags = copy.deepcopy(tags)
|
||||
self.resolved_parameters = {}
|
||||
self.cross_stack_resources = cross_stack_resources
|
||||
|
||||
# Create the default resources
|
||||
self._parsed_resources = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue