from osm_mon.collector.vnf_collectors.vmware import VMwareCollector
from osm_mon.core.config import Config
-from osm_mon.tests.unit.collector.vnf_collectors.vmware.mock_vcd import mock_vdc_response
+from osm_mon.tests.unit.collector.vnf_collectors.vmware.mock_http import (
+ mock_http_response,
+)
from unittest import TestCase, mock
import json
import os
import requests_mock
-VIM_ACCOUNT = {"vrops_site": "https://vrops",
- "vrops_user": "",
- "vrops_password": "",
- "vim_url": "",
- "admin_username": "",
- "admin_password": "",
- "vim_uuid": ""}
+VIM_ACCOUNT = {
+ "vrops_site": "https://vrops",
+ "vrops_user": "",
+ "vrops_password": "",
+ "vim_url": "https://vcd",
+ "admin_username": "",
+ "admin_password": "",
+ "vim_uuid": "",
+}
-@mock.patch.object(VMwareCollector, 'get_vm_resource_id',
- spec_set=True, autospec=True)
-@mock.patch.object(VMwareCollector, 'get_vm_moref_id',
- spec_set=True, autospec=True)
+@mock.patch.object(VMwareCollector, "get_vm_moref_id", spec_set=True, autospec=True)
class CollectorTest(TestCase):
-
- @mock.patch.object(VMwareCollector, 'get_vim_account',
- spec_set=True, autospec=True)
- @mock.patch('osm_mon.collector.vnf_collectors.vmware.CommonDbClient')
+ @mock.patch.object(VMwareCollector, "get_vim_account", spec_set=True, autospec=True)
+ @mock.patch("osm_mon.collector.vnf_collectors.vmware.CommonDbClient")
def setUp(self, mock_db, mock_get_vim_account):
super().setUp()
mock_get_vim_account.return_value = VIM_ACCOUNT
- self.collector = VMwareCollector(Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4")
+ self.collector = VMwareCollector(
+ Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4"
+ )
self.mock_db = mock_db
- with open(os.path.join(os.path.dirname(__file__), 'osm_mocks', 'VNFR.json'), 'r') as f:
+ with open(
+ os.path.join(os.path.dirname(__file__), "osm_mocks", "VNFR.json"), "r"
+ ) as f:
self.vnfr = json.load(f)
- with open(os.path.join(os.path.dirname(__file__), 'osm_mocks', 'VNFD.json'), 'r') as f:
+ with open(
+ os.path.join(os.path.dirname(__file__), "osm_mocks", "VNFD.json"), "r"
+ ) as f:
self.vnfd = json.load(f)
def tearDown(self):
super().tearDown()
- def test_collect_cpu_and_memory(self, mock_vm_moref_id, mock_vm_resource_id):
+ def test_collect_cpu_and_memory(self, mock_vm_moref_id):
- mock_vm_moref_id.return_value = "moref"
- mock_vm_resource_id.return_value = "resource"
+ mock_vm_moref_id.return_value = "VMWARE-OID-VM-1"
+ self.vnfd["vdu"][0]["monitoring-parameter"] = [
+ {"id": "ubuntu_vnf_cpu_util", "performance-metric": "cpu_utilization"},
+ {
+ "id": "ubuntu_vnf_average_memory_utilization",
+ "performance-metric": "average_memory_utilization",
+ },
+ ]
self.mock_db.return_value.get_vnfd.return_value = self.vnfd
with requests_mock.Mocker() as mock_requests:
- mock_vdc_response(mock_requests,
- url_pattern='/suite-api/api/resources/stats.*',
- response_file='vrops_multi.json')
+ mock_http_response(
+ mock_requests,
+ method="POST",
+ url_pattern="/suite-api/api/auth/token/acquire",
+ response_file="vrops_token.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources\\?resourceKind=VirtualMachine",
+ response_file="vrops_resources.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources/stats.*",
+ response_file="vrops_multi.json",
+ )
metrics = self.collector.collect(self.vnfr)
- self.assertEqual(len(metrics), 2, "Number of metrics returned")
- self.assertEqual(metrics[0].name, "cpu_utilization", "First metric name")
- self.assertEqual(metrics[1].name, "average_memory_utilization", "Second metric name")
- self.assertEqual(metrics[0].value, 100.0, "CPU metric value")
- self.assertEqual(metrics[1].value, 20.515941619873047, "Memory metric value")
-
- def test_collect_one_metric_only(self, mock_vm_moref_id, mock_vm_resource_id):
-
- mock_vm_moref_id.return_value = "moref"
- mock_vm_resource_id.return_value = "resource"
+ self.assertEqual(len(metrics), 2, "Number of metrics returned")
+ self.assertEqual(metrics[0].name, "cpu_utilization", "First metric name")
+ self.assertEqual(metrics[0].value, 100.0, "CPU metric value")
+ self.assertEqual(
+ metrics[1].name, "average_memory_utilization", "Second metric name"
+ )
+ self.assertEqual(metrics[1].value, 20.515941619873047, "Memory metric value")
- self.vnfd['vdu'][0]['monitoring-param'] = [
- {'id': 'cirros_vnfd-VM_cpu_util', 'nfvi-metric': 'cpu_utilization'},
- ]
+ def test_collect_no_moref(self, mock_vm_moref_id):
+ mock_vm_moref_id.return_value = None
self.mock_db.return_value.get_vnfd.return_value = self.vnfd
-
with requests_mock.Mocker() as mock_requests:
- mock_vdc_response(mock_requests,
- url_pattern='/suite-api/api/resources/stats.*',
- response_file='vrops_multi.json')
+ mock_http_response(
+ mock_requests,
+ method="POST",
+ url_pattern="/suite-api/api/auth/token/acquire",
+ response_file="vrops_token.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources\\?resourceKind=VirtualMachine",
+ response_file="404.txt",
+ status_code=404,
+ )
metrics = self.collector.collect(self.vnfr)
- self.assertEqual(len(metrics), 1, "Number of metrics returned")
- self.assertEqual(metrics[0].name, "cpu_utilization", "First metric name")
- self.assertEqual(metrics[0].value, 100.0, "CPU metric value")
-
- def test_collect_adjusted_metric(self, mock_vm_moref_id, mock_vm_resource_id):
+ self.assertEqual(len(metrics), 0, "Number of metrics returned")
- mock_vm_moref_id.return_value = "moref"
- mock_vm_resource_id.return_value = "resource"
+ def test_collect_no_monitoring_param(self, _):
+ self.vnfd["vdu"][0]["monitoring-parameter"] = []
+ self.mock_db.return_value.get_vnfd.return_value = self.vnfd
+ with requests_mock.Mocker() as mock_requests:
+ mock_http_response(
+ mock_requests,
+ method="POST",
+ url_pattern="/suite-api/api/auth/token/acquire",
+ response_file="vrops_token.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources\\?resourceKind=VirtualMachine",
+ response_file="vrops_resources.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources/stats.*",
+ response_file="vrops_multi.json",
+ )
+ metrics = self.collector.collect(self.vnfr)
+ self.assertEqual(len(metrics), 0, "Number of metrics returned")
- self.vnfd['vdu'][0]['monitoring-param'] = [
- {'id': 'cirros_vnfd-VM_cpu_util', 'nfvi-metric': 'disk_read_bytes'},
- ]
+ def test_collect_empty_monitoring_param(self, _):
+ del self.vnfd["vdu"][0]["monitoring-parameter"]
self.mock_db.return_value.get_vnfd.return_value = self.vnfd
+ with requests_mock.Mocker() as mock_requests:
+ mock_http_response(
+ mock_requests,
+ method="POST",
+ url_pattern="/suite-api/api/auth/token/acquire",
+ response_file="vrops_token.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources\\?resourceKind=VirtualMachine",
+ response_file="vrops_resources.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources/stats.*",
+ response_file="vrops_multi.json",
+ )
+ metrics = self.collector.collect(self.vnfr)
+ self.assertEqual(len(metrics), 0, "Number of metrics returned")
+ def test_collect_no_name(self, _):
+ del self.vnfr["vdur"][0]["name"]
+ del self.vnfr["vdur"][1]["name"]
+ self.mock_db.return_value.get_vnfd.return_value = self.vnfd
with requests_mock.Mocker() as mock_requests:
- mock_vdc_response(mock_requests,
- url_pattern='/suite-api/api/resources/stats.*',
- response_file='vrops_multi.json')
+ mock_http_response(
+ mock_requests,
+ method="POST",
+ url_pattern="/suite-api/api/auth/token/acquire",
+ response_file="vrops_token.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources\\?resourceKind=VirtualMachine",
+ response_file="vrops_resources.json",
+ )
+ mock_http_response(
+ mock_requests,
+ url_pattern="/suite-api/api/resources/stats.*",
+ response_file="vrops_multi.json",
+ )
metrics = self.collector.collect(self.vnfr)
- self.assertEqual(len(metrics), 1, "Number of metrics returned")
- self.assertEqual(metrics[0].name, "disk_read_bytes", "First metric name")
- self.assertEqual(metrics[0].value, 10240.0, "Disk read bytes (not KB/s)")
+ self.assertEqual(len(metrics), 0, "Number of metrics returned")
- def test_collect_not_provided_metric(self, mock_vm_moref_id, mock_vm_resource_id):
- mock_vm_moref_id.return_value = "moref"
- mock_vm_resource_id.return_value = "resource"
+class VApp_Details_Test(TestCase):
+ @mock.patch.object(VMwareCollector, "get_vim_account", spec_set=True, autospec=True)
+ @mock.patch("osm_mon.collector.vnf_collectors.vmware.CommonDbClient")
+ def setUp(self, mock_db, mock_get_vim_account):
+ super().setUp()
+ self.mock_db = mock_db
+ mock_get_vim_account.return_value = VIM_ACCOUNT
+ self.collector = VMwareCollector(
+ Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4"
+ )
- self.vnfd['vdu'][0]['monitoring-param'] = [
- {'id': 'cirros_vnfd-VM_packets_sent', 'nfvi-metric': 'packets_sent'},
- ]
- self.mock_db.return_value.get_vnfd.return_value = self.vnfd
+ def tearDown(self):
+ super().tearDown()
+ @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
+ def test_get_vapp_details(self, mock_vcd_client):
+ mock_vcd_client.return_value._session.headers = {"x-vcloud-authorization": ""}
with requests_mock.Mocker() as mock_requests:
- mock_vdc_response(mock_requests,
- url_pattern='/suite-api/api/resources/stats.*',
- response_file='OK.json')
- metrics = self.collector.collect(self.vnfr)
- self.assertEqual(len(metrics), 0, "Number of metrics returned")
+ mock_http_response(
+ mock_requests,
+ site="https://vcd",
+ url_pattern="/api/vApp/.*",
+ response_file="vcd_vapp_response.xml",
+ )
+ response = self.collector.get_vapp_details_rest("")
+ self.assertDictContainsSubset(
+ {"vm_vcenter_info": {"vm_moref_id": "vm-4055"}},
+ response,
+ "Managed object reference id incorrect",
+ )
- def test_collect_unkown_metric(self, mock_vm_moref_id, mock_vm_resource_id):
+ def test_no_admin_connect(self):
+ response = self.collector.get_vapp_details_rest("")
+ self.assertDictEqual(
+ response, {}, "Failed to connect should return empty dictionary"
+ )
- mock_vm_moref_id.return_value = "moref"
- mock_vm_resource_id.return_value = "resource"
+ def test_no_id(self):
+ response = self.collector.get_vapp_details_rest()
+ self.assertDictEqual(
+ response, {}, "No id supplied should return empty dictionary"
+ )
- self.vnfd['vdu'][0]['monitoring-param'] = [
- {'id': 'cirros_vnfd-Unknown_Metric', 'nfvi-metric': 'unknown'},
- ]
- self.mock_db.return_value.get_vnfd.return_value = self.vnfd
+ @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
+ def test_get_vapp_details_404(self, mock_vcd_client):
+ mock_vcd_client.return_value._session.headers = {"x-vcloud-authorization": ""}
+ with requests_mock.Mocker() as mock_requests:
+ mock_http_response(
+ mock_requests,
+ site="https://vcd",
+ url_pattern="/api/vApp/.*",
+ response_file="404.txt",
+ status_code=404,
+ )
+ response = self.collector.get_vapp_details_rest("")
+ self.assertDictEqual(response, {}, "HTTP error should return empty dictionary")
+ @mock.patch("osm_mon.collector.vnf_collectors.vmware.Client")
+ def test_get_vapp_details_xml_parse_error(self, mock_vcd_client):
+ mock_vcd_client.return_value._session.headers = {"x-vcloud-authorization": ""}
with requests_mock.Mocker() as mock_requests:
- mock_vdc_response(mock_requests,
- url_pattern='/suite-api/api/resources/stats.*',
- response_file='vrops_multi.json')
- metrics = self.collector.collect(self.vnfr)
- self.assertEqual(len(metrics), 0, "Number of metrics returned")
+ mock_http_response(
+ mock_requests,
+ site="https://vcd",
+ url_pattern="/api/vApp/.*",
+ response_file="404.txt",
+ )
+ response = self.collector.get_vapp_details_rest("")
+ self.assertDictEqual(
+ response, {}, "XML parse error should return empty dictionary"
+ )
- def test_collect_vrops_error(self, mock_vm_moref_id, mock_vm_resource_id):
- mock_vm_moref_id.return_value = "moref"
- mock_vm_resource_id.return_value = "resource"
- self.mock_db.return_value.get_vnfd.return_value = self.vnfd
+class Get_VM_Moref_Test(TestCase):
+ @mock.patch.object(VMwareCollector, "get_vim_account", spec_set=True, autospec=True)
+ @mock.patch("osm_mon.collector.vnf_collectors.vmware.CommonDbClient")
+ def setUp(self, mock_db, mock_get_vim_account):
+ super().setUp()
+ self.mock_db = mock_db
+ mock_get_vim_account.return_value = VIM_ACCOUNT
+ self.collector = VMwareCollector(
+ Config(), "9de6df67-b820-48c3-bcae-ee4838c5c5f4"
+ )
- with requests_mock.Mocker():
- metrics = self.collector.collect(self.vnfr)
- self.assertEqual(len(metrics), 0, "Number of metrics returned")
+ def tearDown(self):
+ super().tearDown()
+
+ @mock.patch.object(
+ VMwareCollector, "get_vapp_details_rest", spec_set=True, autospec=True
+ )
+ def test_get_vm_moref_id(self, mock_vapp_details):
+ mock_vapp_details.return_value = {"vm_vcenter_info": {"vm_moref_id": "vm-4055"}}
+ response = self.collector.get_vm_moref_id("1234")
+ self.assertEqual(
+ response, "vm-4055", "Did not fetch correct ref id from dictionary"
+ )
+
+ @mock.patch.object(
+ VMwareCollector, "get_vapp_details_rest", spec_set=True, autospec=True
+ )
+ def test_get_vm_moref_bad_content(self, mock_vapp_details):
+ mock_vapp_details.return_value = {}
+ response = self.collector.get_vm_moref_id("1234")
+ self.assertEqual(
+ response, None, "Error fetching vapp details should return None"
+ )
+
+ @mock.patch.object(
+ VMwareCollector, "get_vapp_details_rest", spec_set=True, autospec=True
+ )
+ def test_get_vm_moref_has_exception(self, mock_vapp_details):
+ mock_vapp_details.side_effect = Exception("Testing")
+ response = self.collector.get_vm_moref_id("1234")
+ self.assertEqual(
+ response, None, "Exception while fetching vapp details should return None"
+ )