Fix vnf package get logic
[vfc/nfvo/lcm.git] / lcm / packages / sdc_nf_package.py
1 # Copyright 2017 ZTE Corporation.
2 #
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
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 import json
16 import logging
17 import os
18 import sys
19 import threading
20 import traceback
21
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
29
30 logger = logging.getLogger(__name__)
31
32 JOB_ERROR = 255
33
34
35 def nf_get_csars():
36     ret = None
37     try:
38         ret = SdcNfPackage().get_csars()
39     except NSLCMException as e:
40         return [1, e.message]
41     except:
42         logger.error(traceback.format_exc())
43         return [1, str(sys.exc_info())]
44     return ret
45
46
47 def nf_get_csar(csar_id):
48     ret = None
49     try:
50         ret = SdcNfPackage().get_csar(csar_id)
51     except NSLCMException as e:
52         return [1, e.message]
53     except:
54         logger.error(traceback.format_exc())
55         return [1, str(sys.exc_info())]
56     return ret
57
58
59 #####################################################################################
60 class SdcNfDistributeThread(threading.Thread):
61     """
62     Sdc NF Package Distribute
63     """
64
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
70         self.job_id = job_id
71
72         self.csar_save_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
73
74     def run(self):
75         try:
76             self.on_distribute()
77         except NSLCMException as e:
78             self.rollback_distribute()
79             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
80         except:
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)
85
86     def on_distribute(self):
87         JobUtil.create_job(
88             inst_type='nf',
89             jobaction='on_distribute',
90             inst_id=self.csar_id,
91             job_id=self.job_id)
92         JobUtil.add_job_status(self.job_id, 5, "Start CSAR(%s) distribute." % self.csar_id)
93
94         if NfPackageModel.objects.filter(nfpackageid=self.csar_id):
95             raise NSLCMException("NF CSAR(%s) already exists." % self.csar_id)
96
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"],
100                                                  local_path,
101                                                  "%s.csar" % artifact.get("name", self.csar_id))
102
103         vnfd_json = toscaparser.parse_vnfd(local_file_name)
104         vnfd = json.JSONDecoder().decode(vnfd_json)
105
106         nfd_id = vnfd["metadata"]["id"]
107         if NfPackageModel.objects.filter(vnfdid=nfd_id):
108             raise NSLCMException("NFD(%s) already exists." % nfd_id)
109
110         JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id)
111
112         vnfd_ver = vnfd["metadata"].get("vnfd_version")
113         if not vnfd_ver:
114             vnfd_ver = vnfd["metadata"].get("vnfdVersion", "undefined")
115         NfPackageModel(
116             uuid=self.csar_id,
117             nfpackageid=self.csar_id,
118             vnfdid=nfd_id,
119             vendor=vnfd["metadata"].get("vendor", "undefined"),
120             vnfdversion=vnfd_ver,
121             vnfversion=vnfd["metadata"].get("version", "undefined"),
122             vnfdmodel=vnfd_json,
123             vnfd_path=local_file_name).save()
124
125         JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
126
127     def rollback_distribute(self):
128         try:
129             NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
130             fileutil.delete_dirs(self.csar_save_path)
131         except:
132             logger.error(traceback.format_exc())
133             logger.error(str(sys.exc_info()))
134
135
136 ######################################################################################################################
137
138
139 class SdcNfPkgDeleteThread(threading.Thread):
140     """
141     Sdc NF Package Deleting
142     """
143
144     def __init__(self, csar_id, job_id, force_delete):
145         threading.Thread.__init__(self)
146         self.csar_id = csar_id
147         self.job_id = job_id
148         self.force_delete = force_delete
149
150     def run(self):
151         try:
152             self.delete_csar()
153         except NSLCMException as e:
154             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
155         except:
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)
159
160     def delete_csar(self):
161         JobUtil.create_job(
162             inst_type='nf',
163             jobaction='delete',
164             inst_id=self.csar_id,
165             job_id=self.job_id)
166         JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
167
168         if self.force_delete:
169             NfInstModel.objects.filter(package_id=self.csar_id).delete()
170         else:
171             if NfInstModel.objects.filter(package_id=self.csar_id):
172                 raise NSLCMException("NfInst by csar(%s) exists, cannot delete." % self.csar_id)
173
174         JobUtil.add_job_status(self.job_id, 50, "Delete CSAR(%s) from Database." % self.csar_id)
175
176         NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
177
178         JobUtil.add_job_status(self.job_id, 80, "Delete local CSAR(%s) file." % self.csar_id)
179
180         csar_save_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
181         fileutil.delete_dirs(csar_save_path)
182
183         JobUtil.add_job_status(self.job_id, 100, "Delete CSAR(%s) successfully." % self.csar_id)
184
185
186 ######################################################################################################################
187
188 class SdcNfPackage(object):
189     """
190     Actions for sdc nf package.
191     """
192
193     def __init__(self):
194         pass
195
196     def get_csars(self):
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
203             })
204         return [0, csars]
205
206     def get_csar(self, csar_id):
207         """
208         pkg_info = {}
209         nf_pkg = NfPackageModel.objects.filter(nfpackageid=csar_id)
210         if nf_pkg:
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
215         """
216         nf_pkg = sdc_run_catalog.query_vnfpackage_by_id(csar_id)
217         pkg_info = nf_pkg["packageInfo"]
218
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]
222
223         return [0, {"csarId": csar_id,
224                     "packageInfo": pkg_info,
225                     "imageInfo": [],
226                     "vnfInstanceInfo": vnf_inst_info}]