Return names in list role assignments
Utilize the new include names functionality added to list role assignments (GET /role_assignments?include_names=True). Which will return the names of the entities instead of their IDs. Change-Id: I6dc03baf61ef9354a8a259a9f17ff47ce1665ce7 Depends-On: I4aa77c08660a0cbd021502155938a46121ca76ef Closes-Bug: #1479569 Implements: blueprint list-assignment-with-names
This commit is contained in:
		| @@ -66,3 +66,7 @@ List role assignments | |||||||
| .. option:: --inherited | .. option:: --inherited | ||||||
|  |  | ||||||
|     Specifies if the role grant is inheritable to the sub projects |     Specifies if the role grant is inheritable to the sub projects | ||||||
|  |  | ||||||
|  | .. option:: --names | ||||||
|  |  | ||||||
|  |     Returns role assignments with names instead of IDs | ||||||
|   | |||||||
| @@ -39,6 +39,11 @@ class ListRoleAssignment(lister.Lister): | |||||||
|             metavar='<role>', |             metavar='<role>', | ||||||
|             help='Role to filter (name or ID)', |             help='Role to filter (name or ID)', | ||||||
|         ) |         ) | ||||||
|  |         parser.add_argument( | ||||||
|  |             '--names', | ||||||
|  |             action="store_true", | ||||||
|  |             help='Display names instead of IDs', | ||||||
|  |         ) | ||||||
|         user_or_group = parser.add_mutually_exclusive_group() |         user_or_group = parser.add_mutually_exclusive_group() | ||||||
|         user_or_group.add_argument( |         user_or_group.add_argument( | ||||||
|             '--user', |             '--user', | ||||||
| @@ -113,6 +118,7 @@ class ListRoleAssignment(lister.Lister): | |||||||
|                 parsed_args.group_domain, |                 parsed_args.group_domain, | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
|  |         include_names = True if parsed_args.names else False | ||||||
|         effective = True if parsed_args.effective else False |         effective = True if parsed_args.effective else False | ||||||
|         self.log.debug('take_action(%s)' % parsed_args) |         self.log.debug('take_action(%s)' % parsed_args) | ||||||
|         columns = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited') |         columns = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited') | ||||||
| @@ -125,16 +131,25 @@ class ListRoleAssignment(lister.Lister): | |||||||
|             project=project, |             project=project, | ||||||
|             role=role, |             role=role, | ||||||
|             effective=effective, |             effective=effective, | ||||||
|             os_inherit_extension_inherited_to=inherited_to) |             os_inherit_extension_inherited_to=inherited_to, | ||||||
|  |             include_names=include_names) | ||||||
|  |  | ||||||
|         data_parsed = [] |         data_parsed = [] | ||||||
|         for assignment in data: |         for assignment in data: | ||||||
|             # Removing the extra "scope" layer in the assignment json |             # Removing the extra "scope" layer in the assignment json | ||||||
|             scope = assignment.scope |             scope = assignment.scope | ||||||
|             if 'project' in scope: |             if 'project' in scope: | ||||||
|  |                 if include_names: | ||||||
|  |                     prj = '@'.join([scope['project']['name'], | ||||||
|  |                                    scope['project']['domain']['name']]) | ||||||
|  |                     setattr(assignment, 'project', prj) | ||||||
|  |                 else: | ||||||
|                     setattr(assignment, 'project', scope['project']['id']) |                     setattr(assignment, 'project', scope['project']['id']) | ||||||
|                 assignment.domain = '' |                 assignment.domain = '' | ||||||
|             elif 'domain' in scope: |             elif 'domain' in scope: | ||||||
|  |                 if include_names: | ||||||
|  |                     setattr(assignment, 'domain', scope['domain']['name']) | ||||||
|  |                 else: | ||||||
|                     setattr(assignment, 'domain', scope['domain']['id']) |                     setattr(assignment, 'domain', scope['domain']['id']) | ||||||
|                 assignment.project = '' |                 assignment.project = '' | ||||||
|  |  | ||||||
| @@ -148,9 +163,19 @@ class ListRoleAssignment(lister.Lister): | |||||||
|             del assignment.scope |             del assignment.scope | ||||||
|  |  | ||||||
|             if hasattr(assignment, 'user'): |             if hasattr(assignment, 'user'): | ||||||
|  |                 if include_names: | ||||||
|  |                     usr = '@'.join([assignment.user['name'], | ||||||
|  |                                     assignment.user['domain']['name']]) | ||||||
|  |                     setattr(assignment, 'user', usr) | ||||||
|  |                 else: | ||||||
|                     setattr(assignment, 'user', assignment.user['id']) |                     setattr(assignment, 'user', assignment.user['id']) | ||||||
|                 assignment.group = '' |                 assignment.group = '' | ||||||
|             elif hasattr(assignment, 'group'): |             elif hasattr(assignment, 'group'): | ||||||
|  |                 if include_names: | ||||||
|  |                     grp = '@'.join([assignment.group['name'], | ||||||
|  |                                     assignment.group['domain']['name']]) | ||||||
|  |                     setattr(assignment, 'group', grp) | ||||||
|  |                 else: | ||||||
|                     setattr(assignment, 'group', assignment.group['id']) |                     setattr(assignment, 'group', assignment.group['id']) | ||||||
|                 assignment.user = '' |                 assignment.user = '' | ||||||
|             else: |             else: | ||||||
| @@ -158,6 +183,9 @@ class ListRoleAssignment(lister.Lister): | |||||||
|                 assignment.group = '' |                 assignment.group = '' | ||||||
|  |  | ||||||
|             if hasattr(assignment, 'role'): |             if hasattr(assignment, 'role'): | ||||||
|  |                 if include_names: | ||||||
|  |                     setattr(assignment, 'role', assignment.role['name']) | ||||||
|  |                 else: | ||||||
|                     setattr(assignment, 'role', assignment.role['id']) |                     setattr(assignment, 'role', assignment.role['id']) | ||||||
|             else: |             else: | ||||||
|                 assignment.role = '' |                 assignment.role = '' | ||||||
|   | |||||||
| @@ -314,6 +314,22 @@ ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID = { | |||||||
|     'role': {'id': role_id}, |     'role': {'id': role_id}, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INCLUDE_NAMES = { | ||||||
|  |     'scope': { | ||||||
|  |         'project': { | ||||||
|  |             'domain': {'id': domain_id, | ||||||
|  |                        'name': domain_name}, | ||||||
|  |             'id': project_id, | ||||||
|  |             'name': project_name}}, | ||||||
|  |     'user': { | ||||||
|  |         'domain': {'id': domain_id, | ||||||
|  |                    'name': domain_name}, | ||||||
|  |         'id': user_id, | ||||||
|  |         'name': user_name}, | ||||||
|  |     'role': {'id': role_id, | ||||||
|  |              'name': role_name}, | ||||||
|  | } | ||||||
|  |  | ||||||
| ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INHERITED = { | ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INHERITED = { | ||||||
|     'scope': {'project': {'id': project_id}, |     'scope': {'project': {'id': project_id}, | ||||||
|               'OS-INHERIT:inherited_to': 'projects'}, |               'OS-INHERIT:inherited_to': 'projects'}, | ||||||
| @@ -333,6 +349,19 @@ ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID = { | |||||||
|     'role': {'id': role_id}, |     'role': {'id': role_id}, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INCLUDE_NAMES = { | ||||||
|  |     'scope': { | ||||||
|  |         'domain': {'id': domain_id, | ||||||
|  |                    'name': domain_name}}, | ||||||
|  |     'user': { | ||||||
|  |         'domain': {'id': domain_id, | ||||||
|  |                    'name': domain_name}, | ||||||
|  |         'id': user_id, | ||||||
|  |         'name': user_name}, | ||||||
|  |     'role': {'id': role_id, | ||||||
|  |              'name': role_name}, | ||||||
|  | } | ||||||
|  |  | ||||||
| ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INHERITED = { | ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INHERITED = { | ||||||
|     'scope': {'domain': {'id': domain_id}, |     'scope': {'domain': {'id': domain_id}, | ||||||
|               'OS-INHERIT:inherited_to': 'projects'}, |               'OS-INHERIT:inherited_to': 'projects'}, | ||||||
|   | |||||||
| @@ -96,7 +96,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             role=None, |             role=None, | ||||||
|             user=None, |             user=None, | ||||||
|             project=None, |             project=None, | ||||||
|             os_inherit_extension_inherited_to=None) |             os_inherit_extension_inherited_to=None, | ||||||
|  |             include_names=False) | ||||||
|  |  | ||||||
|         self.assertEqual(self.columns, columns) |         self.assertEqual(self.columns, columns) | ||||||
|         datalist = (( |         datalist = (( | ||||||
| @@ -143,6 +144,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             ('role', None), |             ('role', None), | ||||||
|             ('effective', False), |             ('effective', False), | ||||||
|             ('inherited', False), |             ('inherited', False), | ||||||
|  |             ('names', False), | ||||||
|         ] |         ] | ||||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) |         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||||
|  |  | ||||||
| @@ -156,7 +158,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             project=None, |             project=None, | ||||||
|             role=None, |             role=None, | ||||||
|             effective=False, |             effective=False, | ||||||
|             os_inherit_extension_inherited_to=None) |             os_inherit_extension_inherited_to=None, | ||||||
|  |             include_names=False) | ||||||
|  |  | ||||||
|         self.assertEqual(self.columns, columns) |         self.assertEqual(self.columns, columns) | ||||||
|         datalist = (( |         datalist = (( | ||||||
| @@ -203,6 +206,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             ('role', None), |             ('role', None), | ||||||
|             ('effective', False), |             ('effective', False), | ||||||
|             ('inherited', False), |             ('inherited', False), | ||||||
|  |             ('names', False), | ||||||
|         ] |         ] | ||||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) |         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||||
|  |  | ||||||
| @@ -216,7 +220,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             project=None, |             project=None, | ||||||
|             role=None, |             role=None, | ||||||
|             user=None, |             user=None, | ||||||
|             os_inherit_extension_inherited_to=None) |             os_inherit_extension_inherited_to=None, | ||||||
|  |             include_names=False) | ||||||
|  |  | ||||||
|         self.assertEqual(self.columns, columns) |         self.assertEqual(self.columns, columns) | ||||||
|         datalist = (( |         datalist = (( | ||||||
| @@ -263,6 +268,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             ('role', None), |             ('role', None), | ||||||
|             ('effective', False), |             ('effective', False), | ||||||
|             ('inherited', False), |             ('inherited', False), | ||||||
|  |             ('names', False), | ||||||
|         ] |         ] | ||||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) |         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||||
|  |  | ||||||
| @@ -276,7 +282,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             project=None, |             project=None, | ||||||
|             role=None, |             role=None, | ||||||
|             user=None, |             user=None, | ||||||
|             os_inherit_extension_inherited_to=None) |             os_inherit_extension_inherited_to=None, | ||||||
|  |             include_names=False) | ||||||
|  |  | ||||||
|         self.assertEqual(self.columns, columns) |         self.assertEqual(self.columns, columns) | ||||||
|         datalist = (( |         datalist = (( | ||||||
| @@ -323,6 +330,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             ('role', None), |             ('role', None), | ||||||
|             ('effective', False), |             ('effective', False), | ||||||
|             ('inherited', False), |             ('inherited', False), | ||||||
|  |             ('names', False), | ||||||
|         ] |         ] | ||||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) |         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||||
|  |  | ||||||
| @@ -336,7 +344,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             project=self.projects_mock.get(), |             project=self.projects_mock.get(), | ||||||
|             role=None, |             role=None, | ||||||
|             user=None, |             user=None, | ||||||
|             os_inherit_extension_inherited_to=None) |             os_inherit_extension_inherited_to=None, | ||||||
|  |             include_names=False) | ||||||
|  |  | ||||||
|         self.assertEqual(self.columns, columns) |         self.assertEqual(self.columns, columns) | ||||||
|         datalist = (( |         datalist = (( | ||||||
| @@ -381,6 +390,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             ('role', None), |             ('role', None), | ||||||
|             ('effective', True), |             ('effective', True), | ||||||
|             ('inherited', False), |             ('inherited', False), | ||||||
|  |             ('names', False), | ||||||
|         ] |         ] | ||||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) |         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||||
|  |  | ||||||
| @@ -394,7 +404,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             project=None, |             project=None, | ||||||
|             role=None, |             role=None, | ||||||
|             user=None, |             user=None, | ||||||
|             os_inherit_extension_inherited_to=None) |             os_inherit_extension_inherited_to=None, | ||||||
|  |             include_names=False) | ||||||
|  |  | ||||||
|         self.assertEqual(self.columns, columns) |         self.assertEqual(self.columns, columns) | ||||||
|         datalist = (( |         datalist = (( | ||||||
| @@ -441,6 +452,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             ('role', None), |             ('role', None), | ||||||
|             ('effective', False), |             ('effective', False), | ||||||
|             ('inherited', True), |             ('inherited', True), | ||||||
|  |             ('names', False), | ||||||
|         ] |         ] | ||||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) |         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||||
|  |  | ||||||
| @@ -454,7 +466,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             project=None, |             project=None, | ||||||
|             role=None, |             role=None, | ||||||
|             user=None, |             user=None, | ||||||
|             os_inherit_extension_inherited_to='projects') |             os_inherit_extension_inherited_to='projects', | ||||||
|  |             include_names=False) | ||||||
|  |  | ||||||
|         self.assertEqual(self.columns, columns) |         self.assertEqual(self.columns, columns) | ||||||
|         datalist = (( |         datalist = (( | ||||||
| @@ -472,3 +485,72 @@ class TestRoleAssignmentList(TestRoleAssignment): | |||||||
|             True |             True | ||||||
|             ),) |             ),) | ||||||
|         self.assertEqual(datalist, tuple(data)) |         self.assertEqual(datalist, tuple(data)) | ||||||
|  |  | ||||||
|  |     def test_role_assignment_list_include_names(self): | ||||||
|  |  | ||||||
|  |         self.role_assignments_mock.list.return_value = [ | ||||||
|  |             fakes.FakeResource( | ||||||
|  |                 None, | ||||||
|  |                 copy.deepcopy( | ||||||
|  |                     identity_fakes | ||||||
|  |                     .ASSIGNMENT_WITH_PROJECT_ID_AND_USER_ID_INCLUDE_NAMES), | ||||||
|  |                 loaded=True, | ||||||
|  |             ), | ||||||
|  |             fakes.FakeResource( | ||||||
|  |                 None, | ||||||
|  |                 copy.deepcopy( | ||||||
|  |                     identity_fakes | ||||||
|  |                     .ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_ID_INCLUDE_NAMES), | ||||||
|  |                 loaded=True, | ||||||
|  |             ), | ||||||
|  |         ] | ||||||
|  |  | ||||||
|  |         arglist = ['--names'] | ||||||
|  |         verifylist = [ | ||||||
|  |             ('user', None), | ||||||
|  |             ('group', None), | ||||||
|  |             ('domain', None), | ||||||
|  |             ('project', None), | ||||||
|  |             ('role', None), | ||||||
|  |             ('effective', False), | ||||||
|  |             ('inherited', False), | ||||||
|  |             ('names', True), | ||||||
|  |         ] | ||||||
|  |         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||||
|  |  | ||||||
|  |         # DisplayCommandBase.take_action() returns two tuples | ||||||
|  |  | ||||||
|  |         # This test will not run correctly until the patch in the python | ||||||
|  |         # client is merged. Once that is done 'data' should return the | ||||||
|  |         # correct information | ||||||
|  |         columns, data = self.cmd.take_action(parsed_args) | ||||||
|  |  | ||||||
|  |         self.role_assignments_mock.list.assert_called_with( | ||||||
|  |             domain=None, | ||||||
|  |             group=None, | ||||||
|  |             effective=False, | ||||||
|  |             project=None, | ||||||
|  |             role=None, | ||||||
|  |             user=None, | ||||||
|  |             os_inherit_extension_inherited_to=None, | ||||||
|  |             include_names=True) | ||||||
|  |  | ||||||
|  |         collist = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited') | ||||||
|  |         self.assertEqual(columns, collist) | ||||||
|  |  | ||||||
|  |         datalist1 = (( | ||||||
|  |             identity_fakes.role_name, | ||||||
|  |             '@'.join([identity_fakes.user_name, identity_fakes.domain_name]), | ||||||
|  |             '', | ||||||
|  |             '@'.join([identity_fakes.project_name, | ||||||
|  |                      identity_fakes.domain_name]), | ||||||
|  |             '', | ||||||
|  |             False | ||||||
|  |         ), (identity_fakes.role_name, | ||||||
|  |             '@'.join([identity_fakes.user_name, identity_fakes.domain_name]), | ||||||
|  |             '', | ||||||
|  |             '', | ||||||
|  |             identity_fakes.domain_name, | ||||||
|  |             False | ||||||
|  |             ),) | ||||||
|  |         self.assertEqual(tuple(data), datalist1) | ||||||
|   | |||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | --- | ||||||
|  | features: | ||||||
|  |   - > | ||||||
|  |     [`bug 1479569 <https://bugs.launchpad.net/python-keystoneclient/+bug/1479569>`_] | ||||||
|  |     Add an optional ``--names`` argument to the `role assignment list`` command. This | ||||||
|  |     will output names instead of IDs for users, groups, roles, projects, and domains. | ||||||
		Reference in New Issue
	
	Block a user
	 Tom Cocozzello
					Tom Cocozzello