Re-Revert "Revert "Migrates alarms to MongoDB"" approved by TSC
[osm/MON.git] / osm_mon / tests / unit / evaluator / test_evaluator_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 # For those usages not covered by the Apache License, Version 2.0 please
21 # contact: bdiaz@whitestack.com or glavado@whitestack.com
22 ##
23 from unittest import TestCase, mock
24
25 from osm_mon.core.common_db import CommonDbClient
26 from osm_mon.core.config import Config
27 from osm_mon.core.message_bus_client import MessageBusClient
28 from osm_mon.evaluator.backends.prometheus import PrometheusBackend
29 from osm_mon.evaluator.evaluator import AlarmStatus
30 from osm_mon.evaluator.service import EvaluatorService
31
32 vnfr_record_mock = {
33 "_id": "0d9d06ad-3fc2-418c-9934-465e815fafe2",
34 "ip-address": "192.168.160.2",
35 "created-time": 1535392482.0044956,
36 "vim-account-id": "be48ae31-1d46-4892-a4b4-d69abd55714b",
37 "vdur": [
38 {
39 "interfaces": [
40 {
41 "mac-address": "fa:16:3e:71:fd:b8",
42 "name": "eth0",
43 "ip-address": "192.168.160.2"
44 }
45 ],
46 "status": "ACTIVE",
47 "vim-id": "63a65636-9fc8-4022-b070-980823e6266a",
48 "name": "cirros_ns-1-cirros_vnfd-VM-1",
49 "status-detailed": None,
50 "ip-address": "192.168.160.2",
51 "vdu-id-ref": "cirros_vnfd-VM"
52 }
53 ],
54 "id": "0d9d06ad-3fc2-418c-9934-465e815fafe2",
55 "vnfd-ref": "cirros_vdu_scaling_vnf",
56 "vnfd-id": "63f44c41-45ee-456b-b10d-5f08fb1796e0",
57 "_admin": {
58 "created": 1535392482.0067868,
59 "projects_read": [
60 "admin"
61 ],
62 "modified": 1535392482.0067868,
63 "projects_write": [
64 "admin"
65 ]
66 },
67 "nsr-id-ref": "87776f33-b67c-417a-8119-cb08e4098951",
68 "member-vnf-index-ref": "1",
69 "connection-point": [
70 {
71 "name": "eth0",
72 "id": None,
73 "connection-point-id": None
74 }
75 ]
76 }
77
78 vnfd_record_mock = {
79 "_id": "63f44c41-45ee-456b-b10d-5f08fb1796e0",
80 "name": "cirros_vdu_scaling_vnf",
81 "vendor": "OSM",
82 "vdu": [
83 {
84 "name": "cirros_vnfd-VM",
85 "monitoring-param": [
86 {
87 "id": "cirros_vnfd-VM_memory_util",
88 "nfvi-metric": "average_memory_utilization"
89 }
90 ],
91 "vm-flavor": {
92 "vcpu-count": 1,
93 "memory-mb": 256,
94 "storage-gb": 2
95 },
96 "description": "cirros_vnfd-VM",
97 "count": 1,
98 "id": "cirros_vnfd-VM",
99 "interface": [
100 {
101 "name": "eth0",
102 "external-connection-point-ref": "eth0",
103 "type": "EXTERNAL",
104 "virtual-interface": {
105 "bandwidth": "0",
106 "type": "VIRTIO",
107 "vpci": "0000:00:0a.0"
108 }
109 }
110 ],
111 "image": "cirros034"
112 }
113 ],
114 "monitoring-param": [
115 {
116 "id": "cirros_vnf_memory_util",
117 "name": "cirros_vnf_memory_util",
118 "aggregation-type": "AVERAGE",
119 "vdu-monitoring-param": {
120 "vdu-monitoring-param-ref": "cirros_vnfd-VM_memory_util",
121 "vdu-ref": "cirros_vnfd-VM"
122 }
123 }
124 ],
125 "description": "Simple VNF example with a cirros and a scaling group descriptor",
126 "id": "cirros_vdu_scaling_vnf",
127 "logo": "cirros-64.png",
128 "version": "1.0",
129 "connection-point": [
130 {
131 "name": "eth0",
132 "type": "VPORT"
133 }
134 ],
135 "mgmt-interface": {
136 "cp": "eth0"
137 },
138 "short-name": "cirros_vdu_scaling_vnf",
139 "_admin": {}
140 }
141
142
143 @mock.patch.object(CommonDbClient, "__init__", lambda *args, **kwargs: None)
144 @mock.patch.object(MessageBusClient, "__init__", lambda *args, **kwargs: None)
145 class EvaluatorTest(TestCase):
146 def setUp(self):
147 super().setUp()
148 self.config = Config()
149
150 @mock.patch.object(EvaluatorService, "_get_metric_value")
151 def test_evaluate_metric(self, get_metric_value):
152 mock_alarm = mock.Mock()
153 mock_alarm.operation = 'gt'
154 mock_alarm.threshold = 50.0
155 mock_alarm.metric = 'metric_name'
156 get_metric_value.return_value = 100.0
157
158 service = EvaluatorService(self.config)
159 service.queue = mock.Mock()
160 service._evaluate_metric(mock_alarm)
161 service.queue.put.assert_called_with((mock_alarm, AlarmStatus.ALARM))
162 service.queue.reset_mock()
163
164 mock_alarm.operation = 'lt'
165 service._evaluate_metric(mock_alarm)
166 service.queue.put.assert_called_with((mock_alarm, AlarmStatus.OK))
167 service.queue.reset_mock()
168
169 get_metric_value.return_value = None
170 service._evaluate_metric(mock_alarm)
171 service.queue.put.assert_called_with((mock_alarm, AlarmStatus.INSUFFICIENT))
172
173 @mock.patch('multiprocessing.Process')
174 @mock.patch.object(EvaluatorService, "_evaluate_metric")
175 @mock.patch.object(CommonDbClient, "get_vnfd")
176 @mock.patch.object(CommonDbClient, "get_vnfr")
177 @mock.patch.object(CommonDbClient, "get_alarms")
178 def test_evaluate_alarms(self, alarm_list, get_vnfr, get_vnfd, evaluate_metric, process):
179 mock_alarm = mock.Mock()
180 mock_alarm.vdur_name = 'cirros_ns-1-cirros_vnfd-VM-1'
181 mock_alarm.monitoring_param = 'cirros_vnf_memory_util'
182 mock_alarm.tags = {'name': 'value'}
183 alarm_list.return_value = [mock_alarm]
184 get_vnfr.return_value = vnfr_record_mock
185 get_vnfd.return_value = vnfd_record_mock
186
187 evaluator = EvaluatorService(self.config)
188 evaluator.evaluate_alarms()
189
190 process.assert_called_with(target=evaluate_metric, args=(mock_alarm,))
191
192 @mock.patch.object(PrometheusBackend, "get_metric_value")
193 def test_get_metric_value_prometheus(self, get_metric_value):
194 self.config.set('evaluator', 'backend', 'prometheus')
195 evaluator = EvaluatorService(self.config)
196 evaluator._get_metric_value('test', {})
197
198 get_metric_value.assert_called_with('test', {})