diff options
-rw-r--r-- | docs/source/schemas/resources/shared/xnf_resources.rst | 18 | ||||
-rw-r--r-- | docs/source/schemas/version_1_0.rst | 17 | ||||
-rw-r--r-- | docs/source/schemas/version_1_1.rst | 17 | ||||
-rw-r--r-- | onap_data_provider/resources/xnf_resource.py | 12 | ||||
-rw-r--r-- | onap_data_provider/schemas/infra.schema | 24 | ||||
-rw-r--r-- | onap_data_provider/schemas/infra_1_1.schema | 24 | ||||
-rw-r--r-- | samples/xnfs.yaml | 6 | ||||
-rw-r--r-- | tests/test_pnf_resource.py | 36 | ||||
-rw-r--r-- | tests/test_vnf_resource.py | 36 |
9 files changed, 187 insertions, 3 deletions
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 15e327d..a7f700a 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 4546ef1..211f272 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 d683b46..d276755 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 fdf6b4f..bf820ab 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() |