genericparser seed code
[modeling/etsicatalog.git] / genericparser / packages / biz / sdc_vnf_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 genericparser.packages.const import PKG_STATUS
23 from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH, GENERICPARSER_URL_PATH
24 from genericparser.pub.config.config import REG_TO_MSB_REG_PARAM
25 from genericparser.pub.database.models import VnfPackageModel
26 from genericparser.pub.exceptions import GenericparserException
27 from genericparser.pub.msapi import sdc
28 from genericparser.pub.utils import fileutil
29 from genericparser.pub.utils import toscaparsers
30 from genericparser.pub.utils.jobutil import JobUtil
31
32 logger = logging.getLogger(__name__)
33
34 JOB_ERROR = 255
35
36
37 def nf_get_csars():
38     ret = None
39     try:
40         ret = NfPackage().get_csars()
41     except GenericparserException as e:
42         return [1, e.message]
43     except Exception as e:
44         logger.error(e.message)
45         logger.error(traceback.format_exc())
46         return [1, str(sys.exc_info())]
47     return ret
48
49
50 def nf_get_csar(csar_id):
51     ret = None
52     try:
53         ret = NfPackage().get_csar(csar_id)
54     except GenericparserException as e:
55         return [1, e.message]
56     except Exception as e:
57         logger.error(e.message)
58         logger.error(traceback.format_exc())
59         return [1, str(sys.exc_info())]
60     return ret
61
62
63 def parse_vnfd(csar_id, inputs):
64     ret = None
65     try:
66         nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=csar_id)
67         if not nf_pkg:
68             raise GenericparserException("VNF CSAR(%s) does not exist." % csar_id)
69         csar_path = nf_pkg[0].localFilePath
70         ret = {"model": toscaparsers.parse_vnfd(csar_path, inputs)}
71     except GenericparserException as e:
72         return [1, e.message]
73     except Exception as e:
74         logger.error(e.message)
75         logger.error(traceback.format_exc())
76         return [1, str(sys.exc_info())]
77     return [0, ret]
78
79
80 class NfDistributeThread(threading.Thread):
81     """
82     Sdc NF Package Distribute
83     """
84
85     def __init__(self, csar_id, vim_ids, lab_vim_id, job_id):
86         threading.Thread.__init__(self)
87         self.csar_id = csar_id
88         self.vim_ids = vim_ids
89         self.lab_vim_id = lab_vim_id
90         self.job_id = job_id
91
92         self.csar_save_path = os.path.join(GENERICPARSER_ROOT_PATH, csar_id)
93
94     def run(self):
95         try:
96             self.on_distribute()
97         except GenericparserException as e:
98             self.rollback_distribute()
99             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
100         except Exception as e:
101             logger.error(e.message)
102             logger.error(traceback.format_exc())
103             logger.error(str(sys.exc_info()))
104             self.rollback_distribute()
105             JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to distribute CSAR(%s)" % self.csar_id)
106
107     def on_distribute(self):
108         JobUtil.create_job(
109             inst_type='nf',
110             jobaction='on_distribute',
111             inst_id=self.csar_id,
112             job_id=self.job_id)
113         JobUtil.add_job_status(self.job_id, 5, "Start CSAR(%s) distribute." % self.csar_id)
114
115         if VnfPackageModel.objects.filter(vnfPackageId=self.csar_id):
116             err_msg = "NF CSAR(%s) already exists." % self.csar_id
117             JobUtil.add_job_status(self.job_id, JOB_ERROR, err_msg)
118             return
119
120         artifact = sdc.get_artifact(sdc.ASSETTYPE_RESOURCES, self.csar_id)
121         local_path = os.path.join(GENERICPARSER_ROOT_PATH, self.csar_id)
122         csar_name = "%s.csar" % artifact.get("name", self.csar_id)
123         local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path, csar_name)
124         if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"):
125             artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/vnf.csar")
126             if os.path.exists(artifact_vnf_file):
127                 local_file_name = artifact_vnf_file
128
129         vnfd_json = toscaparsers.parse_vnfd(local_file_name)
130         vnfd = json.JSONDecoder().decode(vnfd_json)
131
132         if not vnfd.get("vnf"):
133             raise GenericparserException("VNF propeties and metadata in VNF Package(id=%s) are empty." % self.csar_id)
134
135         vnfd_id = vnfd["vnf"]["properties"].get("descriptor_id", "")
136         if VnfPackageModel.objects.filter(vnfdId=vnfd_id):
137             logger.error("VNF package(%s) already exists.", vnfd_id)
138             raise GenericparserException("VNF package(%s) already exists." % vnfd_id)
139         JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id)
140         vnfd_ver = vnfd["vnf"]["properties"].get("descriptor_verison", "")
141         vnf_provider = vnfd["vnf"]["properties"].get("provider", "")
142         vnf_software_version = vnfd["vnf"]["properties"].get("software_version", "")
143         vnfd_product_name = vnfd["vnf"]["properties"].get("product_name", "")
144         VnfPackageModel(
145             vnfPackageId=self.csar_id,
146             vnfdId=vnfd_id,
147             vnfVendor=vnf_provider,
148             vnfdProductName=vnfd_product_name,
149             vnfdVersion=vnfd_ver,
150             vnfSoftwareVersion=vnf_software_version,
151             vnfdModel=vnfd_json,
152             localFilePath=local_file_name,
153             vnfPackageUri=csar_name,
154             onboardingState=PKG_STATUS.ONBOARDED,
155             operationalState=PKG_STATUS.ENABLED,
156             usageState=PKG_STATUS.NOT_IN_USE
157         ).save()
158         JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
159
160     def rollback_distribute(self):
161         try:
162             VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete()
163             fileutil.delete_dirs(self.csar_save_path)
164         except Exception as e:
165             logger.error(e.message)
166             logger.error(traceback.format_exc())
167             logger.error(str(sys.exc_info()))
168
169
170 class NfPkgDeleteThread(threading.Thread):
171     """
172     Sdc NF Package Deleting
173     """
174
175     def __init__(self, csar_id, job_id):
176         threading.Thread.__init__(self)
177         self.csar_id = csar_id
178         self.job_id = job_id
179
180     def run(self):
181         try:
182             self.delete_csar()
183         except GenericparserException as e:
184             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
185         except Exception as e:
186             logger.error(e.message)
187             logger.error(traceback.format_exc())
188             logger.error(str(sys.exc_info()))
189             JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to delete CSAR(%s)" % self.csar_id)
190
191     def delete_csar(self):
192         JobUtil.create_job(
193             inst_type='nf',
194             jobaction='delete',
195             inst_id=self.csar_id,
196             job_id=self.job_id)
197         JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
198
199         VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete()
200
201         JobUtil.add_job_status(self.job_id, 50, "Delete local CSAR(%s) file." % self.csar_id)
202
203         csar_save_path = os.path.join(GENERICPARSER_ROOT_PATH, self.csar_id)
204         fileutil.delete_dirs(csar_save_path)
205
206         JobUtil.add_job_status(self.job_id, 100, "Delete CSAR(%s) successfully." % self.csar_id)
207
208
209 class NfPackage(object):
210     """
211     Actions for sdc nf package.
212     """
213
214     def __init__(self):
215         pass
216
217     def get_csars(self):
218         csars = []
219         nf_pkgs = VnfPackageModel.objects.filter()
220         for nf_pkg in nf_pkgs:
221             ret = self.get_csar(nf_pkg.vnfPackageId)
222             csars.append(ret[1])
223         return [0, csars]
224
225     def get_csar(self, csar_id):
226         pkg_info = {}
227         nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=csar_id)
228         if not nf_pkg:
229             nf_pkg = VnfPackageModel.objects.filter(vnfdId=csar_id)
230
231         if nf_pkg:
232             db_csar_id = nf_pkg[0].vnfPackageId
233             pkg_info["vnfdId"] = nf_pkg[0].vnfdId
234             pkg_info["vnfPackageId"] = nf_pkg[0].vnfPackageId
235             pkg_info["vnfdProvider"] = nf_pkg[0].vnfVendor
236             pkg_info["vnfdVersion"] = nf_pkg[0].vnfdVersion
237             pkg_info["vnfVersion"] = nf_pkg[0].vnfSoftwareVersion
238             pkg_info["csarName"] = nf_pkg[0].vnfPackageUri
239             pkg_info["vnfdModel"] = nf_pkg[0].vnfdModel
240             pkg_info["downloadUrl"] = "http://%s:%s/%s/%s/%s" % (
241                 REG_TO_MSB_REG_PARAM[0]["nodes"][0]["ip"],
242                 REG_TO_MSB_REG_PARAM[0]["nodes"][0]["port"],
243                 GENERICPARSER_URL_PATH,
244                 db_csar_id,
245                 nf_pkg[0].vnfPackageUri)
246         else:
247             raise GenericparserException("Vnf package[%s] not Found." % csar_id)
248
249         csar_info = {
250             "csarId": db_csar_id,
251             "packageInfo": pkg_info,
252             "imageInfo": []
253         }
254         return [0, csar_info]