From cc44d050f86b4bc2431088f69130b59fc345eb45 Mon Sep 17 00:00:00 2001 From: Eric Brown Date: Tue, 14 Jan 2014 09:19:42 -0800 Subject: [PATCH] Interactive prompt for create user Execution of the shell will now prompt the user for a password if argument '--pass' is specified without a following parameter. In that way, a user does not need to pass passwords on the command line. Usage example: $ keystone user-create --name bob --tenant admin --pass --enabled true New Password: Repeat New Password: Closes-Bug: #1100116 Change-Id: I1f6d6322830972dfad19ebe2fe63e91f82ed8033 --- keystoneclient/tests/v2_0/test_shell.py | 15 +++++++++++++++ keystoneclient/v2_0/shell.py | 10 +++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) mode change 100644 => 100755 keystoneclient/v2_0/shell.py diff --git a/keystoneclient/tests/v2_0/test_shell.py b/keystoneclient/tests/v2_0/test_shell.py index 645ab654a..54ca0d433 100644 --- a/keystoneclient/tests/v2_0/test_shell.py +++ b/keystoneclient/tests/v2_0/test_shell.py @@ -13,6 +13,7 @@ import os import sys +import mock from mox3 import stubout import six from testtools import matchers @@ -102,6 +103,20 @@ class ShellTests(utils.TestCase): 'name': 'new-user', 'tenantId': None}}) + @mock.patch('sys.stdin', autospec=True) + def test_user_create_password_prompt(self, mock_stdin): + with mock.patch('getpass.getpass') as mock_getpass: + mock_getpass.return_value = 'newpass' + self.run_command('user-create --name new-user --pass') + self.fake_client.assert_called_anytime( + 'POST', '/users', + {'user': + {'email': None, + 'password': 'newpass', + 'enabled': True, + 'name': 'new-user', + 'tenantId': None}}) + def test_user_get(self): self.run_command('user-get 1') self.fake_client.assert_called_anytime('GET', '/users/1') diff --git a/keystoneclient/v2_0/shell.py b/keystoneclient/v2_0/shell.py old mode 100644 new mode 100755 index d4fa3c0cd..d738ee95d --- a/keystoneclient/v2_0/shell.py +++ b/keystoneclient/v2_0/shell.py @@ -27,6 +27,7 @@ from keystoneclient.v2_0 import client CLIENT_CLASS = client.Client +ASK_FOR_PASSWORD = object() def require_service_catalog(f): @@ -71,8 +72,8 @@ def do_user_get(kc, args): @utils.arg('--tenant', '--tenant-id', metavar='', help='New user default tenant') @utils.arg('--tenant_id', help=argparse.SUPPRESS) -@utils.arg('--pass', metavar='', dest='passwd', - help='New user password') +@utils.arg('--pass', metavar='', dest='passwd', nargs='?', + const=ASK_FOR_PASSWORD, help='New user password') @utils.arg('--email', metavar='', help='New user email address') @utils.arg('--enabled', metavar='', default=True, @@ -85,7 +86,10 @@ def do_user_create(kc, args): tenant_id = args.tenant_id else: tenant_id = None - user = kc.users.create(args.name, args.passwd, args.email, + new_passwd = args.passwd + if args.passwd is ASK_FOR_PASSWORD: + new_passwd = utils.prompt_for_password() + user = kc.users.create(args.name, new_passwd, args.email, tenant_id=tenant_id, enabled=strutils.bool_from_string(args.enabled)) utils.print_dict(user._info)