diff --git a/heatclient/common/template_utils.py b/heatclient/common/template_utils.py index 03f2f0af..c5fa190b 100644 --- a/heatclient/common/template_utils.py +++ b/heatclient/common/template_utils.py @@ -59,6 +59,7 @@ def get_template_contents(template_file=None, template_url=None, files = {} tmpl_base_url = base_url_for_url(template_url) resolve_template_get_files(template, files, tmpl_base_url) + resolve_template_type(template, files, tmpl_base_url) return files, template @@ -77,6 +78,24 @@ def resolve_template_get_files(template, files, template_base_url): ignore_if, recurse_if) +def resolve_template_type(template, files, template_base_url): + + def ignore_if(key, value): + if key != 'type': + return True + if not isinstance(value, six.string_types): + return True + if not value.endswith(('.yaml', '.template')): + return True + return False + + def recurse_if(value): + return isinstance(value, (dict, list)) + + get_file_contents(template, files, template_base_url, + ignore_if, recurse_if) + + def get_file_contents(from_data, files, base_url=None, ignore_if=None, recurse_if=None): diff --git a/heatclient/tests/test_template_utils.py b/heatclient/tests/test_template_utils.py index 7b76677d..8ddfeb01 100644 --- a/heatclient/tests/test_template_utils.py +++ b/heatclient/tests/test_template_utils.py @@ -431,14 +431,14 @@ class TestTemplateGetFileFunctions(testtools.TestCase): hot_template = '''heat_template_version: 2013-05-23 resources: resource1: - type: type1 + type: OS::type1 properties: foo: {get_file: foo.yaml} bar: get_file: 'http://localhost/bar.yaml' resource2: - type: type1 + type: OS::type1 properties: baz: - {get_file: baz/baz1.yaml} @@ -495,14 +495,14 @@ resources: 'heat_template_version': '2013-05-23', 'resources': { 'resource1': { - 'type': 'type1', + 'type': 'OS::type1', 'properties': { 'bar': {'get_file': 'http://localhost/bar.yaml'}, 'foo': {'get_file': 'file:///home/my/dir/foo.yaml'}, }, }, 'resource2': { - 'type': 'type1', + 'type': 'OS::type1', 'properties': { 'baz': [ {'get_file': 'file:///home/my/dir/baz/baz1.yaml'}, @@ -557,6 +557,77 @@ resources: self.m.VerifyAll() +class TestTemplateTypeFunctions(testtools.TestCase): + + hot_template = '''heat_template_version: 2013-05-23 +parameters: + param1: + type: string +resources: + resource1: + type: foo.yaml + properties: + foo: bar + resource2: + type: OS::Heat::ResourceGroup + properties: + resource_def: + type: spam/egg.yaml + ''' + + def setUp(self): + super(TestTemplateTypeFunctions, self).setUp() + self.m = mox.Mox() + + self.addCleanup(self.m.VerifyAll) + self.addCleanup(self.m.UnsetStubs) + + def test_hot_template(self): + self.m.StubOutWithMock(request, 'urlopen') + tmpl_file = '/home/my/dir/template.yaml' + url = 'file:///home/my/dir/template.yaml' + request.urlopen(url).AndReturn( + six.StringIO(self.hot_template)) + request.urlopen( + 'file:///home/my/dir/foo.yaml').InAnyOrder().AndReturn( + six.StringIO('foo contents')) + request.urlopen( + 'file:///home/my/dir/spam/egg.yaml').InAnyOrder().AndReturn( + six.StringIO('egg contents')) + self.m.ReplayAll() + + files, tmpl_parsed = template_utils.get_template_contents( + template_file=tmpl_file) + + self.assertEqual({ + u'file:///home/my/dir/foo.yaml': 'foo contents', + u'file:///home/my/dir/spam/egg.yaml': 'egg contents' + }, files) + self.assertEqual({ + u'heat_template_version': u'2013-05-23', + u'parameters': { + u'param1': { + u'type': u'string' + } + }, + u'resources': { + u'resource1': { + u'type': u'file:///home/my/dir/foo.yaml', + u'properties': {u'foo': u'bar'} + }, + u'resource2': { + u'type': u'OS::Heat::ResourceGroup', + u'properties': { + u'resource_def': { + u'type': u'file:///home/my/dir/spam/egg.yaml' + } + } + } + } + }, tmpl_parsed) + self.m.VerifyAll() + + class TestURLFunctions(testtools.TestCase): def setUp(self):