summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2017-03-16 13:01:56 +0000
committerGerrit Code Review <review@openstack.org>2017-03-16 13:01:56 +0000
commit9184e1928843940509ba8f1e4069675454916d9a (patch)
tree6803c08efdb86071ca340c1fa1e7a5f839080554 /openstackclient
parent66246561d8a48aca50773db6d3671f713b6efbe1 (diff)
parent6c1b03bf7354fe39d61bb9cf93d2491bbb5ebb16 (diff)
downloadpython-openstackclient-9184e1928843940509ba8f1e4069675454916d9a.tar.gz
Merge "Add sort support to project list"
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/identity/v2_0/project.py9
-rw-r--r--openstackclient/identity/v3/project.py9
-rw-r--r--openstackclient/tests/unit/identity/v2_0/test_project.py36
-rw-r--r--openstackclient/tests/unit/identity/v3/fakes.py17
-rw-r--r--openstackclient/tests/unit/identity/v3/test_project.py37
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):