From 988824784b4dfbc8a941d0374dbaa253104966fd Mon Sep 17 00:00:00 2001 From: Jason Dunsmore Date: Tue, 27 Sep 2016 15:16:59 -0500 Subject: [PATCH] Use event_time as default event sort key in OSC Closes-Bug: #1599568 Change-Id: Id1e6e7669b03f5dd4a66a1e786a08eb9ade79307 --- heatclient/osc/v1/event.py | 16 ++++++++-- heatclient/tests/unit/osc/v1/test_event.py | 36 +++++++++++++++++++++- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/heatclient/osc/v1/event.py b/heatclient/osc/v1/event.py index 4c6e4e03..44bcc374 100644 --- a/heatclient/osc/v1/event.py +++ b/heatclient/osc/v1/event.py @@ -133,11 +133,15 @@ class ListEvent(command.Lister): ) parser.add_argument( '--sort', - metavar='[:]', + metavar='[][:]', action='append', help=_('Sort output by selected keys and directions (asc or desc) ' '(default: asc). Specify multiple times to sort on ' - 'multiple keys') + 'multiple keys. Sort key can be: ' + '"event_time" (default), "resource_name", "links", ' + '"logical_resource_id", "resource_status", ' + '"resource_status_reason", "physical_resource_id", or ' + '"id".') ) parser.add_argument( '--follow', @@ -202,7 +206,13 @@ class ListEvent(command.Lister): limit=parsed_args.limit) if parsed_args.sort: - events = utils.sort_items(events, ','.join(parsed_args.sort)) + sorts = [] + for sort in parsed_args.sort: + if sort.startswith(":"): + sorts.append(":".join(["event_time", sort.lstrip(":")])) + else: + sorts.append(sort) + events = utils.sort_items(events, ','.join(sorts)) if parsed_args.formatter == 'log': return [], events diff --git a/heatclient/tests/unit/osc/v1/test_event.py b/heatclient/tests/unit/osc/v1/test_event.py index 6c7b4ed9..3c64b920 100644 --- a/heatclient/tests/unit/osc/v1/test_event.py +++ b/heatclient/tests/unit/osc/v1/test_event.py @@ -182,13 +182,47 @@ class TestEventList(TestEvent): ]) self.assertEqual(cols, columns) - def test_event_list_sort(self): + @mock.patch('osc_lib.utils.sort_items') + def test_event_list_sort(self, mock_sort_items): arglist = ['my_stack', '--sort', 'resource_name:desc', '--format', 'table'] parsed_args = self.check_parser(self.cmd, arglist, []) + mock_event = self.MockEvent() + mock_sort_items.return_value = [mock_event] columns, data = self.cmd.take_action(parsed_args) + mock_sort_items.assert_called_with(mock.ANY, + "resource_name:desc") + self.event_client.list.assert_called_with(**self.defaults) + self.assertEqual(self.fields, columns) + + @mock.patch('osc_lib.utils.sort_items') + def test_event_list_sort_multiple(self, mock_sort_items): + arglist = ['my_stack', '--sort', 'resource_name:desc', + '--sort', 'id:asc', '--format', 'table'] + parsed_args = self.check_parser(self.cmd, arglist, []) + + mock_event = self.MockEvent() + mock_sort_items.return_value = [mock_event] + columns, data = self.cmd.take_action(parsed_args) + + mock_sort_items.assert_called_with(mock.ANY, + "resource_name:desc,id:asc") + self.event_client.list.assert_called_with(**self.defaults) + self.assertEqual(self.fields, columns) + + @mock.patch('osc_lib.utils.sort_items') + def test_event_list_sort_default_key(self, mock_sort_items): + arglist = ['my_stack', '--sort', ':desc', + '--format', 'table'] + parsed_args = self.check_parser(self.cmd, arglist, []) + + mock_event = self.MockEvent() + mock_sort_items.return_value = [mock_event] + columns, data = self.cmd.take_action(parsed_args) + + mock_sort_items.assert_called_with(mock.ANY, "event_time:desc") self.event_client.list.assert_called_with(**self.defaults) self.assertEqual(self.fields, columns)