diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py index aa6f629495..2c00df0b42 100644 --- a/openstackclient/identity/v3/project.py +++ b/openstackclient/identity/v3/project.py @@ -239,6 +239,20 @@ class ListProject(command.Lister): 'keys and directions.' ), ) + parser.add_argument( + '--enabled', + action='store_true', + dest='is_enabled', + default=None, + help=_('List only enabled projects'), + ) + parser.add_argument( + '--disabled', + action='store_false', + dest='is_enabled', + default=None, + help=_('List only disabled projects'), + ) tag.add_tag_filtering_option_to_parser(parser, _('projects')) return parser @@ -277,6 +291,9 @@ class ListProject(command.Lister): kwargs['user'] = user_id + if parsed_args.is_enabled is not None: + kwargs['is_enabled'] = parsed_args.is_enabled + tag.get_tag_filtering_args(parsed_args, kwargs) if parsed_args.my_projects: diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py index 545b1cda77..9b119c80b1 100644 --- a/openstackclient/identity/v3/user.py +++ b/openstackclient/identity/v3/user.py @@ -411,6 +411,24 @@ class ListUser(command.Lister): default=False, help=_('List additional fields in output'), ) + parser.add_argument( + '--enabled', + action='store_true', + dest='is_enabled', + default=None, + help=_( + 'List only enabled users, does nothing with --project and --group' + ), + ) + parser.add_argument( + '--disabled', + action='store_false', + dest='is_enabled', + default=None, + help=_( + 'List only disabled users, does nothing with --project and --group' + ), + ) return parser def take_action(self, parsed_args): @@ -430,6 +448,9 @@ class ListUser(command.Lister): ignore_missing=False, ).id + if parsed_args.is_enabled is not None: + enabled = parsed_args.is_enabled + if parsed_args.project: if domain is not None: project = identity_client.find_project( @@ -468,9 +489,15 @@ class ListUser(command.Lister): group=group, ) else: - data = identity_client.users( - domain_id=domain, - ) + if parsed_args.is_enabled is not None: + data = identity_client.users( + domain_id=domain, + is_enabled=enabled, + ) + else: + data = identity_client.users( + domain_id=domain, + ) # Column handling if parsed_args.long: diff --git a/openstackclient/tests/unit/identity/v3/test_project.py b/openstackclient/tests/unit/identity/v3/test_project.py index 9085498e31..7788cf02d2 100644 --- a/openstackclient/tests/unit/identity/v3/test_project.py +++ b/openstackclient/tests/unit/identity/v3/test_project.py @@ -941,6 +941,22 @@ class TestProjectList(TestProject): ) self.assertEqual(datalist, tuple(data)) + def test_project_list_with_option_enabled(self): + arglist = ['--enabled'] + verifylist = [('is_enabled', True)] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + kwargs = {'is_enabled': True} + self.projects_mock.list.assert_called_with(**kwargs) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) + class TestProjectSet(TestProject): domain = identity_fakes.FakeDomain.create_one_domain() diff --git a/openstackclient/tests/unit/identity/v3/test_user.py b/openstackclient/tests/unit/identity/v3/test_user.py index 7f4c2497ec..4eea6c6804 100644 --- a/openstackclient/tests/unit/identity/v3/test_user.py +++ b/openstackclient/tests/unit/identity/v3/test_user.py @@ -988,6 +988,24 @@ class TestUserList(identity_fakes.TestIdentityv3): self.assertEqual(self.columns, columns) self.assertEqual(self.datalist, tuple(data)) + def test_user_list_with_option_enabled(self): + arglist = ['--enabled'] + verifylist = [('is_enabled', True)] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + kwargs = {'domain_id': None, 'is_enabled': True} + self.identity_sdk_client.users.assert_called_with(**kwargs) + self.identity_sdk_client.find_user.assert_not_called() + self.identity_sdk_client.group_users.assert_not_called() + + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) + class TestUserSet(identity_fakes.TestIdentityv3): project = sdk_fakes.generate_fake_resource(_project.Project) diff --git a/releasenotes/notes/add-user-project-enabled-filters-9f2090cdcc97b667.yaml b/releasenotes/notes/add-user-project-enabled-filters-9f2090cdcc97b667.yaml new file mode 100644 index 0000000000..a812ca6b73 --- /dev/null +++ b/releasenotes/notes/add-user-project-enabled-filters-9f2090cdcc97b667.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Add filters to search for enabled and disabled users and projects.