diff options
| author | Jenkins <jenkins@review.openstack.org> | 2017-03-16 13:01:56 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2017-03-16 13:01:56 +0000 |
| commit | 9184e1928843940509ba8f1e4069675454916d9a (patch) | |
| tree | 6803c08efdb86071ca340c1fa1e7a5f839080554 /openstackclient | |
| parent | 66246561d8a48aca50773db6d3671f713b6efbe1 (diff) | |
| parent | 6c1b03bf7354fe39d61bb9cf93d2491bbb5ebb16 (diff) | |
| download | python-openstackclient-9184e1928843940509ba8f1e4069675454916d9a.tar.gz | |
Merge "Add sort support to project list"
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/identity/v2_0/project.py | 9 | ||||
| -rw-r--r-- | openstackclient/identity/v3/project.py | 9 | ||||
| -rw-r--r-- | openstackclient/tests/unit/identity/v2_0/test_project.py | 36 | ||||
| -rw-r--r-- | openstackclient/tests/unit/identity/v3/fakes.py | 17 | ||||
| -rw-r--r-- | openstackclient/tests/unit/identity/v3/test_project.py | 37 |
5 files changed, 108 insertions, 0 deletions
diff --git a/openstackclient/identity/v2_0/project.py b/openstackclient/identity/v2_0/project.py index ca565d4d..04d422ec 100644 --- a/openstackclient/identity/v2_0/project.py +++ b/openstackclient/identity/v2_0/project.py @@ -150,6 +150,13 @@ class ListProject(command.Lister): default=False, help=_('List additional fields in output'), ) + parser.add_argument( + '--sort', + metavar='<key>[:<direction>]', + help=_('Sort output by selected keys and directions (asc or desc) ' + '(default: asc), repeat this option to specify multiple ' + 'keys and directions.'), + ) return parser def take_action(self, parsed_args): @@ -158,6 +165,8 @@ class ListProject(command.Lister): else: columns = ('ID', 'Name') data = self.app.client_manager.identity.tenants.list() + if parsed_args.sort: + data = utils.sort_items(data, parsed_args.sort) return (columns, (utils.get_item_properties( s, columns, diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py index 43eca2b5..473dda1a 100644 --- a/openstackclient/identity/v3/project.py +++ b/openstackclient/identity/v3/project.py @@ -194,6 +194,13 @@ class ListProject(command.Lister): default=False, help=_('List additional fields in output'), ) + parser.add_argument( + '--sort', + metavar='<key>[:<direction>]', + help=_('Sort output by selected keys and directions (asc or desc) ' + '(default: asc), repeat this option to specify multiple ' + 'keys and directions.'), + ) return parser def take_action(self, parsed_args): @@ -222,6 +229,8 @@ class ListProject(command.Lister): kwargs['user'] = user_id data = identity_client.projects.list(**kwargs) + if parsed_args.sort: + data = utils.sort_items(data, parsed_args.sort) return (columns, (utils.get_item_properties( s, columns, diff --git a/openstackclient/tests/unit/identity/v2_0/test_project.py b/openstackclient/tests/unit/identity/v2_0/test_project.py index 4e1077db..c726f2a6 100644 --- a/openstackclient/tests/unit/identity/v2_0/test_project.py +++ b/openstackclient/tests/unit/identity/v2_0/test_project.py @@ -26,6 +26,7 @@ from openstackclient.tests.unit.identity.v2_0 import fakes as identity_fakes class TestProject(identity_fakes.TestIdentityv2): fake_project = identity_fakes.FakeProject.create_one_project() + fake_projects = identity_fakes.FakeProject.create_projects() columns = ( 'description', @@ -39,6 +40,12 @@ class TestProject(identity_fakes.TestIdentityv2): fake_project.id, fake_project.name, ) + datalists = ( + (fake_projects[0].description, True, + fake_projects[0].id, fake_projects[0].name,), + (fake_projects[1].description, True, + fake_projects[1].id, fake_projects[1].name,), + ) def setUp(self): super(TestProject, self).setUp() @@ -386,6 +393,35 @@ class TestProjectList(TestProject): ), ) self.assertEqual(datalist, tuple(data)) + def test_project_list_sort(self): + self.projects_mock.list.return_value = self.fake_projects + + arglist = ['--sort', 'name:asc', ] + verifylist = [] + 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) + self.projects_mock.list.assert_called_with() + + collist = ('ID', 'Name') + self.assertEqual(collist, columns) + + if self.fake_projects[0].name > self.fake_projects[1].name: + datalists = ( + (self.fake_projects[1].id, self.fake_projects[1].name), + (self.fake_projects[0].id, self.fake_projects[0].name), + ) + else: + datalists = ( + (self.fake_projects[0].id, self.fake_projects[0].name), + (self.fake_projects[1].id, self.fake_projects[1].name), + ) + + self.assertEqual(datalists, tuple(data)) + class TestProjectSet(TestProject): diff --git a/openstackclient/tests/unit/identity/v3/fakes.py b/openstackclient/tests/unit/identity/v3/fakes.py index 75065e65..01b5dede 100644 --- a/openstackclient/tests/unit/identity/v3/fakes.py +++ b/openstackclient/tests/unit/identity/v3/fakes.py @@ -622,6 +622,23 @@ class FakeProject(object): loaded=True) return project + @staticmethod + def create_projects(attrs=None, count=2): + """Create multiple fake projects. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of projects to fake + :return: + A list of FakeResource objects faking the projects + """ + + projects = [] + for i in range(0, count): + projects.append(FakeProject.create_one_project(attrs)) + return projects + class FakeDomain(object): """Fake one or more domain.""" diff --git a/openstackclient/tests/unit/identity/v3/test_project.py b/openstackclient/tests/unit/identity/v3/test_project.py index b99eaf85..a27bf2a5 100644 --- a/openstackclient/tests/unit/identity/v3/test_project.py +++ b/openstackclient/tests/unit/identity/v3/test_project.py @@ -479,6 +479,7 @@ class TestProjectList(TestProject): domain = identity_fakes.FakeDomain.create_one_domain() project = identity_fakes.FakeProject.create_one_project( attrs={'domain_id': domain.id}) + projects = identity_fakes.FakeProject.create_projects() columns = ( 'ID', @@ -490,6 +491,12 @@ class TestProjectList(TestProject): project.name, ), ) + datalists = ( + (projects[0].description, True, + projects[0].id, projects[0].name,), + (projects[1].description, True, + projects[1].id, projects[1].name,), + ) def setUp(self): super(TestProjectList, self).setUp() @@ -580,6 +587,36 @@ class TestProjectList(TestProject): self.assertEqual(self.columns, columns) self.assertEqual(self.datalist, tuple(data)) + def test_project_list_sort(self): + self.projects_mock.list.return_value = self.projects + + arglist = ['--sort', 'name:asc', ] + verifylist = [] + + 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) + self.projects_mock.list.assert_called_with() + + collist = ('ID', 'Name') + self.assertEqual(collist, columns) + + if self.projects[0].name > self.projects[1].name: + datalists = ( + (self.projects[1].id, self.projects[1].name), + (self.projects[0].id, self.projects[0].name), + ) + else: + datalists = ( + (self.projects[0].id, self.projects[0].name), + (self.projects[1].id, self.projects[1].name), + ) + + self.assertEqual(datalists, tuple(data)) + class TestProjectSet(TestProject): |
