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 | ||||
|  | ||||
|     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>', | ||||
|             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.add_argument( | ||||
|             '--user', | ||||
| @@ -113,6 +118,7 @@ class ListRoleAssignment(lister.Lister): | ||||
|                 parsed_args.group_domain, | ||||
|             ) | ||||
|  | ||||
|         include_names = True if parsed_args.names else False | ||||
|         effective = True if parsed_args.effective else False | ||||
|         self.log.debug('take_action(%s)' % parsed_args) | ||||
|         columns = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited') | ||||
| @@ -125,17 +131,26 @@ class ListRoleAssignment(lister.Lister): | ||||
|             project=project, | ||||
|             role=role, | ||||
|             effective=effective, | ||||
|             os_inherit_extension_inherited_to=inherited_to) | ||||
|             os_inherit_extension_inherited_to=inherited_to, | ||||
|             include_names=include_names) | ||||
|  | ||||
|         data_parsed = [] | ||||
|         for assignment in data: | ||||
|             # Removing the extra "scope" layer in the assignment json | ||||
|             scope = assignment.scope | ||||
|             if 'project' in scope: | ||||
|                 setattr(assignment, 'project', scope['project']['id']) | ||||
|                 if include_names: | ||||
|                     prj = '@'.join([scope['project']['name'], | ||||
|                                    scope['project']['domain']['name']]) | ||||
|                     setattr(assignment, 'project', prj) | ||||
|                 else: | ||||
|                     setattr(assignment, 'project', scope['project']['id']) | ||||
|                 assignment.domain = '' | ||||
|             elif 'domain' in scope: | ||||
|                 setattr(assignment, 'domain', scope['domain']['id']) | ||||
|                 if include_names: | ||||
|                     setattr(assignment, 'domain', scope['domain']['name']) | ||||
|                 else: | ||||
|                     setattr(assignment, 'domain', scope['domain']['id']) | ||||
|                 assignment.project = '' | ||||
|  | ||||
|             else: | ||||
| @@ -148,17 +163,30 @@ class ListRoleAssignment(lister.Lister): | ||||
|             del assignment.scope | ||||
|  | ||||
|             if hasattr(assignment, 'user'): | ||||
|                 setattr(assignment, 'user', assignment.user['id']) | ||||
|                 if include_names: | ||||
|                     usr = '@'.join([assignment.user['name'], | ||||
|                                     assignment.user['domain']['name']]) | ||||
|                     setattr(assignment, 'user', usr) | ||||
|                 else: | ||||
|                     setattr(assignment, 'user', assignment.user['id']) | ||||
|                 assignment.group = '' | ||||
|             elif hasattr(assignment, 'group'): | ||||
|                 setattr(assignment, 'group', assignment.group['id']) | ||||
|                 if include_names: | ||||
|                     grp = '@'.join([assignment.group['name'], | ||||
|                                     assignment.group['domain']['name']]) | ||||
|                     setattr(assignment, 'group', grp) | ||||
|                 else: | ||||
|                     setattr(assignment, 'group', assignment.group['id']) | ||||
|                 assignment.user = '' | ||||
|             else: | ||||
|                 assignment.user = '' | ||||
|                 assignment.group = '' | ||||
|  | ||||
|             if hasattr(assignment, 'role'): | ||||
|                 setattr(assignment, 'role', assignment.role['id']) | ||||
|                 if include_names: | ||||
|                     setattr(assignment, 'role', assignment.role['name']) | ||||
|                 else: | ||||
|                     setattr(assignment, 'role', assignment.role['id']) | ||||
|             else: | ||||
|                 assignment.role = '' | ||||
|  | ||||
|   | ||||
| @@ -314,6 +314,22 @@ ASSIGNMENT_WITH_PROJECT_ID_AND_USER_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 = { | ||||
|     'scope': {'project': {'id': project_id}, | ||||
|               'OS-INHERIT:inherited_to': 'projects'}, | ||||
| @@ -333,6 +349,19 @@ ASSIGNMENT_WITH_DOMAIN_ID_AND_USER_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 = { | ||||
|     'scope': {'domain': {'id': domain_id}, | ||||
|               'OS-INHERIT:inherited_to': 'projects'}, | ||||
|   | ||||
| @@ -96,7 +96,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             role=None, | ||||
|             user=None, | ||||
|             project=None, | ||||
|             os_inherit_extension_inherited_to=None) | ||||
|             os_inherit_extension_inherited_to=None, | ||||
|             include_names=False) | ||||
|  | ||||
|         self.assertEqual(self.columns, columns) | ||||
|         datalist = (( | ||||
| @@ -143,6 +144,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             ('role', None), | ||||
|             ('effective', False), | ||||
|             ('inherited', False), | ||||
|             ('names', False), | ||||
|         ] | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|  | ||||
| @@ -156,7 +158,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             project=None, | ||||
|             role=None, | ||||
|             effective=False, | ||||
|             os_inherit_extension_inherited_to=None) | ||||
|             os_inherit_extension_inherited_to=None, | ||||
|             include_names=False) | ||||
|  | ||||
|         self.assertEqual(self.columns, columns) | ||||
|         datalist = (( | ||||
| @@ -203,6 +206,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             ('role', None), | ||||
|             ('effective', False), | ||||
|             ('inherited', False), | ||||
|             ('names', False), | ||||
|         ] | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|  | ||||
| @@ -216,7 +220,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             project=None, | ||||
|             role=None, | ||||
|             user=None, | ||||
|             os_inherit_extension_inherited_to=None) | ||||
|             os_inherit_extension_inherited_to=None, | ||||
|             include_names=False) | ||||
|  | ||||
|         self.assertEqual(self.columns, columns) | ||||
|         datalist = (( | ||||
| @@ -263,6 +268,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             ('role', None), | ||||
|             ('effective', False), | ||||
|             ('inherited', False), | ||||
|             ('names', False), | ||||
|         ] | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|  | ||||
| @@ -276,7 +282,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             project=None, | ||||
|             role=None, | ||||
|             user=None, | ||||
|             os_inherit_extension_inherited_to=None) | ||||
|             os_inherit_extension_inherited_to=None, | ||||
|             include_names=False) | ||||
|  | ||||
|         self.assertEqual(self.columns, columns) | ||||
|         datalist = (( | ||||
| @@ -323,6 +330,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             ('role', None), | ||||
|             ('effective', False), | ||||
|             ('inherited', False), | ||||
|             ('names', False), | ||||
|         ] | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|  | ||||
| @@ -336,7 +344,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             project=self.projects_mock.get(), | ||||
|             role=None, | ||||
|             user=None, | ||||
|             os_inherit_extension_inherited_to=None) | ||||
|             os_inherit_extension_inherited_to=None, | ||||
|             include_names=False) | ||||
|  | ||||
|         self.assertEqual(self.columns, columns) | ||||
|         datalist = (( | ||||
| @@ -381,6 +390,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             ('role', None), | ||||
|             ('effective', True), | ||||
|             ('inherited', False), | ||||
|             ('names', False), | ||||
|         ] | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|  | ||||
| @@ -394,7 +404,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             project=None, | ||||
|             role=None, | ||||
|             user=None, | ||||
|             os_inherit_extension_inherited_to=None) | ||||
|             os_inherit_extension_inherited_to=None, | ||||
|             include_names=False) | ||||
|  | ||||
|         self.assertEqual(self.columns, columns) | ||||
|         datalist = (( | ||||
| @@ -441,6 +452,7 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             ('role', None), | ||||
|             ('effective', False), | ||||
|             ('inherited', True), | ||||
|             ('names', False), | ||||
|         ] | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|  | ||||
| @@ -454,7 +466,8 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             project=None, | ||||
|             role=None, | ||||
|             user=None, | ||||
|             os_inherit_extension_inherited_to='projects') | ||||
|             os_inherit_extension_inherited_to='projects', | ||||
|             include_names=False) | ||||
|  | ||||
|         self.assertEqual(self.columns, columns) | ||||
|         datalist = (( | ||||
| @@ -472,3 +485,72 @@ class TestRoleAssignmentList(TestRoleAssignment): | ||||
|             True | ||||
|             ),) | ||||
|         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