summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heatclient/common/utils.py6
-rw-r--r--heatclient/exc.py5
-rw-r--r--heatclient/tests/test_utils.py21
-rw-r--r--heatclient/v1/shell.py8
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)