Skip to content

Commit a01bf55

Browse files
jiangpengchengDean Troyer
authored andcommitted
Fix 'domain' filter not work well in some commands
The 'domain' filter not work well in commands 'project show', 'user show' and 'user set'. Depends-On: I490900d6249f01654d4cba43bddd3e7af7928a84 Closes-Bug: #1704097 Change-Id: Ib4f47cbaba27eb56c4a41d187fee74a995e62dc7
1 parent 894df67 commit a01bf55

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)