Skip to content

Commit 7f658c0

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add domain support for ec2creds in v3 identity"
2 parents 1fff11a + 7665d52 commit 7f658c0

2 files changed

Lines changed: 129 additions & 47 deletions

File tree

‎doc/source/command-objects/ec2-credentials.rst‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ Create EC2 credentials
1515
os ec2 credentials create
1616
[--project <project>]
1717
[--user <user>]
18+
[--user-domain <user-domain>]
19+
[--project-domain <project-domain>]
1820
1921
.. option:: --project <project>
2022

@@ -24,6 +26,21 @@ Create EC2 credentials
2426

2527
Specify an alternate user (default: current authenticated user)
2628

29+
.. option:: --user-domain <user-domain>
30+
31+
Domain the user belongs to (name or ID).
32+
This can be used in case collisions between user names exist.
33+
34+
.. versionadded:: 3
35+
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+
41+
.. versionadded:: 3
42+
43+
2744
The :option:`--project` and :option:`--user` options are typically only
2845
useful for admin users, but may be allowed for other users depending on
2946
the policy of the cloud and the roles granted to the user.
@@ -38,12 +55,20 @@ Delete EC2 credentials
3855
3956
os ec2 credentials delete
4057
[--user <user>]
58+
[--user-domain <user-domain>]
4159
<access-key>
4260
4361
.. option:: --user <user>
4462

4563
Specify a user
4664

65+
.. option:: --user-domain <user-domain>
66+
67+
Domain the user belongs to (name or ID).
68+
This can be used in case collisions between user names exist.
69+
70+
.. versionadded:: 3
71+
4772
.. _ec2_credentials_delete-access-key:
4873
.. describe:: access-key
4974

@@ -63,11 +88,19 @@ List EC2 credentials
6388
6489
os ec2 credentials list
6590
[--user <user>]
91+
[--user-domain <user-domain>]
6692
6793
.. option:: --user <user>
6894

6995
Filter list by <user>
7096

97+
.. option:: --user-domain <user-domain>
98+
99+
Domain the user belongs to (name or ID).
100+
This can be used in case collisions between user names exist.
101+
102+
.. versionadded:: 3
103+
71104
The :option:`--user` option is typically only useful for admin users, but
72105
may be allowed for other users depending on the policy of the cloud and
73106
the roles granted to the user.
@@ -82,12 +115,20 @@ Display EC2 credentials details
82115
83116
os ec2 credentials show
84117
[--user <user>]
118+
[--user-domain <user-domain>]
85119
<access-key>
86120
87121
.. option:: --user <user>
88122

89123
Specify a user
90124

125+
.. option:: --user-domain <user-domain>
126+
127+
Domain the user belongs to (name or ID).
128+
This can be used in case collisions between user names exist.
129+
130+
.. versionadded:: 3
131+
91132
.. _ec2_credentials_show-access-key:
92133
.. describe:: access-key
93134

‎openstackclient/identity/v3/ec2creds.py‎

Lines changed: 88 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,35 @@
2121

2222
from openstackclient.common import utils
2323
from openstackclient.i18n import _ # noqa
24+
from openstackclient.identity import common
25+
26+
27+
def _determine_ec2_user(parsed_args, client_manager):
28+
"""Determine a user several different ways.
29+
30+
Assumes parsed_args has user and user_domain arguments. Attempts to find
31+
the user if domain scoping is provided, otherwise revert to a basic user
32+
call. Lastly use the currently authenticated user.
33+
34+
"""
35+
36+
user_domain = None
37+
if parsed_args.user_domain:
38+
user_domain = common.find_domain(client_manager.identity,
39+
parsed_args.user_domain)
40+
if parsed_args.user:
41+
if user_domain is not None:
42+
user = utils.find_resource(client_manager.identity.users,
43+
parsed_args.user,
44+
domain_id=user_domain.id).id
45+
else:
46+
user = utils.find_resource(
47+
client_manager.identity.users,
48+
parsed_args.user).id
49+
else:
50+
# Get the user from the current auth
51+
user = client_manager.auth_ref.user_id
52+
return user
2453

2554

2655
class CreateEC2Creds(show.ShowOne):
@@ -42,28 +71,45 @@ def get_parser(self, prog_name):
4271
help=_('Specify an alternate user'
4372
' (default: current authenticated user)'),
4473
)
74+
parser.add_argument(
75+
'--user-domain',
76+
metavar='<user-domain>',
77+
help=('Domain the user belongs to (name or ID). '
78+
'This can be used in case collisions between user names '
79+
'exist.')
80+
)
81+
parser.add_argument(
82+
'--project-domain',
83+
metavar='<project-domain>',
84+
help=('Domain the project belongs to (name or ID). '
85+
'This can be used in case collisions between project names '
86+
'exist.')
87+
)
4588
return parser
4689

4790
def take_action(self, parsed_args):
4891
self.log.debug('take_action(%s)', parsed_args)
4992
identity_client = self.app.client_manager.identity
93+
client_manager = self.app.client_manager
94+
user = self.determine_ec2_user(parsed_args, client_manager)
95+
96+
project_domain = None
97+
if parsed_args.project_domain:
98+
project_domain = common.find_domain(identity_client,
99+
parsed_args.project_domain)
50100

51101
if parsed_args.project:
52-
project = utils.find_resource(
53-
identity_client.projects,
54-
parsed_args.project,
55-
).id
102+
if project_domain is not None:
103+
project = utils.find_resource(identity_client.projects,
104+
parsed_args.project,
105+
domain_id=project_domain.id).id
106+
else:
107+
project = utils.find_resource(
108+
identity_client.projects,
109+
parsed_args.project).id
56110
else:
57111
# Get the project from the current auth
58112
project = self.app.client_manager.auth_ref.project_id
59-
if parsed_args.user:
60-
user = utils.find_resource(
61-
identity_client.users,
62-
parsed_args.user,
63-
).id
64-
else:
65-
# Get the user from the current auth
66-
user = self.app.client_manager.auth_ref.user_id
67113

68114
creds = identity_client.ec2.create(user, project)
69115

@@ -95,22 +141,20 @@ def get_parser(self, prog_name):
95141
metavar='<user>',
96142
help=_('Specify a user'),
97143
)
144+
parser.add_argument(
145+
'--user-domain',
146+
metavar='<user-domain>',
147+
help=('Domain the user belongs to (name or ID). '
148+
'This can be used in case collisions between user names '
149+
'exist.')
150+
)
98151
return parser
99152

100153
def take_action(self, parsed_args):
101154
self.log.debug('take_action(%s)', parsed_args)
102-
identity_client = self.app.client_manager.identity
103-
104-
if parsed_args.user:
105-
user = utils.find_resource(
106-
identity_client.users,
107-
parsed_args.user,
108-
).id
109-
else:
110-
# Get the user from the current auth
111-
user = self.app.client_manager.auth_ref.user_id
112-
113-
identity_client.ec2.delete(user, parsed_args.access_key)
155+
client_manager = self.app.client_manager
156+
user = self.determine_ec2_user(parsed_args, client_manager)
157+
client_manager.identity.ec2.delete(user, parsed_args.access_key)
114158

115159

116160
class ListEC2Creds(lister.Lister):
@@ -125,24 +169,23 @@ def get_parser(self, prog_name):
125169
metavar='<user>',
126170
help=_('Specify a user'),
127171
)
172+
parser.add_argument(
173+
'--user-domain',
174+
metavar='<user-domain>',
175+
help=('Domain the user belongs to (name or ID). '
176+
'This can be used in case collisions between user names '
177+
'exist.')
178+
)
128179
return parser
129180

130181
def take_action(self, parsed_args):
131182
self.log.debug('take_action(%s)', parsed_args)
132-
identity_client = self.app.client_manager.identity
133-
134-
if parsed_args.user:
135-
user = utils.find_resource(
136-
identity_client.users,
137-
parsed_args.user,
138-
).id
139-
else:
140-
# Get the user from the current auth
141-
user = self.app.client_manager.auth_ref.user_id
183+
client_manager = self.app.client_manager
184+
user = self.determine_ec2_user(parsed_args, client_manager)
142185

143186
columns = ('access', 'secret', 'tenant_id', 'user_id')
144187
column_headers = ('Access', 'Secret', 'Project ID', 'User ID')
145-
data = identity_client.ec2.list(user)
188+
data = client_manager.identity.ec2.list(user)
146189

147190
return (column_headers,
148191
(utils.get_item_properties(
@@ -168,22 +211,20 @@ def get_parser(self, prog_name):
168211
metavar='<user>',
169212
help=_('Specify a user'),
170213
)
214+
parser.add_argument(
215+
'--user-domain',
216+
metavar='<user-domain>',
217+
help=('Domain the user belongs to (name or ID). '
218+
'This can be used in case collisions between user names '
219+
'exist.')
220+
)
171221
return parser
172222

173223
def take_action(self, parsed_args):
174224
self.log.debug('take_action(%s)', parsed_args)
175-
identity_client = self.app.client_manager.identity
176-
177-
if parsed_args.user:
178-
user = utils.find_resource(
179-
identity_client.users,
180-
parsed_args.user,
181-
).id
182-
else:
183-
# Get the user from the current auth
184-
user = self.app.client_manager.auth_ref.user_id
185-
186-
creds = identity_client.ec2.get(user, parsed_args.access_key)
225+
client_manager = self.app.client_manager
226+
user = self.determine_ec2_user(parsed_args, client_manager)
227+
creds = client_manager.identity.ec2.get(user, parsed_args.access_key)
187228

188229
info = {}
189230
info.update(creds._info)

0 commit comments

Comments
 (0)