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
):
70 mock_vm_moref_id
.return_value
= "VMWARE-OID-VM-1"
71 self
.vnfd
["vdu"][0]["monitoring-parameter"] = [
72 {"id": "ubuntu_vnf_cpu_util", "performance-metric": "cpu_utilization"},
74 "id": "ubuntu_vnf_average_memory_utilization",
75 "performance-metric": "average_memory_utilization",
78 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
80 with requests_mock
.Mocker() as mock_requests
:
84 url_pattern
="/suite-api/api/auth/token/acquire",
85 response_file
="vrops_token.json",
89 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
90 response_file
="vrops_resources.json",
94 url_pattern
="/suite-api/api/resources/stats.*",
95 response_file
="vrops_multi.json",
97 metrics
= self
.collector
.collect(self
.vnfr
)
98 self
.assertEqual(len(metrics
), 2, "Number of metrics returned")
99 self
.assertEqual(metrics
[0].name
, "cpu_utilization", "First metric name")
100 self
.assertEqual(metrics
[0].value
, 100.0, "CPU metric value")
102 metrics
[1].name
, "average_memory_utilization", "Second metric name"
104 self
.assertEqual(metrics
[1].value
, 20.515941619873047, "Memory metric value")
106 def test_collect_no_moref(self
, mock_vm_moref_id
):
107 mock_vm_moref_id
.return_value
= None
108 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
109 with requests_mock
.Mocker() as mock_requests
:
113 url_pattern
="/suite-api/api/auth/token/acquire",
114 response_file
="vrops_token.json",
118 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
119 response_file
="404.txt",
122 metrics
= self
.collector
.collect(self
.vnfr
)
123 self
.assertEqual(len(metrics
), 0, "Number of metrics returned")
125 def test_collect_no_monitoring_param(self
, _
):
126 self
.vnfd
["vdu"][0]["monitoring-parameter"] = []
127 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
128 with requests_mock
.Mocker() as mock_requests
:
132 url_pattern
="/suite-api/api/auth/token/acquire",
133 response_file
="vrops_token.json",
137 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
138 response_file
="vrops_resources.json",
142 url_pattern
="/suite-api/api/resources/stats.*",
143 response_file
="vrops_multi.json",
145 metrics
= self
.collector
.collect(self
.vnfr
)
146 self
.assertEqual(len(metrics
), 0, "Number of metrics returned")
148 def test_collect_empty_monitoring_param(self
, _
):
149 del self
.vnfd
["vdu"][0]["monitoring-parameter"]
150 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
151 with requests_mock
.Mocker() as mock_requests
:
155 url_pattern
="/suite-api/api/auth/token/acquire",
156 response_file
="vrops_token.json",
160 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
161 response_file
="vrops_resources.json",
165 url_pattern
="/suite-api/api/resources/stats.*",
166 response_file
="vrops_multi.json",
168 metrics
= self
.collector
.collect(self
.vnfr
)
169 self
.assertEqual(len(metrics
), 0, "Number of metrics returned")
171 def test_collect_no_name(self
, _
):
172 del self
.vnfr
["vdur"][0]["name"]
173 del self
.vnfr
["vdur"][1]["name"]
174 self
.mock_db
.return_value
.get_vnfd
.return_value
= self
.vnfd
175 with requests_mock
.Mocker() as mock_requests
:
179 url_pattern
="/suite-api/api/auth/token/acquire",
180 response_file
="vrops_token.json",
184 url_pattern
="/suite-api/api/resources\\?resourceKind=VirtualMachine",
185 response_file
="vrops_resources.json",
189 url_pattern
="/suite-api/api/resources/stats.*",
190 response_file
="vrops_multi.json",
192 metrics
= self
.collector
.collect(self
.vnfr
)
193 self
.assertEqual(len(metrics
), 0, "Number of metrics returned")
196 class VApp_Details_Test(TestCase
):
197 @mock.patch
.object(VMwareCollector
, "get_vim_account", spec_set
=True, autospec
=True)
198 @mock.patch("osm_mon.collector.vnf_collectors.vmware.CommonDbClient")
199 def setUp(self
, mock_db
, mock_get_vim_account
):
201 self
.mock_db
= mock_db
202 mock_vim_session
= mock
.Mock()
203 mock_get_vim_account
.return_value
= VIM_ACCOUNT
204 self
.collector
= VMwareCollector(
205 Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4", mock_vim_session
211 @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
212 def test_get_vapp_details(self
, mock_vcd_client
):
213 mock_vcd_client
.return_value
._session
.headers
= {"x-vcloud-authorization": ""}
214 with requests_mock
.Mocker() as mock_requests
:
218 url_pattern
="/api/vApp/.*",
219 response_file
="vcd_vapp_response.xml",
221 response
= self
.collector
.get_vapp_details_rest("")
222 self
.assertDictContainsSubset(
223 {"vm_vcenter_info": {"vm_moref_id": "vm-4055"}},
225 "Managed object reference id incorrect",
228 def test_no_admin_connect(self
):
229 response
= self
.collector
.get_vapp_details_rest("")
230 self
.assertDictEqual(
231 response
, {}, "Failed to connect should return empty dictionary"
234 def test_no_id(self
):
235 response
= self
.collector
.get_vapp_details_rest()
236 self
.assertDictEqual(
237 response
, {}, "No id supplied should return empty dictionary"
240 @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
241 def test_get_vapp_details_404(self
, mock_vcd_client
):
242 mock_vcd_client
.return_value
._session
.headers
= {"x-vcloud-authorization": ""}
243 with requests_mock
.Mocker() as mock_requests
:
247 url_pattern
="/api/vApp/.*",
248 response_file
="404.txt",
251 response
= self
.collector
.get_vapp_details_rest("")
252 self
.assertDictEqual(response
, {}, "HTTP error should return empty dictionary")
254 @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
255 def test_get_vapp_details_xml_parse_error(self
, mock_vcd_client
):
256 mock_vcd_client
.return_value
._session
.headers
= {"x-vcloud-authorization": ""}
257 with requests_mock
.Mocker() as mock_requests
:
261 url_pattern
="/api/vApp/.*",
262 response_file
="404.txt",
264 response
= self
.collector
.get_vapp_details_rest("")
265 self
.assertDictEqual(
266 response
, {}, "XML parse error should return empty dictionary"
270 class Get_VM_Moref_Test(TestCase
):
271 @mock.patch
.object(VMwareCollector
, "get_vim_account", spec_set
=True, autospec
=True)
272 @mock.patch("osm_mon.collector.vnf_collectors.vmware.CommonDbClient")
273 def setUp(self
, mock_db
, mock_get_vim_account
):
275 self
.mock_db
= mock_db
276 mock_vim_session
= mock
.Mock()
277 mock_get_vim_account
.return_value
= VIM_ACCOUNT
278 self
.collector
= VMwareCollector(
279 Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4", mock_vim_session
286 VMwareCollector
, "get_vapp_details_rest", spec_set
=True, autospec
=True
288 def test_get_vm_moref_id(self
, mock_vapp_details
):
289 mock_vapp_details
.return_value
= {"vm_vcenter_info": {"vm_moref_id": "vm-4055"}}
290 response
= self
.collector
.get_vm_moref_id("1234")
292 response
, "vm-4055", "Did not fetch correct ref id from dictionary"
296 VMwareCollector
, "get_vapp_details_rest", spec_set
=True, autospec
=True
298 def test_get_vm_moref_bad_content(self
, mock_vapp_details
):
299 mock_vapp_details
.return_value
= {}
300 response
= self
.collector
.get_vm_moref_id("1234")
302 response
, None, "Error fetching vapp details should return None"
306 VMwareCollector
, "get_vapp_details_rest", spec_set
=True, autospec
=True
308 def test_get_vm_moref_has_exception(self
, mock_vapp_details
):
309 mock_vapp_details
.side_effect
= Exception("Testing")
310 response
= self
.collector
.get_vm_moref_id("1234")
312 response
, None, "Exception while fetching vapp details should return None"