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 catalog.pub.config.config import CATALOG_ROOT_PATH
23 from catalog.pub.database.models import VnfPackageModel
24 from catalog.pub.exceptions import CatalogException
25 from catalog.pub.msapi import sdc
26 from catalog.pub.utils import fileutil
27 from catalog.pub.utils import toscaparser
28 from catalog.pub.utils.jobutil import JobUtil
30 logger = logging.getLogger(__name__)
37 ret = NfPackage().get_csars()
38 except CatalogException as e:
41 logger.error(traceback.format_exc())
42 return [1, str(sys.exc_info())]
45 def nf_get_csar(csar_id):
48 ret = NfPackage().get_csar(csar_id)
49 except CatalogException as e:
52 logger.error(traceback.format_exc())
53 return [1, str(sys.exc_info())]
56 def parse_vnfd(csar_id, inputs):
59 nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=csar_id)
61 csar_path = nf_pkg[0].localFilePath
62 ret = {"model": toscaparser.parse_vnfd(csar_path, inputs)}
63 except CatalogException as e:
66 logger.error(traceback.format_exc())
67 return [1, str(sys.exc_info())]
71 class NfDistributeThread(threading.Thread):
73 Sdc NF Package Distribute
76 def __init__(self, csar_id, vim_ids, lab_vim_id, job_id):
77 threading.Thread.__init__(self)
78 self.csar_id = csar_id
79 self.vim_ids = vim_ids
80 self.lab_vim_id = lab_vim_id
83 self.csar_save_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
88 except CatalogException as e:
89 self.rollback_distribute()
90 JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
92 logger.error(traceback.format_exc())
93 logger.error(str(sys.exc_info()))
94 self.rollback_distribute()
95 JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to distribute CSAR(%s)" % self.csar_id)
97 def on_distribute(self):
100 jobaction='on_distribute',
101 inst_id=self.csar_id,
103 JobUtil.add_job_status(self.job_id, 5, "Start CSAR(%s) distribute." % self.csar_id)
105 if VnfPackageModel.objects.filter(vnfPackageId=self.csar_id):
106 raise CatalogException("NF CSAR(%s) already exists." % self.csar_id)
108 vnfd,local_file_name,vnfd_json = self.get_vnfd(self.csar_id)
110 nfd_id = vnfd["metadata"]["id"]
111 if VnfPackageModel.objects.filter(vnfdId=nfd_id):
112 raise CatalogException("NFD(%s) already exists." % nfd_id)
114 JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id)
116 vnfd_ver = vnfd["metadata"].get("vnfd_version")
118 vnfd_ver = vnfd["metadata"].get("vnfdVersion", "undefined")
121 vnfPackageId=self.csar_id,
123 vnfVendor=vnfd["metadata"].get("vendor", "undefined"),
124 vnfdVersion=vnfd_ver,
125 vnfSoftwareVersion=vnfd["metadata"].get("version", "undefined"),
127 localFilePath=local_file_name,
131 JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
133 def get_vnfd(self, csar_id):
134 artifact = sdc.get_artifact(sdc.ASSETTYPE_RESOURCES, self.csar_id)
135 local_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
136 local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path)
137 vnfd_json = toscaparser.parse_vnfd(local_file_name)
138 vnfd = json.JSONDecoder().decode(vnfd_json)
139 return vnfd,local_file_name,vnfd_json
141 def rollback_distribute(self):
143 VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete()
144 fileutil.delete_dirs(self.csar_save_path)
146 logger.error(traceback.format_exc())
147 logger.error(str(sys.exc_info()))
150 class NfPkgDeleteThread(threading.Thread):
152 Sdc NF Package Deleting
155 def __init__(self, csar_id, job_id, force_delete):
156 threading.Thread.__init__(self)
157 self.csar_id = csar_id
159 self.force_delete = force_delete
164 except CatalogException as e:
165 JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
167 logger.error(traceback.format_exc())
168 logger.error(str(sys.exc_info()))
169 JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to delete CSAR(%s)" % self.csar_id)
171 def delete_csar(self):
175 inst_id=self.csar_id,
177 JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
179 VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete()
181 JobUtil.add_job_status(self.job_id, 50, "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 class NfPackage(object):
191 Actions for sdc nf package.
198 csars = {"csars": []}
199 nf_pkgs = VnfPackageModel.objects.filter()
200 for nf_pkg in nf_pkgs:
201 csars["csars"].append({
202 "csarId": nf_pkg.vnfPackageId,
203 "vnfdId": nf_pkg.vnfdId
207 def get_csar(self, csar_id):
209 nf_pkg = VnfPackageModel.objects.filter(nfpackageid=csar_id)
211 pkg_info["vnfdId"] = nf_pkg[0].vnfdId
212 pkg_info["vnfdProvider"] = nf_pkg[0].vnfVendor
213 pkg_info["vnfdVersion"] = nf_pkg[0].vnfdVersion
214 pkg_info["vnfVersion"] = nf_pkg[0].vnfSoftwareVersion
216 return [0, {"csarId": csar_id,
217 "packageInfo": pkg_info,