aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_so_instantiation.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_so_instantiation.py')
-rw-r--r--tests/test_so_instantiation.py1002
1 files changed, 1002 insertions, 0 deletions
diff --git a/tests/test_so_instantiation.py b/tests/test_so_instantiation.py
new file mode 100644
index 0000000..5c8f41a
--- /dev/null
+++ b/tests/test_so_instantiation.py
@@ -0,0 +1,1002 @@
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import json
+import oyaml as yaml
+from collections import namedtuple
+from pathlib import Path
+from unittest import mock
+
+import pytest
+
+from onapsdk.exceptions import APIError, InvalidResponse, ResourceNotFound, StatusError
+from onapsdk.sdc.service import Service
+from onapsdk.sdnc import NetworkPreload, VfModulePreload
+from onapsdk.so.instantiation import (
+ NetworkInstantiation,
+ ServiceInstantiation,
+ SoService,
+ SoServicePnf,
+ SoServiceVfModule,
+ SoServiceVnf,
+ VfModuleInstantiation,
+ VnfInstantiation,
+ VnfOperation
+)
+from onapsdk.vid import Vid
+from onapsdk.aai.business.owning_entity import OwningEntity
+
+
+@mock.patch.object(ServiceInstantiation, "send_message_json")
+def test_service_ala_carte_instantiation(mock_service_instantiation_send_message):
+ mock_sdc_service = mock.MagicMock()
+ mock_sdc_service.distributed = False
+ with pytest.raises(StatusError):
+ ServiceInstantiation.\
+ instantiate_ala_carte(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ service_instance_name="test",
+ service_subscription=mock.MagicMock())
+ mock_sdc_service.distributed = True
+ service_instance = ServiceInstantiation.\
+ instantiate_ala_carte(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ service_instance_name="test",
+ service_subscription=mock.MagicMock())
+ assert service_instance.name == "test"
+
+ service_instance = ServiceInstantiation.\
+ instantiate_ala_carte(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ service_subscription=mock.MagicMock())
+ assert service_instance.name.startswith("Python_ONAP_SDK_service_instance_")
+ mock_service_instantiation_send_message.assert_called()
+ method, _, url = mock_service_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{ServiceInstantiation.base_url}/onap/so/infra/"
+ f"serviceInstantiation/{ServiceInstantiation.api_version}/serviceInstances")
+
+
+@mock.patch.object(ServiceInstantiation, "send_message_json")
+def test_service_macro_instantiation(mock_service_instantiation_send_message):
+ mock_sdc_service = mock.MagicMock()
+ mock_sdc_service.distributed = False
+ with pytest.raises(StatusError):
+ ServiceInstantiation.\
+ instantiate_macro(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ service_instance_name="test",
+ service_subscription=mock.MagicMock())
+ mock_sdc_service.distributed = True
+ service_instance = ServiceInstantiation.\
+ instantiate_macro(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ service_instance_name="test",
+ service_subscription=mock.MagicMock())
+ assert service_instance.name == "test"
+
+ service_instance = ServiceInstantiation.\
+ instantiate_macro(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ project=mock.MagicMock(),
+ so_service=mock.MagicMock())
+ assert service_instance.name.startswith("Python_ONAP_SDK_service_instance_")
+ mock_service_instantiation_send_message.assert_called()
+ method, _, url = mock_service_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{ServiceInstantiation.base_url}/onap/so/infra/"
+ f"serviceInstantiation/{ServiceInstantiation.api_version}/serviceInstances")
+
+ so_service_mock = mock.MagicMock()
+ so_service_mock.instance_name = "SoServiceInstanceName"
+ service_instance = ServiceInstantiation.\
+ instantiate_macro(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ project=mock.MagicMock(),
+ so_service=so_service_mock)
+ assert service_instance.name == "SoServiceInstanceName"
+ mock_service_instantiation_send_message.assert_called()
+ method, _, url = mock_service_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{ServiceInstantiation.base_url}/onap/so/infra/"
+ f"serviceInstantiation/{ServiceInstantiation.api_version}/serviceInstances")
+
+
+def test_service_instance_aai_service_instance():
+ customer_mock = mock.MagicMock()
+ service_instantiation = ServiceInstantiation(name="test",
+ request_id="test_request_id",
+ instance_id="test_instance_id",
+ sdc_service=mock.MagicMock(),
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=customer_mock,
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock())
+ status_mock = mock.PropertyMock(return_value=ServiceInstantiation.StatusEnum.IN_PROGRESS)
+ type(service_instantiation).status = status_mock
+ with pytest.raises(StatusError):
+ service_instantiation.aai_service_instance
+
+ status_mock.return_value = return_value=ServiceInstantiation.StatusEnum.COMPLETED
+ assert service_instantiation.aai_service_instance is not None
+
+ customer_mock.get_service_subscription_by_service_type.side_effect = APIError
+ with pytest.raises(APIError) as err:
+ service_instantiation.aai_service_instance
+ assert err.type == APIError
+
+
+@mock.patch.object(VnfInstantiation, "send_message_json")
+def test_vnf_instantiation(mock_vnf_instantiation_send_message):
+ aai_service_instance_mock = mock.MagicMock()
+ aai_service_instance_mock.instance_id = "test_instance_id"
+ vnf_instantiation = VnfInstantiation.\
+ instantiate_ala_carte(aai_service_instance=aai_service_instance_mock,
+ vnf_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ sdc_service=mock.MagicMock())
+ assert vnf_instantiation.name.startswith("Python_ONAP_SDK_vnf_instance_")
+ mock_vnf_instantiation_send_message.assert_called_once()
+ method, _, url = mock_vnf_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{VnfInstantiation.base_url}/onap/so/infra/serviceInstantiation/"
+ f"{VnfInstantiation.api_version}/serviceInstances/"
+ f"{aai_service_instance_mock.instance_id}/vnfs")
+
+ vnf_instantiation = VnfInstantiation.\
+ instantiate_ala_carte(aai_service_instance=aai_service_instance_mock,
+ vnf_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ vnf_instance_name="test",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ sdc_service=mock.MagicMock())
+ assert vnf_instantiation.name == "test"
+
+
+@mock.patch.object(VnfInstantiation, "send_message_json")
+def test_vnf_instantiation_with_cr_and_tenant(mock_vnf_instantiation_send_message):
+ aai_service_instance_mock = mock.MagicMock()
+ aai_service_instance_mock.instance_id = "test_instance_id"
+ vnf_instantiation = VnfInstantiation.\
+ instantiate_ala_carte(aai_service_instance=aai_service_instance_mock,
+ vnf_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ sdc_service=mock.MagicMock())
+ assert vnf_instantiation.name.startswith("Python_ONAP_SDK_vnf_instance_")
+ mock_vnf_instantiation_send_message.assert_called_once()
+ method, _, url = mock_vnf_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{VnfInstantiation.base_url}/onap/so/infra/serviceInstantiation/"
+ f"{VnfInstantiation.api_version}/serviceInstances/"
+ f"{aai_service_instance_mock.instance_id}/vnfs")
+
+ vnf_instantiation = VnfInstantiation.\
+ instantiate_ala_carte(aai_service_instance=aai_service_instance_mock,
+ vnf_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ vnf_instance_name="test",
+ sdc_service=mock.MagicMock())
+ assert vnf_instantiation.name == "test"
+
+
+@mock.patch.object(VnfInstantiation, "send_message_json")
+@mock.patch.object(OwningEntity, "get_by_owning_entity_id")
+def test_vnf_instantiation_macro(mock_owning_entity_get, mock_vnf_instantiation_send_message):
+ aai_service_instance_mock = mock.MagicMock()
+ aai_service_instance_mock.instance_id = "test_instance_id"
+
+ relation_1 = mock.MagicMock()
+ relation_1.related_to = "owning-entity"
+ relation_1.relationship_data = [{"relationship-value": "test"}]
+ relation_2 = mock.MagicMock()
+ relation_2.related_to = "project"
+ relation_2.relationship_data = [{"relationship-value": "test"}]
+
+ aai_service_instance_mock.relationships = (item for item in [relation_1, relation_2])
+
+ vnf_instantiation = VnfInstantiation.\
+ instantiate_macro(aai_service_instance=aai_service_instance_mock,
+ vnf_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ sdc_service=mock.MagicMock())
+ assert vnf_instantiation.name.startswith("Python_ONAP_SDK_vnf_instance_")
+ mock_vnf_instantiation_send_message.assert_called_once()
+ method, _, url = mock_vnf_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{VnfInstantiation.base_url}/onap/so/infra/serviceInstantiation/"
+ f"{VnfInstantiation.api_version}/serviceInstances/"
+ f"{aai_service_instance_mock.instance_id}/vnfs")
+
+ vnf_instantiation = VnfInstantiation. \
+ instantiate_macro(aai_service_instance=aai_service_instance_mock,
+ vnf_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ vnf_instance_name="test",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ sdc_service=mock.MagicMock())
+ assert vnf_instantiation.name == "test"
+
+ vnf_instantiation = VnfInstantiation. \
+ instantiate_macro(aai_service_instance=aai_service_instance_mock,
+ vnf_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ sdc_service=mock.MagicMock(),
+ so_vnf=mock.MagicMock())
+ assert vnf_instantiation.name.startswith("Python_ONAP_SDK_service_instance_")
+
+ so_vnf_mock = mock.MagicMock()
+ so_vnf_mock.instance_name = "SoVnfInstanceName"
+ vnf_instantiation = VnfInstantiation. \
+ instantiate_macro(aai_service_instance=aai_service_instance_mock,
+ vnf_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ sdc_service=mock.MagicMock(),
+ so_vnf=so_vnf_mock)
+ assert vnf_instantiation.name == "SoVnfInstanceName"
+
+
+@mock.patch.object(VnfInstantiation, "send_message_json")
+@mock.patch.object(OwningEntity, "get_by_owning_entity_id")
+def test_vnf_macro_so_action(mock_owning_entity_get, mock_vnf_instantiation_send_message):
+
+ mock_sdc_service = mock.MagicMock()
+ with pytest.raises(StatusError):
+ VnfInstantiation.\
+ so_action(vnf_instance=mock.MagicMock(),
+ operation_type=mock.MagicMock(),
+ aai_service_instance=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ sdc_service=mock_sdc_service,
+ so_service=mock.MagicMock())
+
+ relation_1 = mock.MagicMock()
+ relation_1.related_to = "owning-entity"
+ relation_1.relationship_data = [{"relationship-value": "test"}]
+ relation_2 = mock.MagicMock()
+ relation_2.related_to = "project"
+ relation_2.relationship_data = [{"relationship-value": "test"}]
+
+ mock_aai_service_instance = mock.MagicMock()
+ mock_aai_service_instance.instance_id = mock.MagicMock()
+ mock_aai_service_instance.relationships = (item for item in [relation_1, relation_2])
+ mock_aai_service_instance.service_subscription = mock.MagicMock()
+ mock_vnf_instance = mock.MagicMock()
+ mock_vnf_instance.vnf_name = "test_name_update"
+ mock_vnf_instance.vnf_id = "1234"
+
+ vnf_instance_update = VnfInstantiation.\
+ so_action(vnf_instance=mock_vnf_instance,
+ operation_type=VnfOperation.UPDATE,
+ aai_service_instance=mock_aai_service_instance,
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ sdc_service=mock_sdc_service,
+ so_service=mock.MagicMock())
+ assert vnf_instance_update.name == "test_name_update"
+ mock_vnf_instantiation_send_message.assert_called()
+ method, _, url = mock_vnf_instantiation_send_message.call_args[0]
+ assert method == "PUT"
+ assert url == (f"{ServiceInstantiation.base_url}/onap/so/infra/"
+ f"serviceInstantiation/{ServiceInstantiation.api_version}/serviceInstances/"
+ f"{mock_aai_service_instance.instance_id}/vnfs/{mock_vnf_instance.vnf_id}")
+
+ mock_vnf_instance = mock.MagicMock()
+ mock_vnf_instance.vnf_name = "test_name_healthcheck"
+
+ vnf_instance_healthcheck = VnfInstantiation. \
+ so_action(vnf_instance=mock_vnf_instance,
+ operation_type=VnfOperation.HEALTHCHECK,
+ aai_service_instance=mock_aai_service_instance,
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ sdc_service=mock_sdc_service,
+ so_service=mock.MagicMock())
+ assert vnf_instance_healthcheck.name == "test_name_healthcheck"
+ mock_vnf_instantiation_send_message.assert_called()
+ method, _, url = mock_vnf_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{ServiceInstantiation.base_url}/onap/so/infra/"
+ f"serviceInstantiation/{ServiceInstantiation.api_version}/serviceInstances/"
+ f"{mock_aai_service_instance.instance_id}/vnfs/{mock_vnf_instance.vnf_id}/healthcheck")
+
+
+@mock.patch.object(NetworkInstantiation, "send_message_json")
+@mock.patch.object(NetworkPreload, "send_message_json")
+def test_network_instantiation(mock_network_preload, mock_network_instantiation_send_message):
+ aai_service_instance_mock = mock.MagicMock()
+ aai_service_instance_mock.instance_id = "test_instance_id"
+ vnf_instantiation = NetworkInstantiation.\
+ instantiate_ala_carte(aai_service_instance=aai_service_instance_mock,
+ network_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock())
+ mock_network_preload.assert_called_once()
+ assert vnf_instantiation.name.startswith("Python_ONAP_SDK_network_instance_")
+ mock_network_instantiation_send_message.assert_called_once()
+ method, _, url = mock_network_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{NetworkInstantiation.base_url}/onap/so/infra/serviceInstantiation/"
+ f"{NetworkInstantiation.api_version}/serviceInstances/"
+ f"{aai_service_instance_mock.instance_id}/networks")
+
+ network_instantiation = NetworkInstantiation.\
+ instantiate_ala_carte(aai_service_instance=aai_service_instance_mock,
+ network_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ network_instance_name="test",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock())
+ assert mock_network_preload.call_count == 2
+ assert network_instantiation.name == "test"
+
+
+@mock.patch.object(NetworkInstantiation, "send_message_json")
+@mock.patch.object(NetworkPreload, "send_message_json")
+def test_network_instantiation_with_cr_and_tenant(mock_network_preload, mock_network_instantiation_send_message):
+ aai_service_instance_mock = mock.MagicMock()
+ aai_service_instance_mock.instance_id = "test_instance_id"
+ vnf_instantiation = NetworkInstantiation.\
+ instantiate_ala_carte(aai_service_instance=aai_service_instance_mock,
+ network_object=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock())
+ mock_network_preload.assert_called_once()
+ assert vnf_instantiation.name.startswith("Python_ONAP_SDK_network_instance_")
+ mock_network_instantiation_send_message.assert_called_once()
+ method, _, url = mock_network_instantiation_send_message.call_args[0]
+ assert method == "POST"
+ assert url == (f"{NetworkInstantiation.base_url}/onap/so/infra/serviceInstantiation/"
+ f"{NetworkInstantiation.api_version}/serviceInstances/"
+ f"{aai_service_instance_mock.instance_id}/networks")
+
+ network_instantiation = NetworkInstantiation.\
+ instantiate_ala_carte(aai_service_instance=aai_service_instance_mock,
+ network_object=mock.MagicMock(),
+ line_of_business="test_lob",
+ platform="test_platform",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ network_instance_name="test")
+ assert mock_network_preload.call_count == 2
+ assert network_instantiation.name == "test"
+
+@mock.patch.object(Vid, "send_message")
+@mock.patch.object(VnfInstantiation, "send_message_json")
+@mock.patch("onapsdk.so.instantiation.SdcService")
+def test_vnf_instantiation_get_by_vnf_instance_name(mock_sdc_service, mock_send_message_json, mock_send):
+ mock_sdc_service.return_value.vnfs = []
+ mock_send_message_json.return_value = {}
+ with pytest.raises(InvalidResponse):
+ VnfInstantiation.get_by_vnf_instance_name("test_vnf_instance_name")
+ mock_send_message_json.return_value = {
+ "requestList": [
+ {
+ "request": {
+ "requestScope": "not_vnf"
+ }
+ }
+ ]
+ }
+ with pytest.raises(InvalidResponse):
+ VnfInstantiation.get_by_vnf_instance_name("test_vnf_instance_name")
+ mock_send_message_json.return_value = {
+ "requestList": [
+ {
+ "request": {
+ "requestScope": "vnf",
+ "requestType": "updateInstance"
+ }
+ }
+ ]
+ }
+ with pytest.raises(InvalidResponse):
+ VnfInstantiation.get_by_vnf_instance_name("test_vnf_instance_name")
+ mock_send_message_json.return_value = {
+ "requestList": [
+ {
+ "request": {
+ "requestScope": "vnf",
+ "requestType": "createInstance"
+ }
+ }
+ ]
+ }
+ with pytest.raises(ResourceNotFound):
+ VnfInstantiation.get_by_vnf_instance_name("test_vnf_instance_name")
+ mock_send_message_json.return_value = {
+ "requestList": [
+ {
+ "request": {
+ "requestScope": "vnf",
+ "requestType": "createInstance",
+ "requestDetails": {
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "modelInfo": {
+ "modelType": "service",
+ "modelName": "test_service"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ with pytest.raises(ResourceNotFound):
+ VnfInstantiation.get_by_vnf_instance_name("test_vnf_instance_name")
+ mock_vnf = mock.MagicMock()
+ mock_vnf.name = "test_vnf_name"
+ mock_sdc_service.return_value.vnfs = [mock_vnf]
+ mock_send_message_json.return_value = {
+ "requestList": [
+ {
+ "request": {
+ "requestScope": "vnf",
+ "requestType": "createInstance",
+ "requestDetails": {
+ "modelInfo": {
+ "modelCustomizationName": "test_fail_vnf_name"
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "modelInfo": {
+ "modelType": "service",
+ "modelName": "test_service",
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ with pytest.raises(ResourceNotFound):
+ VnfInstantiation.get_by_vnf_instance_name("test_vnf_instance_name")
+ mock_sdc_service.return_value.vnfs = [mock_vnf]
+ mock_send_message_json.return_value = {
+ "requestList": [
+ {
+ "request": {
+ "requestScope": "vnf",
+ "requestType": "createInstance",
+ "requestDetails": {
+ "modelInfo": {
+ "modelCustomizationName": "test_vnf_name"
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "modelInfo": {
+ "modelType": "service",
+ "modelName": "test_service"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ assert VnfInstantiation.get_by_vnf_instance_name("test_vnf_instance_name") is not None
+
+
+@mock.patch.object(VfModuleInstantiation, "send_message_json")
+@mock.patch.object(VfModulePreload, "upload_vf_module_preload")
+def test_vf_module_instantiation(mock_vf_module_preload, mock_send_message_json):
+ mock_service_instance = mock.MagicMock()
+ mock_service_instance.instance_id = "1234"
+ mock_vnf_instance = mock.MagicMock()
+ mock_vnf_instance.service_instance = mock_service_instance
+ mock_vnf_instance.vnf_id = "4321"
+ instantiation = VfModuleInstantiation.\
+ instantiate_ala_carte(vf_module=mock.MagicMock(),
+ vnf_instance=mock_vnf_instance,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock())
+ assert instantiation.name.startswith("Python_ONAP_SDK_vf_module_instance_")
+ mock_send_message_json.assert_called_once()
+ method, _, url = mock_send_message_json.call_args[0]
+ assert method == "POST"
+ assert url == (f"{VfModuleInstantiation.base_url}/onap/so/infra/serviceInstantiation/"
+ f"{VfModuleInstantiation.api_version}/serviceInstances/1234/vnfs/"
+ f"4321/vfModules")
+
+ instantiation = VfModuleInstantiation.\
+ instantiate_ala_carte(vf_module=mock.MagicMock(),
+ vnf_instance=mock_vnf_instance,
+ vf_module_instance_name="test",
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock())
+ assert instantiation.name == "test"
+
+
+@mock.patch.object(VfModuleInstantiation, "send_message_json")
+@mock.patch.object(VfModulePreload, "upload_vf_module_preload")
+def test_vf_module_instantiation_with_cr_and_tenant(mock_vf_module_preload, mock_send_message_json):
+ mock_service_instance = mock.MagicMock()
+ mock_service_instance.instance_id = "1234"
+ mock_vnf_instance = mock.MagicMock()
+ mock_vnf_instance.service_instance = mock_service_instance
+ mock_vnf_instance.vnf_id = "4321"
+ instantiation = VfModuleInstantiation.\
+ instantiate_ala_carte(vf_module=mock.MagicMock(),
+ vnf_instance=mock_vnf_instance,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock())
+ assert instantiation.name.startswith("Python_ONAP_SDK_vf_module_instance_")
+ mock_send_message_json.assert_called_once()
+ method, _, url = mock_send_message_json.call_args[0]
+ assert method == "POST"
+ assert url == (f"{VfModuleInstantiation.base_url}/onap/so/infra/serviceInstantiation/"
+ f"{VfModuleInstantiation.api_version}/serviceInstances/1234/vnfs/"
+ f"4321/vfModules")
+
+ instantiation = VfModuleInstantiation.\
+ instantiate_ala_carte(vf_module=mock.MagicMock(),
+ vnf_instance=mock_vnf_instance,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ vf_module_instance_name="test")
+ assert instantiation.name == "test"
+
+
+def test_instantiation_wait_for_finish():
+ with mock.patch.object(ServiceInstantiation, "finished", new_callable=mock.PropertyMock) as mock_finished:
+ with mock.patch.object(ServiceInstantiation, "completed", new_callable=mock.PropertyMock) as mock_completed:
+ instantiation = ServiceInstantiation(
+ name="test",
+ request_id="test",
+ instance_id="test",
+ sdc_service=mock.MagicMock(),
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock()
+ )
+ instantiation.WAIT_FOR_SLEEP_TIME = 0
+ mock_finished.side_effect = [False, False, True]
+ mock_completed.return_value = True
+ rv = namedtuple("Value", ["return_value"])
+ instantiation._wait_for_finish(rv)
+ assert rv.return_value
+
+@mock.patch.object(ServiceInstantiation, "send_message_json")
+def test_service_instantiation_multicloud(mock_send_message_json):
+
+ mock_sdc_service = mock.MagicMock()
+ mock_sdc_service.distributed = True
+ _ = ServiceInstantiation.\
+ instantiate_ala_carte(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ service_subscription=mock.MagicMock())
+ _, kwargs = mock_send_message_json.call_args
+ data = json.loads(kwargs["data"])
+ assert data["requestDetails"]["requestParameters"]["userParams"] == []
+ mock_send_message_json.reset_mock()
+
+ _ = ServiceInstantiation.\
+ instantiate_ala_carte(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ enable_multicloud=True,
+ service_subscription=mock.MagicMock())
+ _, kwargs = mock_send_message_json.call_args
+ data = json.loads(kwargs["data"])
+ assert data["requestDetails"]["requestParameters"]["userParams"] == [{"name": "orchestrator", "value": "multicloud"}]
+ mock_send_message_json.reset_mock()
+
+ _ = ServiceInstantiation.\
+ instantiate_macro(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ service_instance_name="test",
+ service_subscription=mock.MagicMock())
+ _, kwargs = mock_send_message_json.call_args
+ data = json.loads(kwargs["data"])
+ assert not any(filter(lambda x: x == {"name": "orchestrator", "value": "multicloud"}, data["requestDetails"]["requestParameters"]["userParams"]))
+ mock_send_message_json.reset_mock()
+
+ _ = ServiceInstantiation.\
+ instantiate_macro(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ service_instance_name="test",
+ enable_multicloud=True,
+ service_subscription=mock.MagicMock())
+ _, kwargs = mock_send_message_json.call_args
+ data = json.loads(kwargs["data"])
+ assert any(filter(lambda x: x == {"name": "orchestrator", "value": "multicloud"}, data["requestDetails"]["requestParameters"]["userParams"]))
+
+
+@mock.patch.object(ServiceInstantiation, "send_message_json")
+def test_service_instantiation_so_service(mock_send_message_json):
+ mock_sdc_service = mock.MagicMock()
+ mock_sdc_service.distributed = True
+
+ so_service = SoService(
+ subscription_service_type="test_so_service",
+ vnfs=[
+ SoServiceVnf(
+ model_name="test_so_service_vnf_model_name_1",
+ instance_name="test_so_service_vnf_instance_name_1",
+ parameters={
+ "param_1": "param_1_value",
+ "param_2": "param_2_value"
+ }
+ ),
+ SoServiceVnf(
+ model_name="test_so_service_vnf_model_name_2",
+ instance_name="test_so_service_vnf_instance_name_2",
+ vf_modules=[
+ SoServiceVfModule(
+ model_name="test_so_service_vf_module_model_name_1",
+ instance_name="test_so_service_vf_module_instance_name_1",
+ parameters={
+ "vf_module_param_1": "vf_module_param_1_value",
+ "vf_module_param_2": "vf_module_param_2_value"
+ }
+ ),
+ SoServiceVfModule(
+ model_name="test_so_service_vf_module_model_name_2",
+ instance_name="test_so_service_vf_module_instance_name_2",
+ parameters={
+ "vf_module_param_1": "vf_module_param_1_value",
+ "vf_module_param_2": "vf_module_param_2_value"
+ }
+ ),
+ ]
+ )
+ ],
+ pnfs=[
+ SoServicePnf(
+ model_name="test_so_service_pnf_model_name_1",
+ instance_name="test_so_service_pnf_instance_name_1"
+ ),
+ SoServicePnf(
+ model_name="test_so_service_pnf_model_name_2",
+ instance_name="test_so_service_pnf_instance_name_2"
+ )
+ ]
+ )
+
+ _ = ServiceInstantiation.\
+ instantiate_macro(sdc_service=mock_sdc_service,
+ cloud_region=mock.MagicMock(),
+ tenant=mock.MagicMock(),
+ customer=mock.MagicMock(),
+ owning_entity=mock.MagicMock(),
+ project=mock.MagicMock(),
+ line_of_business=mock.MagicMock(),
+ platform=mock.MagicMock(),
+ service_instance_name="test",
+ so_service=so_service)
+ _, kwargs = mock_send_message_json.call_args
+ data = json.loads(kwargs["data"])
+ assert data["requestDetails"]["requestParameters"]["subscriptionServiceType"] == "test_so_service"
+ assert len(data["requestDetails"]["requestParameters"]["userParams"][1]["service"]["resources"]["vnfs"]) == 2
+ assert len(data["requestDetails"]["requestParameters"]["userParams"][1]["service"]["resources"]["pnfs"]) == 2
+ vnf_1_data = data["requestDetails"]["requestParameters"]["userParams"][1]["service"]["resources"]["vnfs"][0]
+ vnf_2_data = data["requestDetails"]["requestParameters"]["userParams"][1]["service"]["resources"]["vnfs"][1]
+ pnf_1_data = data["requestDetails"]["requestParameters"]["userParams"][1]["service"]["resources"]["pnfs"][0]
+ pnf_2_data = data["requestDetails"]["requestParameters"]["userParams"][1]["service"]["resources"]["pnfs"][1]
+
+ assert vnf_1_data["instanceName"] == "test_so_service_vnf_instance_name_1"
+ assert len(vnf_1_data["instanceParams"][0]) == 2
+ assert vnf_1_data["instanceParams"][0]["param_1"] == "param_1_value"
+ assert vnf_1_data["instanceParams"][0]["param_2"] == "param_2_value"
+ assert len(vnf_1_data["vfModules"]) == 0
+
+ assert vnf_2_data["instanceName"] == "test_so_service_vnf_instance_name_2"
+ assert len(vnf_2_data["instanceParams"][0]) == 0
+ assert len(vnf_2_data["vfModules"]) == 2
+ vf_module_1_data = vnf_2_data["vfModules"][0]
+ vf_module_2_data = vnf_2_data["vfModules"][1]
+
+ assert vf_module_1_data["instanceName"] == "test_so_service_vf_module_instance_name_1"
+ assert len(vf_module_1_data["instanceParams"][0]) == 2
+ assert vf_module_1_data["instanceParams"][0]["vf_module_param_1"] == "vf_module_param_1_value"
+ assert vf_module_1_data["instanceParams"][0]["vf_module_param_2"] == "vf_module_param_2_value"
+
+ assert vf_module_2_data["instanceName"] == "test_so_service_vf_module_instance_name_2"
+ assert len(vf_module_2_data["instanceParams"][0]) == 2
+ assert vf_module_2_data["instanceParams"][0]["vf_module_param_1"] == "vf_module_param_1_value"
+ assert vf_module_2_data["instanceParams"][0]["vf_module_param_2"] == "vf_module_param_2_value"
+
+ assert pnf_1_data["instanceName"] == "test_so_service_pnf_instance_name_1"
+
+ assert pnf_2_data["instanceName"] == "test_so_service_pnf_instance_name_2"
+
+
+def test_so_service_load_from_yaml():
+
+ so_service_yaml = """
+ subscription_service_type: myservice
+ vnfs:
+ - model_name: myvfmodel
+ instance_name: myfirstvnf
+ parameters:
+ param1: value1
+ processing_priority: 1
+ vf_modules:
+ - instance_name: mysecondvfm
+ model_name: base
+ processing_priority: 2
+ parameters:
+ param-vfm1: value-vfm1
+ - instance_name: myfirstvfm
+ model_name: base
+ processing_priority: 1
+ parameters:
+ param-vfm1: value-vfm1
+ - model_name: myvfmodel
+ instance_name: mysecondvnf
+ parameters:
+ param1: value1
+ processing_priority: 2
+ vf_modules:
+ - instance_name: myfirstvfm
+ model_name: base
+ processing_priority: 1
+ parameters:
+ param-vfm1: value-vfm1
+ - instance_name: mysecondvfm
+ model_name: base
+ processing_priority: 2
+ parameters:
+ param-vfm1: value-vfm1
+ pnfs:
+ - model_name: mypnfmodel
+ instance_name: myfirstpnf
+ """
+ so_service = SoService.load(yaml.safe_load(so_service_yaml))
+ assert so_service.subscription_service_type == "myservice"
+ assert not so_service.instance_name
+ assert len(so_service.vnfs) == 2
+ assert len(so_service.pnfs) == 1
+
+ so_service_vnf_1 = so_service.vnfs[0]
+ so_service_vnf_2 = so_service.vnfs[1]
+ so_service_pnf = so_service.pnfs[0]
+
+ assert so_service_vnf_1.model_name == "myvfmodel"
+ assert so_service_vnf_1.instance_name == "myfirstvnf"
+ assert so_service_vnf_1.processing_priority == 1
+ assert len(so_service_vnf_1.parameters) == 1
+ assert so_service_vnf_1.parameters["param1"] == "value1"
+ assert len(so_service_vnf_1.vf_modules) == 2
+
+ so_service_vnf_1_vf_module_1 = so_service_vnf_1.vf_modules[0]
+ so_service_vnf_1_vf_module_2 = so_service_vnf_1.vf_modules[1]
+
+ assert so_service_vnf_1_vf_module_1.model_name == "base"
+ assert so_service_vnf_1_vf_module_1.instance_name == "mysecondvfm"
+ assert so_service_vnf_1_vf_module_1.processing_priority == 2
+ assert len(so_service_vnf_1_vf_module_1.parameters) == 1
+ assert so_service_vnf_1_vf_module_1.parameters["param-vfm1"] == "value-vfm1"
+ assert so_service_vnf_1_vf_module_2.model_name == "base"
+ assert so_service_vnf_1_vf_module_2.instance_name == "myfirstvfm"
+ assert so_service_vnf_1_vf_module_2.processing_priority == 1
+ assert len(so_service_vnf_1_vf_module_2.parameters) == 1
+ assert so_service_vnf_1_vf_module_2.parameters["param-vfm1"] == "value-vfm1"
+
+ assert so_service_vnf_2.model_name == "myvfmodel"
+ assert so_service_vnf_2.instance_name == "mysecondvnf"
+ assert so_service_vnf_2.processing_priority == 2
+ assert len(so_service_vnf_2.parameters) == 1
+ assert so_service_vnf_2.parameters["param1"] == "value1"
+ assert len(so_service_vnf_2.vf_modules) == 2
+
+ so_service_vnf_1_vf_module_1 = so_service_vnf_2.vf_modules[0]
+ so_service_vnf_1_vf_module_2 = so_service_vnf_2.vf_modules[1]
+
+ assert so_service_vnf_1_vf_module_1.model_name == "base"
+ assert so_service_vnf_1_vf_module_1.instance_name == "myfirstvfm"
+ assert so_service_vnf_1_vf_module_1.processing_priority == 1
+ assert len(so_service_vnf_1_vf_module_1.parameters) == 1
+ assert so_service_vnf_1_vf_module_1.parameters["param-vfm1"] == "value-vfm1"
+ assert so_service_vnf_1_vf_module_2.model_name == "base"
+ assert so_service_vnf_1_vf_module_2.instance_name == "mysecondvfm"
+ assert so_service_vnf_1_vf_module_2.processing_priority == 2
+ assert len(so_service_vnf_1_vf_module_2.parameters) == 1
+ assert so_service_vnf_1_vf_module_2.parameters["param-vfm1"] == "value-vfm1"
+
+ assert so_service_pnf.model_name == "mypnfmodel"
+ assert so_service_pnf.instance_name == "myfirstpnf"
+
+
+def test_so_service_load_from_file():
+ with Path(Path(__file__).parent, "data/test_so_service_data.yaml").open() as yaml_template:
+ so_service_data = yaml.safe_load(yaml_template)
+ service = Service(next(iter(so_service_data.keys())))
+ so_service = SoService.load(so_service_data[service.name])
+ assert so_service.subscription_service_type == "myservice"
+ assert not so_service.instance_name
+ assert len(so_service.vnfs) == 2
+
+ so_service_vnf_1 = so_service.vnfs[0]
+ so_service_vnf_2 = so_service.vnfs[1]
+
+ assert so_service_vnf_1.model_name == "myvfmodel"
+ assert so_service_vnf_1.instance_name == "myfirstvnf"
+ assert so_service_vnf_1.processing_priority == 1
+ assert len(so_service_vnf_1.parameters) == 1
+ assert so_service_vnf_1.parameters["param1"] == "value1"
+ assert len(so_service_vnf_1.vf_modules) == 2
+
+ so_service_vnf_1_vf_module_1 = so_service_vnf_1.vf_modules[0]
+ so_service_vnf_1_vf_module_2 = so_service_vnf_1.vf_modules[1]
+
+ assert so_service_vnf_1_vf_module_1.model_name == "base"
+ assert so_service_vnf_1_vf_module_1.instance_name == "mysecondvfm"
+ assert so_service_vnf_1_vf_module_1.processing_priority == 2
+ assert len(so_service_vnf_1_vf_module_1.parameters) == 1
+ assert so_service_vnf_1_vf_module_1.parameters["param-vfm1"] == "value-vfm1"
+ assert so_service_vnf_1_vf_module_2.model_name == "base"
+ assert so_service_vnf_1_vf_module_2.instance_name == "myfirstvfm"
+ assert so_service_vnf_1_vf_module_2.processing_priority == 1
+ assert len(so_service_vnf_1_vf_module_2.parameters) == 1
+ assert so_service_vnf_1_vf_module_2.parameters["param-vfm1"] == "value-vfm1"
+
+ assert so_service_vnf_2.model_name == "myvfmodel"
+ assert so_service_vnf_2.instance_name == "mysecondvnf"
+ assert so_service_vnf_2.processing_priority == 2
+ assert len(so_service_vnf_2.parameters) == 1
+ assert so_service_vnf_2.parameters["param1"] == "value1"
+ assert len(so_service_vnf_2.vf_modules) == 2
+
+ so_service_vnf_1_vf_module_1 = so_service_vnf_2.vf_modules[0]
+ so_service_vnf_1_vf_module_2 = so_service_vnf_2.vf_modules[1]
+
+ assert so_service_vnf_1_vf_module_1.model_name == "base"
+ assert so_service_vnf_1_vf_module_1.instance_name == "myfirstvfm"
+ assert so_service_vnf_1_vf_module_1.processing_priority == 1
+ assert len(so_service_vnf_1_vf_module_1.parameters) == 1
+ assert so_service_vnf_1_vf_module_1.parameters["param-vfm1"] == "value-vfm1"
+ assert so_service_vnf_1_vf_module_2.model_name == "base"
+ assert so_service_vnf_1_vf_module_2.instance_name == "mysecondvfm"
+ assert so_service_vnf_1_vf_module_2.processing_priority == 2
+ assert len(so_service_vnf_1_vf_module_2.parameters) == 1
+ assert so_service_vnf_1_vf_module_2.parameters["param-vfm1"] == "value-vfm1"
+
+
+def test_so_service_vnf_load_from_yaml():
+
+ so_vnf_yaml = """
+ model_name: myvnfmodel
+ instance_name: mynewvnf
+ parameters:
+ param1: value1
+ vf_modules:
+ - instance_name: myfirstvfm
+ model_name: base
+ processing_priority: 1
+ parameters:
+ param-vfm1: value-vfm1
+ - instance_name: mysecondvfm
+ model_name: second_base
+ processing_priority: 2
+ parameters:
+ param-vfm2: value-vfm2
+ param-vfm3: value-vfm3
+ """
+
+ so_vnf = SoServiceVnf.load(yaml.safe_load(so_vnf_yaml))
+ assert so_vnf.model_name == "myvnfmodel"
+ assert so_vnf.instance_name == "mynewvnf"
+
+ assert len(so_vnf.parameters) == 1
+ assert so_vnf.parameters["param1"] == "value1"
+
+ assert len(so_vnf.vf_modules) == 2
+ so_vnf_vf_module_1 = so_vnf.vf_modules[0]
+ so_vnf_vf_module_2 = so_vnf.vf_modules[1]
+
+ assert so_vnf_vf_module_1.model_name == "base"
+ assert so_vnf_vf_module_1.instance_name == "myfirstvfm"
+ assert so_vnf_vf_module_1.processing_priority == 1
+ assert len(so_vnf_vf_module_1.parameters) == 1
+ assert so_vnf_vf_module_1.parameters["param-vfm1"] == "value-vfm1"
+
+ assert so_vnf_vf_module_2.model_name == "second_base"
+ assert so_vnf_vf_module_2.instance_name == "mysecondvfm"
+ assert so_vnf_vf_module_2.processing_priority == 2
+ assert len(so_vnf_vf_module_2.parameters) == 2
+ assert so_vnf_vf_module_2.parameters["param-vfm2"] == "value-vfm2"
+ assert so_vnf_vf_module_2.parameters["param-vfm3"] == "value-vfm3"