diff options
| author | Jenkins <jenkins@review.openstack.org> | 2014-09-18 03:15:13 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2014-09-18 03:15:13 +0000 |
| commit | 3ff5700a9b27312c22b3acfb13d655e2ecda0831 (patch) | |
| tree | 3fd5e8637ce9c6c9627a157ff9c9f7effb25f356 | |
| parent | c29f12a2a8f251573e537684c0b395d3039bbe9a (diff) | |
| parent | 6877ee1234869a59a9d32e47cf691b2b06472208 (diff) | |
| download | python-heatclient-3ff5700a9b27312c22b3acfb13d655e2ecda0831.tar.gz | |
Merge "Add stack-update argument for patching parameters"
| -rw-r--r-- | heatclient/tests/test_shell.py | 81 | ||||
| -rw-r--r-- | heatclient/v1/shell.py | 11 | ||||
| -rw-r--r-- | heatclient/v1/stacks.py | 4 |
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): |
