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
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):
208 nf_pkg = NfPackageModel.objects.filter(nfpackageid=csar_id)
210 pkg_info["vnfdId"] = nf_pkg[0].vnfdid
211 pkg_info["vnfdProvider"] = nf_pkg[0].vendor
212 pkg_info["vnfdVersion"] = nf_pkg[0].vnfdversion
213 pkg_info["vnfVersion"] = nf_pkg[0].vnfversion
215 vnf_insts = NfInstModel.objects.filter(package_id=csar_id)
216 vnf_inst_info = [{"vnfInstanceId": vnf_inst.nfinstid,
217 "vnfInstanceName": vnf_inst.nf_name} for vnf_inst in vnf_insts]
219 return [0, {"csarId": csar_id,
220 "packageInfo": pkg_info,
222 "vnfInstanceInfo": vnf_inst_info}]