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:
@@ -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
|
||||
|
||||
@@ -39,6 +39,11 @@ class HTTPException(BaseException):
|
||||
code = 'N/A'
|
||||
|
||||
|
||||
class MalformedRequestBody(BaseException):
|
||||
"""Malformed parameter in request."""
|
||||
pass
|
||||
|
||||
|
||||
class HTTPMultipleChoices(HTTPException):
|
||||
code = 300
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user