summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordyh <dengyuanhong@chinamobile.com>2019-04-03 15:45:35 +0800
committerdeng yuanhong <dengyuanhong@chinamobile.com>2019-04-03 08:37:23 +0000
commitb21f397d129afef6bfb540eea8e7af3286ff0aa8 (patch)
tree1e4ad6f4ad522a51673eb5f9207c2b2cc0f9997e
parentbe6150278ad87a1096df914954e76b99222b9eb8 (diff)
Update parser result: 1.Get inputs 2. Get service info.
Change-Id: I0075d5dd811eea2be0cfb73caf1f2214514595c5 Issue-ID: VFC-1335 Signed-off-by: dyh <dengyuanhong@chinamobile.com>
-rw-r--r--catalog/packages/biz/sdc_service_package.py2
-rw-r--r--catalog/packages/biz/service_descriptor.py27
-rw-r--r--catalog/packages/tests/test_service_descriptor.py125
-rw-r--r--catalog/packages/tests/test_servicepackage.py259
-rw-r--r--catalog/pub/utils/toscaparser/__init__.py10
-rw-r--r--catalog/pub/utils/toscaparser/sdmodel.py87
6 files changed, 471 insertions, 39 deletions
diff --git a/catalog/packages/biz/sdc_service_package.py b/catalog/packages/biz/sdc_service_package.py
index 713ab056..3105bc0b 100644
--- a/catalog/packages/biz/sdc_service_package.py
+++ b/catalog/packages/biz/sdc_service_package.py
@@ -103,7 +103,7 @@ class ServicePackage(object):
try:
csar_path = service_pkg[0].localFilePath
- ret = {"model": toscaparser.parse_nsd(csar_path, inputs)}
+ ret = {"model": toscaparser.parse_sd(csar_path, inputs)}
return ret
except CatalogException as e:
logger.error(e.message)
diff --git a/catalog/packages/biz/service_descriptor.py b/catalog/packages/biz/service_descriptor.py
index 4b9a2aad..11b6fb37 100644
--- a/catalog/packages/biz/service_descriptor.py
+++ b/catalog/packages/biz/service_descriptor.py
@@ -19,7 +19,7 @@ import uuid
from catalog.packages.const import PKG_STATUS
from catalog.pub.config.config import CATALOG_ROOT_PATH
-from catalog.pub.database.models import ServicePackageModel
+from catalog.pub.database.models import ServicePackageModel, VnfPackageModel, PnfPackageModel
from catalog.pub.exceptions import CatalogException, PackageNotFoundException
from catalog.pub.utils import toscaparser, fileutil
from catalog.pub.utils.values import ignore_case_get
@@ -61,18 +61,17 @@ class ServiceDescriptor(object):
service_pkgs = ServicePackageModel.objects.filter(servicePackageId=serviced_info_id)
service_pkgs.update(onboardingState=PKG_STATUS.PROCESSING)
- serviced_json = toscaparser.parse_nsd(local_file_name)
- logger.debug("%s", serviced_json)
+ serviced_json = toscaparser.parse_sd(local_file_name)
serviced = json.JSONDecoder().decode(serviced_json)
- serviced_id = serviced.get("ns", {}).get("properties", {}).get("descriptor_id", "")
- serviced_name = serviced.get("ns", {}).get("properties", {}).get("name", "")
- serviced_version = serviced.get("ns", {}).get("properties", {}).get("version", "")
- serviced_designer = serviced.get("ns", {}).get("properties", {}).get("designer", "")
- invariant_id = serviced.get("ns", {}).get("properties", {}).get("invariant_id", "")
+ serviced_id = serviced.get("service", {}).get("properties", {}).get("descriptor_id", "")
+ serviced_name = serviced.get("service", {}).get("properties", {}).get("name", "")
+ serviced_version = serviced.get("service", {}).get("properties", {}).get("version", "")
+ serviced_designer = serviced.get("service", {}).get("properties", {}).get("designer", "")
+ invariant_id = serviced.get("service", {}).get("properties", {}).get("invariant_id", "")
if serviced_id == "":
raise CatalogException("serviced_id(%s) does not exist in metadata." % serviced_id)
- other_nspkg = ServicePackageModel.objects.filter(nsdId=serviced_id)
+ other_nspkg = ServicePackageModel.objects.filter(servicedId=serviced_id)
if other_nspkg and other_nspkg[0].servicePackageId != serviced_info_id:
logger.warn("ServiceD(%s,%s) already exists.", serviced_id, other_nspkg[0].servicePackageId)
raise CatalogException("ServiceD(%s) already exists." % serviced_id)
@@ -81,9 +80,9 @@ class ServiceDescriptor(object):
vnfd_id = vnf["properties"].get("descriptor_id", "undefined")
if vnfd_id == "undefined":
vnfd_id = vnf["properties"].get("id", "undefined")
- pkg = ServicePackageModel.objects.filter(vnfdId=vnfd_id)
+ pkg = VnfPackageModel.objects.filter(vnfdId=vnfd_id)
if not pkg:
- pkg = ServicePackageModel.objects.filter(vnfPackageId=vnfd_id)
+ pkg = VnfPackageModel.objects.filter(vnfPackageId=vnfd_id)
if not pkg:
vnfd_name = vnf.get("vnf_id", "undefined")
logger.error("[%s] is not distributed.", vnfd_name)
@@ -93,9 +92,9 @@ class ServiceDescriptor(object):
pnfd_id = pnf["properties"].get("descriptor_id", "undefined")
if pnfd_id == "undefined":
pnfd_id = pnf["properties"].get("id", "undefined")
- pkg = ServicePackageModel.objects.filter(pnfdId=pnfd_id)
+ pkg = PnfPackageModel.objects.filter(pnfdId=pnfd_id)
if not pkg:
- pkg = ServicePackageModel.objects.filter(pnfPackageId=pnfd_id)
+ pkg = PnfPackageModel.objects.filter(pnfPackageId=pnfd_id)
if not pkg:
pnfd_name = pnf.get("pnf_id", "undefined")
logger.error("[%s] is not distributed.", pnfd_name)
@@ -104,7 +103,7 @@ class ServiceDescriptor(object):
service_pkgs.update(
servicedId=serviced_id,
servicedName=serviced_name,
- servicedDesginer=serviced_designer,
+ servicedDesigner=serviced_designer,
servicedDescription=serviced.get("description", ""),
servicedVersion=serviced_version,
invariantId=invariant_id,
diff --git a/catalog/packages/tests/test_service_descriptor.py b/catalog/packages/tests/test_service_descriptor.py
index d0dc83fd..95f06d14 100644
--- a/catalog/packages/tests/test_service_descriptor.py
+++ b/catalog/packages/tests/test_service_descriptor.py
@@ -11,14 +11,17 @@
# 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 logging
from django.test import TestCase
+from mock import mock
from catalog.packages.biz.service_descriptor import ServiceDescriptor
from catalog.packages.const import PKG_STATUS
-from catalog.pub.database.models import ServicePackageModel
+from catalog.pub.database.models import ServicePackageModel, VnfPackageModel, PnfPackageModel
from catalog.pub.exceptions import PackageNotFoundException
+from catalog.pub.utils import toscaparser
logger = logging.getLogger(__name__)
@@ -34,6 +37,102 @@ class TestServiceDescription(TestCase):
self.data = {
'userDefinedData': self.user_defined_data,
}
+ self.sd_data = {
+ "inputs": {
+ "sdwanvpnresource_list": [
+ {
+ "sdwanvpn_topology": "",
+ "required": True,
+ "type": "string"
+ }
+ ]
+ },
+ "pnfs": [
+ {
+ "pnf_id": "m6000_s",
+ "cps": [],
+ "description": "",
+ "properties": {
+ "vendor": "zte",
+ "request_reclassification": False,
+ "pnf_type": "m6000s",
+ "version": "1.0",
+ "management_address": "111111",
+ "id": "m6000_s",
+ "nsh_aware": False
+ }
+ }
+ ],
+ "description": "",
+ "vnfs": [
+ {
+ "vnf_id": "sdwansiteresource",
+ "description": "",
+ "properties": {
+ "sdwandevice_type": "",
+ "sdwandevice_class": "PNF",
+ "multi_stage_design": "false",
+ "min_instances": "1",
+ "sdwansite_controlPoint": "",
+ "id": "cd557883-ac4b-462d-aa01-421b5fa606b1",
+ "sdwansite_longitude": "",
+ "sdwansite_latitude": "",
+ "sdwansite_postcode": "",
+ "sdwansite_type": "",
+ "nf_naming": {
+ "ecomp_generated_naming": True
+ },
+ "sdwansite_emails": "",
+ "sdwansite_role": "",
+ "vnfm_info": "",
+ "sdwansite_address": "",
+ "sdwansite_description": "",
+ "availability_zone_max_count": "1",
+ "sdwansite_name": ""
+ }
+ }
+ ],
+ "service": {
+ "type": "org.openecomp.service.EnhanceService",
+ "properties": {
+ "descriptor_id": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+ "designer": "",
+ "invariant_id": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+ "name": "Enhance_Service",
+ "verison": ""
+ },
+ "metadata": {
+ "category": "E2E Service",
+ "serviceType": "",
+ "description": "Enhance_Service",
+ "instantiationType": "A-la-carte",
+ "type": "Service",
+ "environmentContext": "General_Revenue-Bearing",
+ "serviceEcompNaming": True,
+ "UUID": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+ "ecompGeneratedNaming": True,
+ "serviceRole": "",
+ "invariantUUID": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+ "namingPolicy": "",
+ "name": "Enhance_Service"
+ }
+ },
+ "metadata": {
+ "category": "E2E Service",
+ "serviceType": "",
+ "description": "Enhance_Service",
+ "instantiationType": "A-la-carte",
+ "type": "Service",
+ "environmentContext": "General_Revenue-Bearing",
+ "serviceEcompNaming": True,
+ "UUID": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+ "ecompGeneratedNaming": True,
+ "serviceRole": "",
+ "invariantUUID": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+ "namingPolicy": "",
+ "name": "Enhance_Service"
+ }
+ }
ServicePackageModel.objects.filter().delete()
def tearDown(self):
@@ -58,19 +157,19 @@ class TestServiceDescription(TestCase):
self.assertEqual(PKG_STATUS.CREATED, service_package.onboardingState)
self.assertEqual(PKG_STATUS.NOT_IN_USE, service_package.usageState)
- def test_parse_serviced_and_save(self):
- try:
- servcie_desc = ServiceDescriptor()
- csar_id = '0b667470-e6b3-4ee8-8f08-186317a04dc2'
- servcie_desc.create(self.data, csar_id)
-
- local_file_name = "C:\\work\\onap\\api_test_data\\service\\service-Sotnvpninfraservice-csar.csar"
- servcie_desc.parse_serviced_and_save(csar_id, local_file_name)
+ @mock.patch.object(toscaparser, 'parse_sd')
+ def test_parse_serviced_and_save(self, mock_parse_sd):
+ mock_parse_sd.return_value = json.JSONEncoder().encode(self.sd_data)
+ servcie_desc = ServiceDescriptor()
+ csar_id = '0b667470-e6b3-4ee8-8f08-186317a04dc2'
+ servcie_desc.create(self.data, csar_id)
+ VnfPackageModel(vnfPackageId="1", vnfdId="cd557883-ac4b-462d-aa01-421b5fa606b1").save()
+ PnfPackageModel(pnfPackageId="1", pnfdId="m6000_s").save()
+ local_file_name = "/test.csar"
+ servcie_desc.parse_serviced_and_save(csar_id, local_file_name)
- service_package = ServicePackageModel.objects.filter(servicePackageId=csar_id)[0]
- self.assertIsNotNone(service_package)
- except Exception as e:
- logger.error(e.message)
+ service_package = ServicePackageModel.objects.filter(servicePackageId=csar_id)[0]
+ self.assertIsNotNone(service_package)
def test_delete_single(self):
servcie_desc = ServiceDescriptor()
diff --git a/catalog/packages/tests/test_servicepackage.py b/catalog/packages/tests/test_servicepackage.py
index 9365c295..dc6f3574 100644
--- a/catalog/packages/tests/test_servicepackage.py
+++ b/catalog/packages/tests/test_servicepackage.py
@@ -18,7 +18,7 @@ from mock import mock
from rest_framework import status
from catalog.packages.biz.sdc_service_package import ServicePackage
-from catalog.pub.database.models import ServicePackageModel
+from catalog.pub.database.models import ServicePackageModel, VnfPackageModel, PnfPackageModel
from catalog.pub.exceptions import PackageNotFoundException, PackageHasExistsException, CatalogException
from catalog.pub.msapi import sdc
from catalog.pub.utils import toscaparser
@@ -32,6 +32,222 @@ class TestServicePackage(TestCase):
def setUp(self):
self.client = Client()
ServicePackageModel.objects.filter().delete()
+ self.sd_data = {
+ "inputs": {
+ "sdwanvpnresource_list": [
+ {
+ "sdwanvpn_topology": "",
+ "required": True,
+ "type": "string"
+ },
+ {
+ "sdwansitelan_list": [
+ {
+ "deviceName": "",
+ "required": True,
+ "type": "string",
+ "description": "The device name in the site"
+ }
+ ]
+ }
+ ],
+ "sdwansiteresource_list": [
+ {
+ "sdwansite_controlPoint": "",
+ "required": False,
+ "type": "string",
+ "description": "The control point of the site,only for sd-wan-edge"
+ },
+ {
+ "sdwandevice_list": [
+ {
+ "systemIp": "",
+ "required": False,
+ "type": "string",
+ "description": "The system ip of the device"
+ }
+ ]
+ }
+ ]
+ },
+ "pnfs": [
+ {
+ "pnf_id": "m6000_s",
+ "cps": [],
+ "description": "",
+ "properties": {
+ "vendor": "zte",
+ "request_reclassification": False,
+ "pnf_type": "m6000s",
+ "version": "1.0",
+ "management_address": "111111",
+ "id": "m6000_s",
+ "nsh_aware": False
+ }
+ }
+ ],
+ "description": "",
+ "graph": {
+ "sdwansiteresource": [
+ "sdwanvpnresource"
+ ],
+ "sdwanvpnresource": []
+ },
+ "basepath": "c:\\users\\cmcc\\appdata\\local\\temp\\tmpn79jwc\\Definitions",
+ "vnfs": [
+ {
+ "vnf_id": "sdwansiteresource",
+ "description": "",
+ "properties": {
+ "sdwandevice_type": "",
+ "sdwandevice_class": "PNF",
+ "multi_stage_design": "False",
+ "min_instances": "1",
+ "sdwansite_controlPoint": "",
+ "id": "cd557883-ac4b-462d-aa01-421b5fa606b1",
+ "sdwansite_longitude": "",
+ "sdwansite_latitude": "",
+ "sdwansite_postcode": "",
+ "sdwansite_type": "",
+ "nf_naming": {
+ "ecomp_generated_naming": True
+ },
+ "sdwansite_emails": "",
+ "sdwansite_role": "",
+ "vnfm_info": "",
+ "sdwansite_address": "",
+ "sdwansite_description": "",
+ "availability_zone_max_count": "1",
+ "sdwansite_name": ""
+ },
+ "dependencies": [],
+ "networks": [],
+ "metadata": {
+ "category": "Configuration",
+ "subcategory": "Configuration",
+ "UUID": "cd557883-ac4b-462d-aa01-421b5fa606b1",
+ "invariantUUID": "c83b621e-e267-4910-a75a-a2a5957296e4",
+ "name": "sdwansiteresource",
+ "customizationUUID": "673dd6b3-3a06-4ef0-8ad0-8c26224b08f7",
+ "resourceVendorRelease": "1.0",
+ "version": "1.0",
+ "resourceVendor": "onap",
+ "resourceVendorModelNumber": "",
+ "type": "VF",
+ "description": "sdwansiteresource"
+ }
+ }
+ ],
+ "vls": [],
+ "service": {
+ "type": "org.openecomp.service.EnhanceService",
+ "requirements": {
+ "sdwanvpnresource.sdwanvpn.dependency": [
+ "sdwanvpnresource",
+ "sdwanvpn.dependency"
+ ],
+ "sdwansiteresource.sdwansitewan.dependency": [
+ "sdwansiteresource",
+ "sdwansitewan.dependency"
+ ],
+ "sdwansiteresource.sdwandevice.dependency": [
+ "sdwansiteresource",
+ "sdwandevice.dependency"
+ ],
+ "sdwanvpnresource.sdwansitelan.dependency": [
+ "sdwanvpnresource",
+ "sdwansitelan.dependency"
+ ],
+ "sdwanvpnresource.sdwanvpn.device": [
+ "sdwanvpnresource",
+ "sdwanvpn.device"
+ ],
+ "sdwansiteresource.sdwansite.device": [
+ "sdwansiteresource",
+ "sdwansite.device"
+ ],
+ "sdwansiteresource.sdwansite.dependency": [
+ "sdwansiteresource",
+ "sdwansite.dependency"
+ ],
+ "sdwanvpnresource.sdwansitelan.device": [
+ "sdwanvpnresource",
+ "sdwansitelan.device"
+ ],
+ "sdwansiteresource.sdwansitewan.device": [
+ "sdwansiteresource",
+ "sdwansitewan.device"
+ ],
+ "sdwansiteresource.sdwandevice.device": [
+ "sdwansiteresource",
+ "sdwandevice.device"
+ ]
+ },
+ "properties": {
+ "descriptor_id": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+ "designer": "",
+ "invariant_id": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+ "name": "Enhance_Service",
+ "verison": ""
+ },
+ "capabilities": {
+ "sdwansiteresource.sdwandevice.feature": [
+ "sdwansiteresource",
+ "sdwandevice.feature"
+ ],
+ "sdwanvpnresource.sdwanvpn.feature": [
+ "sdwanvpnresource",
+ "sdwanvpn.feature"
+ ],
+ "sdwanvpnresource.sdwanvpn.link": [
+ "sdwanvpnresource",
+ "sdwanvpn.link"
+ ],
+ "sdwansiteresource.sdwansite.feature": [
+ "sdwansiteresource",
+ "sdwansite.feature"
+ ],
+ "sdwansiteresource.sdwansitewan.feature": [
+ "sdwansiteresource",
+ "sdwansitewan.feature"
+ ],
+ "sdwanvpnresource.sdwansitelan.feature": [
+ "sdwanvpnresource",
+ "sdwansitelan.feature"
+ ]
+ },
+ "metadata": {
+ "category": "E2E Service",
+ "serviceType": "",
+ "description": "Enhance_Service",
+ "instantiationType": "A-la-carte",
+ "type": "Service",
+ "environmentContext": "General_Revenue-Bearing",
+ "serviceEcompNaming": True,
+ "UUID": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+ "ecompGeneratedNaming": True,
+ "serviceRole": "",
+ "invariantUUID": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+ "namingPolicy": "",
+ "name": "Enhance_Service"
+ }
+ },
+ "metadata": {
+ "category": "E2E Service",
+ "serviceType": "",
+ "description": "Enhance_Service",
+ "instantiationType": "A-la-carte",
+ "type": "Service",
+ "environmentContext": "General_Revenue-Bearing",
+ "serviceEcompNaming": True,
+ "UUID": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+ "ecompGeneratedNaming": True,
+ "serviceRole": "",
+ "invariantUUID": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+ "namingPolicy": "",
+ "name": "Enhance_Service"
+ }
+ }
def tearDown(self):
pass
@@ -40,7 +256,7 @@ class TestServicePackage(TestCase):
def test_service_pkg_distribute_when_pkg_exists(self):
ServicePackageModel(servicePackageId="1", servicedId="2").save()
- csar_id = 1
+ csar_id = "1"
try:
ServicePackage().on_distribute(csar_id)
except PackageHasExistsException as e:
@@ -49,7 +265,7 @@ class TestServicePackage(TestCase):
@mock.patch.object(sdc, 'get_artifact')
def test_service_pkg_distribute_when_fail_get_artifacts(self, mock_get_artifact):
mock_get_artifact.side_effect = CatalogException("Failed to query artifact(services,1) from sdc.")
- csar_id = 1
+ csar_id = "1"
try:
ServicePackage().on_distribute(csar_id)
except Exception as e:
@@ -58,7 +274,7 @@ class TestServicePackage(TestCase):
@mock.patch.object(sdc, 'get_artifact')
@mock.patch.object(sdc, 'download_artifacts')
- def test_api_service_pkg_distribute_when_fail_download_artifacts(self, mock_get_artifact, mock_download_artifacts):
+ def test_service_pkg_distribute_when_fail_download_artifacts(self, mock_get_artifact, mock_download_artifacts):
mock_get_artifact.return_value = {
"uuid": "1",
"invariantUUID": "63eaec39-ffbe-411c-a838-448f2c73f7eb",
@@ -73,13 +289,36 @@ class TestServicePackage(TestCase):
"lastUpdaterUserId": "jh0003"
}
mock_download_artifacts.side_effect = CatalogException("Failed to download 1 from sdc.")
- csar_id = 1
+ csar_id = "1"
try:
ServicePackage().on_distribute(csar_id)
except Exception as e:
self.assertTrue(isinstance(e, CatalogException))
self.assertEqual("Failed to download 1 from sdc.", e.message)
+ @mock.patch.object(sdc, 'get_artifact')
+ @mock.patch.object(sdc, 'download_artifacts')
+ @mock.patch.object(toscaparser, 'parse_sd')
+ def test_service_pkg_distribute(self, mock_parse_sd, mock_download_artifacts, mock_get_artifact):
+ mock_parse_sd.return_value = json.JSONEncoder().encode(self.sd_data)
+ mock_download_artifacts.return_value = "/test.csar"
+ mock_get_artifact.return_value = {
+ "uuid": "1",
+ "invariantUUID": "63eaec39-ffbe-411c-a838-448f2c73f7eb",
+ "name": "underlayvpn",
+ "version": "2.0",
+ "toscaModelURL": "/sdc/v1/catalog/resources/c94490a0-f7ef-48be-b3f8-8d8662a37236/toscaModel",
+ "category": "Volte",
+ "subCategory": "VolteVNF",
+ "resourceType": "VF",
+ "lifecycleState": "CERTIFIED",
+ "distributionStatus": "DISTRIBUTION_APPROVED",
+ "lastUpdaterUserId": "jh0003"
+ }
+ VnfPackageModel(vnfPackageId="1", vnfdId="cd557883-ac4b-462d-aa01-421b5fa606b1").save()
+ PnfPackageModel(pnfPackageId="1", pnfdId="m6000_s").save()
+ ServicePackage().on_distribute(csar_id="1")
+
def test_api_service_pkg_distribute_when_pkg_exists(self):
ServicePackageModel(servicePackageId="1", servicedId="2").save()
resp = self.client.post(
@@ -185,18 +424,18 @@ class TestServicePackage(TestCase):
###############################################################
- @mock.patch.object(toscaparser, 'parse_nsd')
- def test_service_pkg_parser(self, mock_parse_nsd):
+ @mock.patch.object(toscaparser, 'parse_sd')
+ def test_service_pkg_parser(self, mock_parse_sd):
ServicePackageModel(servicePackageId="8", servicedId="2").save()
- mock_parse_nsd.return_value = json.JSONEncoder().encode({"a": "b"})
+ mock_parse_sd.return_value = json.JSONEncoder().encode({"a": "b"})
inputs = []
- ret = ServicePackage().parse_serviced(8, inputs)
+ ret = ServicePackage().parse_serviced("8", inputs)
self.assertTrue({"model": '{"c": "d"}'}, ret)
def test_service_pkg_parser_not_found(self):
try:
- csar_id = 8000
+ csar_id = "8000"
inputs = []
ServicePackage().parse_serviced(csar_id, inputs)
except PackageNotFoundException as e:
diff --git a/catalog/pub/utils/toscaparser/__init__.py b/catalog/pub/utils/toscaparser/__init__.py
index ecc3dacd..62ead96a 100644
--- a/catalog/pub/utils/toscaparser/__init__.py
+++ b/catalog/pub/utils/toscaparser/__init__.py
@@ -15,8 +15,9 @@
import json
from catalog.pub.utils.toscaparser.nsdmodel import NsdInfoModel
-from catalog.pub.utils.toscaparser.vnfdmodel import EtsiVnfdInfoModel
from catalog.pub.utils.toscaparser.pnfmodel import PnfdInfoModel
+from catalog.pub.utils.toscaparser.sdmodel import SdInfoModel
+from catalog.pub.utils.toscaparser.vnfdmodel import EtsiVnfdInfoModel
def parse_nsd(path, input_parameters=[]):
@@ -26,6 +27,13 @@ def parse_nsd(path, input_parameters=[]):
return strResponse
+def parse_sd(path, input_parameters=[]):
+ tosca_obj = SdInfoModel(path, input_parameters)
+ strResponse = json.dumps(tosca_obj, default=lambda obj: obj.__dict__)
+ strResponse = strResponse.replace(': null', ': ""')
+ return strResponse
+
+
def parse_vnfd(path, input_parameters=[], isETSI=True):
if isETSI:
tosca_obj = EtsiVnfdInfoModel(path, input_parameters)
diff --git a/catalog/pub/utils/toscaparser/sdmodel.py b/catalog/pub/utils/toscaparser/sdmodel.py
new file mode 100644
index 00000000..ac49d445
--- /dev/null
+++ b/catalog/pub/utils/toscaparser/sdmodel.py
@@ -0,0 +1,87 @@
+# Copyright (c) 2019, CMCC Technologies. Co., Ltd.
+#
+# 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 logging
+
+from catalog.pub.utils.toscaparser.basemodel import BaseInfoModel
+from catalog.pub.utils.toscaparser.servicemodel import SdcServiceModel
+
+logger = logging.getLogger(__name__)
+
+
+class SdInfoModel(BaseInfoModel):
+ def __init__(self, path, params):
+ super(SdInfoModel, self).__init__(path, params)
+
+ def parseModel(self, tosca):
+ self.metadata = self.buildMetadata(tosca)
+ self.inputs = self.build_inputs(tosca)
+
+ sdcModle = SdcServiceModel(tosca)
+ if sdcModle:
+ self.service = sdcModle.ns
+ if hasattr(tosca, 'nodetemplates'):
+ self.basepath = sdcModle.basepath
+ self.vnfs = sdcModle.vnfs
+ self.pnfs = sdcModle.pnfs
+ self.vls = sdcModle.vls
+ self.graph = sdcModle.graph
+
+ def build_inputs(self, tosca):
+ """ Get all the inputs for complex type"""
+ result_inputs = {}
+
+ if not tosca.inputs:
+ return {}
+
+ for input in tosca.inputs:
+ type = input.schema.type
+ if type.__eq__('list') or type.__eq__('map'):
+ complex_input = []
+ entry_schema = input.schema.schema['entry_schema']
+ self.get_child_input_repeat(complex_input, entry_schema, input)
+ result_inputs[input.schema.name] = complex_input
+
+ else:
+ simple_input = {
+ "type": input.schema.type,
+ "description": input.schema.description,
+ "required": input.schema.required,
+ }
+ result_inputs[input.schema.name] = simple_input
+ return result_inputs
+
+ def get_child_input_repeat(self, complex_input, entry_schema, input):
+ custom_defs = input.custom_defs
+ properties = custom_defs[entry_schema]['properties']
+ for key, value in properties.iteritems():
+ if value['type'].__eq__('list'):
+ child_complex_input = []
+ child_entry_schema = value['entry_schema']
+ self.get_child_input_repeat(child_complex_input, child_entry_schema, input)
+ complex_input.append({key: child_complex_input})
+ else:
+ if 'description' in value.keys():
+ simple_input = {
+ key: "",
+ "type": value['type'],
+ "required": value['required'],
+ "description": value['description'],
+ }
+ else:
+ simple_input = {
+ key: "",
+ "type": value['type'],
+ "required": value['required'],
+ }
+ complex_input.append(simple_input)