diff options
author | maopengzhang <zhang.maopeng1@zte.com.cn> | 2018-11-19 20:12:54 +0800 |
---|---|---|
committer | maopengzhang <zhang.maopeng1@zte.com.cn> | 2018-11-21 09:39:18 +0800 |
commit | 8dfaa7ba8b5e60a366b22b730a7f47529aefbbac (patch) | |
tree | e958dd1fa6f7a36dfaf7ef098d8e6810eef21046 | |
parent | b36a88c07da383d3596dda0936d3db34ae1b360c (diff) |
fix NS&VNF package parser error
fix NS&VNF package parser error
Change-Id: Ib416e74c6c8bcd6a88899b55f534728d98b1a76a
Issue-ID: VFC-1185
Signed-off-by: maopengzhang <zhang.maopeng1@zte.com.cn>
-rw-r--r-- | catalog/packages/biz/ns_descriptor.py | 4 | ||||
-rw-r--r-- | catalog/packages/biz/sdc_ns_package.py | 7 | ||||
-rw-r--r-- | catalog/packages/biz/sdc_vnf_package.py | 29 | ||||
-rw-r--r-- | catalog/packages/biz/vnf_package.py | 2 | ||||
-rw-r--r-- | catalog/packages/tests/test_vnfpackage.py | 12 | ||||
-rw-r--r-- | catalog/pub/utils/fileutil.py | 12 |
6 files changed, 49 insertions, 17 deletions
diff --git a/catalog/packages/biz/ns_descriptor.py b/catalog/packages/biz/ns_descriptor.py index 91c1ec18..0e4dff01 100644 --- a/catalog/packages/biz/ns_descriptor.py +++ b/catalog/packages/biz/ns_descriptor.py @@ -121,12 +121,12 @@ class NsDescriptor(object): logger.info('NSD(%s) has been downloaded.' % nsd_info_id) return read(local_file_path, start, end) - def parse_nsd_and_save(self, nsd_info_id, local_file_name, isETSI=True): + def parse_nsd_and_save(self, nsd_info_id, local_file_name): logger.info('Start to process NSD(%s)...' % nsd_info_id) ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id) ns_pkgs.update(onboardingState=PKG_STATUS.PROCESSING) - nsd_json = toscaparser.parse_nsd(local_file_name, isETSI) + nsd_json = toscaparser.parse_nsd(local_file_name) logger.debug("%s", nsd_json) nsd = json.JSONDecoder().decode(nsd_json) diff --git a/catalog/packages/biz/sdc_ns_package.py b/catalog/packages/biz/sdc_ns_package.py index b441723f..34dc8675 100644 --- a/catalog/packages/biz/sdc_ns_package.py +++ b/catalog/packages/biz/sdc_ns_package.py @@ -24,6 +24,7 @@ from catalog.pub.exceptions import CatalogException from catalog.pub.msapi import sdc from catalog.pub.utils import toscaparser from catalog.packages.biz.ns_descriptor import NsDescriptor +from catalog.pub.utils import fileutil logger = logging.getLogger(__name__) @@ -122,13 +123,17 @@ class NsPackage(object): local_path = os.path.join(CATALOG_ROOT_PATH, csar_id) csar_name = "%s.csar" % artifact.get("name", csar_id) local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path, csar_name) + if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"): + artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/ns.csar") + if os.path.exists(artifact_vnf_file): + local_file_name = artifact_vnf_file data = { 'userDefinedData': "" } nsd = NsDescriptor() nsd.create(data, csar_id) - nsd.parse_nsd_and_save(csar_id, local_file_name, False) + nsd.parse_nsd_and_save(csar_id, local_file_name) return [0, "CSAR(%s) distributed successfully." % csar_id] def delete_csar(self, csar_id): diff --git a/catalog/packages/biz/sdc_vnf_package.py b/catalog/packages/biz/sdc_vnf_package.py index f74aed9a..8db251be 100644 --- a/catalog/packages/biz/sdc_vnf_package.py +++ b/catalog/packages/biz/sdc_vnf_package.py @@ -120,30 +120,35 @@ class NfDistributeThread(threading.Thread): local_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id) csar_name = "%s.csar" % artifact.get("name", self.csar_id) local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path, csar_name) + if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"): + artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/vnf.csar") + if os.path.exists(artifact_vnf_file): + local_file_name = artifact_vnf_file vnfd_json = toscaparser.parse_vnfd(local_file_name) vnfd = json.JSONDecoder().decode(vnfd_json) - nfd_id = vnfd["metadata"]["id"] - if VnfPackageModel.objects.filter(vnfdId=nfd_id): - raise CatalogException("NFD(%s) already exists." % nfd_id) + if not vnfd.get("vnf"): + raise CatalogException("VNF propeties and metadata in VNF Package(id=%s) are empty." % self.csar_id) + vnfd_id = vnfd["vnf"]["properties"].get("descriptor_id", "") + if VnfPackageModel.objects.filter(vnfdId=vnfd_id): + logger.error("VNF package(%s) already exists.", vnfd_id) + raise CatalogException("VNF package(%s) already exists." % vnfd_id) JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id) - - vnfd_ver = vnfd["metadata"].get("vnfd_version") - if not vnfd_ver: - vnfd_ver = vnfd["metadata"].get("vnfdVersion", "undefined") + vnfd_ver = vnfd["vnf"]["properties"].get("descriptor_verison", "") + vnf_provider = vnfd["vnf"]["properties"].get("provider", "") + vnf_software_version = vnfd["vnf"]["properties"].get("software_version", "") VnfPackageModel( vnfPackageId=self.csar_id, - vnfdId=nfd_id, - vnfVendor=vnfd["metadata"].get("vendor", "undefined"), + vnfdId=vnfd_id, + vnfVendor=vnf_provider, vnfdVersion=vnfd_ver, - vnfSoftwareVersion=vnfd["metadata"].get("version", "undefined"), + vnfSoftwareVersion=vnf_software_version, vnfdModel=vnfd_json, localFilePath=local_file_name, vnfPackageUri=csar_name ).save() - JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id) def rollback_distribute(self): @@ -226,7 +231,7 @@ class NfPackage(object): pkg_info["csarName"] = nf_pkg[0].vnfPackageUri pkg_info["vnfdModel"] = nf_pkg[0].vnfdModel pkg_info["downloadUrl"] = "http://%s:%s/%s/%s/%s" % ( - MSB_SERVICE_IP, + MSB_SERVICE_IP, # REG_TO_MSB_REG_PARAM[0]["nodes"][0]["ip"], REG_TO_MSB_REG_PARAM[0]["nodes"][0]["port"], CATALOG_URL_PATH, csar_id, diff --git a/catalog/packages/biz/vnf_package.py b/catalog/packages/biz/vnf_package.py index 2ecc35b8..1eea540a 100644 --- a/catalog/packages/biz/vnf_package.py +++ b/catalog/packages/biz/vnf_package.py @@ -200,7 +200,7 @@ def parse_vnfd_and_save(vnf_pkg_id, vnf_pkg_path): if other_pkg and other_pkg[0].vnfPackageId != vnf_pkg_id: logger.error("VNF package(%s,%s) already exists.", other_pkg[0].vnfPackageId, vnfd_id) raise CatalogException("VNF package(%s) already exists." % vnfd_id) - vnf_provider = vnfd["vnf"].get("provider", "") + vnf_provider = vnfd["vnf"]["properties"].get("provider", "") vnfd_ver = vnfd["vnf"]["properties"].get("descriptor_verison", "") vnf_software_version = vnfd["vnf"]["properties"].get("software_version", "") vnfd_product_name = vnfd["vnf"]["properties"].get("product_name", "") diff --git a/catalog/packages/tests/test_vnfpackage.py b/catalog/packages/tests/test_vnfpackage.py index 0086129d..15d62e0d 100644 --- a/catalog/packages/tests/test_vnfpackage.py +++ b/catalog/packages/tests/test_vnfpackage.py @@ -232,6 +232,16 @@ class TestNfPackage(TestCase): "vnfProductInfoDescription": "hss", "vnfdVersion": "1.0.0", "vnfProductInfoName": "hss" + }, + "vnf": { + "properties": { + "descriptor_id": "zte-hss-1.0", + "descriptor_verison": "1.0.0", + "software_version": "1.0.0", + "provider": "zte" + }, + "metadata": { + } } } @@ -277,7 +287,7 @@ class TestNfPackage(TestCase): vim_ids=["1"], lab_vim_id="", job_id="2").run() - self.assert_job_result("2", 255, "NFD(zte-hss-1.0) already exists.") + self.assert_job_result("2", 255, "VNF package(zte-hss-1.0) already exists.") @mock.patch.object(restcall, 'call_req') @mock.patch.object(sdc, 'download_artifacts') diff --git a/catalog/pub/utils/fileutil.py b/catalog/pub/utils/fileutil.py index bd1a4aff..48b64cb7 100644 --- a/catalog/pub/utils/fileutil.py +++ b/catalog/pub/utils/fileutil.py @@ -16,6 +16,8 @@ import shutil import logging import traceback import urllib2 +import zipfile + logger = logging.getLogger(__name__) @@ -50,3 +52,13 @@ def download_file_from_http(url, local_dir, file_name): logger.error(traceback.format_exc()) logger.error("Failed to download %s to %s.", url, local_file_name) return is_download_ok, local_file_name + + +def unzip_file(zip_src, dst_dir, csar_path): + if os.path.exists(zip_src): + fz = zipfile.ZipFile(zip_src, 'r') + for file in fz.namelist(): + fz.extract(file, dst_dir) + return os.path.join(dst_dir, csar_path) + else: + return "" |