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.
24 from lcm.pub.database.models import NfPackageModel, NfInstModel
25 from lcm.pub.utils.values import ignore_case_get
26 from lcm.pub.utils import fileutil
27 from lcm.pub.exceptions import NSLCMException
28 from lcm.pub.config.config import CATALOG_ROOT_PATH
29 from lcm.pub.msapi.extsys import get_vims
30 from lcm.pub.utils.jobutil import JobUtil
31 from lcm.pub.utils import toscaparser
32 from lcm.pub.msapi import sdc
34 logger = logging.getLogger(__name__)
41 ret = SdcNfPackage().get_csars()
42 except NSLCMException as e:
45 logger.error(traceback.format_exc())
46 return [1, str(sys.exc_info())]
49 def nf_get_csar(csar_id):
52 ret = SdcNfPackage().get_csar(csar_id)
53 except NSLCMException as e:
56 logger.error(traceback.format_exc())
57 return [1, str(sys.exc_info())]
60 #####################################################################################
62 class SdcNfDistributeThread(threading.Thread):
64 Sdc NF Package Distribute
67 def __init__(self, csar_id, vim_ids, lab_vim_id, job_id):
68 threading.Thread.__init__(self)
69 self.csar_id = csar_id
70 self.vim_ids = vim_ids
71 self.lab_vim_id = lab_vim_id
74 self.csar_save_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
79 except NSLCMException as e:
80 self.rollback_distribute()
81 JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
83 logger.error(traceback.format_exc())
84 logger.error(str(sys.exc_info()))
85 self.rollback_distribute()
86 JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to distribute CSAR(%s)" % self.csar_id)
88 def on_distribute(self):
91 jobaction='on_distribute',
94 JobUtil.add_job_status(self.job_id, 5, "Start CSAR(%s) distribute." % self.csar_id)
96 if NfPackageModel.objects.filter(nfpackageid=self.csar_id):
97 raise NSLCMException("NF CSAR(%s) already exists." % self.csar_id)
99 artifact = sdc.get_artifact(sdc.ASSETTYPE_RESOURCES, self.csar_id)
100 local_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
101 local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path)
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
126 JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
129 def rollback_distribute(self):
131 NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
132 fileutil.delete_dirs(self.csar_save_path)
134 logger.error(traceback.format_exc())
135 logger.error(str(sys.exc_info()))
138 ######################################################################################################################
141 class SdcNfPkgDeleteThread(threading.Thread):
143 Sdc NF Package Deleting
146 def __init__(self, csar_id, job_id, force_delete):
147 threading.Thread.__init__(self)
148 self.csar_id = csar_id
150 self.force_delete = force_delete
155 except NSLCMException as e:
156 JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
158 logger.error(traceback.format_exc())
159 logger.error(str(sys.exc_info()))
160 JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to delete CSAR(%s)" % self.csar_id)
162 def delete_csar(self):
166 inst_id=self.csar_id,
168 JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
170 if self.force_delete:
171 NfInstModel.objects.filter(package_id=self.csar_id).delete()
173 if NfInstModel.objects.filter(package_id=self.csar_id):
174 raise NSLCMException("NfInst by csar(%s) exists, cannot delete." % self.csar_id)
176 JobUtil.add_job_status(self.job_id, 50, "Delete CSAR(%s) from Database." % self.csar_id)
178 NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
180 JobUtil.add_job_status(self.job_id, 80, "Delete local CSAR(%s) file." % self.csar_id)
182 csar_save_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
183 fileutil.delete_dirs(csar_save_path)
185 JobUtil.add_job_status(self.job_id, 100, "Delete CSAR(%s) successfully." % self.csar_id)
188 ######################################################################################################################
190 class SdcNfPackage(object):
192 Actions for sdc nf package.
199 csars = {"csars": []}
200 nf_pkgs = NfPackageModel.objects.filter()
201 for nf_pkg in nf_pkgs:
202 csars["csars"].append({
203 "csarId": nf_pkg.nfpackageid,
204 "vnfdId": nf_pkg.vnfdid
208 def get_csar(self, csar_id):
210 nf_pkg = NfPackageModel.objects.filter(nfpackageid=csar_id)
212 pkg_info["vnfdId"] = nf_pkg[0].vnfdid
213 pkg_info["vnfdProvider"] = nf_pkg[0].vendor
214 pkg_info["vnfdVersion"] = nf_pkg[0].vnfdversion
215 pkg_info["vnfVersion"] = nf_pkg[0].vnfversion
218 vnf_insts = NfInstModel.objects.filter(package_id=csar_id)
219 vnf_inst_info = [{"vnfInstanceId": vnf_inst.nfinstid,
220 "vnfInstanceName": vnf_inst.nf_name} for vnf_inst in vnf_insts]
222 return [0, {"csarId": csar_id,
223 "packageInfo": pkg_info,
225 "vnfInstanceInfo": vnf_inst_info}]