diff options
author | Jenkins <jenkins@review.openstack.org> | 2017-07-05 15:20:38 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2017-07-05 15:20:38 +0000 |
commit | 4722facf06d813fd5ec76de7a662a723f3ddee29 (patch) | |
tree | 31ed74a2fde252e2f59ca7fe7773786132e7f22c /heatclient | |
parent | 81fb46dc4f1ede19936964b541d0dde083cb113e (diff) | |
parent | 7998d7bb3fdce093df2c88e5b82b1bfa9db5560b (diff) | |
download | python-heatclient-4722facf06d813fd5ec76de7a662a723f3ddee29.tar.gz |
Merge "Add optional arguments '-y' in CLI:snapshot-delete"
Diffstat (limited to 'heatclient')
-rw-r--r-- | heatclient/tests/unit/test_shell.py | 64 | ||||
-rw-r--r-- | heatclient/v1/shell.py | 23 |
2 files changed, 85 insertions, 2 deletions
diff --git a/heatclient/tests/unit/test_shell.py b/heatclient/tests/unit/test_shell.py index cdf6a74..b9ec014 100644 --- a/heatclient/tests/unit/test_shell.py +++ b/heatclient/tests/unit/test_shell.py @@ -32,6 +32,7 @@ import testscenarios import testtools import yaml +from heatclient._i18n import _ from heatclient.common import http from heatclient.common import utils from heatclient import exc @@ -2225,6 +2226,65 @@ class ShellTestUserPass(ShellBase): resp = self.shell('snapshot-show teststack/1 2') self.assertEqual(resp_dict, jsonutils.loads(resp)) + # the main thing this @mock.patch is doing here is keeping + # sys.stdin untouched for later tests + @mock.patch('sys.stdin', new_callable=six.StringIO) + def test_snapshot_delete_prompt_with_tty(self, ms): + self.register_keystone_auth_fixture() + resp_dict = {"snapshot": { + "id": "2", + "creation_time": "2012-10-25T01:58:47Z" + }} + + mock_stdin = mock.Mock() + mock_stdin.isatty = mock.Mock() + mock_stdin.isatty.return_value = True + mock_stdin.readline = mock.Mock() + mock_stdin.readline.return_value = 'n' + sys.stdin = mock_stdin + + self.mock_request_delete('/stacks/teststack/1/snapshots/2', resp_dict) + + self.m.ReplayAll() + + resp = self.shell('snapshot-delete teststack/1 2') + resp_text = ('Are you sure you want to delete the snapshot of ' + 'this stack [Y/N]?') + self.assertEqual(resp_text, resp) + self.m.ReplayAll() + + mock_stdin.readline.return_value = 'Y' + resp = self.shell('snapshot-delete teststack/1 2') + msg = _("Request to delete the snapshot 2 of the stack " + "teststack/1 has been accepted.") + self.assertRegex(resp, msg) + + # the main thing this @mock.patch is doing here is keeping + # sys.stdin untouched for later tests + @mock.patch('sys.stdin', new_callable=six.StringIO) + def test_snapshot_delete_prompt_with_tty_y(self, ms): + self.register_keystone_auth_fixture() + resp_dict = {"snapshot": { + "id": "2", + "creation_time": "2012-10-25T01:58:47Z" + }} + + mock_stdin = mock.Mock() + mock_stdin.isatty = mock.Mock() + mock_stdin.isatty.return_value = True + mock_stdin.readline = mock.Mock() + mock_stdin.readline.return_value = '' + sys.stdin = mock_stdin + + self.mock_request_delete('/stacks/teststack/1/snapshots/2', resp_dict) + + self.m.ReplayAll() + # -y from the shell should skip the n/y prompt + resp = self.shell('snapshot-delete -y teststack/1 2') + msg = _("Request to delete the snapshot 2 of the stack " + "teststack/1 has been accepted.") + self.assertRegex(resp, msg) + def test_snapshot_delete(self): self.register_keystone_auth_fixture() @@ -2236,7 +2296,9 @@ class ShellTestUserPass(ShellBase): self.m.ReplayAll() resp = self.shell('snapshot-delete teststack/1 2') - self.assertEqual("", resp) + msg = _("Request to delete the snapshot 2 of the stack " + "teststack/1 has been accepted.") + self.assertRegex(resp, msg) def test_stack_restore(self): self.register_keystone_auth_fixture() diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py index 70ffc9f..97484ca 100644 --- a/heatclient/v1/shell.py +++ b/heatclient/v1/shell.py @@ -1634,13 +1634,34 @@ def do_snapshot_show(hc, args): help=_('Name or ID of the stack containing the snapshot.')) @utils.arg('snapshot', metavar='<SNAPSHOT>', help=_('The ID of the snapshot to delete.')) +@utils.arg('-y', '--yes', default=False, action="store_true", + help=_('Skip yes/no prompt (assume yes).')) def do_snapshot_delete(hc, args): '''Delete a snapshot of a stack.''' show_deprecated('heat snapshot-delete', 'openstack stack snapshot delete') - + msg = "User did not confirm snapshot delete %sso taking no action." + try: + if not args.yes and sys.stdin.isatty(): + sys.stdout.write( + _('Are you sure you want to delete the snapshot of this ' + 'stack [Y/N]?')) + prompt_response = sys.stdin.readline().lower() + if not prompt_response.startswith('y'): + logger.info(msg, '') + return + except KeyboardInterrupt: # ctrl-c + logger.info(msg, '(ctrl-c) ') + return + except EOFError: # ctrl-d + logger.info(msg, '(ctrl-d) ') + return fields = {'stack_id': args.id, 'snapshot_id': args.snapshot} try: hc.stacks.snapshot_delete(**fields) + success_msg = _("Request to delete the snapshot %(snapshot_id)s of " + "the stack %(stack_id)s has been accepted.") + print(success_msg % {'stack_id': args.id, + 'snapshot_id': args.snapshot}) except exc.HTTPNotFound: raise exc.CommandError(_('Stack or snapshot not found')) |