1 # Copyright 2017 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
22 from lcm.pub.config.config import CATALOG_ROOT_PATH
23 from lcm.pub.database.models import NfPackageModel, NfInstModel
24 from lcm.pub.exceptions import NSLCMException
25 from lcm.pub.msapi import sdc, sdc_run_catalog
26 from lcm.pub.utils import fileutil
27 from lcm.pub.utils import toscaparser
28 from lcm.pub.utils.jobutil import JobUtil
30 logger = logging.getLogger(__name__)
38 ret = SdcNfPackage().get_csars()
39 except NSLCMException as e:
42 logger.error(traceback.format_exc())
43 return [1, str(sys.exc_info())]
47 def nf_get_csar(csar_id):
50 ret = SdcNfPackage().get_csar(csar_id)
51 except NSLCMException as e:
54 logger.error(traceback.format_exc())
55 return [1, str(sys.exc_info())]
59 #####################################################################################
60 class SdcNfDistributeThread(threading.Thread):
62 Sdc NF Package Distribute
65 def __init__(self, csar_id, vim_ids, lab_vim_id, job_id):
66 threading.Thread.__init__(self)
67 self.csar_id = csar_id
68 self.vim_ids = vim_ids
69 self.lab_vim_id = lab_vim_id
72 self.csar_save_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
77 except NSLCMException as e:
78 self.rollback_distribute()
79 JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
81 logger.error(traceback.format_exc())
82 logger.error(str(sys.exc_info()))
83 self.rollback_distribute()
84 JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to distribute CSAR(%s)" % self.csar_id)
86 def on_distribute(self):
89 jobaction='on_distribute',
92 JobUtil.add_job_status(self.job_id, 5, "Start CSAR(%s) distribute." % self.csar_id)
94 if NfPackageModel.objects.filter(nfpackageid=self.csar_id):
95 raise NSLCMException("NF CSAR(%s) already exists." % self.csar_id)
97 artifact = sdc.get_artifact(sdc.ASSETTYPE_RESOURCES, self.csar_id)
98 local_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
99 local_file_name = sdc.download_artifacts(artifact["toscaModelURL"],
101 "%s.csar" % artifact.get("name", self.csar_id))
103 vnfd_json = toscaparser.parse_vnfd(local_file_name)
104 vnfd = json.JSONDecoder().decode(vnfd_json)
106 nfd_id = vnfd["metadata"]["id"]
107 if NfPackageModel.objects.filter(vnfdid=nfd_id):
108 raise NSLCMException("NFD(%s) already exists." % nfd_id)
110 JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id)
112 vnfd_ver = vnfd["metadata"].get("vnfd_version")
114 vnfd_ver = vnfd["metadata"].get("vnfdVersion", "undefined")
117 nfpackageid=self.csar_id,
119 vendor=vnfd["metadata"].get("vendor", "undefined"),
120 vnfdversion=vnfd_ver,
121 vnfversion=vnfd["metadata"].get("version", "undefined"),
123 vnfd_path=local_file_name).save()
125 JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
127 def rollback_distribute(self):
129 NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
130 fileutil.delete_dirs(self.csar_save_path)
132 logger.error(traceback.format_exc())
133 logger.error(str(sys.exc_info()))
136 ######################################################################################################################
139 class SdcNfPkgDeleteThread(threading.Thread):
141 Sdc NF Package Deleting
144 def __init__(self, csar_id, job_id, force_delete):
145 threading.Thread.__init__(self)
146 self.csar_id = csar_id
148 self.force_delete = force_delete
153 except NSLCMException as e:
154 JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
156 logger.error(traceback.format_exc())
157 logger.error(str(sys.exc_info()))
158 JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to delete CSAR(%s)" % self.csar_id)
160 def delete_csar(self):
164 inst_id=self.csar_id,
166 JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
168 if self.force_delete:
169 NfInstModel.objects.filter(package_id=self.csar_id).delete()
171 if NfInstModel.objects.filter(package_id=self.csar_id):
172 raise NSLCMException("NfInst by csar(%s) exists, cannot delete." % self.csar_id)
174 JobUtil.add_job_status(self.job_id, 50, "Delete CSAR(%s) from Database." % self.csar_id)
176 NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
178 JobUtil.add_job_status(self.job_id, 80, "Delete local CSAR(%s) file." % self.csar_id)
180 csar_save_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
181 fileutil.delete_dirs(csar_save_path)
183 JobUtil.add_job_status(self.job_id, 100, "Delete CSAR(%s) successfully." % self.csar_id)
186 ######################################################################################################################
188 class SdcNfPackage(object):
190 Actions for sdc nf package.
197 csars = {"csars": []}
198 nf_pkgs = NfPackageModel.objects.filter()
199 for nf_pkg in nf_pkgs:
200 csars["csars"].append({
201 "csarId": nf_pkg.nfpackageid,
202 "vnfdId": nf_pkg.vnfdid
206 def get_csar(self, csar_id):
209 nf_pkg = NfPackageModel.objects.filter(nfpackageid=csar_id)
211 pkg_info["vnfdId"] = nf_pkg[0].vnfdid
212 pkg_info["vnfdProvider"] = nf_pkg[0].vendor
213 pkg_info["vnfdVersion"] = nf_pkg[0].vnfdversion
214 pkg_info["vnfVersion"] = nf_pkg[0].vnfversion
216 nf_pkg = sdc_run_catalog.query_vnfpackage_by_id(csar_id)
217 pkg_info = nf_pkg["packageInfo"]
219 vnf_insts = NfInstModel.objects.filter(package_id=csar_id)
220 vnf_inst_info = [{"vnfInstanceId": vnf_inst.nfinstid,
221 "vnfInstanceName": vnf_inst.nf_name} for vnf_inst in vnf_insts]
223 return [0, {"csarId": csar_id,
224 "packageInfo": pkg_info,
226 "vnfInstanceInfo": vnf_inst_info}]