]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
raise an UnknownUserParameter exception when receiving an unknown param
authorLiang Chen <cbjchen@cn.ibm.com>
Wed, 5 Jun 2013 08:41:14 +0000 (16:41 +0800)
committerLiang Chen <cbjchen@cn.ibm.com>
Sat, 8 Jun 2013 10:55:08 +0000 (18:55 +0800)
add some validation logic to Parameters, so that when an invalid param
is passed in an exception will be raised.

Fixes bug #1186790

Change-Id: I8aece556d8fc5cd5533f4baf041e345bdc5722ec

heat/api/aws/exception.py
heat/api/openstack/v1/util.py
heat/common/exception.py
heat/engine/parameters.py
heat/tests/test_api_cfn_v1.py
heat/tests/test_api_openstack_v1.py
heat/tests/test_nested_stack.py
heat/tests/test_parameters.py
heat/tests/test_watch.py

index 44ed0ef2c74208ac7759fc6d3fe81a13ab120fb6..462163c5e302822563a1c4d60357315f6ba5f529 100644 (file)
@@ -255,6 +255,7 @@ def map_remote_error(ex):
             'StackExists',
             'StackValidationFailed',
             'InvalidTemplateReference',
+            'UnknownUserParameter',
         )
         denied_errors = ('Forbidden', 'NotAuthorized')
 
index 7a38a4ad46c132d99afb260851a8b92ef8fb1451..f9666346e32aee87b775aee41ae2ad17ce7ba40f 100644 (file)
@@ -82,6 +82,7 @@ def remote_error(ex):
         'StackExists': exc.HTTPConflict,
         'StackValidationFailed': exc.HTTPBadRequest,
         'InvalidTemplateReference': exc.HTTPBadRequest,
+        'UnknownUserParameter': exc.HTTPBadRequest,
     }
 
     Exc = error_map.get(ex.exc_type, exc.HTTPInternalServerError)
index 419685e137c385f910fb7023a67069c9114fab3c..b50c992160bee00fe05ce8c8595afabcac24c849 100644 (file)
@@ -191,6 +191,10 @@ class UserParameterMissing(OpenstackException):
     message = _("The Parameter (%(key)s) was not provided.")
 
 
+class UnknownUserParameter(OpenstackException):
+    message = _("The Parameter (%(key)s) was not defined in template.")
+
+
 class InvalidTemplateAttribute(OpenstackException):
     message = _("The Referenced Attribute (%(resource)s %(key)s)"
                 " is incorrect.")
index 6b5af4fa0cdc9c30e93dc0543948ca3293efd00f..7ae8481e483dbe8f83a7b796baa55b8f20b52b08 100644 (file)
@@ -16,6 +16,7 @@
 import collections
 import re
 
+from heat.common import exception
 from heat.engine import template
 
 PARAMETER_KEYS = (
@@ -246,6 +247,8 @@ class Parameters(collections.Mapping):
             for name, schema in tmpl[template.PARAMETERS].iteritems():
                 yield Parameter(name, schema, user_params.get(name))
 
+        self.tmpl = tmpl
+        self._validate(user_params)
         self.params = dict((p.name, p) for p in parameters())
 
     def __contains__(self, key):
@@ -284,3 +287,8 @@ class Parameters(collections.Mapping):
         Set the AWS::StackId pseudo parameter value
         '''
         self.params[PARAM_STACK_ID].schema[DEFAULT] = stack_id
+
+    def _validate(self, user_params):
+        for param in user_params:
+            if param not in self.tmpl[template.PARAMETERS]:
+                raise exception.UnknownUserParameter(key=param)
index 2b753aee738b163b5e621226f84e9f458602a1f3..130d2682aab1b6272ea3f54c45f645548e9c7d4a 100644 (file)
@@ -540,6 +540,15 @@ class CfnStackControllerTest(HeatTestCase):
                            'args': engine_args},
                   'version': self.api_version}, None
                  ).AndRaise(rpc_common.RemoteError("AttributeError"))
+        rpc.call(dummy_req.context, self.topic,
+                 {'namespace': None,
+                  'method': 'create_stack',
+                  'args': {'stack_name': stack_name,
+                           'template': template,
+                           'params': engine_parms,
+                           'args': engine_args},
+                  'version': self.api_version}, None
+                 ).AndRaise(rpc_common.RemoteError("UnknownUserParameter"))
 
         self.m.ReplayAll()
 
@@ -547,6 +556,12 @@ class CfnStackControllerTest(HeatTestCase):
 
         self.assertEqual(type(result),
                          exception.HeatInvalidParameterValueError)
+
+        result = self.controller.create(dummy_req)
+
+        self.assertEqual(type(result),
+                         exception.HeatInvalidParameterValueError)
+
         self.m.VerifyAll()
 
     def test_create_err_exists(self):
index c5db808d99f88089d27e09f507dc9b23095608ef..b1e35b033aaea776ca8dac59f6420a21c18df5b7 100644 (file)
@@ -362,11 +362,25 @@ class StackControllerTest(ControllerTest, HeatTestCase):
                            'args': {'timeout_mins': 30}},
                   'version': self.api_version},
                  None).AndRaise(rpc_common.RemoteError("AttributeError"))
+        rpc.call(req.context, self.topic,
+                 {'namespace': None,
+                  'method': 'create_stack',
+                  'args': {'stack_name': stack_name,
+                           'template': template,
+                           'params': parameters,
+                           'args': {'timeout_mins': 30}},
+                  'version': self.api_version},
+                 None).AndRaise(rpc_common.RemoteError("UnknownUserParameter"))
+
         self.m.ReplayAll()
 
         self.assertRaises(webob.exc.HTTPBadRequest,
                           self.controller.create,
                           req, tenant_id=self.tenant, body=body)
+        self.assertRaises(webob.exc.HTTPBadRequest,
+                          self.controller.create,
+                          req, tenant_id=self.tenant, body=body)
+
         self.m.VerifyAll()
 
     def test_create_err_existing(self):
index 83f46de88fa0bf8348ca6ed5d50709273c89984a..d9824981c820b270d2ced0cf9c6c4b32b0b34e94 100644 (file)
@@ -37,6 +37,9 @@ Resources:
 
     nested_template = '''
 HeatTemplateFormatVersion: '2012-12-12'
+Parameters:
+  KeyName:
+    Type: String
 Outputs:
   Foo:
     Value: bar
index bfa3672ba9761856c4c8c1e9cf32e47287b0d7b6..ffbc86e44565ca082c5bebb7d15989d1d6e26dcd 100644 (file)
@@ -16,6 +16,7 @@
 import testtools
 import json
 
+from heat.common import exception
 from heat.engine import parameters
 
 
@@ -338,3 +339,11 @@ class ParametersTest(testtools.TestCase):
                     'AWS::StackName': 'test_params'}
 
         self.assertEqual(params.map(str), expected)
+
+    def test_unknown_params(self):
+        user_params = {'Foo': 'wibble'}
+        self.assertRaises(exception.UnknownUserParameter,
+                          parameters.Parameters,
+                          'test',
+                          params_schema,
+                          user_params)
index 12e1214eba2ce5cee1cad07b08f1dcd1c3038bf1..92a536cf4da7d52120e38ec0c64ed2150d71d691 100644 (file)
@@ -52,7 +52,7 @@ class WatchRuleTest(HeatTestCase):
         empty_tmpl = {"template": {}}
         tmpl = parser.Template(empty_tmpl)
         stack_name = 'dummystack'
-        params = parser.Parameters(stack_name, tmpl, {'foo': 'bar'})
+        params = parser.Parameters(stack_name, tmpl, {})
         dummy_stack = parser.Stack(ctx, stack_name, tmpl, params)
         dummy_stack.state_set(dummy_stack.CREATE_COMPLETE, 'Testing')
         dummy_stack.store()