Fix vROps monitoring problems related to SOL006 migration
[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 "id": "cirros_vdu_scaling_vnf",
81 "_admin": {},
82 "product-name": "cirros_vdu_scaling_vnf",
83 "version": "1.0",
84 "vdu": [
85 {
86 "id": "cirros_vnfd-VM",
87 "name": "cirros_vnfd-VM",
88 "int-cpd": [
89 {
90 "virtual-network-interface-requirement": [
91 {
92 "name": "vdu-eth0"
93 }
94 ],
95 "id": "vdu-eth0-int"
96 }
97 ],
98 "virtual-compute-desc": "cirros_vnfd-VM-compute",
99 "virtual-storage-desc": [
100 "cirros_vnfd-VM-storage"
101 ],
102 "sw-image-desc": "cirros034",
103 "monitoring-parameter": [
104 {
105 "id": "cirros_vnfd-VM_memory_util",
106 "name": "cirros_vnfd-VM_memory_util",
107 "performance-metric": "average_memory_utilization"
108 }
109 ]
110 }
111 ],
112 "virtual-compute-desc": [
113 {
114 "id": "cirros_vnfd-VM-compute",
115 "virtual-cpu": {
116 "num-virtual-cpu": 1
117 },
118 "virtual-memory": {
119 "size": 1
120 }
121 }
122 ],
123 "virtual-storage-desc": [
124 {
125 "id": "cirros_vnfd-VM-storage",
126 "size-of-storage": 2
127 }
128 ],
129 "sw-image-desc": [
130 {
131 "id": "cirros034",
132 "name": "cirros034",
133 "image": "cirros034"
134 }
135 ],
136 "ext-cpd": [
137 {
138 "int-cpd": {
139 "vdu-id": "cirros_vnfd-VM",
140 "cpd": "vdu-eth0-int"
141 },
142 "id": "vnf-cp0-ext"
143 }
144 ],
145 "df": [
146 {
147 "id": "default-df",
148 "vdu-profile": [
149 {
150 "id": "cirros_vnfd-VM"
151 }
152 ],
153 "instantiation-level": [
154 {
155 "id": "default-instantiation-level",
156 "vdu-level": [
157 {
158 "vdu-id": "cirros_vnfd-VM"
159 }
160 ]
161 }
162 ]
163 }
164 ],
165 "description": "Simple VNF example with a cirros and a scaling group descriptor",
166 "mgmt-cp": "vnf-cp0-ext"
167 }
168
169
170 @mock.patch.object(CommonDbClient, "__init__", lambda *args, **kwargs: None)
171 @mock.patch.object(MessageBusClient, "__init__", lambda *args, **kwargs: None)
172 class EvaluatorTest(TestCase):
173 def setUp(self):
174 super().setUp()
175 self.config = Config()
176
177 @mock.patch.object(EvaluatorService, "_get_metric_value")
178 def test_evaluate_metric(self, get_metric_value):
179 mock_alarm = mock.Mock()
180 mock_alarm.operation = 'gt'
181 mock_alarm.threshold = 50.0
182 mock_alarm.metric = 'metric_name'
183 get_metric_value.return_value = 100.0
184
185 service = EvaluatorService(self.config)
186 service.queue = mock.Mock()
187 service._evaluate_metric(mock_alarm)
188 service.queue.put.assert_called_with((mock_alarm, AlarmStatus.ALARM))
189 service.queue.reset_mock()
190
191 mock_alarm.operation = 'lt'
192 service._evaluate_metric(mock_alarm)
193 service.queue.put.assert_called_with((mock_alarm, AlarmStatus.OK))
194 service.queue.reset_mock()
195
196 get_metric_value.return_value = None
197 service._evaluate_metric(mock_alarm)
198 service.queue.put.assert_called_with((mock_alarm, AlarmStatus.INSUFFICIENT))
199
200 @mock.patch('multiprocessing.Process')
201 @mock.patch.object(EvaluatorService, "_evaluate_metric")
202 @mock.patch.object(CommonDbClient, "get_vnfd")
203 @mock.patch.object(CommonDbClient, "get_vnfr")
204 @mock.patch.object(CommonDbClient, "get_alarms")
205 def test_evaluate_alarms(self, alarm_list, get_vnfr, get_vnfd, evaluate_metric, process):
206 mock_alarm = mock.Mock()
207 mock_alarm.vdur_name = 'cirros_ns-1-cirros_vnfd-VM-1'
208 mock_alarm.monitoring_param = 'cirros_vnf_memory_util'
209 mock_alarm.tags = {'name': 'value'}
210 alarm_list.return_value = [mock_alarm]
211 get_vnfr.return_value = vnfr_record_mock
212 get_vnfd.return_value = vnfd_record_mock
213
214 evaluator = EvaluatorService(self.config)
215 evaluator.evaluate_alarms()
216
217 process.assert_called_with(target=evaluate_metric, args=(mock_alarm,))
218
219 @mock.patch.object(PrometheusBackend, "get_metric_value")
220 def test_get_metric_value_prometheus(self, get_metric_value):
221 self.config.set('evaluator', 'backend', 'prometheus')
222 evaluator = EvaluatorService(self.config)
223 evaluator._get_metric_value('test', {})
224
225 get_metric_value.assert_called_with('test', {})