summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPiotr Stanior <piotr.stanior@t-mobile.pl>2022-02-02 15:14:47 +0100
committerPiotr Stanior <piotr.stanior@t-mobile.pl>2022-02-03 14:44:31 +0100
commit7f6332466912bbc0886756d40e34128861a39259 (patch)
treeb15fdb446e440d09c74c1300295ba41de1d06920
parente9dbe96626c23204bac7426bba69b4e2aedfbd8f (diff)
Add vfc resource support for xnfs
Change-Id: I8caa5174e35167f1bd26fe4a950af2cd7fe63ead Signed-off-by: Piotr Stanior <piotr.stanior@t-mobile.pl> Issue-ID: INT-2058 Signed-off-by: Piotr Stanior <piotr.stanior@t-mobile.pl>
-rw-r--r--docs/source/schemas/resources/shared/xnf_resources.rst18
-rw-r--r--docs/source/schemas/version_1_0.rst17
-rw-r--r--docs/source/schemas/version_1_1.rst17
-rw-r--r--onap_data_provider/resources/xnf_resource.py12
-rw-r--r--onap_data_provider/schemas/infra.schema24
-rw-r--r--onap_data_provider/schemas/infra_1_1.schema24
-rw-r--r--samples/xnfs.yaml6
-rw-r--r--tests/test_pnf_resource.py36
-rw-r--r--tests/test_vnf_resource.py36
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 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()