Coverage for osm_policy_module/tests/unit/alarming/test_alarming_service.py: 93%

82 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-05-07 08:03 +0000

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## 

24import asyncio 

25from unittest import TestCase, mock 

26 

27from osm_policy_module.alarming.service import AlarmingService 

28from osm_policy_module.common.common_db_client import CommonDbClient 

29from osm_policy_module.common.lcm_client import LcmClient 

30from osm_policy_module.common.mon_client import MonClient 

31from osm_policy_module.core.config import Config 

32from 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) 

38class TestAlarmingService(TestCase): 

39 def setUp(self): 

40 self.config = Config() 

41 self.payload = {"notify_details": {"alarm_number": 0}} 

42 self.headers = {"content-type": "application/json"} 

43 

44 @mock.patch.object(VnfAlarmRepository, "get") 

45 @mock.patch("requests.post") 

46 @mock.patch("osm_policy_module.core.database.db") 

47 def test_handle_alarm_suppression(self, database, requests_post, get_alarm): 

48 alert_timeout = int(self.config.get("alert", "timeout")) 

49 mock_alarm = self._build_mock_alarm("test_id", last_action="ok") 

50 get_alarm.return_value = mock_alarm 

51 service = AlarmingService(self.config) 

52 if bool(self.config.get("alert", "enhanced_alarms")): 

53 asyncio.run(service.handle_alarm("test_id", "alarm", self.payload)) 

54 requests_post.assert_called_once_with( 

55 url="http://alarm-url/", 

56 data='{"notify_details": {"alarm_number": 1}}', 

57 headers={"content-type": "application/json"}, 

58 timeout=alert_timeout, 

59 ) 

60 else: 

61 asyncio.run(service.handle_alarm("test_id", "alarm", {})) 

62 requests_post.assert_called_once_with( 

63 json="{}", url="http://alarm-url/", timeout=alert_timeout 

64 ) 

65 

66 @mock.patch.object(VnfAlarmRepository, "get") 

67 @mock.patch("requests.post") 

68 @mock.patch("osm_policy_module.core.database.db") 

69 def test_handle_ok_suppression(self, database, requests_post, get_alarm): 

70 alert_timeout = int(self.config.get("alert", "timeout")) 

71 mock_alarm = self._build_mock_alarm("test_id", last_action="alarm") 

72 get_alarm.return_value = mock_alarm 

73 service = AlarmingService(self.config) 

74 if bool(self.config.get("alert", "enhanced_alarms")): 

75 asyncio.run(service.handle_alarm("test_id", "ok", self.payload)) 

76 requests_post.assert_called_once_with( 

77 url="http://ok-url/", 

78 data='{"notify_details": {"alarm_number": 0}}', 

79 headers={"content-type": "application/json"}, 

80 timeout=alert_timeout, 

81 ) 

82 else: 

83 asyncio.run(service.handle_alarm("test_id", "ok", {})) 

84 requests_post.assert_called_once_with( 

85 json="{}", url="http://ok-url/", timeout=alert_timeout 

86 ) 

87 

88 @mock.patch.object(VnfAlarmRepository, "get") 

89 @mock.patch("requests.post") 

90 @mock.patch("osm_policy_module.core.database.db") 

91 def test_handle_insufficientalarm(self, database, requests_post, get_alarm): 

92 alert_timeout = int(self.config.get("alert", "timeout")) 

93 mock_alarm = self._build_mock_alarm("test_id") 

94 get_alarm.return_value = mock_alarm 

95 service = AlarmingService(self.config) 

96 if bool(self.config.get("alert", "enhanced_alarms")): 

97 asyncio.run( 

98 service.handle_alarm("test_id", "insufficient-data", self.payload) 

99 ) 

100 requests_post.assert_called_once_with( 

101 url="http://insufficient-data-url/", 

102 data='{"notify_details": {"alarm_number": 0}}', 

103 headers={"content-type": "application/json"}, 

104 timeout=alert_timeout, 

105 ) 

106 else: 

107 asyncio.run(service.handle_alarm("test_id", "insufficient-data", {})) 

108 requests_post.assert_called_once_with( 

109 json="{}", url="http://insufficient-data-url/", timeout=alert_timeout 

110 ) 

111 

112 @mock.patch.object(VnfAlarmRepository, "get") 

113 @mock.patch("requests.post") 

114 @mock.patch("osm_policy_module.core.database.db") 

115 def test_handle_alarm_unknown_status(self, database, requests_post, get_alarm): 

116 mock_alarm = self._build_mock_alarm("test_id") 

117 get_alarm.return_value = mock_alarm 

118 service = AlarmingService(self.config) 

119 asyncio.run(service.handle_alarm("test_id", "unknown", {})) 

120 requests_post.assert_not_called() 

121 

122 def _build_mock_alarm( 

123 self, 

124 alarm_id="test_id", 

125 alarm_url="http://alarm-url/", 

126 insufficient_data_url="http://insufficient-data-url/", 

127 ok_url="http://ok-url/", 

128 id_suffix=0, 

129 last_action="insufficient-data", 

130 ): 

131 mock_alarm = mock.Mock() 

132 mock_alarm.alarm_id = alarm_id 

133 insufficient_data_action = mock.Mock() 

134 insufficient_data_action.type = "insufficient-data" 

135 insufficient_data_action.url = insufficient_data_url 

136 alarm_action = mock.Mock() 

137 alarm_action.type = "alarm" 

138 alarm_action.url = alarm_url 

139 ok_action = mock.Mock() 

140 ok_action.type = "ok" 

141 ok_action.url = ok_url 

142 mock_alarm.ok_ack = False 

143 mock_alarm.alarm_ack = False 

144 mock_alarm.id_suffix = id_suffix 

145 mock_alarm.last_action = last_action 

146 mock_alarm.actions = [insufficient_data_action, alarm_action, ok_action] 

147 return mock_alarm