summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-09-18 03:15:13 +0000
committerGerrit Code Review <review@openstack.org>2014-09-18 03:15:13 +0000
commit3ff5700a9b27312c22b3acfb13d655e2ecda0831 (patch)
tree3fd5e8637ce9c6c9627a157ff9c9f7effb25f356
parentc29f12a2a8f251573e537684c0b395d3039bbe9a (diff)
parent6877ee1234869a59a9d32e47cf691b2b06472208 (diff)
downloadpython-heatclient-3ff5700a9b27312c22b3acfb13d655e2ecda0831.tar.gz
Merge "Add stack-update argument for patching parameters"
-rw-r--r--heatclient/tests/test_shell.py81
-rw-r--r--heatclient/v1/shell.py11
-rw-r--r--heatclient/v1/stacks.py4
3 files changed, 95 insertions, 1 deletions
diff --git a/heatclient/tests/test_shell.py b/heatclient/tests/test_shell.py
index 9f143e9..3ac3eff 100644
--- a/heatclient/tests/test_shell.py
+++ b/heatclient/tests/test_shell.py
@@ -1417,6 +1417,87 @@ class ShellTestUserPass(ShellBase):
self.assertRegexpMatches(update_text, r)
@httpretty.activate
+ def test_stack_update_with_existing_parameters(self):
+ self.register_keystone_auth_fixture()
+ template_file = os.path.join(TEST_VAR_DIR, 'minimal.template')
+ template_data = open(template_file).read()
+ resp = fakes.FakeHTTPResponse(
+ 202,
+ 'Accepted',
+ {},
+ 'The request is accepted for processing.')
+ expected_data = {
+ 'files': {},
+ 'environment': {},
+ 'template': jsonutils.loads(template_data),
+ 'parameters': {},
+ 'disable_rollback': False}
+ http.HTTPClient.json_request(
+ 'PATCH', '/stacks/teststack2/2',
+ data=expected_data,
+ headers={'X-Auth-Key': 'password', 'X-Auth-User': 'username'}
+ ).AndReturn((resp, None))
+ fakes.script_heat_list()
+
+ self.m.ReplayAll()
+
+ update_text = self.shell(
+ 'stack-update teststack2/2 '
+ '--template-file=%s '
+ '--enable-rollback '
+ '--existing' % template_file)
+
+ required = [
+ 'stack_name',
+ 'id',
+ 'teststack2',
+ '1'
+ ]
+ for r in required:
+ self.assertRegexpMatches(update_text, r)
+
+ @httpretty.activate
+ def test_stack_update_with_patched_existing_parameters(self):
+ self.register_keystone_auth_fixture()
+ template_file = os.path.join(TEST_VAR_DIR, 'minimal.template')
+ template_data = open(template_file).read()
+ resp = fakes.FakeHTTPResponse(
+ 202,
+ 'Accepted',
+ {},
+ 'The request is accepted for processing.')
+ expected_data = {
+ 'files': {},
+ 'environment': {},
+ 'template': jsonutils.loads(template_data),
+ 'parameters': {'"KeyPairName': 'updated_key"'},
+ 'disable_rollback': False}
+ http.HTTPClient.json_request(
+ 'PATCH', '/stacks/teststack2/2',
+ data=expected_data,
+ headers={'X-Auth-Key': 'password', 'X-Auth-User': 'username'}
+ ).AndReturn((resp, None))
+ fakes.script_heat_list()
+
+ self.m.ReplayAll()
+
+ update_text = self.shell(
+ 'stack-update teststack2/2 '
+ '--template-file=%s '
+ '--enable-rollback '
+ '--parameters="KeyPairName=updated_key" '
+ '--existing' % template_file)
+
+ required = [
+ 'stack_name',
+ 'id',
+ 'teststack2',
+ '1'
+ ]
+ for r in required:
+ self.assertRegexpMatches(update_text, r)
+
+ @httpretty.activate
def test_stack_delete(self):
self.register_keystone_auth_fixture()
resp = fakes.FakeHTTPResponse(
diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py
index fd7f8f7..fa8e19a 100644
--- a/heatclient/v1/shell.py
+++ b/heatclient/v1/shell.py
@@ -363,6 +363,11 @@ def do_stack_show(hc, args):
'This can be specified multiple times, or once with parameters '
'separated by a semicolon.',
action='append')
+@utils.arg('-x', '--existing', default=False, action="store_true",
+ help='Re-use the set of parameters of the current stack. '
+ 'Parameters specified in --parameters will patch over the existing '
+ 'values in the current stack. Parameters omitted will keep '
+ 'the existing values.')
@utils.arg('id', metavar='<NAME or ID>',
help='Name or ID of stack to update.')
def do_update(hc, args):
@@ -399,6 +404,11 @@ def do_update(hc, args):
'This can be specified multiple times, or once with parameters '
'separated by a semicolon.',
action='append')
+@utils.arg('-x', '--existing', default=False, action="store_true",
+ help='Re-use the set of parameters of the current stack. '
+ 'Parameters specified in --parameters will patch over the existing '
+ 'values in the current stack. Parameters omitted will keep '
+ 'the existing values.')
@utils.arg('id', metavar='<NAME or ID>',
help='Name or ID of stack to update.')
def do_stack_update(hc, args):
@@ -416,6 +426,7 @@ def do_stack_update(hc, args):
fields = {
'stack_id': args.id,
'parameters': utils.format_parameters(args.parameters),
+ 'existing': args.existing,
'template': template,
'files': dict(list(tpl_files.items()) + list(env_files.items())),
'environment': env
diff --git a/heatclient/v1/stacks.py b/heatclient/v1/stacks.py
index c290c4b..a9ca309 100644
--- a/heatclient/v1/stacks.py
+++ b/heatclient/v1/stacks.py
@@ -122,7 +122,9 @@ class StackManager(base.BaseManager):
def update(self, stack_id, **kwargs):
"""Update a stack."""
headers = self.client.credentials_headers()
- resp, body = self.client.json_request('PUT', '/stacks/%s' % stack_id,
+ method = 'PATCH' if kwargs['existing'] else 'PUT'
+ del kwargs['existing']
+ resp, body = self.client.json_request(method, '/stacks/%s' % stack_id,
data=kwargs, headers=headers)
def delete(self, stack_id):