diff options
author | dyh <dengyuanhong@chinamobile.com> | 2019-04-03 15:45:35 +0800 |
---|---|---|
committer | deng yuanhong <dengyuanhong@chinamobile.com> | 2019-04-03 08:37:23 +0000 |
commit | b21f397d129afef6bfb540eea8e7af3286ff0aa8 (patch) | |
tree | 1e4ad6f4ad522a51673eb5f9207c2b2cc0f9997e | |
parent | be6150278ad87a1096df914954e76b99222b9eb8 (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.py | 2 | ||||
-rw-r--r-- | catalog/packages/biz/service_descriptor.py | 27 | ||||
-rw-r--r-- | catalog/packages/tests/test_service_descriptor.py | 125 | ||||
-rw-r--r-- | catalog/packages/tests/test_servicepackage.py | 259 | ||||
-rw-r--r-- | catalog/pub/utils/toscaparser/__init__.py | 10 | ||||
-rw-r--r-- | catalog/pub/utils/toscaparser/sdmodel.py | 87 |
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) |