1 # -*- coding: utf-8 -*-
3 # Copyright 2018 Whitestack, LLC
4 # *************************************************************
6 # This file is part of OSM Monitoring module
7 # All Rights Reserved to Whitestack, LLC
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
13 # http://www.apache.org/licenses/LICENSE-2.0
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
20 # For those usages not covered by the Apache License, Version 2.0 please
21 # contact: bdiaz@whitestack.com or glavado@whitestack.com
23 from unittest
import TestCase
, mock
25 from osm_mon
.core
.common_db
import CommonDbClient
26 from osm_mon
.core
.config
import Config
27 from osm_mon
.core
.database
import AlarmRepository
28 from osm_mon
.core
.message_bus_client
import MessageBusClient
29 from osm_mon
.evaluator
.backends
.prometheus
import PrometheusBackend
30 from osm_mon
.evaluator
.evaluator
import AlarmStatus
31 from osm_mon
.evaluator
.service
import EvaluatorService
34 "_id": "0d9d06ad-3fc2-418c-9934-465e815fafe2",
35 "ip-address": "192.168.160.2",
36 "created-time": 1535392482.0044956,
37 "vim-account-id": "be48ae31-1d46-4892-a4b4-d69abd55714b",
42 "mac-address": "fa:16:3e:71:fd:b8",
44 "ip-address": "192.168.160.2"
48 "vim-id": "63a65636-9fc8-4022-b070-980823e6266a",
49 "name": "cirros_ns-1-cirros_vnfd-VM-1",
50 "status-detailed": None,
51 "ip-address": "192.168.160.2",
52 "vdu-id-ref": "cirros_vnfd-VM"
55 "id": "0d9d06ad-3fc2-418c-9934-465e815fafe2",
56 "vnfd-ref": "cirros_vdu_scaling_vnf",
57 "vnfd-id": "63f44c41-45ee-456b-b10d-5f08fb1796e0",
59 "created": 1535392482.0067868,
63 "modified": 1535392482.0067868,
68 "nsr-id-ref": "87776f33-b67c-417a-8119-cb08e4098951",
69 "member-vnf-index-ref": "1",
74 "connection-point-id": None
80 "_id": "63f44c41-45ee-456b-b10d-5f08fb1796e0",
81 "name": "cirros_vdu_scaling_vnf",
85 "name": "cirros_vnfd-VM",
88 "id": "cirros_vnfd-VM_memory_util",
89 "nfvi-metric": "average_memory_utilization"
97 "description": "cirros_vnfd-VM",
99 "id": "cirros_vnfd-VM",
103 "external-connection-point-ref": "eth0",
105 "virtual-interface": {
108 "vpci": "0000:00:0a.0"
115 "monitoring-param": [
117 "id": "cirros_vnf_memory_util",
118 "name": "cirros_vnf_memory_util",
119 "aggregation-type": "AVERAGE",
120 "vdu-monitoring-param": {
121 "vdu-monitoring-param-ref": "cirros_vnfd-VM_memory_util",
122 "vdu-ref": "cirros_vnfd-VM"
126 "description": "Simple VNF example with a cirros and a scaling group descriptor",
127 "id": "cirros_vdu_scaling_vnf",
128 "logo": "cirros-64.png",
130 "connection-point": [
139 "short-name": "cirros_vdu_scaling_vnf",
144 @mock.patch
.object(CommonDbClient
, "__init__", lambda *args
, **kwargs
: None)
145 @mock.patch
.object(MessageBusClient
, "__init__", lambda *args
, **kwargs
: None)
146 class EvaluatorTest(TestCase
):
149 self
.config
= Config()
151 @mock.patch
.object(EvaluatorService
, "_get_metric_value")
152 @mock.patch('osm_mon.core.database.db')
153 def test_evaluate_metric(self
, db
, get_metric_value
):
154 mock_alarm
= mock
.Mock()
155 mock_alarm
.operation
= 'gt'
156 mock_alarm
.threshold
= 50.0
157 get_metric_value
.return_value
= 100.0
159 service
= EvaluatorService(self
.config
)
160 service
.queue
= mock
.Mock()
161 service
._evaluate
_metric
('test_id', '1', 'test_name', 'test_metric_name', mock_alarm
)
162 service
.queue
.put
.assert_called_with((mock_alarm
, AlarmStatus
.ALARM
))
163 service
.queue
.reset_mock()
165 mock_alarm
.operation
= 'lt'
166 service
._evaluate
_metric
('test_id', '1', 'test_name', 'test_metric_name', mock_alarm
)
167 service
.queue
.put
.assert_called_with((mock_alarm
, AlarmStatus
.OK
))
168 service
.queue
.reset_mock()
170 get_metric_value
.return_value
= None
171 service
._evaluate
_metric
('test_id', '1', 'test_name', 'test_metric_name', mock_alarm
)
172 service
.queue
.put
.assert_called_with((mock_alarm
, AlarmStatus
.INSUFFICIENT
))
174 @mock.patch('multiprocessing.Process')
175 @mock.patch
.object(EvaluatorService
, "_evaluate_metric")
176 @mock.patch
.object(CommonDbClient
, "get_vnfd")
177 @mock.patch
.object(CommonDbClient
, "get_vnfr")
178 @mock.patch
.object(AlarmRepository
, "list")
179 @mock.patch('osm_mon.core.database.db')
180 def test_evaluate(self
, db
, alarm_list
, get_vnfr
, get_vnfd
, evaluate_metric
, proccess
):
181 mock_alarm
= mock
.Mock()
182 mock_alarm
.vdur_name
= 'cirros_ns-1-cirros_vnfd-VM-1'
183 mock_alarm
.monitoring_param
= 'cirros_vnf_memory_util'
184 alarm_list
.return_value
= [mock_alarm
]
185 get_vnfr
.return_value
= vnfr_record_mock
186 get_vnfd
.return_value
= vnfd_record_mock
188 evaluator
= EvaluatorService(self
.config
)
189 evaluator
.evaluate_alarms()
191 proccess
.assert_called_with(target
=evaluate_metric
, args
=(
192 '87776f33-b67c-417a-8119-cb08e4098951', '1', 'cirros_ns-1-cirros_vnfd-VM-1', 'average_memory_utilization',
195 @mock.patch
.object(PrometheusBackend
, "get_metric_value")
196 @mock.patch('osm_mon.core.database.db')
197 def test_get_metric_value_prometheus(self
, db
, get_metric_value
):
198 self
.config
.set('evaluator', 'backend', 'prometheus')
199 evaluator
= EvaluatorService(self
.config
)
200 evaluator
._get
_metric
_value
('test_id', 'test_vnf_member_index', 'test_vdur_name', 'test_metric_name')
202 get_metric_value
.assert_called_with('test_metric_name', 'test_id', 'test_vdur_name', 'test_vnf_member_index')