Add convert vnfs and pnfs 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 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"], local_path)
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
124             ).save()
125
126         JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
127
128
129     def rollback_distribute(self):
130         try:
131             NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
132             fileutil.delete_dirs(self.csar_save_path)
133         except:
134             logger.error(traceback.format_exc())
135             logger.error(str(sys.exc_info()))
136
137
138 ######################################################################################################################
139
140
141 class SdcNfPkgDeleteThread(threading.Thread):
142     """
143     Sdc NF Package Deleting
144     """
145
146     def __init__(self, csar_id, job_id, force_delete):
147         threading.Thread.__init__(self)
148         self.csar_id = csar_id
149         self.job_id = job_id
150         self.force_delete = force_delete
151
152     def run(self):
153         try:
154             self.delete_csar()
155         except NSLCMException as e:
156             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
157         except:
158             logger.error(traceback.format_exc())
159             logger.error(str(sys.exc_info()))
160             JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to delete CSAR(%s)" % self.csar_id)
161
162     def delete_csar(self):
163         JobUtil.create_job(
164             inst_type='nf',
165             jobaction='delete',
166             inst_id=self.csar_id,
167             job_id=self.job_id)
168         JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
169
170         if self.force_delete:
171             NfInstModel.objects.filter(package_id=self.csar_id).delete()
172         else:
173             if NfInstModel.objects.filter(package_id=self.csar_id):
174                 raise NSLCMException("NfInst by csar(%s) exists, cannot delete." % self.csar_id)
175
176         JobUtil.add_job_status(self.job_id, 50, "Delete CSAR(%s) from Database." % self.csar_id)
177
178         NfPackageModel.objects.filter(nfpackageid=self.csar_id).delete()
179
180         JobUtil.add_job_status(self.job_id, 80, "Delete local CSAR(%s) file." % self.csar_id)
181
182         csar_save_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
183         fileutil.delete_dirs(csar_save_path)
184
185         JobUtil.add_job_status(self.job_id, 100, "Delete CSAR(%s) successfully." % self.csar_id)
186
187
188 ######################################################################################################################
189
190 class SdcNfPackage(object):
191     """
192     Actions for sdc nf package.
193     """
194
195     def __init__(self):
196         pass
197
198     def get_csars(self):
199         csars = {"csars": []}
200         nf_pkgs = NfPackageModel.objects.filter()
201         for nf_pkg in nf_pkgs:
202             csars["csars"].append({
203                 "csarId": nf_pkg.nfpackageid,
204                 "vnfdId": nf_pkg.vnfdid
205             })
206         return [0, csars]
207         
208     def get_csar(self, csar_id):
209         pkg_info = {}
210         nf_pkg = NfPackageModel.objects.filter(nfpackageid=csar_id)
211         if nf_pkg:
212             pkg_info["vnfdId"] = nf_pkg[0].vnfdid
213             pkg_info["vnfdProvider"] = nf_pkg[0].vendor
214             pkg_info["vnfdVersion"] = nf_pkg[0].vnfdversion
215             pkg_info["vnfVersion"] = nf_pkg[0].vnfversion
216
217
218         vnf_insts = NfInstModel.objects.filter(package_id=csar_id)
219         vnf_inst_info = [{"vnfInstanceId": vnf_inst.nfinstid,
220                           "vnfInstanceName": vnf_inst.nf_name} for vnf_inst in vnf_insts]
221
222         return [0, {"csarId": csar_id,
223                     "packageInfo": pkg_info,
224                     "imageInfo": [],
225                     "vnfInstanceInfo": vnf_inst_info}]
226
227
228