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"],
102 local_path, "%s.csar" % artifact.get("name", self.csar_id))
104 vnfd_json = toscaparser.parse_vnfd(local_file_name)
105 vnfd = json.JSONDecoder().decode(vnfd_json)
107 nfd_id = vnfd["metadata"]["id"]
108 if NfPackageModel.objects.filter(vnfdid=nfd_id):
109 raise NSLCMException("NFD(%s) already exists." % nfd_id)
111 JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id)
113 vnfd_ver = vnfd["metadata"].get("vnfd_version")
115 vnfd_ver = vnfd["metadata"].get("vnfdVersion", "undefined")
118 nfpackageid=self.csar_id,
120 vendor=vnfd["metadata"].get("vendor", "undefined"),
121 vnfdversion=vnfd_ver,
122 vnfversion=vnfd["metadata"].get("version", "undefined"),
124 vnfd_path=local_file_name
127 JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
130 def rollback_distribute(self):
132 NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
133 fileutil.delete_dirs(self.csar_save_path)
135 logger.error(traceback.format_exc())
136 logger.error(str(sys.exc_info()))
139 ######################################################################################################################
142 class SdcNfPkgDeleteThread(threading.Thread):
144 Sdc NF Package Deleting
147 def __init__(self, csar_id, job_id, force_delete):
148 threading.Thread.__init__(self)
149 self.csar_id = csar_id
151 self.force_delete = force_delete
156 except NSLCMException as e:
157 JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
159 logger.error(traceback.format_exc())
160 logger.error(str(sys.exc_info()))
161 JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to delete CSAR(%s)" % self.csar_id)
163 def delete_csar(self):
167 inst_id=self.csar_id,
169 JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
171 if self.force_delete:
172 NfInstModel.objects.filter(package_id=self.csar_id).delete()
174 if NfInstModel.objects.filter(package_id=self.csar_id):
175 raise NSLCMException("NfInst by csar(%s) exists, cannot delete." % self.csar_id)
177 JobUtil.add_job_status(self.job_id, 50, "Delete CSAR(%s) from Database." % self.csar_id)
179 NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
181 JobUtil.add_job_status(self.job_id, 80, "Delete local CSAR(%s) file." % self.csar_id)
183 csar_save_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
184 fileutil.delete_dirs(csar_save_path)
186 JobUtil.add_job_status(self.job_id, 100, "Delete CSAR(%s) successfully." % self.csar_id)
189 ######################################################################################################################
191 class SdcNfPackage(object):
193 Actions for sdc nf package.
200 csars = {"csars": []}
201 nf_pkgs = NfPackageModel.objects.filter()
202 for nf_pkg in nf_pkgs:
203 csars["csars"].append({
204 "csarId": nf_pkg.nfpackageid,
205 "vnfdId": nf_pkg.vnfdid
209 def get_csar(self, csar_id):
211 nf_pkg = NfPackageModel.objects.filter(nfpackageid=csar_id)
213 pkg_info["vnfdId"] = nf_pkg[0].vnfdid
214 pkg_info["vnfdProvider"] = nf_pkg[0].vendor
215 pkg_info["vnfdVersion"] = nf_pkg[0].vnfdversion
216 pkg_info["vnfVersion"] = nf_pkg[0].vnfversion
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}]