diff --git a/heat/engine/parameters.py b/heat/engine/parameters.py index b3f6b8efe7..27fbd44568 100644 --- a/heat/engine/parameters.py +++ b/heat/engine/parameters.py @@ -340,7 +340,10 @@ class CommaDelimitedListParam(Parameter, collections.Sequence): def __init__(self, name, schema, value=None): super(CommaDelimitedListParam, self).__init__(name, schema, value) - self.parsed = self.parse(self.user_value or self.default()) + if self.has_value(): + self.parsed = self.parse(self.user_value or self.default()) + else: + self.parsed = [] def parse(self, value): # only parse when value is not already a list @@ -357,7 +360,10 @@ class CommaDelimitedListParam(Parameter, collections.Sequence): return value def value(self): - return self.parsed + if self.has_value(): + return self.parsed + + raise exception.UserParameterMissing(key=self.name) def __len__(self): '''Return the length of the list.''' @@ -382,7 +388,10 @@ class JsonParam(Parameter): def __init__(self, name, schema, value=None): super(JsonParam, self).__init__(name, schema, value) - self.parsed = self.parse(self.user_value or self.default()) + if self.has_value(): + self.parsed = self.parse(self.user_value or self.default()) + else: + self.parsed = {} def parse(self, value): try: @@ -397,7 +406,10 @@ class JsonParam(Parameter): return value def value(self): - return self.parsed + if self.has_value(): + return self.parsed + + raise exception.UserParameterMissing(key=self.name) def __getitem__(self, key): return self.parsed[key] diff --git a/heat/tests/test_parameters.py b/heat/tests/test_parameters.py index 57c0ec62fa..cd1c065361 100644 --- a/heat/tests/test_parameters.py +++ b/heat/tests/test_parameters.py @@ -363,12 +363,24 @@ class ParameterTest(testtools.TestCase): self.new_parameter, 'bo', schema, 'foo') self.assertIn("Unrecognized value 'foo'", six.text_type(err)) - def test_missing_param(self): + def test_missing_param_str(self): '''Test missing user parameter.''' self.assertRaises(exception.UserParameterMissing, self.new_parameter, 'p', {'Type': 'String'}) + def test_missing_param_list(self): + '''Test missing user parameter.''' + self.assertRaises(exception.UserParameterMissing, + self.new_parameter, 'p', + {'Type': 'CommaDelimitedList'}) + + def test_missing_param_map(self): + '''Test missing user parameter.''' + self.assertRaises(exception.UserParameterMissing, + self.new_parameter, 'p', + {'Type': 'Json'}) + def test_param_name_in_error_message(self): schema = {'Type': 'String', 'AllowedPattern': '[a-z]*'} diff --git a/heat_integrationtests/functional/test_autoscaling.py b/heat_integrationtests/functional/test_autoscaling.py index 15b318bdac..60fa66fea3 100644 --- a/heat_integrationtests/functional/test_autoscaling.py +++ b/heat_integrationtests/functional/test_autoscaling.py @@ -70,7 +70,7 @@ parameters: InstanceType: {type: string} SecurityGroups: {type: comma_delimited_list} UserData: {type: string} - Tags: {type: comma_delimited_list} + Tags: {type: comma_delimited_list, default: "x,y"} resources: random1: @@ -93,7 +93,7 @@ parameters: InstanceType: {type: string} SecurityGroups: {type: comma_delimited_list} UserData: {type: string} - Tags: {type: comma_delimited_list} + Tags: {type: comma_delimited_list, default: "x,y"} resources: random1: @@ -612,7 +612,7 @@ parameters: InstanceType: {type: string} SecurityGroups: {type: comma_delimited_list} UserData: {type: string} - Tags: {type: comma_delimited_list} + Tags: {type: comma_delimited_list, default: "x,y"} resources: outputs: