Skip to content

Commit 3967321

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Fix 'domain' filter not work well in some commands"
2 parents b9daff2 + a01bf55 commit 3967321

6 files changed

Lines changed: 105 additions & 5 deletions

File tree

openstackclient/identity/common.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def find_service(identity_client, name_type_or_id):
5858
raise exceptions.CommandError(msg % name_type_or_id)
5959

6060

61-
def _get_token_resource(client, resource, parsed_name):
61+
def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
6262
"""Peek into the user's auth token to get resource IDs
6363
6464
Look into a user's token to try and find the ID of a domain, project or
@@ -71,6 +71,8 @@ def _get_token_resource(client, resource, parsed_name):
7171
`project_domain`, `user_domain`, `project`, or `user`.
7272
:param parsed_name: This is input from parsed_args that the user is hoping
7373
to find in the token.
74+
:param parsed_domain: This is domain filter from parsed_args that used to
75+
filter the results.
7476
7577
:returns: The ID of the resource from the token, or the original value from
7678
parsed_args if it does not match.
@@ -85,6 +87,10 @@ def _get_token_resource(client, resource, parsed_name):
8587
if resource == 'domain':
8688
token_dict = token_dict['project']
8789
obj = token_dict[resource]
90+
91+
# user/project under different domain may has a same name
92+
if parsed_domain and parsed_domain not in obj['domain'].values():
93+
return parsed_name
8894
return obj['id'] if obj['name'] == parsed_name else parsed_name
8995
# diaper defense in case parsing the token fails
9096
except Exception: # noqa

openstackclient/identity/v3/project.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,8 @@ def take_action(self, parsed_args):
360360
identity_client = self.app.client_manager.identity
361361

362362
project_str = common._get_token_resource(identity_client, 'project',
363-
parsed_args.project)
363+
parsed_args.project,
364+
parsed_args.domain)
364365

365366
if parsed_args.domain:
366367
domain = common.find_domain(identity_client, parsed_args.domain)

openstackclient/identity/v3/user.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,8 @@ def take_action(self, parsed_args):
358358
"when a user does not have a password."))
359359

360360
user_str = common._get_token_resource(identity_client, 'user',
361-
parsed_args.user)
361+
parsed_args.user,
362+
parsed_args.domain)
362363
if parsed_args.domain:
363364
domain = common.find_domain(identity_client, parsed_args.domain)
364365
user = utils.find_resource(identity_client.users,
@@ -473,7 +474,8 @@ def take_action(self, parsed_args):
473474
identity_client = self.app.client_manager.identity
474475

475476
user_str = common._get_token_resource(identity_client, 'user',
476-
parsed_args.user)
477+
parsed_args.user,
478+
parsed_args.domain)
477479
if parsed_args.domain:
478480
domain = common.find_domain(identity_client, parsed_args.domain)
479481
user = utils.find_resource(identity_client.users,

openstackclient/tests/unit/identity/v3/test_project.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from osc_lib import exceptions
2020
from osc_lib import utils
2121

22+
from openstackclient.identity import common
2223
from openstackclient.identity.v3 import project
2324
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
2425

@@ -1060,3 +1061,48 @@ def test_project_show_parents_and_children(self):
10601061
['children-id'],
10611062
)
10621063
self.assertEqual(data, datalist)
1064+
1065+
def test_project_show_with_domain(self):
1066+
project = identity_fakes.FakeProject.create_one_project(
1067+
{"name": self.project.name})
1068+
1069+
self.app.client_manager.identity.tokens.get_token_data.return_value = \
1070+
{'token':
1071+
{'project':
1072+
{'domain': {"id": self.project.domain_id},
1073+
'name': self.project.name,
1074+
'id': self.project.id
1075+
}
1076+
}
1077+
}
1078+
1079+
identity_client = self.app.client_manager.identity
1080+
arglist = [
1081+
"--domain", self.domain.id,
1082+
project.name,
1083+
]
1084+
verifylist = [
1085+
('domain', self.domain.id),
1086+
('project', project.name),
1087+
]
1088+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1089+
1090+
project_str = common._get_token_resource(identity_client, 'project',
1091+
parsed_args.project,
1092+
parsed_args.domain)
1093+
self.assertEqual(self.project.id, project_str)
1094+
1095+
arglist = [
1096+
"--domain", project.domain_id,
1097+
project.name,
1098+
]
1099+
verifylist = [
1100+
('domain', project.domain_id),
1101+
('project', project.name),
1102+
]
1103+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1104+
1105+
project_str = common._get_token_resource(identity_client, 'project',
1106+
parsed_args.project,
1107+
parsed_args.domain)
1108+
self.assertEqual(project.name, project_str)

openstackclient/tests/unit/identity/v3/test_user.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from osc_lib import exceptions
2020
from osc_lib import utils
2121

22+
from openstackclient.identity import common
2223
from openstackclient.identity.v3 import user
2324
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
2425

@@ -1091,7 +1092,7 @@ def setUp(self):
10911092
self.app.client_manager.identity.tokens.get_token_data.return_value = \
10921093
{'token':
10931094
{'user':
1094-
{'domain': {},
1095+
{'domain': {'id': self.user.domain_id},
10951096
'id': self.user.id,
10961097
'name': self.user.name,
10971098
}
@@ -1126,3 +1127,38 @@ def test_user_show(self):
11261127
self.user.name,
11271128
)
11281129
self.assertEqual(datalist, data)
1130+
1131+
def test_user_show_with_domain(self):
1132+
user = identity_fakes.FakeUser.create_one_user(
1133+
{"name": self.user.name})
1134+
identity_client = self.app.client_manager.identity
1135+
1136+
arglist = [
1137+
"--domain", self.user.domain_id,
1138+
user.name,
1139+
]
1140+
verifylist = [
1141+
('domain', self.user.domain_id),
1142+
('user', user.name),
1143+
]
1144+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1145+
1146+
user_str = common._get_token_resource(identity_client, 'user',
1147+
parsed_args.user,
1148+
parsed_args.domain)
1149+
self.assertEqual(self.user.id, user_str)
1150+
1151+
arglist = [
1152+
"--domain", user.domain_id,
1153+
user.name,
1154+
]
1155+
verifylist = [
1156+
('domain', user.domain_id),
1157+
('user', user.name),
1158+
]
1159+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1160+
1161+
user_str = common._get_token_resource(identity_client, 'user',
1162+
parsed_args.user,
1163+
parsed_args.domain)
1164+
self.assertEqual(user.name, user_str)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
fixes:
3+
- |
4+
Fix an issue when run commands `project show`, `user show` and `user set`
5+
with `--domain` specific, the domain filter won't work if the login user's
6+
project name or user name is same with the resource name user hoping to
7+
get.
8+
9+
[Bug `1704097 <https://bugs.launchpad.net/python-openstackclient/+bug/1704097>`_]

0 commit comments

Comments
 (0)