summaryrefslogtreecommitdiff
path: root/heat
diff options
context:
space:
mode:
authorSergey Kraynev <skraynev@mirantis.com>2014-08-29 09:57:44 -0400
committerSergey Kraynev <skraynev@mirantis.com>2014-09-25 12:14:03 +0000
commit6226326cade9780f893ffe3766800f4a5e017171 (patch)
tree92f707e90780480a3bc7f41709b7d24152a4f030 /heat
parentdac81bd2592015f6bf33b403b1bc12a99ce57080 (diff)
downloadheat-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.py5
-rw-r--r--heat/tests/test_engine_service.py25
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',