diff options
-rw-r--r-- | heatclient/common/utils.py | 6 | ||||
-rw-r--r-- | heatclient/exc.py | 5 | ||||
-rw-r--r-- | heatclient/tests/test_utils.py | 21 | ||||
-rw-r--r-- | heatclient/v1/shell.py | 8 |
4 files changed, 37 insertions, 3 deletions
diff --git a/heatclient/common/utils.py b/heatclient/common/utils.py index 07e20b8..2f29b36 100644 --- a/heatclient/common/utils.py +++ b/heatclient/common/utils.py @@ -130,6 +130,10 @@ def format_parameters(params): parameters = {} if params: for count, p in enumerate(params.split(';'), 1): - (n, v) = p.split('=') + try: + (n, v) = p.split(('='), 1) + except ValueError: + raise exc.MalformedRequestBody() + parameters[n] = v return parameters diff --git a/heatclient/exc.py b/heatclient/exc.py index c90b0fc..ddadfb7 100644 --- a/heatclient/exc.py +++ b/heatclient/exc.py @@ -39,6 +39,11 @@ class HTTPException(BaseException): code = 'N/A' +class MalformedRequestBody(BaseException): + """Malformed parameter in request.""" + pass + + class HTTPMultipleChoices(HTTPException): code = 300 diff --git a/heatclient/tests/test_utils.py b/heatclient/tests/test_utils.py index d9f5b60..2f41ea4 100644 --- a/heatclient/tests/test_utils.py +++ b/heatclient/tests/test_utils.py @@ -13,11 +13,15 @@ # License for the specific language governing permissions and limitations # under the License. from heatclient.common import utils +from heatclient import exc import testtools class shellTest(testtools.TestCase): + def test_format_parameter_none(self): + self.assertEqual({}, utils.format_parameters(None)) + def test_format_parameters(self): p = utils.format_parameters( 'InstanceType=m1.large;DBUsername=wp;' @@ -29,4 +33,19 @@ class shellTest(testtools.TestCase): 'KeyName': 'heat_key', 'LinuxDistribution': 'F17' }, p) - self.assertEqual({}, utils.format_parameters(None)) + + def test_format_parameters_split(self): + p = utils.format_parameters( + 'KeyName=heat_key;' + 'DnsSecKey=hsgx1m31PbamNF4WEcHlwjIlCGgifOdoB58/wwC7a4oAONQ/fDV5ct' + 'qrYBoLlKHhTfkyQEw9iVScKYZbbMtMNg==;' + 'UpstreamDNS=8.8.8.8') + self.assertEqual({'KeyName': 'heat_key', + 'DnsSecKey': 'hsgx1m31PbamNF4WEcHlwjIlCGgifOdoB58/ww' + 'C7a4oAONQ/fDV5ctqrYBoLlKHhTfkyQEw9iVScKYZbbMtMNg==', + 'UpstreamDNS': '8.8.8.8'}, p) + + def test_format_parameter_bad_parameter(self): + params = 'KeyName=heat_key;UpstreamDNS8.8.8.8' + self.assertRaises(exc.MalformedRequestBody, + utils.format_parameters, params) diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py index 736ae6a..6807612 100644 --- a/heatclient/v1/shell.py +++ b/heatclient/v1/shell.py @@ -79,10 +79,16 @@ def do_create(hc, args): help='Name of the stack to create.') def do_stack_create(hc, args): '''Create the stack.''' + try: + parameters = utils.format_parameters(args.parameters) + except exc.MalformedRequestBody: + msg = "Malformed parameters. Parameters should have key=value format" + raise exc.CommandError(msg=msg) + fields = {'stack_name': args.name, 'timeout_mins': args.create_timeout, 'disable_rollback': not(args.enable_rollback), - 'parameters': utils.format_parameters(args.parameters)} + 'parameters': parameters} _set_template_fields(hc, args, fields) hc.stacks.create(**fields) |