From 7f6332466912bbc0886756d40e34128861a39259 Mon Sep 17 00:00:00 2001 From: Piotr Stanior Date: Wed, 2 Feb 2022 15:14:47 +0100 Subject: Add vfc resource support for xnfs Change-Id: I8caa5174e35167f1bd26fe4a950af2cd7fe63ead Signed-off-by: Piotr Stanior Issue-ID: INT-2058 Signed-off-by: Piotr Stanior --- .../schemas/resources/shared/xnf_resources.rst | 18 +++++++++++ docs/source/schemas/version_1_0.rst | 17 ++++++++++ docs/source/schemas/version_1_1.rst | 17 ++++++++++ onap_data_provider/resources/xnf_resource.py | 12 +++++++- onap_data_provider/schemas/infra.schema | 24 +++++++++++++++ onap_data_provider/schemas/infra_1_1.schema | 24 +++++++++++++++ samples/xnfs.yaml | 6 ++++ tests/test_pnf_resource.py | 36 +++++++++++++++++++++- tests/test_vnf_resource.py | 36 +++++++++++++++++++++- 9 files changed, 187 insertions(+), 3 deletions(-) create mode 100644 docs/source/schemas/resources/shared/xnf_resources.rst diff --git a/docs/source/schemas/resources/shared/xnf_resources.rst b/docs/source/schemas/resources/shared/xnf_resources.rst new file mode 100644 index 0000000..71ad609 --- /dev/null +++ b/docs/source/schemas/resources/shared/xnf_resources.rst @@ -0,0 +1,18 @@ +Resources +^^^^^^^^^ + +.. list-table:: + :header-rows: 1 + + * - Property + - Type + - Required + - Comment + * - name + - string + - YES + - + * - xnf_type + - string + - YES + - \ No newline at end of file diff --git a/docs/source/schemas/version_1_0.rst b/docs/source/schemas/version_1_0.rst index ffc65ca..98634c2 100644 --- a/docs/source/schemas/version_1_0.rst +++ b/docs/source/schemas/version_1_0.rst @@ -196,6 +196,10 @@ PNF - List of `PNF Properties 1.0`_ - NO - + * - resources + - List of `PNF Resources 1.0`_ + - NO + - .. _PNF deployment artifact 1.0: @@ -205,6 +209,10 @@ PNF .. include:: /schemas/resources/shared/xnf_property.rst +.. _PNF resources 1.0: + +.. include:: /schemas/resources/shared/xnf_resources.rst + VNF --- @@ -231,6 +239,10 @@ VNF - List of `VNF properties 1.0`_ - NO - + * - resources + - List of `VNF Resources 1.0`_ + - NO + - .. _VNF deployment artifact 1.0: @@ -248,6 +260,11 @@ VNF .. include:: /schemas/resources/shared/line_of_business.rst +.. _VNF resources 1.0: + +.. include:: /schemas/resources/shared/xnf_resources.rst + + MSB k8s definition ------------------ diff --git a/docs/source/schemas/version_1_1.rst b/docs/source/schemas/version_1_1.rst index cb78222..bcbdd53 100644 --- a/docs/source/schemas/version_1_1.rst +++ b/docs/source/schemas/version_1_1.rst @@ -206,6 +206,10 @@ PNF - List of `PNF Properties 1.1`_ - NO - + * - resources + - List of `PNF Resources 1.1`_ + - NO + - .. _PNF deployment artifact 1.1: @@ -215,6 +219,10 @@ PNF .. include:: /schemas/resources/shared/xnf_property.rst +.. _PNF resources 1.1: + +.. include:: /schemas/resources/shared/xnf_resources.rst + VNF --- @@ -253,6 +261,10 @@ VNF - List of `VNF properties 1.1`_ - NO - + * - resources + - List of `VNF Resources 1.1`_ + - NO + - .. _VNF deployment artifact 1.1: @@ -262,6 +274,11 @@ VNF .. include:: /schemas/resources/shared/owning_entity.rst +.. _VNF resources 1.1: + +.. include:: /schemas/resources/shared/xnf_resources.rst + + MSB k8s definition ------------------ diff --git a/onap_data_provider/resources/xnf_resource.py b/onap_data_provider/resources/xnf_resource.py index efede03..0c873b7 100644 --- a/onap_data_provider/resources/xnf_resource.py +++ b/onap_data_provider/resources/xnf_resource.py @@ -16,10 +16,12 @@ """ from abc import ABC +import logging from typing import Any, Dict from onapsdk.sdc.vsp import Vsp # type: ignore from onapsdk.sdc.sdc_resource import SdcResource # type: ignore from onapsdk.sdc.properties import Property # type: ignore +from onapsdk.sdc.vfc import Vfc # type: ignore from .sdc_properties_mixins import SdcPropertiesMixins @@ -44,13 +46,21 @@ class XnfResource(ABC, SdcPropertiesMixins): if (vsp_name := data.get("vsp")) is not None: self._xnf.vsp = Vsp(vsp_name) self._xnf.create() - if (artifact_data := data.get("deployment_artifact")) is not None: + if data.get("deployment_artifact") is not None: self._xnf.add_deployment_artifact( artifact_type=data["deployment_artifact"]["artifact_type"], artifact_name=data["deployment_artifact"]["artifact_name"], artifact_label=data["deployment_artifact"]["artifact_label"], artifact=data["deployment_artifact"]["artifact_file_name"], ) + if (resources := data.get("resources")) is not None: + for resource_data in resources: + if resource_data["xnf_type"] == "VFC": + self._xnf.add_resource(Vfc(name=resource_data["name"])) + else: + logging.warning( + f"Provided xNF resource of type {resource_data['xnf_type']} is not supported." + ) self.set_properties(self._xnf, data.get("properties", [])) self.set_inputs(self._xnf, data.get("inputs", [])) self._xnf.onboard() diff --git a/onap_data_provider/schemas/infra.schema b/onap_data_provider/schemas/infra.schema index 55c5cbf..8904f95 100644 --- a/onap_data_provider/schemas/infra.schema +++ b/onap_data_provider/schemas/infra.schema @@ -318,6 +318,18 @@ properties: - artifact_file_name properties: *props inputs: *props + resources: + type: array + items: + - type: object + properties: + xnf_type: + type: string + name: + type: string + required: + - xnf_type + - name required: - name required: @@ -352,6 +364,18 @@ properties: - artifact_file_name properties: *props inputs: *props + resources: + type: array + items: + - type: object + properties: + xnf_type: + type: string + name: + type: string + required: + - xnf_type + - name required: - name required: diff --git a/onap_data_provider/schemas/infra_1_1.schema b/onap_data_provider/schemas/infra_1_1.schema index 7514acc..7d51345 100644 --- a/onap_data_provider/schemas/infra_1_1.schema +++ b/onap_data_provider/schemas/infra_1_1.schema @@ -324,6 +324,18 @@ properties: - artifact_file_name properties: *props inputs: *props + resources: + type: array + items: + - type: object + properties: + xnf_type: + type: string + name: + type: string + required: + - xnf_type + - name required: - name required: @@ -364,6 +376,18 @@ properties: - artifact_file_name properties: *props inputs: *props + resources: + type: array + items: + - type: object + properties: + xnf_type: + type: string + name: + type: string + required: + - xnf_type + - name required: - name required: diff --git a/samples/xnfs.yaml b/samples/xnfs.yaml index 81f344b..805a2c1 100644 --- a/samples/xnfs.yaml +++ b/samples/xnfs.yaml @@ -25,6 +25,12 @@ resources: vendor: sample-vendor # Make sure it exists! category: Allotted Resource subcategory: Allotted Resource + - vnf: + name: sample-vnf-with-vfc-as-property + vsp: sample-vsp # Make sure it exists! + resources: + - xnf_type: "VFC" + name: "AllottedResource" pnfs: - pnf: diff --git a/tests/test_pnf_resource.py b/tests/test_pnf_resource.py index c58717a..62dc3ae 100644 --- a/tests/test_pnf_resource.py +++ b/tests/test_pnf_resource.py @@ -1,4 +1,4 @@ -from unittest.mock import patch, PropertyMock +from unittest.mock import MagicMock, patch, PropertyMock from onap_data_provider.resources.pnf_resource import PnfResource @@ -26,3 +26,37 @@ def test_pnf_resource_pnf(mock_pnf_created): assert pnf_resource.pnf is None mock_pnf_created.return_value = True assert pnf_resource.pnf is not None + + +@patch( + "onap_data_provider.resources.pnf_resource.Pnf.create", +) +@patch( + "onap_data_provider.resources.pnf_resource.Pnf.add_resource", +) +@patch( + "onap_data_provider.resources.pnf_resource.Pnf.onboard", +) +@patch( + "onap_data_provider.resources.pnf_resource.PnfResource.pnf", + new_callable=PropertyMock, +) +@patch( + "onap_data_provider.resources.xnf_resource.Vfc", +) +def test_pnf_resource_onboards_with_vfc( + mock_vfc, mock_pnf, mock_onboard, mock_add_resource, mock_pnf_create +): + mock_vfc = MagicMock() + mock_pnf.return_value = None + data_no_composition = {"name": "test_pnf"} + pnf_resource = PnfResource(data_no_composition) + pnf_resource.create() + mock_add_resource.assert_not_called() + data_with_composition = { + "name": "test_pnf", + "resources": [{"name": "test", "xnf_type": "VFC"}], + } + pnf_resource = PnfResource(data_with_composition) + pnf_resource.create() + mock_add_resource.assert_called_once() diff --git a/tests/test_vnf_resource.py b/tests/test_vnf_resource.py index 6398aec..e35cded 100644 --- a/tests/test_vnf_resource.py +++ b/tests/test_vnf_resource.py @@ -1,4 +1,4 @@ -from unittest.mock import patch, PropertyMock +from unittest.mock import MagicMock, patch, PropertyMock from onap_data_provider.resources.vnf_resource import VnfResource @@ -26,3 +26,37 @@ def test_vnf_resource_vnf(mock_vnf_created): assert vnf_resource.vnf is None mock_vnf_created.return_value = True assert vnf_resource.vnf is not None + + +@patch( + "onap_data_provider.resources.vnf_resource.Vf.create", +) +@patch( + "onap_data_provider.resources.vnf_resource.Vf.add_resource", +) +@patch( + "onap_data_provider.resources.vnf_resource.Vf.onboard", +) +@patch( + "onap_data_provider.resources.vnf_resource.VnfResource.vnf", + new_callable=PropertyMock, +) +@patch( + "onap_data_provider.resources.xnf_resource.Vfc", +) +def test_vnf_resource_onboards_with_vfc( + mock_vfc, mock_vnf, mock_onboard, mock_add_resource, mock_vnf_create +): + mock_vfc = MagicMock() + mock_vnf.return_value = None + data_no_composition = {"name": "test_vnf"} + vnf_resource = VnfResource(data_no_composition) + vnf_resource.create() + mock_add_resource.assert_not_called() + data_with_composition = { + "name": "test_vnf", + "resources": [{"name": "test", "xnf_type": "VFC"}], + } + vnf_resource = VnfResource(data_with_composition) + vnf_resource.create() + mock_add_resource.assert_called_once() -- cgit 1.2.3-korg