11f27b34d74b91ca49a2170c6df194f9bb6622e3
[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 uuid
18 import os
19 import time
20 import threading
21 import traceback
22 import sys
23
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
33
34 logger = logging.getLogger(__name__)
35
36 JOB_ERROR = 255
37
38 def nf_get_csars():
39     ret = None
40     try:
41         ret = SdcNfPackage().get_csars()
42     except NSLCMException as e:
43         return [1, e.message]
44     except:
45         logger.error(traceback.format_exc())
46         return [1, str(sys.exc_info())]
47     return ret
48
49 def nf_get_csar(csar_id):
50     ret = None
51     try:
52         ret = SdcNfPackage().get_csar(csar_id)
53     except NSLCMException as e:
54         return [1, e.message]
55     except:
56         logger.error(traceback.format_exc())
57         return [1, str(sys.exc_info())]
58     return ret
59
60 #####################################################################################
61
62 class SdcNfDistributeThread(threading.Thread):
63     """
64     Sdc NF Package Distribute
65     """
66
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
72         self.job_id = job_id
73
74         self.csar_save_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
75
76     def run(self):
77         try:
78             self.on_distribute()
79         except NSLCMException as e:
80             self.rollback_distribute()
81             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
82         except:
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)
87
88     def on_distribute(self):
89         JobUtil.create_job(
90             inst_type='nf',
91             jobaction='on_distribute',
92             inst_id=self.csar_id,
93             job_id=self.job_id)
94         JobUtil.add_job_status(self.job_id, 5, "Start CSAR(%s) distribute." % self.csar_id)
95
96         if NfPackageModel.objects.filter(nfpackageid=self.csar_id):
97             raise NSLCMException("NF CSAR(%s) already exists." % self.csar_id)
98
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))
103         
104         vnfd_json = toscaparser.parse_vnfd(local_file_name)
105         vnfd = json.JSONDecoder().decode(vnfd_json)
106
107         nfd_id = vnfd["metadata"]["id"]
108         if NfPackageModel.objects.filter(vnfdid=nfd_id):
109             raise NSLCMException("NFD(%s) already exists." % nfd_id)
110
111         JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id)
112
113         vnfd_ver = vnfd["metadata"].get("vnfd_version")
114         if not vnfd_ver:
115             vnfd_ver = vnfd["metadata"].get("vnfdVersion", "undefined")
116         NfPackageModel(
117             uuid=self.csar_id,
118             nfpackageid=self.csar_id,
119             vnfdid=nfd_id,
120             vendor=vnfd["metadata"].get("vendor", "undefined"),
121             vnfdversion=vnfd_ver,
122             vnfversion=vnfd["metadata"].get("version", "undefined"),
123             vnfdmodel=vnfd_json,
124             vnfd_path=local_file_name
125             ).save()
126
127         JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
128
129
130     def rollback_distribute(self):
131         try:
132             NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
133             fileutil.delete_dirs(self.csar_save_path)
134         except:
135             logger.error(traceback.format_exc())
136             logger.error(str(sys.exc_info()))
137
138
139 ######################################################################################################################
140
141
142 class SdcNfPkgDeleteThread(threading.Thread):
143     """
144     Sdc NF Package Deleting
145     """
146
147     def __init__(self, csar_id, job_id, force_delete):
148         threading.Thread.__init__(self)
149         self.csar_id = csar_id
150         self.job_id = job_id
151         self.force_delete = force_delete
152
153     def run(self):
154         try:
155             self.delete_csar()
156         except NSLCMException as e:
157             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
158         except:
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)
162
163     def delete_csar(self):
164         JobUtil.create_job(
165             inst_type='nf',
166             jobaction='delete',
167             inst_id=self.csar_id,
168             job_id=self.job_id)
169         JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
170
171         if self.force_delete:
172             NfInstModel.objects.filter(package_id=self.csar_id).delete()
173         else:
174             if NfInstModel.objects.filter(package_id=self.csar_id):
175                 raise NSLCMException("NfInst by csar(%s) exists, cannot delete." % self.csar_id)
176
177         JobUtil.add_job_status(self.job_id, 50, "Delete CSAR(%s) from Database." % self.csar_id)
178
179         NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
180
181         JobUtil.add_job_status(self.job_id, 80, "Delete local CSAR(%s) file." % self.csar_id)
182
183         csar_save_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
184         fileutil.delete_dirs(csar_save_path)
185
186         JobUtil.add_job_status(self.job_id, 100, "Delete CSAR(%s) successfully." % self.csar_id)
187
188
189 ######################################################################################################################
190
191 class SdcNfPackage(object):
192     """
193     Actions for sdc nf package.
194     """
195
196     def __init__(self):
197         pass
198
199     def get_csars(self):
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
206             })
207         return [0, csars]
208         
209     def get_csar(self, csar_id):
210         pkg_info = {}
211         nf_pkg = NfPackageModel.objects.filter(nfpackageid=csar_id)
212         if nf_pkg:
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
217
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}]
227
228
229