From 352ec64c95e0427cc1453e7427278c9505a6610e Mon Sep 17 00:00:00 2001 From: liusheng Date: Fri, 17 Jun 2016 15:45:01 +0800 Subject: [PATCH] Correct the order when sorting by "severity" Related to change[1], since we have supported pagination query now, we need to also fix the ordering of 'severity' in listing alarms. [1] I69531e3b53a11026a35a40a415f48b7bb838010b Change-Id: Icb5239f1c4a5ef1e7e5733bc440eed12bb2f5b9f Related-Bug: #1452254 --- aodh/storage/impl_sqlalchemy.py | 13 +++++++++++++ .../tests/functional/api/v2/test_alarm_scenarios.py | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/aodh/storage/impl_sqlalchemy.py b/aodh/storage/impl_sqlalchemy.py index 4d199f9cc..00cd7141a 100644 --- a/aodh/storage/impl_sqlalchemy.py +++ b/aodh/storage/impl_sqlalchemy.py @@ -25,6 +25,9 @@ from oslo_db.sqlalchemy import utils as oslo_sql_utils from oslo_log import log from oslo_utils import timeutils import six +from sqlalchemy import asc +from sqlalchemy import desc +from sqlalchemy import func from sqlalchemy.orm import exc from aodh.i18n import _LI @@ -161,6 +164,16 @@ class Connection(base.Connection): raise storage.InvalidMarker( 'Marker %s not found.' % pagination['marker']) limit = pagination.get('limit') + # we sort by "severity" by its semantic than its alphabetical + # order when "severity" specified in sorts. + for sort_key, sort_dir in pagination['sort'][::-1]: + if sort_key == 'severity': + sort_dir_func = {'asc': asc, 'desc': desc}[sort_dir] + query = query.order_by(sort_dir_func( + func.field(getattr(model, sort_key), 'low', + 'moderate', 'critical'))) + pagination['sort'].remove((sort_key, sort_dir)) + sort_keys = [s[0] for s in pagination['sort']] sort_dirs = [s[1] for s in pagination['sort']] return oslo_sql_utils.paginate_query( diff --git a/aodh/tests/functional/api/v2/test_alarm_scenarios.py b/aodh/tests/functional/api/v2/test_alarm_scenarios.py index 7eb1b5e77..f74a4c437 100644 --- a/aodh/tests/functional/api/v2/test_alarm_scenarios.py +++ b/aodh/tests/functional/api/v2/test_alarm_scenarios.py @@ -3313,6 +3313,18 @@ class TestPaginationQuery(TestAlarmsBase): names = [a['name'] for a in data] self.assertEqual(['name1', 'name2', 'name3', 'name4'], names) + def test_sort_by_severity_with_its_value(self): + data = self.get_json('/alarms?sort=severity:asc', + headers=self.auth_headers) + severities = [a['severity'] for a in data] + self.assertEqual(['low', 'moderate', 'critical', 'critical'], + severities) + data = self.get_json('/alarms?sort=severity:desc', + headers=self.auth_headers) + severities = [a['severity'] for a in data] + self.assertEqual(['critical', 'critical', 'moderate', 'low'], + severities) + def test_pagination_query_limit(self): data = self.get_json('/alarms?limit=2', headers=self.auth_headers) self.assertEqual(2, len(data))