aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormaopengzhang <zhang.maopeng1@zte.com.cn>2018-11-19 20:12:54 +0800
committermaopengzhang <zhang.maopeng1@zte.com.cn>2018-11-21 09:39:18 +0800
commit8dfaa7ba8b5e60a366b22b730a7f47529aefbbac (patch)
treee958dd1fa6f7a36dfaf7ef098d8e6810eef21046
parentb36a88c07da383d3596dda0936d3db34ae1b360c (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.py4
-rw-r--r--catalog/packages/biz/sdc_ns_package.py7
-rw-r--r--catalog/packages/biz/sdc_vnf_package.py29
-rw-r--r--catalog/packages/biz/vnf_package.py2
-rw-r--r--catalog/packages/tests/test_vnfpackage.py12
-rw-r--r--catalog/pub/utils/fileutil.py12
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 ""