Fixes text split for parameters

Make text split only on the first "=" element, this will
allow for values to have multiple "=" in the string.
Also, ensure that key = value pair is honored in parameters,
exit otherwise with error message. Tests included.
Fixes bug #1183842

Change-Id: Ic8897405c61dee49f5927b53f055b0d0686eea7d
This commit is contained in:
Sulochan Acharya
2013-05-29 18:04:46 -05:00
parent 2e6e49f7fa
commit 9b1ce21081
4 changed files with 37 additions and 3 deletions

View File

@@ -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

View File

@@ -39,6 +39,11 @@ class HTTPException(BaseException):
code = 'N/A'
class MalformedRequestBody(BaseException):
"""Malformed parameter in request."""
pass
class HTTPMultipleChoices(HTTPException):
code = 300

View File

@@ -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)

View File

@@ -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)