diff --git a/contrib/docker-plugin/tests/test_docker_container.py b/contrib/docker-plugin/tests/test_docker_container.py index 529340e7b7..f4d766ebe3 100644 --- a/contrib/docker-plugin/tests/test_docker_container.py +++ b/contrib/docker-plugin/tests/test_docker_container.py @@ -28,7 +28,7 @@ from ..plugin import docker_container # noqa template = ''' { - "AWSTemplateFormatVersion" : "2010-09-09", + "AWSTemplateFormatVersion": "2010-09-09", "Description": "Test template", "Parameters": {}, "Resources": { diff --git a/contrib/rackspace/heat/tests/test_auto_scale.py b/contrib/rackspace/heat/tests/test_auto_scale.py index 1962537f7d..1dc9684b3d 100644 --- a/contrib/rackspace/heat/tests/test_auto_scale.py +++ b/contrib/rackspace/heat/tests/test_auto_scale.py @@ -169,6 +169,7 @@ class FakeAutoScale(object): class ScalingGroupTest(HeatTestCase): group_template = template_format.parse(''' + HeatTemplateFormatVersion: "2012-12-12" Description: "Rackspace Auto Scale" Parameters: {} Resources: @@ -330,6 +331,7 @@ class ScalingGroupTest(HeatTestCase): class PolicyTest(HeatTestCase): policy_template = template_format.parse(''' + HeatTemplateFormatVersion: "2012-12-12" Description: "Rackspace Auto Scale" Parameters: {} Resources: @@ -472,6 +474,7 @@ class PolicyTest(HeatTestCase): class WebHookTest(HeatTestCase): webhook_template = template_format.parse(''' + HeatTemplateFormatVersion: "2012-12-12" Description: "Rackspace Auto Scale" Parameters: {} Resources: diff --git a/heat/common/template_format.py b/heat/common/template_format.py index ce33ad647e..843c6486ca 100644 --- a/heat/common/template_format.py +++ b/heat/common/template_format.py @@ -69,28 +69,14 @@ def parse(tmpl_str): else: if tpl is None: tpl = {} - if u'heat_template_version' not in tpl: - default_for_missing(tpl, u'HeatTemplateFormatVersion', - HEAT_VERSIONS) + # Looking for supported version keys in the loaded template + if not ('HeatTemplateFormatVersion' in tpl + or 'heat_template_version' in tpl + or 'AWSTemplateFormatVersion' in tpl): + raise ValueError(_("Template format version not found.")) return tpl -def default_for_missing(tpl, version_param, versions): - ''' - Checks a parsed template for missing version and sections. - - This is currently only applied to YAML templates. - ''' - # if version is missing, implicitly use the lastest one - if version_param not in tpl: - tpl[version_param] = versions[-1] - - # create empty placeholders for any of the main dict sections - for param in (u'Parameters', u'Mappings', u'Resources', u'Outputs'): - if param not in tpl: - tpl[param] = {} - - def convert_json_to_yaml(json_str): '''Convert a string containing the AWS JSON template format to an equivalent string containing the Heat YAML format. diff --git a/heat/tests/templates/Neutron.template b/heat/tests/templates/Neutron.template index 11631bcc75..ea5c3e6f8a 100644 --- a/heat/tests/templates/Neutron.template +++ b/heat/tests/templates/Neutron.template @@ -3,10 +3,6 @@ "Description" : "Template to test Neutron resources", - "Parameters" : { - - }, - "Resources" : { "network": { "Type": "OS::Neutron::Net", diff --git a/heat/tests/test_api_cfn_v1.py b/heat/tests/test_api_cfn_v1.py index e1ea415cc2..1362b49e10 100644 --- a/heat/tests/test_api_cfn_v1.py +++ b/heat/tests/test_api_cfn_v1.py @@ -30,6 +30,7 @@ from heat.tests.common import HeatTestCase from heat.tests import utils policy_path = os.path.dirname(os.path.realpath(__file__)) + "/policy/" +template = {u'AWSTemplateFormatVersion': u'2010-09-09', u'Foo': u'bar'} class CfnStackControllerTest(HeatTestCase): @@ -464,7 +465,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -511,7 +511,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create_rollback(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -558,7 +557,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create_onfailure_true(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -605,7 +603,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create_onfailure_false_delete(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -652,7 +649,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create_onfailure_false_rollback(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -699,7 +695,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create_onfailure_err(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -739,7 +734,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create_err_rpcerr(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -809,7 +803,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create_err_exists(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -845,7 +838,6 @@ class CfnStackControllerTest(HeatTestCase): def test_create_err_engine(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'CreateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -881,7 +873,6 @@ class CfnStackControllerTest(HeatTestCase): def test_update(self): # Format a dummy request stack_name = "wordpress" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'UpdateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -929,7 +920,6 @@ class CfnStackControllerTest(HeatTestCase): def test_update_bad_name(self): stack_name = "wibble" - template = {u'Foo': u'bar'} json_template = json.dumps(template) params = {'Action': 'UpdateStack', 'StackName': stack_name, 'TemplateBody': '%s' % json_template, @@ -961,7 +951,6 @@ class CfnStackControllerTest(HeatTestCase): # Format a dummy request stack_name = "wordpress" identity = dict(identifier.HeatIdentifier('t', stack_name, '6')) - template = {u'Foo': u'bar'} params = {'Action': 'GetTemplate', 'StackName': stack_name} dummy_req = self._dummy_GET_request(params) self._stub_enforce(dummy_req, 'GetTemplate') @@ -1092,12 +1081,10 @@ class CfnStackControllerTest(HeatTestCase): def test_bad_resources_in_template(self): # Format a dummy request json_template = { - 'template': { - 'AWSTemplateFormatVersion': '2010-09-09', - 'Resources': { - 'Type': 'AWS: : EC2: : Instance', - }, - } + 'AWSTemplateFormatVersion': '2010-09-09', + 'Resources': { + 'Type': 'AWS: : EC2: : Instance', + }, } params = {'Action': 'ValidateTemplate', 'TemplateBody': '%s' % json.dumps(json_template)} diff --git a/heat/tests/test_api_openstack_v1.py b/heat/tests/test_api_openstack_v1.py index ef850ad7cb..b8d8e3c372 100644 --- a/heat/tests/test_api_openstack_v1.py +++ b/heat/tests/test_api_openstack_v1.py @@ -64,8 +64,12 @@ def to_remote_error(error): class InstantiationDataTest(HeatTestCase): def test_format_parse(self): - data = {"key1": ["val1[0]", "val1[1]"], "key2": "val2"} - json_repr = '{ "key1": [ "val1[0]", "val1[1]" ], "key2": "val2" }' + data = {"AWSTemplateFormatVersion": "2010-09-09", + "key1": ["val1[0]", "val1[1]"], + "key2": "val2"} + json_repr = '{"AWSTemplateFormatVersion" : "2010-09-09",' \ + '"key1": [ "val1[0]", "val1[1]" ], ' \ + '"key2": "val2" }' parsed = stacks.InstantiationData.format_parse(json_repr, 'foo') self.assertEqual(parsed, data) @@ -77,6 +81,7 @@ class InstantiationDataTest(HeatTestCase): def test_format_parse_invalid_message(self): # make sure the parser error gets through to the caller. bad_temp = ''' +heat_template_version: '2012-12-12' parameters: KeyName: type: string @@ -86,7 +91,7 @@ parameters: parse_ex = self.assertRaises(webob.exc.HTTPBadRequest, stacks.InstantiationData.format_parse, bad_temp, 'foo') - self.assertIn('line 3, column 3', str(parse_ex)) + self.assertIn('line 4, column 3', str(parse_ex)) def test_stack_name(self): body = {'stack_name': 'wibble'} @@ -105,20 +110,18 @@ parameters: self.assertEqual(data.template(), template) def test_template_string_json(self): - template = '{"foo": "bar", "blarg": "wibble"}' + template = '{"heat_template_version": "2012-12-12",' \ + '"foo": "bar", "blarg": "wibble"}' body = {'template': template} data = stacks.InstantiationData(body) self.assertEqual(data.template(), json.loads(template)) def test_template_string_yaml(self): - template = '''foo: bar + template = '''HeatTemplateFormatVersion: 2012-12-12 +foo: bar blarg: wibble ''' parsed = {u'HeatTemplateFormatVersion': u'2012-12-12', - u'Mappings': {}, - u'Outputs': {}, - u'Parameters': {}, - u'Resources': {}, u'blarg': u'wibble', u'foo': u'bar'} @@ -127,7 +130,9 @@ blarg: wibble self.assertEqual(data.template(), parsed) def test_template_url(self): - template = {'foo': 'bar', 'blarg': 'wibble'} + template = {'heat_template_version': '2013-05-23', + 'foo': 'bar', + 'blarg': 'wibble'} url = 'http://example.com/template' body = {'template_url': url} data = stacks.InstantiationData(body) diff --git a/heat/tests/test_nested_stack.py b/heat/tests/test_nested_stack.py index 2a819088a8..3fc588b012 100644 --- a/heat/tests/test_nested_stack.py +++ b/heat/tests/test_nested_stack.py @@ -320,7 +320,7 @@ Outputs: def test_nested_stack_three_deep(self): root_template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack @@ -328,7 +328,7 @@ Resources: TemplateURL: 'https://server.test/depth1.template' ''' depth1_template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack @@ -336,7 +336,7 @@ Resources: TemplateURL: 'https://server.test/depth2.template' ''' depth2_template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack @@ -360,7 +360,7 @@ Resources: def test_nested_stack_four_deep(self): root_template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack @@ -368,7 +368,7 @@ Resources: TemplateURL: 'https://server.test/depth1.template' ''' depth1_template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack @@ -376,7 +376,7 @@ Resources: TemplateURL: 'https://server.test/depth2.template' ''' depth2_template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack @@ -384,7 +384,7 @@ Resources: TemplateURL: 'https://server.test/depth3.template' ''' depth3_template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack @@ -415,7 +415,7 @@ Resources: def test_nested_stack_four_wide(self): root_template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack @@ -460,7 +460,7 @@ Resources: def test_nested_stack_infinite_recursion(self): template = ''' -HeatTemplateFormat: 2012-12-12 +HeatTemplateFormatVersion: 2012-12-12 Resources: Nested: Type: AWS::CloudFormation::Stack diff --git a/heat/tests/test_parser.py b/heat/tests/test_parser.py index 95e506f7fe..4cd756002c 100644 --- a/heat/tests/test_parser.py +++ b/heat/tests/test_parser.py @@ -104,6 +104,7 @@ class ParserTest(HeatTestCase): mapping_template = template_format.parse('''{ + "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "ValidMapping" : { "TestKey" : { "TestValue" : "wibble" } @@ -787,10 +788,12 @@ class StackTest(HeatTestCase): self.assertEqual(1, stack.total_resources()) def _setup_nested(self, name): - nested_tpl = ('{"Resources":{' + nested_tpl = ('{"HeatTemplateFormatVersion" : "2012-12-12",' + '"Resources":{' '"A": {"Type": "GenericResourceType"},' '"B": {"Type": "GenericResourceType"}}}') - tpl = {'Resources': + tpl = {'HeatTemplateFormatVersion': "2012-12-12", + 'Resources': {'A': {'Type': 'AWS::CloudFormation::Stack', 'Properties': {'TemplateURL': 'http://server.test/nested.json'}}, diff --git a/heat/tests/test_provider_template.py b/heat/tests/test_provider_template.py index 85d106f2ab..dda232cd7d 100644 --- a/heat/tests/test_provider_template.py +++ b/heat/tests/test_provider_template.py @@ -92,6 +92,7 @@ class ProviderTemplateTest(HeatTestCase): def test_to_parameters(self): """Tests property conversion to parameter values.""" provider = { + 'HeatTemplateFormatVersion': '2012-12-12', 'Parameters': { 'Foo': {'Type': 'String'}, 'AList': {'Type': 'CommaDelimitedList'}, @@ -163,6 +164,7 @@ class ProviderTemplateTest(HeatTestCase): def test_attributes_extra(self): provider = { + 'HeatTemplateFormatVersion': '2012-12-12', 'Outputs': { 'Foo': {'Value': 'bar'}, 'Blarg': {'Value': 'wibble'}, @@ -221,6 +223,7 @@ class ProviderTemplateTest(HeatTestCase): def test_properties_normal(self): provider = { + 'HeatTemplateFormatVersion': '2012-12-12', 'Parameters': { 'Foo': {'Type': 'String'}, 'Blarg': {'Type': 'String', 'Default': 'wibble'}, @@ -417,7 +420,9 @@ class ProviderTemplateTest(HeatTestCase): parser.Template({}), stack_id=str(uuid.uuid4())) - minimal_temp = json.dumps({'Parameters': {}, 'Resources': {}}) + minimal_temp = json.dumps({'HeatTemplateFormatVersion': '2012-12-12', + 'Parameters': {}, + 'Resources': {}}) self.m.StubOutWithMock(urlfetch, "get") urlfetch.get(test_templ_name, allowed_schemes=('http', 'https', diff --git a/heat/tests/test_stack_resource.py b/heat/tests/test_stack_resource.py index 6d94ef0bb6..33608b9fbb 100644 --- a/heat/tests/test_stack_resource.py +++ b/heat/tests/test_stack_resource.py @@ -35,6 +35,7 @@ ws_res_snippet = {"Type": "some_magic_type", param_template = ''' { + "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "KeyName" : { "Description" : "KeyName", @@ -54,6 +55,7 @@ param_template = ''' simple_template = ''' { + "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : {}, "Resources" : { "WebServer": { diff --git a/heat/tests/test_template_format.py b/heat/tests/test_template_format.py index eb32a65f78..619364ea56 100644 --- a/heat/tests/test_template_format.py +++ b/heat/tests/test_template_format.py @@ -60,8 +60,6 @@ class JsonToYamlTest(HeatTestCase): del(yml[u'HeatTemplateFormatVersion']) jsn = template_format.parse(json_str) - template_format.default_for_missing(jsn, 'AWSTemplateFormatVersion', - template_format.CFN_VERSIONS) if u'AWSTemplateFormatVersion' in jsn: del(jsn[u'AWSTemplateFormatVersion']) @@ -81,18 +79,6 @@ class JsonToYamlTest(HeatTestCase): class YamlMinimalTest(HeatTestCase): - def test_minimal_yaml(self): - yaml1 = '' - yaml2 = '''HeatTemplateFormatVersion: '2012-12-12' -Parameters: {} -Mappings: {} -Resources: {} -Outputs: {} -''' - tpl1 = template_format.parse(yaml1) - tpl2 = template_format.parse(yaml2) - self.assertEqual(tpl1, tpl2) - def test_long_yaml(self): template = {'HeatTemplateVersion': '2012-12-12'} config.cfg.CONF.set_override('max_template_size', 1024) @@ -105,6 +91,16 @@ Outputs: {} msg = 'Request limit exceeded: Template exceeds maximum allowed size.' self.assertEqual(msg, str(ex)) + def test_parse_no_version_format(self): + yaml = '' + self.assertRaises(ValueError, template_format.parse, yaml) + yaml2 = '''Parameters: {} +Mappings: {} +Resources: {} +Outputs: {} +''' + self.assertRaises(ValueError, template_format.parse, yaml2) + class YamlParseExceptions(HeatTestCase): @@ -143,13 +139,9 @@ class JsonYamlResolvedCompareTest(HeatTestCase): def compare_stacks(self, json_file, yaml_file, parameters): t1 = self.load_template(json_file) - template_format.default_for_missing(t1, 'AWSTemplateFormatVersion', - template_format.CFN_VERSIONS) - del(t1[u'AWSTemplateFormatVersion']) - t2 = self.load_template(yaml_file) del(t2[u'HeatTemplateFormatVersion']) - + del(t1[u'AWSTemplateFormatVersion']) stack1 = utils.parse_stack(t1, parameters) stack2 = utils.parse_stack(t2, parameters)