Skip to content

Commit 7b32ec0

Browse files
author
Guojian Shao
committed
add --project-domain option for user v3
user v3 create/set only support --project option, we need --project-domain to prevent collisions between project names exist. Change-Id: I2d62e5b9bb6df4c5c5a9542514faf2e4365bb18b Closes-Bug: #1475357
1 parent 37c83e6 commit 7b32ec0

3 files changed

Lines changed: 82 additions & 8 deletions

File tree

doc/source/command-objects/user.rst

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Create new user
1414
1515
os user create
1616
[--domain <domain>]
17-
[--project <project>]
17+
[--project <project> [--project-domain <project-domain>]]
1818
[--password <password>]
1919
[--password-prompt]
2020
[--email <email-address>]
@@ -33,6 +33,11 @@ Create new user
3333
3434
Default project (name or ID)
3535
36+
.. option:: --project-domain <project-domain>
37+
38+
Domain the project belongs to (name or ID).
39+
This can be used in case collisions between project names exist.
40+
3641
.. option:: --password <password>
3742
3843
Set user password
@@ -136,7 +141,7 @@ Set user properties
136141
137142
os user set
138143
[--name <name>]
139-
[--project <project>]
144+
[--project <project> [--project-domain <project-domain>]]
140145
[--password <password>]
141146
[--email <email-address>]
142147
[--description <description>]
@@ -151,6 +156,11 @@ Set user properties
151156
152157
Set default project (name or ID)
153158
159+
.. option:: --project-domain <project-domain>
160+
161+
Domain the project belongs to (name or ID).
162+
This can be used in case collisions between project names exist.
163+
154164
.. option:: --password <password>
155165
156166
Set user password

openstackclient/identity/v3/user.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def get_parser(self, prog_name):
5151
metavar='<project>',
5252
help='Default project (name or ID)',
5353
)
54+
common.add_project_domain_option_to_parser(parser)
5455
parser.add_argument(
5556
'--password',
5657
metavar='<password>',
@@ -96,10 +97,9 @@ def take_action(self, parsed_args):
9697

9798
project_id = None
9899
if parsed_args.project:
99-
project_id = utils.find_resource(
100-
identity_client.projects,
101-
parsed_args.project,
102-
).id
100+
project_id = common.find_project(identity_client,
101+
parsed_args.project,
102+
parsed_args.project_domain).id
103103

104104
domain_id = None
105105
if parsed_args.domain:
@@ -301,6 +301,7 @@ def get_parser(self, prog_name):
301301
metavar='<project>',
302302
help='Set default project (name or ID)',
303303
)
304+
common.add_project_domain_option_to_parser(parser)
304305
parser.add_argument(
305306
'--password',
306307
metavar='<password>',
@@ -367,8 +368,9 @@ def take_action(self, parsed_args):
367368
if parsed_args.description:
368369
kwargs['description'] = parsed_args.description
369370
if parsed_args.project:
370-
project_id = utils.find_resource(
371-
identity_client.projects, parsed_args.project).id
371+
project_id = common.find_project(identity_client,
372+
parsed_args.project,
373+
parsed_args.project_domain).id
372374
kwargs['default_project'] = project_id
373375
kwargs['enabled'] = user.enabled
374376
if parsed_args.enable:

openstackclient/tests/identity/v3/test_user.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,68 @@ def test_user_create_project(self):
320320
)
321321
self.assertEqual(datalist, data)
322322

323+
def test_user_create_project_domain(self):
324+
# Return the new project
325+
self.projects_mock.get.return_value = fakes.FakeResource(
326+
None,
327+
copy.deepcopy(identity_fakes.PROJECT_2),
328+
loaded=True,
329+
)
330+
# Set up to return an updated user
331+
USER_2 = copy.deepcopy(identity_fakes.USER)
332+
USER_2['default_project_id'] = identity_fakes.PROJECT_2['id']
333+
self.users_mock.create.return_value = fakes.FakeResource(
334+
None,
335+
USER_2,
336+
loaded=True,
337+
)
338+
339+
arglist = [
340+
'--project', identity_fakes.PROJECT_2['name'],
341+
'--project-domain', identity_fakes.PROJECT_2['domain_id'],
342+
identity_fakes.user_name,
343+
]
344+
verifylist = [
345+
('project', identity_fakes.PROJECT_2['name']),
346+
('project_domain', identity_fakes.PROJECT_2['domain_id']),
347+
('enable', False),
348+
('disable', False),
349+
('name', identity_fakes.user_name),
350+
]
351+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
352+
353+
# DisplayCommandBase.take_action() returns two tuples
354+
columns, data = self.cmd.take_action(parsed_args)
355+
356+
# Set expected values
357+
kwargs = {
358+
'name': identity_fakes.user_name,
359+
'default_project': identity_fakes.PROJECT_2['id'],
360+
'description': None,
361+
'domain': None,
362+
'email': None,
363+
'enabled': True,
364+
'password': None,
365+
}
366+
# UserManager.create(name=, domain=, project=, password=, email=,
367+
# description=, enabled=, default_project=)
368+
self.users_mock.create.assert_called_with(
369+
**kwargs
370+
)
371+
372+
collist = ('default_project_id', 'domain_id', 'email',
373+
'enabled', 'id', 'name')
374+
self.assertEqual(collist, columns)
375+
datalist = (
376+
identity_fakes.PROJECT_2['id'],
377+
identity_fakes.domain_id,
378+
identity_fakes.user_email,
379+
True,
380+
identity_fakes.user_id,
381+
identity_fakes.user_name,
382+
)
383+
self.assertEqual(datalist, data)
384+
323385
def test_user_create_domain(self):
324386
arglist = [
325387
'--domain', identity_fakes.domain_name,

0 commit comments

Comments
 (0)