vrovachev | 95a16cc | 2014-02-04 15:29:48 +0400 | [diff] [blame] | 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| 2 | # not use this file except in compliance with the License. You may obtain |
| 3 | # a copy of the License at |
| 4 | # |
| 5 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 6 | # |
| 7 | # Unless required by applicable law or agreed to in writing, software |
| 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 10 | # License for the specific language governing permissions and limitations |
| 11 | # under the License. |
| 12 | |
Masayuki Igawa | bfa0760 | 2015-01-20 18:47:17 +0900 | [diff] [blame] | 13 | from tempest_lib import exceptions as lib_exc |
| 14 | |
vrovachev | 95a16cc | 2014-02-04 15:29:48 +0400 | [diff] [blame] | 15 | from tempest.api.telemetry import base |
Fei Long Wang | d39431f | 2015-05-14 11:30:48 +1200 | [diff] [blame] | 16 | from tempest.common.utils import data_utils |
Matthew Treinish | 5c660ab | 2014-05-18 21:14:36 -0400 | [diff] [blame] | 17 | from tempest import test |
vrovachev | 95a16cc | 2014-02-04 15:29:48 +0400 | [diff] [blame] | 18 | |
| 19 | |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 20 | class TelemetryAlarmingAPITestJSON(base.BaseAlarmingTest): |
vrovachev | 95a16cc | 2014-02-04 15:29:48 +0400 | [diff] [blame] | 21 | |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 22 | @classmethod |
Andrea Frittoli | c76d04d | 2014-09-15 13:14:54 +0100 | [diff] [blame] | 23 | def resource_setup(cls): |
| 24 | super(TelemetryAlarmingAPITestJSON, cls).resource_setup() |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 25 | cls.rule = {'meter_name': 'cpu_util', |
| 26 | 'comparison_operator': 'gt', |
| 27 | 'threshold': 80.0, |
| 28 | 'period': 70} |
| 29 | for i in range(2): |
| 30 | cls.create_alarm(threshold_rule=cls.rule) |
| 31 | |
Chris Hoge | 7579c1a | 2015-02-26 14:12:15 -0800 | [diff] [blame] | 32 | @test.idempotent_id('1c918e06-210b-41eb-bd45-14676dd77cd6') |
vrovachev | 95a16cc | 2014-02-04 15:29:48 +0400 | [diff] [blame] | 33 | def test_alarm_list(self): |
nayna-patel | c3a39ba | 2014-03-12 13:28:05 +0000 | [diff] [blame] | 34 | # List alarms |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 35 | alarm_list = self.alarming_client.list_alarms() |
vrovachev | 95a16cc | 2014-02-04 15:29:48 +0400 | [diff] [blame] | 36 | |
nayna-patel | c3a39ba | 2014-03-12 13:28:05 +0000 | [diff] [blame] | 37 | # Verify created alarm in the list |
| 38 | fetched_ids = [a['alarm_id'] for a in alarm_list] |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 39 | missing_alarms = [a for a in self.alarm_ids if a not in fetched_ids] |
nayna-patel | c3a39ba | 2014-03-12 13:28:05 +0000 | [diff] [blame] | 40 | self.assertEqual(0, len(missing_alarms), |
| 41 | "Failed to find the following created alarm(s)" |
| 42 | " in a fetched list: %s" % |
| 43 | ', '.join(str(a) for a in missing_alarms)) |
| 44 | |
Chris Hoge | 7579c1a | 2015-02-26 14:12:15 -0800 | [diff] [blame] | 45 | @test.idempotent_id('1297b095-39c1-4e74-8a1f-4ae998cedd67') |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 46 | def test_create_update_get_delete_alarm(self): |
| 47 | # Create an alarm |
| 48 | alarm_name = data_utils.rand_name('telemetry_alarm') |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 49 | body = self.alarming_client.create_alarm( |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 50 | name=alarm_name, type='threshold', threshold_rule=self.rule) |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 51 | self.assertEqual(alarm_name, body['name']) |
| 52 | alarm_id = body['alarm_id'] |
| 53 | self.assertDictContainsSubset(self.rule, body['threshold_rule']) |
| 54 | # Update alarm with new rule and new name |
| 55 | new_rule = {'meter_name': 'cpu', |
| 56 | 'comparison_operator': 'eq', |
| 57 | 'threshold': 70.0, |
| 58 | 'period': 60} |
piyush110786 | c3328e4 | 2015-09-14 11:14:58 +0530 | [diff] [blame] | 59 | alarm_name_updated = data_utils.rand_name('telemetry-alarm-update') |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 60 | body = self.alarming_client.update_alarm( |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 61 | alarm_id, |
| 62 | threshold_rule=new_rule, |
piyush110786 | c3328e4 | 2015-09-14 11:14:58 +0530 | [diff] [blame] | 63 | name=alarm_name_updated, |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 64 | type='threshold') |
piyush110786 | c3328e4 | 2015-09-14 11:14:58 +0530 | [diff] [blame] | 65 | self.assertEqual(alarm_name_updated, body['name']) |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 66 | self.assertDictContainsSubset(new_rule, body['threshold_rule']) |
| 67 | # Get and verify details of an alarm after update |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 68 | body = self.alarming_client.show_alarm(alarm_id) |
piyush110786 | c3328e4 | 2015-09-14 11:14:58 +0530 | [diff] [blame] | 69 | self.assertEqual(alarm_name_updated, body['name']) |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 70 | self.assertDictContainsSubset(new_rule, body['threshold_rule']) |
piyush110786 | c3328e4 | 2015-09-14 11:14:58 +0530 | [diff] [blame] | 71 | # Get history for the alarm and verify the same |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 72 | body = self.alarming_client.show_alarm_history(alarm_id) |
piyush110786 | c3328e4 | 2015-09-14 11:14:58 +0530 | [diff] [blame] | 73 | self.assertEqual("rule change", body[0]['type']) |
| 74 | self.assertIn(alarm_name_updated, body[0]['detail']) |
| 75 | self.assertEqual("creation", body[1]['type']) |
| 76 | self.assertIn(alarm_name, body[1]['detail']) |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 77 | # Delete alarm and verify if deleted |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 78 | self.alarming_client.delete_alarm(alarm_id) |
Masayuki Igawa | bfa0760 | 2015-01-20 18:47:17 +0900 | [diff] [blame] | 79 | self.assertRaises(lib_exc.NotFound, |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 80 | self.alarming_client.show_alarm, alarm_id) |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 81 | |
Chris Hoge | 7579c1a | 2015-02-26 14:12:15 -0800 | [diff] [blame] | 82 | @test.idempotent_id('aca49486-70bb-4016-87e0-f6131374f741') |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 83 | def test_set_get_alarm_state(self): |
| 84 | alarm_states = ['ok', 'alarm', 'insufficient data'] |
David Kranz | 20d06f4 | 2015-02-09 14:54:15 -0500 | [diff] [blame] | 85 | alarm = self.create_alarm(threshold_rule=self.rule) |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 86 | # Set alarm state and verify |
| 87 | new_state =\ |
| 88 | [elem for elem in alarm_states if elem != alarm['state']][0] |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 89 | state = self.alarming_client.alarm_set_state(alarm['alarm_id'], |
| 90 | new_state) |
David Kranz | d7e97b4 | 2015-02-16 09:37:31 -0500 | [diff] [blame] | 91 | self.assertEqual(new_state, state.data) |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 92 | # Get alarm state and verify |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 93 | state = self.alarming_client.show_alarm_state(alarm['alarm_id']) |
David Kranz | d7e97b4 | 2015-02-16 09:37:31 -0500 | [diff] [blame] | 94 | self.assertEqual(new_state, state.data) |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 95 | |
Chris Hoge | 7579c1a | 2015-02-26 14:12:15 -0800 | [diff] [blame] | 96 | @test.idempotent_id('08d7e45a-1344-4e5c-ba6f-f6cbb77f55b9') |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 97 | def test_create_delete_alarm_with_combination_rule(self): |
| 98 | rule = {"alarm_ids": self.alarm_ids, |
| 99 | "operator": "or"} |
| 100 | # Verifies alarm create |
| 101 | alarm_name = data_utils.rand_name('combination_alarm') |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 102 | body = self.alarming_client.create_alarm(name=alarm_name, |
| 103 | combination_rule=rule, |
| 104 | type='combination') |
nayna-patel | a4c56c9 | 2014-03-24 12:16:52 +0000 | [diff] [blame] | 105 | self.assertEqual(alarm_name, body['name']) |
| 106 | alarm_id = body['alarm_id'] |
| 107 | self.assertDictContainsSubset(rule, body['combination_rule']) |
| 108 | # Verify alarm delete |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 109 | self.alarming_client.delete_alarm(alarm_id) |
Masayuki Igawa | bfa0760 | 2015-01-20 18:47:17 +0900 | [diff] [blame] | 110 | self.assertRaises(lib_exc.NotFound, |
liu-sheng | 67b730e | 2015-07-16 15:19:33 +0800 | [diff] [blame] | 111 | self.alarming_client.show_alarm, alarm_id) |