From acdb8b41a3d452d79d63601af92bdabe87252c5f Mon Sep 17 00:00:00 2001 From: sslypushenko Date: Wed, 4 Dec 2013 18:42:36 +0200 Subject: [PATCH] Add validation for an existence of a resource type Validation of resource type existence was missing. The patch adds validation checks that in the template the resource type is set and is not an empty string. Change-Id: I171644010ec868e8acc4c29556889256e8bf51b6 Closes-Bug: #1257243 --- heat/engine/environment.py | 8 ++++++++ heat/engine/resource.py | 2 +- heat/tests/test_resource.py | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/heat/engine/environment.py b/heat/engine/environment.py index 554d571ce8..00e79d2b57 100644 --- a/heat/engine/environment.py +++ b/heat/engine/environment.py @@ -273,6 +273,14 @@ class ResourceRegistry(object): return match def get_class(self, resource_type, resource_name=None): + if resource_type == "": + msg = _('Resource "%s" has no type') % resource_name + raise exception.StackValidationFailed(message=msg) + elif resource_type is None: + msg = _('Non-empty resource type is required ' + 'for resource "%s"') % resource_name + raise exception.StackValidationFailed(message=msg) + info = self.get_resource_info(resource_type, resource_name=resource_name) if info is None: diff --git a/heat/engine/resource.py b/heat/engine/resource.py index 254b3ea3a4..5e97aca2a2 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -159,7 +159,7 @@ class Resource(object): return super(Resource, cls).__new__(cls) # Select the correct subclass to instantiate - ResourceClass = stack.env.get_class(json['Type'], + ResourceClass = stack.env.get_class(json.get('Type'), resource_name=name) return ResourceClass(name, json, stack) diff --git a/heat/tests/test_resource.py b/heat/tests/test_resource.py index 25c32f8d7b..31769a9aee 100644 --- a/heat/tests/test_resource.py +++ b/heat/tests/test_resource.py @@ -24,6 +24,7 @@ from heat.engine import resource from heat.engine import scheduler from heat.engine import template from heat.engine import environment +from heat.openstack.common.gettextutils import _ import heat.db.api as db_api from heat.tests import generic_resource as generic_rsrc @@ -67,6 +68,23 @@ class ResourceTest(HeatTestCase): self.assertRaises(exception.StackValidationFailed, resource.Resource, 'aresource', snippet, self.stack) + def test_resource_non_type(self): + snippet = {'Type': ''} + resource_name = 'aresource' + ex = self.assertRaises(exception.StackValidationFailed, + resource.Resource, resource_name, + snippet, self.stack) + self.assertIn(_('Resource "%s" has no type') % resource_name, str(ex)) + + def test_resource_missed_type(self): + snippet = {'not-a-Type': 'GenericResourceType'} + resource_name = 'aresource' + ex = self.assertRaises(exception.StackValidationFailed, + resource.Resource, resource_name, + snippet, self.stack) + self.assertIn(_('Non-empty resource type is required ' + 'for resource "%s"') % resource_name, str(ex)) + def test_state_defaults(self): tmpl = {'Type': 'Foo'} res = generic_rsrc.GenericResource('test_res_def', tmpl, self.stack)