Fix vfc-lcm/packages pep8 issue
[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
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         pkg_info = {}
208         nf_pkg = NfPackageModel.objects.filter(nfpackageid=csar_id)
209         if nf_pkg:
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
214
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]
218
219         return [0, {"csarId": csar_id,
220                     "packageInfo": pkg_info,
221                     "imageInfo": [],
222                     "vnfInstanceInfo": vnf_inst_info}]