diff --git a/heat/engine/cfn/template.py b/heat/engine/cfn/template.py index 6b705e428d..22ec1b6fe3 100644 --- a/heat/engine/cfn/template.py +++ b/heat/engine/cfn/template.py @@ -150,14 +150,23 @@ class CfnTemplateBase(template_common.CommonTemplate): name = definition.name hot_tmpl = definition.render_hot() + if self.t.get(self.RESOURCES) is None: + self.t[self.RESOURCES] = {} + cfn_tmpl = dict((self.HOT_TO_CFN_RES_ATTRS[k], v) for k, v in hot_tmpl.items()) - if len(cfn_tmpl.get(self.RES_DEPENDS_ON, [])) == 1: - cfn_tmpl[self.RES_DEPENDS_ON] = cfn_tmpl[self.RES_DEPENDS_ON][0] + dep_list = cfn_tmpl.get(self.RES_DEPENDS_ON, []) + if len(dep_list) == 1: + dep_res = cfn_tmpl[self.RES_DEPENDS_ON][0] + if dep_res in self.t[self.RESOURCES]: + cfn_tmpl[self.RES_DEPENDS_ON] = dep_res + else: + del cfn_tmpl[self.RES_DEPENDS_ON] + elif dep_list: + cfn_tmpl[self.RES_DEPENDS_ON] = [d for d in dep_list + if d in self.t[self.RESOURCES]] - if self.t.get(self.RESOURCES) is None: - self.t[self.RESOURCES] = {} self.t[self.RESOURCES][name] = cfn_tmpl def add_output(self, definition): diff --git a/heat/engine/hot/template.py b/heat/engine/hot/template.py index dc3698391c..0a18f4f8bd 100644 --- a/heat/engine/hot/template.py +++ b/heat/engine/hot/template.py @@ -266,7 +266,14 @@ class HOTemplate20130523(template_common.CommonTemplate): if self.t.get(self.RESOURCES) is None: self.t[self.RESOURCES] = {} - self.t[self.RESOURCES][name] = definition.render_hot() + rendered = definition.render_hot() + + dep_list = rendered.get(self.RES_DEPENDS_ON) + if dep_list: + rendered[self.RES_DEPENDS_ON] = [d for d in dep_list + if d in self.t[self.RESOURCES]] + + self.t[self.RESOURCES][name] = rendered def add_output(self, definition): if self.t.get(self.OUTPUTS) is None: diff --git a/heat/tests/test_hot.py b/heat/tests/test_hot.py index 62be09a667..08b10f1c6e 100644 --- a/heat/tests/test_hot.py +++ b/heat/tests/test_hot.py @@ -1934,15 +1934,24 @@ conditions: foo: bar resource2: type: AWS::EC2::Instance + resource3: + type: AWS::EC2::Instance + depends_on: + - resource1 + - dummy + - resource2 ''') source = template.Template(hot_tpl) empty = template.Template(copy.deepcopy(hot_tpl_empty)) stack = parser.Stack(utils.dummy_context(), 'test_stack', source) - for defn in six.itervalues(source.resource_definitions(stack)): + for rname, defn in sorted(source.resource_definitions(stack).items()): empty.add_resource(defn) - self.assertEqual(hot_tpl['resources'], empty.t['resources']) + expected = copy.deepcopy(hot_tpl['resources']) + expected['resource1']['depends_on'] = [] + expected['resource3']['depends_on'] = ['resource1', 'resource2'] + self.assertEqual(expected, empty.t['resources']) def test_add_output(self): hot_tpl = template_format.parse(''' diff --git a/heat/tests/test_template.py b/heat/tests/test_template.py index b14b7aa1d9..0c6e137a1e 100644 --- a/heat/tests/test_template.py +++ b/heat/tests/test_template.py @@ -1421,15 +1421,24 @@ class TemplateTest(common.HeatTestCase): foo: bar resource2: Type: AWS::EC2::Instance + resource3: + Type: AWS::EC2::Instance + DependsOn: + - resource1 + - dummy + - resource2 ''') source = template.Template(cfn_tpl) empty = template.Template(copy.deepcopy(empty_template)) stk = stack.Stack(self.ctx, 'test_stack', source) - for defn in six.itervalues(source.resource_definitions(stk)): + for rname, defn in sorted(source.resource_definitions(stk).items()): empty.add_resource(defn) - self.assertEqual(cfn_tpl['Resources'], empty.t['Resources']) + expected = copy.deepcopy(cfn_tpl['Resources']) + del expected['resource1']['DependsOn'] + expected['resource3']['DependsOn'] = ['resource1', 'resource2'] + self.assertEqual(expected, empty.t['Resources']) def test_add_output(self): cfn_tpl = template_format.parse('''