1 # -*- coding: utf-8 -*-
3 # Copyright 2016-2019 VMware Inc.
4 # This file is part of ETSI OSM
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
11 # http://www.apache.org/licenses/LICENSE-2.0
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
19 # For those usages not covered by the Apache License, Version 2.0 please
20 # contact: osslegalrouting@vmware.com
23 from osm_mon
.collector
.vnf_collectors
.vmware
import VMwareCollector
24 from osm_mon
.core
.config
import Config
25 from osm_mon
.tests
.unit
.collector
.vnf_collectors
.vmware
.mock_http
import (
28 from unittest
import TestCase
, mock
35 "vrops_site": "https://vrops",
38 "vim_url": "https://vcd",
45 @mock.patch
.object(VMwareCollector
, "get_vm_moref_id", spec_set
=True, autospec
=True)
46 class CollectorTest(TestCase
):
47 @mock.patch
.object(VMwareCollector
, "get_vim_account", spec_set
=True, autospec
=True)
48 @mock.patch("osm_mon.collector.vnf_collectors.vmware.CommonDbClient")
49 def setUp(self
, mock_db
, mock_get_vim_account
):
51 mock_vim_session
= mock
.Mock()
52 mock_get_vim_account
.return_value
= VIM_ACCOUNT
53 self
.collector
= VMwareCollector(
54 Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4", mock_vim_session
56 self
.mock_db
= mock_db
58 os
.path
.join(os
.path
.dirname(__file__
), "osm_mocks", "VNFR.json"), "r"
60 self
.vnfr
= json
.load(f
)
62 os
.path
.join(os
.path
.dirname(__file__
), "osm_mocks", "VNFD.json"), "r"
64 self
.vnfd
= json
.load(f
)
69 def test_collect_cpu_and_memory(self
, mock_vm_moref_id
):
71 mock_vm_moref_id
.return_value
= "VMWARE-OID-VM-1"
72 self
.vnfd
["vdu"][0]["monitoring-parameter"] = [
73 {"id": "ubuntu_vnf_cpu_util", "performance-metric": "cpu_utilization"},
75 "id": "ubuntu_vnf_average_memory_utilization",
76 "performance-metric": "average_memory_utilization",
79 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
81 with requests_mock
.Mocker() as mock_requests
:
85 url_pattern
="/suite-api/api/auth/token/acquire",
86 response_file
="vrops_token.json",
90 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
91 response_file
="vrops_resources.json",
95 url_pattern
="/suite-api/api/resources/stats.*",
96 response_file
="vrops_multi.json",
98 metrics
= self
.collector
.collect(self
.vnfr
)
99 self
.assertEqual(len(metrics
), 2, "Number of metrics returned")
100 self
.assertEqual(metrics
[0].name
, "cpu_utilization", "First metric name")
101 self
.assertEqual(metrics
[0].value
, 100.0, "CPU metric value")
103 metrics
[1].name
, "average_memory_utilization", "Second metric name"
105 self
.assertEqual(metrics
[1].value
, 20.515941619873047, "Memory metric value")
107 def test_collect_no_moref(self
, mock_vm_moref_id
):
108 mock_vm_moref_id
.return_value
= None
109 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
110 with requests_mock
.Mocker() as mock_requests
:
114 url_pattern
="/suite-api/api/auth/token/acquire",
115 response_file
="vrops_token.json",
119 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
120 response_file
="404.txt",
123 metrics
= self
.collector
.collect(self
.vnfr
)
124 self
.assertEqual(len(metrics
), 0, "Number of metrics returned")
126 def test_collect_no_monitoring_param(self
, _
):
127 self
.vnfd
["vdu"][0]["monitoring-parameter"] = []
128 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
129 with requests_mock
.Mocker() as mock_requests
:
133 url_pattern
="/suite-api/api/auth/token/acquire",
134 response_file
="vrops_token.json",
138 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
139 response_file
="vrops_resources.json",
143 url_pattern
="/suite-api/api/resources/stats.*",
144 response_file
="vrops_multi.json",
146 metrics
= self
.collector
.collect(self
.vnfr
)
147 self
.assertEqual(len(metrics
), 0, "Number of metrics returned")
149 def test_collect_empty_monitoring_param(self
, _
):
150 del self
.vnfd
["vdu"][0]["monitoring-parameter"]
151 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
152 with requests_mock
.Mocker() as mock_requests
:
156 url_pattern
="/suite-api/api/auth/token/acquire",
157 response_file
="vrops_token.json",
161 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
162 response_file
="vrops_resources.json",
166 url_pattern
="/suite-api/api/resources/stats.*",
167 response_file
="vrops_multi.json",
169 metrics
= self
.collector
.collect(self
.vnfr
)
170 self
.assertEqual(len(metrics
), 0, "Number of metrics returned")
172 def test_collect_no_name(self
, _
):
173 del self
.vnfr
["vdur"][0]["name"]
174 del self
.vnfr
["vdur"][1]["name"]
175 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
176 with requests_mock
.Mocker() as mock_requests
:
180 url_pattern
="/suite-api/api/auth/token/acquire",
181 response_file
="vrops_token.json",
185 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
186 response_file
="vrops_resources.json",
190 url_pattern
="/suite-api/api/resources/stats.*",
191 response_file
="vrops_multi.json",
193 metrics
= self
.collector
.collect(self
.vnfr
)
194 self
.assertEqual(len(metrics
), 0, "Number of metrics returned")
197 class VApp_Details_Test(TestCase
):
198 @mock.patch
.object(VMwareCollector
, "get_vim_account", spec_set
=True, autospec
=True)
199 @mock.patch("osm_mon.collector.vnf_collectors.vmware.CommonDbClient")
200 def setUp(self
, mock_db
, mock_get_vim_account
):
202 self
.mock_db
= mock_db
203 mock_vim_session
= mock
.Mock()
204 mock_get_vim_account
.return_value
= VIM_ACCOUNT
205 self
.collector
= VMwareCollector(
206 Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4", mock_vim_session
212 @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
213 def test_get_vapp_details(self
, mock_vcd_client
):
214 mock_vcd_client
.return_value
._session
.headers
= {"x-vcloud-authorization": ""}
215 with requests_mock
.Mocker() as mock_requests
:
219 url_pattern
="/api/vApp/.*",
220 response_file
="vcd_vapp_response.xml",
222 response
= self
.collector
.get_vapp_details_rest("")
223 self
.assertDictContainsSubset(
224 {"vm_vcenter_info": {"vm_moref_id": "vm-4055"}},
226 "Managed object reference id incorrect",
229 def test_no_admin_connect(self
):
230 response
= self
.collector
.get_vapp_details_rest("")
231 self
.assertDictEqual(
232 response
, {}, "Failed to connect should return empty dictionary"
235 def test_no_id(self
):
236 response
= self
.collector
.get_vapp_details_rest()
237 self
.assertDictEqual(
238 response
, {}, "No id supplied should return empty dictionary"
241 @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
242 def test_get_vapp_details_404(self
, mock_vcd_client
):
243 mock_vcd_client
.return_value
._session
.headers
= {"x-vcloud-authorization": ""}
244 with requests_mock
.Mocker() as mock_requests
:
248 url_pattern
="/api/vApp/.*",
249 response_file
="404.txt",
252 response
= self
.collector
.get_vapp_details_rest("")
253 self
.assertDictEqual(response
, {}, "HTTP error should return empty dictionary")
255 @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
256 def test_get_vapp_details_xml_parse_error(self
, mock_vcd_client
):
257 mock_vcd_client
.return_value
._session
.headers
= {"x-vcloud-authorization": ""}
258 with requests_mock
.Mocker() as mock_requests
:
262 url_pattern
="/api/vApp/.*",
263 response_file
="404.txt",
265 response
= self
.collector
.get_vapp_details_rest("")
266 self
.assertDictEqual(
267 response
, {}, "XML parse error should return empty dictionary"
271 class Get_VM_Moref_Test(TestCase
):
272 @mock.patch
.object(VMwareCollector
, "get_vim_account", spec_set
=True, autospec
=True)
273 @mock.patch("osm_mon.collector.vnf_collectors.vmware.CommonDbClient")
274 def setUp(self
, mock_db
, mock_get_vim_account
):
276 self
.mock_db
= mock_db
277 mock_vim_session
= mock
.Mock()
278 mock_get_vim_account
.return_value
= VIM_ACCOUNT
279 self
.collector
= VMwareCollector(
280 Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4", mock_vim_session
287 VMwareCollector
, "get_vapp_details_rest", spec_set
=True, autospec
=True
289 def test_get_vm_moref_id(self
, mock_vapp_details
):
290 mock_vapp_details
.return_value
= {"vm_vcenter_info": {"vm_moref_id": "vm-4055"}}
291 response
= self
.collector
.get_vm_moref_id("1234")
293 response
, "vm-4055", "Did not fetch correct ref id from dictionary"
297 VMwareCollector
, "get_vapp_details_rest", spec_set
=True, autospec
=True
299 def test_get_vm_moref_bad_content(self
, mock_vapp_details
):
300 mock_vapp_details
.return_value
= {}
301 response
= self
.collector
.get_vm_moref_id("1234")
303 response
, None, "Error fetching vapp details should return None"
307 VMwareCollector
, "get_vapp_details_rest", spec_set
=True, autospec
=True
309 def test_get_vm_moref_has_exception(self
, mock_vapp_details
):
310 mock_vapp_details
.side_effect
= Exception("Testing")
311 response
= self
.collector
.get_vm_moref_id("1234")
313 response
, None, "Exception while fetching vapp details should return None"