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
This commit is contained in:
liusheng 2016-06-17 15:45:01 +08:00
parent 9010fcae9a
commit 352ec64c95
2 changed files with 25 additions and 0 deletions

View File

@ -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(

View File

@ -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))