diff --git a/heat/engine/parameter_groups.py b/heat/engine/parameter_groups.py index b865d3f346..d35c7edb35 100644 --- a/heat/engine/parameter_groups.py +++ b/heat/engine/parameter_groups.py @@ -43,28 +43,36 @@ class ParameterGroups(object): ''' LOG.debug('Validating Parameter Groups.') LOG.debug(self.parameter_names) - if self.parameter_groups is not None: + if self.parameter_groups: + if not isinstance(self.parameter_groups, list): + raise exception.StackValidationFailed(message=_( + 'The %s should be a list.') % PARAMETER_GROUPS) + # Loop through groups and validate parameters grouped_parameters = [] for group in self.parameter_groups: parameters = group.get(PARAMETERS) - if parameters is None: raise exception.StackValidationFailed(message=_( - 'Parameters must be provided for ' - 'each Parameter Group.')) + 'The %s must be provided for ' + 'each parameter group.') % PARAMETERS) + + if not isinstance(parameters, list): + raise exception.StackValidationFailed(message=_( + 'The %s of parameter group ' + 'should be a list.') % PARAMETERS) for param in parameters: # Check if param has been added to a previous group if param in grouped_parameters: raise exception.StackValidationFailed(message=_( 'The %s parameter must be assigned to one ' - 'Parameter Group only.') % param) + 'parameter group only.') % param) else: grouped_parameters.append(param) # Check that grouped parameter references a valid Parameter if param not in self.parameter_names: raise exception.StackValidationFailed(message=_( - 'The Parameter name (%s) does not reference ' - 'an existing parameter.') % param) + 'The grouped parameter %s does not reference ' + 'a valid parameter.') % param) diff --git a/heat/tests/test_validate.py b/heat/tests/test_validate.py index 36e1f0f73b..0899b3e2f6 100644 --- a/heat/tests/test_validate.py +++ b/heat/tests/test_validate.py @@ -734,6 +734,45 @@ resources: type: OS::Nova::Server ''' +test_template_parameter_groups_not_list = ''' +heat_template_version: 2013-05-23 + +description: > + Hello world HOT template that just defines a single compute instance. + Contains just base features to verify base HOT support. + +parameter_groups: + label: Server Group + description: A group of parameters for the server + parameters: + key_name: heat_key + label: Database Group + description: A group of parameters for the database + parameters: + public_net: public +resources: + server: + type: OS::Nova::Server +''' + +test_template_parameters_not_list = ''' +heat_template_version: 2013-05-23 + +description: > + Hello world HOT template that just defines a single compute instance. + Contains just base features to verify base HOT support. + +parameter_groups: +- label: Server Group + description: A group of parameters for the server + parameters: + key_name: heat_key + public_net: public +resources: + server: + type: OS::Nova::Server +''' + test_template_allowed_integers = ''' heat_template_version: 2013-05-23 @@ -1368,7 +1407,7 @@ class validateTest(common.HeatTestCase): stack.validate) self.assertEqual(_('The InstanceType parameter must be assigned to ' - 'one Parameter Group only.'), six.text_type(exc)) + 'one parameter group only.'), six.text_type(exc)) def test_validate_invalid_parameter_in_group(self): t = template_format.parse(test_template_invalid_parameter_name) @@ -1382,8 +1421,8 @@ class validateTest(common.HeatTestCase): exc = self.assertRaises(exception.StackValidationFailed, stack.validate) - self.assertEqual(_('The Parameter name (SomethingNotHere) does not ' - 'reference an existing parameter.'), + self.assertEqual(_('The grouped parameter SomethingNotHere does not ' + 'reference a valid parameter.'), six.text_type(exc)) def test_validate_no_parameters_in_group(self): @@ -1393,8 +1432,28 @@ class validateTest(common.HeatTestCase): exc = self.assertRaises(exception.StackValidationFailed, stack.validate) - self.assertEqual(_('Parameters must be provided for each Parameter ' - 'Group.'), six.text_type(exc)) + self.assertEqual(_('The parameters must be provided for each ' + 'parameter group.'), six.text_type(exc)) + + def test_validate_parameter_groups_not_list(self): + t = template_format.parse(test_template_parameter_groups_not_list) + template = hot_tmpl.HOTemplate20130523(t) + stack = parser.Stack(self.ctx, 'test_stack', template) + exc = self.assertRaises(exception.StackValidationFailed, + stack.validate) + + self.assertEqual(_('The parameter_groups should be ' + 'a list.'), six.text_type(exc)) + + def test_validate_parameters_not_list(self): + t = template_format.parse(test_template_parameters_not_list) + template = hot_tmpl.HOTemplate20130523(t) + stack = parser.Stack(self.ctx, 'test_stack', template) + exc = self.assertRaises(exception.StackValidationFailed, + stack.validate) + + self.assertEqual(_('The parameters of parameter group should be ' + 'a list.'), six.text_type(exc)) def test_validate_allowed_values_integer(self): t = template_format.parse(test_template_allowed_integers)