Alarms listing based on "timestamp"
Fixes are proposed for ordering alarms based on "timestamp" in descending order. Existing tests has been modified at storage and api without breaking their functionality. One test case has been provided with this patch. Co-Authored-By: Ilya Tyaptin <ityaptin@mirantis.com> Change-Id: Ie2bb950b6d32188f451f905e2cf07e4d938df1ac Closes-Bug: #1287119
This commit is contained in:
parent
5b8c72c3ea
commit
b9d8b58320
|
@ -12,6 +12,7 @@
|
|||
# under the License.
|
||||
|
||||
import datetime
|
||||
import operator
|
||||
|
||||
import ceilometer
|
||||
from ceilometer.alarm.storage import base
|
||||
|
@ -133,9 +134,13 @@ class Connection(hbase_base.Connection, base.Connection):
|
|||
with self.conn_pool.connection() as conn:
|
||||
alarm_table = conn.table(self.ALARM_TABLE)
|
||||
gen = alarm_table.scan(filter=q)
|
||||
for ignored, data in gen:
|
||||
stored_alarm = hbase_utils.deserialize_entry(data)[0]
|
||||
yield models.Alarm(**stored_alarm)
|
||||
alarms = [hbase_utils.deserialize_entry(data)[0]
|
||||
for ignored, data in gen]
|
||||
for alarm in sorted(
|
||||
alarms,
|
||||
key=operator.itemgetter('timestamp'),
|
||||
reverse=True):
|
||||
yield models.Alarm(**alarm)
|
||||
|
||||
def get_alarm_changes(self, alarm_id, on_behalf_of,
|
||||
user=None, project=None, type=None,
|
||||
|
|
|
@ -172,6 +172,7 @@ class Connection(base.Connection):
|
|||
if state is not None:
|
||||
query = query.filter(models.Alarm.state == state)
|
||||
|
||||
query = query.order_by(desc(models.Alarm.timestamp))
|
||||
alarms = self._retrieve_alarms(query)
|
||||
|
||||
# TODO(cmart): improve this by using sqlalchemy.func factory
|
||||
|
|
|
@ -111,7 +111,10 @@ class Connection(base.Connection):
|
|||
if meter is not None:
|
||||
q['rule.meter_name'] = meter
|
||||
|
||||
return self._retrieve_alarms(q, [], None)
|
||||
return self._retrieve_alarms(q,
|
||||
[("timestamp",
|
||||
pymongo.DESCENDING)],
|
||||
None)
|
||||
|
||||
def get_alarm_changes(self, alarm_id, on_behalf_of,
|
||||
user=None, project=None, type=None,
|
||||
|
|
|
@ -2086,20 +2086,24 @@ class TestAlarms(v2.FunctionalTest,
|
|||
def test_alarm_sends_notification(self):
|
||||
# Hit the AlarmController (with alarm_id supplied) ...
|
||||
data = self.get_json('/alarms')
|
||||
del_alarm_name = "name1"
|
||||
for d in data:
|
||||
if d['name'] == del_alarm_name:
|
||||
del_alarm_id = d['alarm_id']
|
||||
|
||||
with mock.patch.object(messaging, 'get_notifier') as get_notifier:
|
||||
notifier = get_notifier.return_value
|
||||
|
||||
self.delete('/alarms/%s' % data[0]['alarm_id'],
|
||||
self.delete('/alarms/%s' % del_alarm_id,
|
||||
headers=self.auth_headers, status=204)
|
||||
get_notifier.assert_called_once_with(mock.ANY,
|
||||
publisher_id='ceilometer.api')
|
||||
|
||||
calls = notifier.info.call_args_list
|
||||
self.assertEqual(1, len(calls))
|
||||
args, _ = calls[0]
|
||||
context, event_type, payload = args
|
||||
self.assertEqual('alarm.deletion', event_type)
|
||||
self.assertEqual('name1', payload['detail']['name'])
|
||||
self.assertEqual(del_alarm_name, payload['detail']['name'])
|
||||
self.assertTrue(set(['alarm_id', 'detail', 'event_id', 'on_behalf_of',
|
||||
'project_id', 'timestamp', 'type',
|
||||
'user_id']).issubset(payload.keys()))
|
||||
|
|
|
@ -2311,7 +2311,8 @@ class AlarmTestBase(DBTestBase):
|
|||
type='threshold',
|
||||
name='red-alert',
|
||||
description='my red-alert',
|
||||
timestamp=constants.MIN_DATETIME,
|
||||
timestamp=datetime.datetime(2015, 7,
|
||||
2, 10, 25),
|
||||
user_id='me',
|
||||
project_id='and-da-boys',
|
||||
state="insufficient data",
|
||||
|
@ -2339,7 +2340,8 @@ class AlarmTestBase(DBTestBase):
|
|||
type='threshold',
|
||||
name='orange-alert',
|
||||
description='a orange',
|
||||
timestamp=constants.MIN_DATETIME,
|
||||
timestamp=datetime.datetime(2015, 7,
|
||||
2, 10, 40),
|
||||
user_id='me',
|
||||
project_id='and-da-boys',
|
||||
state="insufficient data",
|
||||
|
@ -2365,7 +2367,8 @@ class AlarmTestBase(DBTestBase):
|
|||
type='threshold',
|
||||
name='yellow-alert',
|
||||
description='yellow',
|
||||
timestamp=constants.MIN_DATETIME,
|
||||
timestamp=datetime.datetime(2015, 7,
|
||||
2, 10, 10),
|
||||
user_id='me',
|
||||
project_id='and-da-boys',
|
||||
state="insufficient data",
|
||||
|
@ -2408,6 +2411,16 @@ class AlarmTest(AlarmTestBase,
|
|||
alarms = list(self.alarm_conn.get_alarms())
|
||||
self.assertEqual(len(alarms), 3)
|
||||
|
||||
def test_list_ordered_by_timestamp(self):
|
||||
self.add_some_alarms()
|
||||
alarms = list(self.alarm_conn.get_alarms())
|
||||
self.assertEqual(len(alarms), 3)
|
||||
alarm_l = [a.timestamp for a in alarms]
|
||||
alarm_l_ordered = [datetime.datetime(2015, 7, 2, 10, 40),
|
||||
datetime.datetime(2015, 7, 2, 10, 25),
|
||||
datetime.datetime(2015, 7, 2, 10, 10)]
|
||||
self.assertEqual(alarm_l_ordered, alarm_l)
|
||||
|
||||
def test_list_enabled(self):
|
||||
self.add_some_alarms()
|
||||
alarms = list(self.alarm_conn.get_alarms(enabled=True))
|
||||
|
@ -2593,8 +2606,14 @@ class ComplexAlarmHistoryQueryTest(AlarmTestBase,
|
|||
|
||||
def prepare_alarm_history(self):
|
||||
alarms = list(self.alarm_conn.get_alarms())
|
||||
name_index = {
|
||||
'red-alert': 0,
|
||||
'orange-alert': 1,
|
||||
'yellow-alert': 2
|
||||
}
|
||||
|
||||
for alarm in alarms:
|
||||
i = alarms.index(alarm)
|
||||
i = name_index[alarm.name]
|
||||
alarm_change = dict(event_id=(
|
||||
"16fd2706-8baf-433b-82eb-8c7fada847c%s" % i),
|
||||
alarm_id=alarm.alarm_id,
|
||||
|
|
Loading…
Reference in New Issue