summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-09-27 04:27:41 +0000
committerGerrit Code Review <review@openstack.org>2013-09-27 04:27:41 +0000
commit96dbb0911c8d139a5b3fe64af82783cf81790ff8 (patch)
tree908164139ac1341dc1b70819d825cbaa986dd7ae
parent455b1cb4e88cff87787d69ecf196c64be0467ed4 (diff)
parent795d52c6418fa3beab2e3385da11ece8fca3db37 (diff)
downloadpython-heatclient-0.2.5.tar.gz
Merge "Allow -P to be invoked multiple times"0.2.5
-rw-r--r--heatclient/common/utils.py28
-rw-r--r--heatclient/tests/test_utils.py44
-rw-r--r--heatclient/v1/shell.py30
3 files changed, 79 insertions, 23 deletions
diff --git a/heatclient/common/utils.py b/heatclient/common/utils.py
index 49753ad..033314f 100644
--- a/heatclient/common/utils.py
+++ b/heatclient/common/utils.py
@@ -147,17 +147,25 @@ def exit(msg=''):
def format_parameters(params):
'''Reformat parameters into dict of format expected by the API.'''
+
+ if not params:
+ return {}
+
+ # expect multiple invocations of --parameters but fall back
+ # to ; delimited if only one --parameters is specified
+ if len(params) == 1:
+ params = params[0].split(';')
+
parameters = {}
- if params:
- for count, p in enumerate(params.split(';'), 1):
- try:
- (n, v) = p.split(('='), 1)
- except ValueError:
- msg = '%s(%s). %s.' % ('Malformed parameter', p,
- 'Use the key=value format')
- raise exc.CommandError(msg)
-
- parameters[n] = v
+ for p in params:
+ try:
+ (n, v) = p.split(('='), 1)
+ except ValueError:
+ msg = '%s(%s). %s.' % ('Malformed parameter', p,
+ 'Use the key=value format')
+ raise exc.CommandError(msg)
+
+ parameters[n] = v
return parameters
diff --git a/heatclient/tests/test_utils.py b/heatclient/tests/test_utils.py
index 55d7bc7..192bd42 100644
--- a/heatclient/tests/test_utils.py
+++ b/heatclient/tests/test_utils.py
@@ -23,10 +23,10 @@ class shellTest(testtools.TestCase):
self.assertEqual({}, utils.format_parameters(None))
def test_format_parameters(self):
- p = utils.format_parameters(
+ p = utils.format_parameters([
'InstanceType=m1.large;DBUsername=wp;'
'DBPassword=verybadpassword;KeyName=heat_key;'
- 'LinuxDistribution=F17')
+ 'LinuxDistribution=F17'])
self.assertEqual({'InstanceType': 'm1.large',
'DBUsername': 'wp',
'DBPassword': 'verybadpassword',
@@ -35,20 +35,50 @@ class shellTest(testtools.TestCase):
}, p)
def test_format_parameters_split(self):
- p = utils.format_parameters(
+ p = utils.format_parameters([
'KeyName=heat_key;'
'DnsSecKey=hsgx1m31PbamNF4WEcHlwjIlCGgifOdoB58/wwC7a4oAONQ/fDV5ct'
'qrYBoLlKHhTfkyQEw9iVScKYZbbMtMNg==;'
- 'UpstreamDNS=8.8.8.8')
+ 'UpstreamDNS=8.8.8.8'])
self.assertEqual({'KeyName': 'heat_key',
'DnsSecKey': 'hsgx1m31PbamNF4WEcHlwjIlCGgifOdoB58/ww'
'C7a4oAONQ/fDV5ctqrYBoLlKHhTfkyQEw9iVScKYZbbMtMNg==',
'UpstreamDNS': '8.8.8.8'}, p)
+ def test_format_parameters_multiple(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_parameters_multiple_semicolon_values(self):
+ p = utils.format_parameters([
+ 'KeyName=heat_key',
+ 'DnsSecKey=hsgx1m31;PbaNF4WEcHlwj;IlCGgfOdoB;58/ww7a4oAO;NQ/fD==',
+ 'UpstreamDNS=8.8.8.8'])
+ self.assertEqual({'KeyName': 'heat_key',
+ 'DnsSecKey': 'hsgx1m31;PbaNF4WEcHlwj;IlCGgfOdoB;58/'
+ 'ww7a4oAO;NQ/fD==',
+ 'UpstreamDNS': '8.8.8.8'}, p)
+
def test_format_parameter_bad_parameter(self):
- params = 'KeyName=heat_key;UpstreamDNS8.8.8.8'
- self.assertRaises(exc.CommandError,
- utils.format_parameters, params)
+ params = ['KeyName=heat_key;UpstreamDNS8.8.8.8']
+ ex = self.assertRaises(exc.CommandError,
+ utils.format_parameters, params)
+ self.assertEqual('Malformed parameter(UpstreamDNS8.8.8.8). '
+ 'Use the key=value format.', str(ex))
+
+ def test_format_multiple_bad_parameter(self):
+ params = ['KeyName=heat_key', 'UpstreamDNS8.8.8.8']
+ ex = self.assertRaises(exc.CommandError,
+ utils.format_parameters, params)
+ self.assertEqual('Malformed parameter(UpstreamDNS8.8.8.8). '
+ 'Use the key=value format.', str(ex))
def test_link_formatter(self):
self.assertEqual('', utils.link_formatter(None))
diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py
index 4a4bef9..8cf7da3 100644
--- a/heatclient/v1/shell.py
+++ b/heatclient/v1/shell.py
@@ -103,7 +103,10 @@ def _process_environment_and_files(hc, args, fields):
@utils.arg('-r', '--enable-rollback', default=False, action="store_true",
help='Enable rollback on create/update failure')
@utils.arg('-P', '--parameters', metavar='<KEY1=VALUE1;KEY2=VALUE2...>',
- help='Parameter values used to create the stack.')
+ help='Parameter values used to create the stack. '
+ 'This can be specified multiple times, or once with parameters '
+ 'separated by semicolon.',
+ action='append')
@utils.arg('name', metavar='<STACK_NAME>',
help='Name of the stack to create.')
def do_create(hc, args):
@@ -125,7 +128,10 @@ def do_create(hc, args):
@utils.arg('-r', '--enable-rollback', default=False, action="store_true",
help='Enable rollback on create/update failure')
@utils.arg('-P', '--parameters', metavar='<KEY1=VALUE1;KEY2=VALUE2...>',
- help='Parameter values used to create the stack.')
+ help='Parameter values used to create the stack. '
+ 'This can be specified multiple times, or once with parameters '
+ 'separated by semicolon.',
+ action='append')
@utils.arg('name', metavar='<STACK_NAME>',
help='Name of the stack to create.')
def do_stack_create(hc, args):
@@ -221,7 +227,10 @@ def do_stack_show(hc, args):
@utils.arg('-o', '--template-object', metavar='<URL>',
help='URL to retrieve template object (e.g from swift)')
@utils.arg('-P', '--parameters', metavar='<KEY1=VALUE1;KEY2=VALUE2...>',
- help='Parameter values used to create the stack.')
+ help='Parameter values used to create the stack. '
+ 'This can be specified multiple times, or once with parameters '
+ 'separated by semicolon.',
+ action='append')
@utils.arg('id', metavar='<NAME or ID>',
help='Name or ID of stack to update.')
def do_update(hc, args):
@@ -238,7 +247,10 @@ def do_update(hc, args):
@utils.arg('-o', '--template-object', metavar='<URL>',
help='URL to retrieve template object (e.g from swift)')
@utils.arg('-P', '--parameters', metavar='<KEY1=VALUE1;KEY2=VALUE2...>',
- help='Parameter values used to create the stack.')
+ help='Parameter values used to create the stack. '
+ 'This can be specified multiple times, or once with parameters '
+ 'separated by semicolon.',
+ action='append')
@utils.arg('id', metavar='<NAME or ID>',
help='Name or ID of stack to update.')
def do_stack_update(hc, args):
@@ -297,7 +309,10 @@ def do_template_show(hc, args):
@utils.arg('-o', '--template-object', metavar='<URL>',
help='URL to retrieve template object (e.g from swift)')
@utils.arg('-P', '--parameters', metavar='<KEY1=VALUE1;KEY2=VALUE2...>',
- help='Parameter values to validate.')
+ help='Parameter values to validate. '
+ 'This can be specified multiple times, or once with parameters '
+ 'separated by semicolon.',
+ action='append')
def do_validate(hc, args):
'''DEPRECATED! Use template-validate instead.'''
do_template_validate(hc, args)
@@ -312,7 +327,10 @@ def do_validate(hc, args):
@utils.arg('-o', '--template-object', metavar='<URL>',
help='URL to retrieve template object (e.g from swift)')
@utils.arg('-P', '--parameters', metavar='<KEY1=VALUE1;KEY2=VALUE2...>',
- help='Parameter values to validate.')
+ help='Parameter values to validate. '
+ 'This can be specified multiple times, or once with parameters '
+ 'separated by semicolon.',
+ action='append')
def do_template_validate(hc, args):
'''Validate a template with parameters.'''
fields = {'parameters': utils.format_parameters(args.parameters)}