Feature 10918: Alarm Notification Enhancement
[osm/POL.git] / osm_policy_module / tests / unit / alarming / test_alarming_service.py
1 # -*- coding: utf-8 -*-
2
3 # Copyright 2018 Whitestack, LLC
4 # *************************************************************
5
6 # This file is part of OSM Monitoring module
7 # All Rights Reserved to Whitestack, LLC
8
9 # Licensed under the Apache License, Version 2.0 (the "License"); you may
10 # not use this file except in compliance with the License. You may obtain
11 # a copy of the License at
12
13 # http://www.apache.org/licenses/LICENSE-2.0
14
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18 # License for the specific language governing permissions and limitations
19 # under the License.
20
21 # For those usages not covered by the Apache License, Version 2.0 please
22 # contact: bdiaz@whitestack.com or glavado@whitestack.com
23 ##
24 import asyncio
25 from unittest import TestCase, mock
26
27 from osm_policy_module.alarming.service import AlarmingService
28 from osm_policy_module.common.common_db_client import CommonDbClient
29 from osm_policy_module.common.lcm_client import LcmClient
30 from osm_policy_module.common.mon_client import MonClient
31 from osm_policy_module.core.config import Config
32 from osm_policy_module.core.database import VnfAlarmRepository
33
34
35 @mock.patch.object(LcmClient, "__init__", lambda *args, **kwargs: None)
36 @mock.patch.object(MonClient, "__init__", lambda *args, **kwargs: None)
37 @mock.patch.object(CommonDbClient, "__init__", lambda *args, **kwargs: None)
38 class TestAlarmingService(TestCase):
39 def setUp(self):
40 self.config = Config()
41 self.loop = asyncio.new_event_loop()
42 self.payload = {
43 "notify_details": {
44 "alarm_number": 0
45 }
46 }
47 self.headers = {"content-type": "application/json"}
48
49 @mock.patch.object(VnfAlarmRepository, "get")
50 @mock.patch("requests.post")
51 @mock.patch("osm_policy_module.core.database.db")
52 def test_handle_alarm_suppression(self, database, requests_post, get_alarm):
53 alert_timeout = int(self.config.get('alert', 'timeout'))
54 mock_alarm = self._build_mock_alarm("test_id", last_action="ok")
55 get_alarm.return_value = mock_alarm
56 service = AlarmingService(self.config)
57 if bool(self.config.get('alert', 'enhanced_alarms')):
58 self.loop.run_until_complete(service.handle_alarm("test_id", "alarm", self.payload))
59 requests_post.assert_called_once_with(
60 url='http://alarm-url/', data='{"notify_details": {"alarm_number": 1}}',
61 headers={'content-type': 'application/json'}, verify=False, timeout=alert_timeout
62 )
63 else:
64 self.loop.run_until_complete(service.handle_alarm("test_id", "alarm", {}))
65 requests_post.assert_called_once_with(json="{}", url="http://alarm-url/", timeout=alert_timeout)
66
67 @mock.patch.object(VnfAlarmRepository, "get")
68 @mock.patch("requests.post")
69 @mock.patch("osm_policy_module.core.database.db")
70 def test_handle_ok_suppression(self, database, requests_post, get_alarm):
71 alert_timeout = int(self.config.get('alert', 'timeout'))
72 mock_alarm = self._build_mock_alarm("test_id", last_action="alarm")
73 get_alarm.return_value = mock_alarm
74 service = AlarmingService(self.config)
75 if bool(self.config.get('alert', 'enhanced_alarms')):
76 self.loop.run_until_complete(service.handle_alarm("test_id", "ok", self.payload))
77 requests_post.assert_called_once_with(
78 url='http://ok-url/', data='{"notify_details": {"alarm_number": 0}}',
79 headers={'content-type': 'application/json'}, verify=False, timeout=alert_timeout
80 )
81 else:
82 self.loop.run_until_complete(service.handle_alarm("test_id", "ok", {}))
83 requests_post.assert_called_once_with(json="{}", url="http://ok-url/", timeout=alert_timeout)
84
85 @mock.patch.object(VnfAlarmRepository, "get")
86 @mock.patch("requests.post")
87 @mock.patch("osm_policy_module.core.database.db")
88 def test_handle_insufficientalarm(self, database, requests_post, get_alarm):
89 alert_timeout = int(self.config.get('alert', 'timeout'))
90 mock_alarm = self._build_mock_alarm("test_id")
91 get_alarm.return_value = mock_alarm
92 service = AlarmingService(self.config)
93 if bool(self.config.get('alert', 'enhanced_alarms')):
94 self.loop.run_until_complete(
95 service.handle_alarm("test_id", "insufficient-data", self.payload)
96 )
97 requests_post.assert_called_once_with(
98 url='http://insufficient-data-url/', data='{"notify_details": {"alarm_number": 0}}',
99 headers={'content-type': 'application/json'}, verify=False, timeout=alert_timeout
100 )
101 else:
102 self.loop.run_until_complete(
103 service.handle_alarm("test_id", "insufficient-data", {})
104 )
105 requests_post.assert_called_once_with(
106 json="{}", url='http://insufficient-data-url/', timeout=alert_timeout
107 )
108
109 @mock.patch.object(VnfAlarmRepository, "get")
110 @mock.patch("requests.post")
111 @mock.patch("osm_policy_module.core.database.db")
112 def test_handle_alarm_unknown_status(self, database, requests_post, get_alarm):
113 mock_alarm = self._build_mock_alarm("test_id")
114 get_alarm.return_value = mock_alarm
115 service = AlarmingService(self.config)
116 self.loop.run_until_complete(service.handle_alarm("test_id", "unknown", {}))
117 requests_post.assert_not_called()
118
119 def _build_mock_alarm(
120 self,
121 alarm_id="test_id",
122 alarm_url="http://alarm-url/",
123 insufficient_data_url="http://insufficient-data-url/",
124 ok_url="http://ok-url/",
125 id_suffix=0,
126 last_action="insufficient-data"
127 ):
128 mock_alarm = mock.Mock()
129 mock_alarm.alarm_id = alarm_id
130 insufficient_data_action = mock.Mock()
131 insufficient_data_action.type = "insufficient-data"
132 insufficient_data_action.url = insufficient_data_url
133 alarm_action = mock.Mock()
134 alarm_action.type = "alarm"
135 alarm_action.url = alarm_url
136 ok_action = mock.Mock()
137 ok_action.type = "ok"
138 ok_action.url = ok_url
139 mock_alarm.ok_ack = False
140 mock_alarm.alarm_ack = False
141 mock_alarm.id_suffix = id_suffix
142 mock_alarm.last_action = last_action
143 mock_alarm.actions = [insufficient_data_action, alarm_action, ok_action]
144 return mock_alarm