Fixing ordering of 'severity' in alarms

The ordering of severity in alarms is done
alphabetically. It would be more appropriate
if the ordering is done based on value of
severity. This patch fixes the ordering.

Closes-bug: #1452254
Co-Authored-By: liusheng <liusheng@huawei.com>

Change-Id: I69531e3b53a11026a35a40a415f48b7bb838010b
This commit is contained in:
sanjana 2016-06-10 15:44:30 +05:30 committed by liusheng
parent 9010fcae9a
commit 472c2867a7
2 changed files with 31 additions and 2 deletions

View File

@ -16,6 +16,7 @@ import operator
from sqlalchemy import and_
from sqlalchemy import asc
from sqlalchemy import desc
from sqlalchemy import func
from sqlalchemy import not_
from sqlalchemy import or_
@ -88,8 +89,13 @@ class QueryTransformer(object):
for field in orderby:
attr, order = list(field.items())[0]
ordering_function = self.ordering_functions[order]
self.query = self.query.order_by(ordering_function(
getattr(self.table, attr)))
if attr == 'severity':
self.query = self.query.order_by(ordering_function(
func.field(getattr(self.table, attr), 'low',
'moderate', 'critical')))
else:
self.query = self.query.order_by(ordering_function(
getattr(self.table, attr)))
else:
self.query = self.query.order_by(desc(self.table.timestamp))

View File

@ -21,6 +21,7 @@ from oslo_utils import timeutils
from aodh.storage import models
from aodh.tests.functional.api import v2 as tests_api
from aodh.tests.functional import db as tests_db
admin_header = {"X-Roles": "admin",
@ -194,6 +195,28 @@ class TestQueryAlarmsController(tests_api.FunctionalTest):
for alarm in data.json:
self.assertEqual("alarm", alarm["state"])
@tests_db.run_with('mysql', 'pgsql', 'sqlite')
def test_query_with_orderby_severity(self):
orderby = '[{"severity": "ASC"}]'
data = self.post_json(self.alarm_url,
headers=admin_header,
params={"orderby": orderby})
alarms = list(data.json)
severities = [a['severity'] for a in alarms]
severity_choices = ['low', 'moderate', 'critical']
sorted_severities = sorted(severities, key=severity_choices.index)
self.assertEqual(sorted_severities, severities)
orderby = '[{"severity": "DESC"}]'
data = self.post_json(self.alarm_url,
headers=admin_header,
params={"orderby": orderby})
alarms = list(data.json)
severities = [a['severity'] for a in alarms]
sorted_severities = sorted(severities, key=severity_choices.index,
reverse=True)
self.assertEqual(sorted_severities, severities)
def test_limit_should_be_positive(self):
data = self.post_json(self.alarm_url,
headers=admin_header,