Skip to content

Commit 3001d60

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add --or-show option to user create"
2 parents 951ca3a + 42d0b20 commit 3001d60

3 files changed

Lines changed: 103 additions & 7 deletions

File tree

openstackclient/identity/v2_0/user.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ def get_parser(self, prog_name):
7171
action='store_true',
7272
help=_('Disable user'),
7373
)
74+
parser.add_argument(
75+
'--or-show',
76+
action='store_true',
77+
help=_('Return existing user'),
78+
)
7479
return parser
7580

7681
def take_action(self, parsed_args):
@@ -91,13 +96,24 @@ def take_action(self, parsed_args):
9196
if parsed_args.password_prompt:
9297
parsed_args.password = utils.get_password(self.app.stdin)
9398

94-
user = identity_client.users.create(
95-
parsed_args.name,
96-
parsed_args.password,
97-
parsed_args.email,
98-
tenant_id=project_id,
99-
enabled=enabled,
100-
)
99+
try:
100+
user = identity_client.users.create(
101+
parsed_args.name,
102+
parsed_args.password,
103+
parsed_args.email,
104+
tenant_id=project_id,
105+
enabled=enabled,
106+
)
107+
except ksc_exc.Conflict as e:
108+
if parsed_args.or_show:
109+
user = utils.find_resource(
110+
identity_client.users,
111+
parsed_args.name,
112+
)
113+
self.log.info('Returning existing user %s', user.name)
114+
else:
115+
raise e
116+
101117
# NOTE(dtroyer): The users.create() method wants 'tenant_id' but
102118
# the returned resource has 'tenantId'. Sigh.
103119
# We're using project_id now inside OSC so there.

openstackclient/tests/fakes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ def __init__(self, name, version):
210210

211211
class FakeResource(object):
212212
def __init__(self, manager, info, loaded=False):
213+
self.__name__ = type(self).__name__
213214
self.manager = manager
214215
self._info = info
215216
self._add_details(info)

openstackclient/tests/identity/v2_0/test_user.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import copy
1717
import mock
1818

19+
from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc
1920
from openstackclient.identity.v2_0 import user
2021
from openstackclient.tests import fakes
2122
from openstackclient.tests.identity.v2_0 import fakes as identity_fakes
@@ -342,6 +343,84 @@ def test_user_create_disable(self):
342343
)
343344
self.assertEqual(data, datalist)
344345

346+
def test_user_create_or_show_exists(self):
347+
def _raise_conflict(*args, **kwargs):
348+
raise ksc_exc.Conflict(None)
349+
350+
# need to make this throw an exception...
351+
self.users_mock.create.side_effect = _raise_conflict
352+
353+
self.users_mock.get.return_value = fakes.FakeResource(
354+
None,
355+
copy.deepcopy(identity_fakes.USER),
356+
loaded=True,
357+
)
358+
359+
arglist = [
360+
'--or-show',
361+
identity_fakes.user_name,
362+
]
363+
verifylist = [
364+
('name', identity_fakes.user_name),
365+
('or_show', True),
366+
]
367+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
368+
369+
# DisplayCommandBase.take_action() returns two tuples
370+
columns, data = self.cmd.take_action(parsed_args)
371+
372+
# UserManager.create(name, password, email, tenant_id=, enabled=)
373+
self.users_mock.get.assert_called_with(identity_fakes.user_name)
374+
375+
collist = ('email', 'enabled', 'id', 'name', 'project_id')
376+
self.assertEqual(collist, columns)
377+
datalist = (
378+
identity_fakes.user_email,
379+
True,
380+
identity_fakes.user_id,
381+
identity_fakes.user_name,
382+
identity_fakes.project_id,
383+
)
384+
self.assertEqual(datalist, data)
385+
386+
def test_user_create_or_show_not_exists(self):
387+
arglist = [
388+
'--or-show',
389+
identity_fakes.user_name,
390+
]
391+
verifylist = [
392+
('name', identity_fakes.user_name),
393+
('or_show', True),
394+
]
395+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
396+
397+
# DisplayCommandBase.take_action() returns two tuples
398+
columns, data = self.cmd.take_action(parsed_args)
399+
400+
# Set expected values
401+
kwargs = {
402+
'enabled': True,
403+
'tenant_id': None,
404+
}
405+
# UserManager.create(name, password, email, tenant_id=, enabled=)
406+
self.users_mock.create.assert_called_with(
407+
identity_fakes.user_name,
408+
None,
409+
None,
410+
**kwargs
411+
)
412+
413+
collist = ('email', 'enabled', 'id', 'name', 'project_id')
414+
self.assertEqual(collist, columns)
415+
datalist = (
416+
identity_fakes.user_email,
417+
True,
418+
identity_fakes.user_id,
419+
identity_fakes.user_name,
420+
identity_fakes.project_id,
421+
)
422+
self.assertEqual(datalist, data)
423+
345424

346425
class TestUserDelete(TestUser):
347426

0 commit comments

Comments
 (0)