Remove call nslcm from vnf pkg api
[vfc/nfvo/catalog.git] / catalog / packages / 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 catalog.pub.config.config import CATALOG_ROOT_PATH
23 from catalog.pub.database.models import VnfPackageModel
24 from catalog.pub.exceptions import CatalogException
25 from catalog.pub.msapi import sdc
26 from catalog.pub.utils import fileutil
27 from catalog.pub.utils import toscaparser
28 from catalog.pub.utils.jobutil import JobUtil
29
30 logger = logging.getLogger(__name__)
31
32 JOB_ERROR = 255
33
34 def nf_get_csars():
35     ret = None
36     try:
37         ret = NfPackage().get_csars()
38     except CatalogException as e:
39         return [1, e.message]
40     except:
41         logger.error(traceback.format_exc())
42         return [1, str(sys.exc_info())]
43     return ret
44
45 def nf_get_csar(csar_id):
46     ret = None
47     try:
48         ret = NfPackage().get_csar(csar_id)
49     except CatalogException as e:
50         return [1, e.message]
51     except:
52         logger.error(traceback.format_exc())
53         return [1, str(sys.exc_info())]
54     return ret
55
56 def parse_vnfd(csar_id, inputs):
57     ret= None
58     try:
59         nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=csar_id)
60         if nf_pkg:
61              csar_path = nf_pkg[0].localFilePath
62              ret = {"model": toscaparser.parse_vnfd(csar_path, inputs)}
63     except CatalogException as e:
64         return [1, e.message]
65     except:
66         logger.error(traceback.format_exc())
67         return [1, str(sys.exc_info())]
68     return [0, ret]
69
70
71 class NfDistributeThread(threading.Thread):
72     """
73     Sdc NF Package Distribute
74     """
75
76     def __init__(self, csar_id, vim_ids, lab_vim_id, job_id):
77         threading.Thread.__init__(self)
78         self.csar_id = csar_id
79         self.vim_ids = vim_ids
80         self.lab_vim_id = lab_vim_id
81         self.job_id = job_id
82
83         self.csar_save_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
84
85     def run(self):
86         try:
87             self.on_distribute()
88         except CatalogException as e:
89             self.rollback_distribute()
90             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
91         except:
92             logger.error(traceback.format_exc())
93             logger.error(str(sys.exc_info()))
94             self.rollback_distribute()
95             JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to distribute CSAR(%s)" % self.csar_id)
96
97     def on_distribute(self):
98         JobUtil.create_job(
99             inst_type='nf',
100             jobaction='on_distribute',
101             inst_id=self.csar_id,
102             job_id=self.job_id)
103         JobUtil.add_job_status(self.job_id, 5, "Start CSAR(%s) distribute." % self.csar_id)
104
105         if VnfPackageModel.objects.filter(vnfPackageId=self.csar_id):
106             raise CatalogException("NF CSAR(%s) already exists." % self.csar_id)
107
108         vnfd,local_file_name,vnfd_json = self.get_vnfd(self.csar_id)
109
110         nfd_id = vnfd["metadata"]["id"]
111         if VnfPackageModel.objects.filter(vnfdId=nfd_id):
112             raise CatalogException("NFD(%s) already exists." % nfd_id)
113
114         JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id)
115
116         vnfd_ver = vnfd["metadata"].get("vnfd_version")
117         if not vnfd_ver:
118             vnfd_ver = vnfd["metadata"].get("vnfdVersion", "undefined")
119         VnfPackageModel(
120             #  uuid=self.csar_id,
121             vnfPackageId=self.csar_id,
122             vnfdId=nfd_id,
123             vnfVendor=vnfd["metadata"].get("vendor", "undefined"),
124             vnfdVersion=vnfd_ver,
125             vnfSoftwareVersion=vnfd["metadata"].get("version", "undefined"),
126             vnfdModel=vnfd_json,
127             localFilePath=local_file_name,
128             #vnfPackageUri to do
129             ).save()
130
131         JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
132
133     def get_vnfd(self, csar_id):
134         artifact = sdc.get_artifact(sdc.ASSETTYPE_RESOURCES, self.csar_id)
135         local_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
136         local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path)
137         vnfd_json = toscaparser.parse_vnfd(local_file_name)
138         vnfd = json.JSONDecoder().decode(vnfd_json)
139         return vnfd,local_file_name,vnfd_json
140
141     def rollback_distribute(self):
142         try:
143             VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete()
144             fileutil.delete_dirs(self.csar_save_path)
145         except:
146             logger.error(traceback.format_exc())
147             logger.error(str(sys.exc_info()))
148
149
150 class NfPkgDeleteThread(threading.Thread):
151     """
152     Sdc NF Package Deleting
153     """
154
155     def __init__(self, csar_id, job_id, force_delete):
156         threading.Thread.__init__(self)
157         self.csar_id = csar_id
158         self.job_id = job_id
159         self.force_delete = force_delete
160
161     def run(self):
162         try:
163             self.delete_csar()
164         except CatalogException as e:
165             JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
166         except:
167             logger.error(traceback.format_exc())
168             logger.error(str(sys.exc_info()))
169             JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to delete CSAR(%s)" % self.csar_id)
170
171     def delete_csar(self):
172         JobUtil.create_job(
173             inst_type='nf',
174             jobaction='delete',
175             inst_id=self.csar_id,
176             job_id=self.job_id)
177         JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id)
178
179         VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete()
180
181         JobUtil.add_job_status(self.job_id, 50, "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 class NfPackage(object):
190     """
191     Actions for sdc nf package.
192     """
193
194     def __init__(self):
195         pass
196
197     def get_csars(self):
198         csars = {"csars": []}
199         nf_pkgs = VnfPackageModel.objects.filter()
200         for nf_pkg in nf_pkgs:
201             csars["csars"].append({
202                 "csarId": nf_pkg.vnfPackageId,
203                 "vnfdId": nf_pkg.vnfdId
204             })
205         return [0, csars]
206         
207     def get_csar(self, csar_id):
208         pkg_info = {}
209         nf_pkg = VnfPackageModel.objects.filter(nfpackageid=csar_id)
210         if nf_pkg:
211             pkg_info["vnfdId"] = nf_pkg[0].vnfdId
212             pkg_info["vnfdProvider"] = nf_pkg[0].vnfVendor
213             pkg_info["vnfdVersion"] = nf_pkg[0].vnfdVersion
214             pkg_info["vnfVersion"] = nf_pkg[0].vnfSoftwareVersion
215
216         return [0, {"csarId": csar_id,
217                     "packageInfo": pkg_info,
218                     "imageInfo": []}]