diff options
author | Sergey Kraynev <skraynev@mirantis.com> | 2014-08-29 09:57:44 -0400 |
---|---|---|
committer | Sergey Kraynev <skraynev@mirantis.com> | 2014-09-25 12:14:03 +0000 |
commit | 6226326cade9780f893ffe3766800f4a5e017171 (patch) | |
tree | 92f707e90780480a3bc7f41709b7d24152a4f030 /heat | |
parent | dac81bd2592015f6bf33b403b1bc12a99ce57080 (diff) | |
download | heat-6226326cade9780f893ffe3766800f4a5e017171.tar.gz |
Do template validation during creation
During create we should handle exceptions same as for template
validation. This change will allow correct display of mistakes in a
template after a failed create attempt.
Change-Id: I55c5197533a25c93c5c61953a05c2276ada52fc1
Closes-Bug: #1363093
Diffstat (limited to 'heat')
-rw-r--r-- | heat/engine/service.py | 5 | ||||
-rw-r--r-- | heat/tests/test_engine_service.py | 25 |
2 files changed, 30 insertions, 0 deletions
diff --git a/heat/engine/service.py b/heat/engine/service.py index 52c8838ff..b2909c852 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -509,6 +509,11 @@ class EngineService(service.Service): raise exception.MissingCredentialError(required='X-Auth-Key') def _validate_new_stack(self, cnxt, stack_name, parsed_template): + try: + parsed_template.validate() + except Exception as ex: + raise exception.StackValidationFailed(message=six.text_type(ex)) + if db_api.stack_get_by_name(cnxt, stack_name): raise exception.StackExists(stack_name=stack_name) diff --git a/heat/tests/test_engine_service.py b/heat/tests/test_engine_service.py index a05093cd8..908fc84c8 100644 --- a/heat/tests/test_engine_service.py +++ b/heat/tests/test_engine_service.py @@ -2928,6 +2928,31 @@ class StackServiceTest(HeatTestCase): self.eng._validate_new_stack, self.ctx, 'test_existing_stack', template) + def test_validate_new_stack_checks_incorrect_keywords_in_resource(self): + template = {'heat_template_version': '2013-05-23', + 'resources': { + 'Res': {'Type': 'GenericResource1'}}} + parsed_template = service.templatem.Template(template) + ex = self.assertRaises(exception.StackValidationFailed, + self.eng._validate_new_stack, + self.ctx, 'test_existing_stack', + parsed_template) + msg = \ + u'u\'"Type" is not a valid keyword inside a resource definition\'' + self.assertEqual(msg, six.text_type(ex)) + + def test_validate_new_stack_checks_incorrect_sections(self): + template = {'heat_template_version': '2013-05-23', + 'unknown_section': { + 'Res': {'Type': 'GenericResource1'}}} + parsed_template = service.templatem.Template(template) + ex = self.assertRaises(exception.StackValidationFailed, + self.eng._validate_new_stack, + self.ctx, 'test_existing_stack', + parsed_template) + msg = u'The template section is invalid: unknown_section' + self.assertEqual(msg, six.text_type(ex)) + def test_validate_new_stack_checks_resource_limit(self): cfg.CONF.set_override('max_resources_per_stack', 5) template = {'HeatTemplateFormatVersion': '2012-12-12', |