import sys
import threading
import traceback
+import zipfile
+from catalog.packages.biz.vnf_package import VnfPackage
from catalog.packages.const import PKG_STATUS
from catalog.pub.config.config import CATALOG_ROOT_PATH, CATALOG_URL_PATH
from catalog.pub.config.config import REG_TO_MSB_REG_PARAM
from catalog.pub.database.models import VnfPackageModel
-from catalog.pub.exceptions import CatalogException
+from catalog.pub.exceptions import CatalogException, PackageHasExistsException
from catalog.pub.msapi import sdc
from catalog.pub.utils import fileutil
from catalog.pub.utils import toscaparser
-from catalog.pub.utils.jobutil import JobUtil
+from catalog.pub.utils.jobutil import JobUtil, JOB_ERROR_CODE
logger = logging.getLogger(__name__)
def run(self):
try:
self.on_distribute()
+ except PackageHasExistsException as e:
+ self.rollback_distribute()
+ JobUtil.add_job_status(self.job_id, JOB_ERROR, e.args[0], error_code=JOB_ERROR_CODE.PACKAGE_EXIST)
except CatalogException as e:
self.rollback_distribute()
- JobUtil.add_job_status(self.job_id, JOB_ERROR, e.args[0])
+ JobUtil.add_job_status(self.job_id, JOB_ERROR, e.args[0], error_code=JOB_ERROR_CODE.CATALOG_EXCEPTION)
except Exception as e:
logger.error(e.args[0])
logger.error(traceback.format_exc())
logger.error(str(sys.exc_info()))
self.rollback_distribute()
- JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to distribute CSAR(%s)" % self.csar_id)
+ JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to distribute CSAR(%s)" % self.csar_id,
+ error_code=JOB_ERROR_CODE.SYSTEM_ERROR)
def on_distribute(self):
JobUtil.create_job(
if VnfPackageModel.objects.filter(vnfPackageId=self.csar_id):
err_msg = "NF CSAR(%s) already exists." % self.csar_id
- JobUtil.add_job_status(self.job_id, JOB_ERROR, err_msg)
+ JobUtil.add_job_status(self.job_id, JOB_ERROR, err_msg, error_code=JOB_ERROR_CODE.PACKAGE_EXIST)
return
artifact = sdc.get_artifact(sdc.ASSETTYPE_RESOURCES, 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"):
fileutil.unzip_csar(local_file_name, local_path)
- vendor_vnf_file = ""
+ vendor_vnf_file = ''
# find original vendor ETSI package under the ONBOARDING_PACKAGE directory
onboarding_package_dir = os.path.join(local_path, "Artifacts/Deployment/ONBOARDED_PACKAGE")
if os.path.exists(onboarding_package_dir):
break
# find original vendor ETSI package under Artifacts/Deployment/OTHER directory
- if vendor_vnf_file.isspace():
+ if vendor_vnf_file.strip() == '':
vendor_vnf_file = os.path.join(local_path, "Artifacts/Deployment/OTHER/vnf.csar")
if os.path.exists(vendor_vnf_file):
local_file_name = vendor_vnf_file
else:
local_file_name = vendor_vnf_file
+ # create VNFD zip file
+ self.create_vnfd_zip(self.csar_id, vendor_vnf_file)
+
vnfd_json = toscaparser.parse_vnfd(local_file_name)
vnfd = json.JSONDecoder().decode(vnfd_json)
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)
+ raise PackageHasExistsException("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["vnf"]["properties"].get("descriptor_version", "")
vnf_provider = vnfd["vnf"]["properties"].get("provider", "")
).save()
JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
+ def create_vnfd_zip(self, csar_id, vendor_vnf_file):
+ """
+ Create VNFD zip file.
+ :param csar_id: CSAR Id
+ :param vendor_vnf_file: the vendor original package(csar)
+ :return:
+ """
+ if os.path.exists(vendor_vnf_file):
+ # create VNFD from vendor original package
+ VnfPackage().creat_vnfd(csar_id, vendor_vnf_file)
+ else:
+ try:
+ vnf_package_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
+ vnfd_zip_file = os.path.join(vnf_package_path, 'VNFD.zip')
+ with zipfile.ZipFile(vnfd_zip_file, 'w', zipfile.ZIP_DEFLATED) as vnfd_zip:
+ def_path = os.path.join(vnf_package_path, "Definitions")
+ if os.path.exists(def_path):
+ def_files = os.listdir(def_path)
+ for def_file in def_files:
+ full_path = os.path.join(def_path, def_file)
+ vnfd_zip.write(full_path, def_file)
+ except Exception as e:
+ logger.error(e)
+ if os.path.exists(vnfd_zip_file):
+ os.remove(vnfd_zip_file)
+
def rollback_distribute(self):
try:
VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete()