32532e13d423f6e90852805c857937abd9f7bb1d
[osm/MON.git] / osm_mon / test / OpenStack / integration / test_alarm_integration.py
1 # Copyright 2017 Intel Research and Development Ireland Limited
2 # *************************************************************
3
4 # This file is part of OSM Monitoring module
5 # All Rights Reserved to Intel Corporation
6
7 # Licensed under the Apache License, Version 2.0 (the "License"); you may
8 # not use this file except in compliance with the License. You may obtain
9 # a copy of the License at
10
11 # http://www.apache.org/licenses/LICENSE-2.0
12
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16 # License for the specific language governing permissions and limitations
17 # under the License.
18
19 # For those usages not covered by the Apache License, Version 2.0 please
20 # contact: helena.mcgough@intel.com or adrian.hoban@intel.com
21
22 # __author__ = "Helena McGough"
23 """Test an end to end Openstack alarm requests."""
24
25 import json
26 import logging
27 import unittest
28
29 import mock
30 from kafka import KafkaConsumer
31 from kafka import KafkaProducer
32 from kafka.errors import KafkaError
33
34 from osm_mon.core.auth import AuthManager
35 from osm_mon.core.database import DatabaseManager, VimCredentials
36 from osm_mon.core.message_bus.producer import KafkaProducer as prod
37 from osm_mon.plugins.OpenStack import response
38 from osm_mon.plugins.OpenStack.Aodh import alarming
39 from osm_mon.plugins.OpenStack.common import Common
40
41 log = logging.getLogger(__name__)
42
43 mock_creds = VimCredentials()
44 mock_creds.config = '{}'
45
46
47 class AlarmIntegrationTest(unittest.TestCase):
48 def setUp(self):
49 try:
50 self.producer = KafkaProducer(bootstrap_servers='localhost:9092',
51 key_serializer=str.encode,
52 value_serializer=str.encode
53 )
54 self.req_consumer = KafkaConsumer(bootstrap_servers='localhost:9092',
55 key_deserializer=bytes.decode,
56 value_deserializer=bytes.decode,
57 auto_offset_reset='earliest',
58 consumer_timeout_ms=60000)
59 self.req_consumer.subscribe(['alarm_request'])
60 except KafkaError:
61 self.skipTest('Kafka server not present.')
62 # Set up common and alarming class instances
63 self.alarms = alarming.Alarming()
64 self.openstack_auth = Common()
65
66 def tearDown(self):
67 self.producer.close()
68 self.req_consumer.close()
69
70 @mock.patch.object(Common, "get_auth_token", mock.Mock())
71 @mock.patch.object(Common, "get_endpoint", mock.Mock())
72 @mock.patch.object(AuthManager, 'get_credentials')
73 @mock.patch.object(prod, "update_alarm_response")
74 @mock.patch.object(alarming.Alarming, "update_alarm")
75 @mock.patch.object(response.OpenStack_Response, "generate_response")
76 def test_update_alarm_req(self, resp, update_alarm, update_resp, get_creds):
77 """Test Aodh update alarm request message from KafkaProducer."""
78 # Set-up message, producer and consumer for tests
79 payload = {"alarm_update_request":
80 {"correlation_id": 123,
81 "alarm_uuid": "alarm_id",
82 "metric_uuid": "metric_id"}}
83
84 get_creds.return_value = mock_creds
85
86 self.producer.send('alarm_request', key="update_alarm_request",
87 value=json.dumps(payload))
88
89 for message in self.req_consumer:
90 if message.key == "update_alarm_request":
91 # Mock a valid alarm update
92 update_alarm.return_value = "alarm_id", True
93 self.alarms.alarming(message, 'test_id')
94
95 # A response message is generated and sent via MON's producer
96 resp.assert_called_with(
97 'update_alarm_response', alarm_id="alarm_id", cor_id=123,
98 status=True)
99 update_resp.assert_called_with(
100 'update_alarm_response', resp.return_value)
101
102 return
103 self.fail("No message received in consumer")
104
105 @mock.patch.object(DatabaseManager, "save_alarm", mock.Mock())
106 @mock.patch.object(Common, "get_auth_token", mock.Mock())
107 @mock.patch.object(Common, "get_endpoint", mock.Mock())
108 @mock.patch.object(AuthManager, 'get_credentials')
109 @mock.patch.object(prod, "create_alarm_response")
110 @mock.patch.object(alarming.Alarming, "configure_alarm")
111 @mock.patch.object(response.OpenStack_Response, "generate_response")
112 def test_create_alarm_req(self, resp, config_alarm, create_resp, get_creds):
113 """Test Aodh create alarm request message from KafkaProducer."""
114 # Set-up message, producer and consumer for tests
115 payload = {"alarm_create_request":
116 {"correlation_id": 123,
117 "alarm_name": "my_alarm",
118 "metric_name": "my_metric",
119 "resource_uuid": "my_resource",
120 "severity": "WARNING",
121 "threshold_value": 60,
122 "operation": "GT",
123 "vdu_name": "vdu",
124 "vnf_member_index": "1",
125 "ns_id": "1"}}
126
127 get_creds.return_value = mock_creds
128
129 self.producer.send('alarm_request', key="create_alarm_request",
130 value=json.dumps(payload))
131
132 for message in self.req_consumer:
133 if message.key == "create_alarm_request":
134 # Mock a valid alarm creation
135 config_alarm.return_value = "alarm_id", True
136 self.alarms.alarming(message, 'test_id')
137
138 # A response message is generated and sent via MON's produce
139 resp.assert_called_with(
140 'create_alarm_response', status=True, alarm_id="alarm_id",
141 cor_id=123)
142 create_resp.assert_called_with(
143 'create_alarm_response', resp.return_value)
144
145 return
146 self.fail("No message received in consumer")
147
148 @mock.patch.object(Common, "get_auth_token", mock.Mock())
149 @mock.patch.object(Common, "get_endpoint", mock.Mock())
150 @mock.patch.object(AuthManager, 'get_credentials')
151 @mock.patch.object(prod, "list_alarm_response")
152 @mock.patch.object(alarming.Alarming, "list_alarms")
153 @mock.patch.object(response.OpenStack_Response, "generate_response")
154 def test_list_alarm_req(self, resp, list_alarm, list_resp, get_creds):
155 """Test Aodh list alarm request message from KafkaProducer."""
156 # Set-up message, producer and consumer for tests
157 payload = {"alarm_list_request":
158 {"correlation_id": 123,
159 "resource_uuid": "resource_id", }}
160
161 self.producer.send('alarm_request', key="list_alarm_request",
162 value=json.dumps(payload))
163
164 get_creds.return_value = mock_creds
165
166 for message in self.req_consumer:
167 if message.key == "list_alarm_request":
168 # Mock an empty list generated by the request
169 list_alarm.return_value = []
170 self.alarms.alarming(message, 'test_id')
171
172 # Response message is generated
173 resp.assert_called_with(
174 'list_alarm_response', alarm_list=[],
175 cor_id=123)
176 # Producer attempts to send the response message back to the SO
177 list_resp.assert_called_with(
178 'list_alarm_response', resp.return_value)
179
180 return
181 self.fail("No message received in consumer")
182
183 @mock.patch.object(Common, "get_auth_token", mock.Mock())
184 @mock.patch.object(Common, "get_endpoint", mock.Mock())
185 @mock.patch.object(AuthManager, 'get_credentials')
186 @mock.patch.object(alarming.Alarming, "delete_alarm")
187 @mock.patch.object(prod, "delete_alarm_response")
188 @mock.patch.object(response.OpenStack_Response, "generate_response")
189 def test_delete_alarm_req(self, resp, del_resp, del_alarm, get_creds):
190 """Test Aodh delete alarm request message from KafkaProducer."""
191 # Set-up message, producer and consumer for tests
192 payload = {"alarm_delete_request":
193 {"correlation_id": 123,
194 "alarm_uuid": "alarm_id", }}
195
196 self.producer.send('alarm_request', key="delete_alarm_request",
197 value=json.dumps(payload))
198
199 get_creds.return_value = mock_creds
200
201 for message in self.req_consumer:
202 if message.key == "delete_alarm_request":
203 self.alarms.alarming(message, 'test_id')
204
205 # Response message is generated and sent by MON's producer
206 resp.assert_called_with(
207 'delete_alarm_response', alarm_id="alarm_id",
208 status=del_alarm.return_value, cor_id=123)
209 del_resp.assert_called_with(
210 'delete_alarm_response', resp.return_value)
211
212 return
213 self.fail("No message received in consumer")
214
215 @mock.patch.object(Common, "get_auth_token", mock.Mock())
216 @mock.patch.object(Common, "get_endpoint", mock.Mock())
217 @mock.patch.object(AuthManager, 'get_credentials')
218 @mock.patch.object(alarming.Alarming, "update_alarm_state")
219 def test_ack_alarm_req(self, ack_alarm, get_creds):
220 """Test Aodh acknowledge alarm request message from KafkaProducer."""
221 # Set-up message, producer and consumer for tests
222 payload = {"ack_details":
223 {"alarm_uuid": "alarm_id", }}
224
225 self.producer.send('alarm_request', key="acknowledge_alarm",
226 value=json.dumps(payload))
227
228 get_creds.return_value = mock_creds
229 ack_alarm.return_value = True
230
231 for message in self.req_consumer:
232 if message.key == "acknowledge_alarm":
233 self.alarms.alarming(message, 'test_id')
234 ack_alarm.assert_called_with(mock.ANY, mock.ANY, 'alarm_id')
235 return
236
237 self.fail("No message received in consumer")