fix NS&VNF package parser error 20/73220/1
authormaopengzhang <zhang.maopeng1@zte.com.cn>
Mon, 19 Nov 2018 12:12:54 +0000 (20:12 +0800)
committerFu Jinhua <fu.jinhua@zte.com.cn>
Wed, 21 Nov 2018 06:50:57 +0000 (06:50 +0000)
fix NS&VNF package parser error

Change-Id: Ib416e74c6c8bcd6a88899b55f534728d98b1a76a
Issue-ID: VFC-1185
Signed-off-by: maopengzhang <zhang.maopeng1@zte.com.cn>
(cherry picked from commit 8dfaa7ba8b5e60a366b22b730a7f47529aefbbac)

catalog/packages/biz/ns_descriptor.py
catalog/packages/biz/sdc_ns_package.py
catalog/packages/biz/sdc_vnf_package.py
catalog/packages/biz/vnf_package.py
catalog/packages/tests/test_vnfpackage.py
catalog/pub/utils/fileutil.py

index 91c1ec1..0e4dff0 100644 (file)
@@ -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)
 
index b441723..34dc867 100644 (file)
@@ -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):
index f74aed9..8db251b 100644 (file)
@@ -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,
index 2ecc35b..1eea540 100644 (file)
@@ -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", "")
index 0086129..15d62e0 100644 (file)
@@ -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')
index bd1a4af..48b64cb 100644 (file)
@@ -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 ""