Merge "add the Parser function in the catalog"
[vfc/nfvo/catalog.git] / catalog / packages / ns_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
18 import traceback
19 import sys
20 import os
21
22 from catalog.pub.database.models import NSDModel, NfPackageModel
23 from catalog.pub.utils.values import ignore_case_get
24 from catalog.pub.exceptions import CatalogException
25 from catalog.pub.msapi import sdc
26 from catalog.pub.config.config import CATALOG_ROOT_PATH
27 from catalog.pub.utils import toscaparser
28 from catalog.pub.utils import fileutil
29 from catalog.pub.msapi import nfvolcm
30
31 logger = logging.getLogger(__name__)
32
33 STATUS_SUCCESS, STATUS_FAILED = "success", "failed"
34
35
36 def fmt_ns_pkg_rsp(status, desc, error_code="500"):
37     return [0, {"status": status, "statusDescription": desc, "errorCode": error_code}]
38
39
40 def ns_on_distribute(csar_id):
41     ret = None
42     try:
43         ret = NsPackage().on_distribute(csar_id)
44     except CatalogException as e:
45         NsPackage().delete_catalog(csar_id)
46         return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
47     except:
48         logger.error(traceback.format_exc())
49         NsPackage().delete_catalog(csar_id)
50         return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
51     return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
52
53
54 def ns_delete_csar(csar_id, force_delete):
55     ret = None
56     try:
57         ret = NsPackage().delete_csar(csar_id, force_delete)
58     except CatalogException as e:
59         return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
60     except:
61         logger.error(traceback.format_exc())
62         return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
63     return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
64
65 def ns_get_csars():
66     ret = None
67     try:
68         ret = NsPackage().get_csars()
69     except CatalogException as e:
70         return [1, e.message]
71     except:
72         logger.error(traceback.format_exc())
73         return [1, str(sys.exc_info())]
74     return ret
75
76 def ns_get_csar(csar_id):
77     ret = None
78     try:
79         ret = NsPackage().get_csar(csar_id)
80     except CatalogException as e:
81         return [1, e.message]
82     except:
83         logger.error(traceback.format_exc())
84         return [1, str(sys.exc_info())]
85     return ret
86
87 def parser_nsmodel(csar_id,inputs):
88     ret = None
89     try:
90         nf_pkg = NSDModel.objects.filter(id=csar_id)
91         if nf_pkg:
92              csar_path=nf_pkg["nsd_path"]
93              ret=toscaparser.parse_nsd(csar_path,inputs)
94     except CatalogException as e:
95         return [1, e.message]
96     except:
97         logger.error(traceback.format_exc())
98         return [1, str(sys.exc_info())]
99     return ret
100
101 ###############################################################################################################
102
103 class NsPackage(object):
104     """
105     Actions for sdc ns package.
106     """
107
108     def __init__(self):
109         pass
110
111     def on_distribute(self, csar_id):
112         if NSDModel.objects.filter(id=csar_id):
113             raise CatalogException("NS CSAR(%s) already exists." % csar_id)
114
115         nsd,local_file_name,nsd_json = self.get_nsd(csar_id)
116
117         nsd_id = nsd["metadata"]["id"]
118         if NSDModel.objects.filter(nsd_id=nsd_id):
119             raise CatalogException("NSD(%s) already exists." % nsd_id)
120
121         for vnf in nsd["vnfs"]:
122             vnfd_id = vnf["properties"]["id"]
123             pkg = NfPackageModel.objects.filter(vnfdid=vnfd_id)
124             if not pkg:
125                 raise CatalogException("VNF package(%s) is not distributed." % vnfd_id)
126
127         NSDModel(
128             id=csar_id,
129             nsd_id=nsd_id,
130             name=nsd["metadata"].get("name", nsd_id),
131             vendor=nsd["metadata"].get("vendor", "undefined"),
132             description=nsd["metadata"].get("description", ""),
133             version=nsd["metadata"].get("version", "undefined"),
134             nsd_path=local_file_name,
135             nsd_model=nsd_json).save()
136
137         return [0, "CSAR(%s) distributed successfully." % csar_id]
138
139     def get_nsd(self, csar_id):
140         artifact = sdc.get_artifact(sdc.ASSETTYPE_SERVICES, csar_id)
141         local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
142         local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path)
143
144         nsd_json = toscaparser.parse_nsd(local_file_name)
145         nsd = json.JSONDecoder().decode(nsd_json)
146
147         return nsd,local_file_name,nsd_json
148
149     def delete_csar(self, csar_id, force_delete):
150         '''
151         if force_delete:
152             NSInstModel.objects.filter(nspackage_id=csar_id).delete()
153         else:
154             if NSInstModel.objects.filter(nspackage_id=csar_id):
155                 raise CatalogException("CSAR(%s) is in using, cannot be deleted." % csar_id)
156         '''
157         nfvolcm.delete_ns_inst_mock()
158         NSDModel.objects.filter(id=csar_id).delete()
159         return [0, "Delete CSAR(%s) successfully." % csar_id]
160
161
162     def get_csars(self):
163         csars = []
164         nss = NSDModel.objects.filter()
165         for ns in nss:
166             csars.append({
167                 "csarId": ns.id,
168                 "nsdId": ns.nsd_id
169             })
170         return [0, csars]
171
172     def get_csar(self, csar_id):
173         package_info = {}
174         csars = NSDModel.objects.filter(id=csar_id)
175         if csars:
176             package_info["nsdId"] = csars[0].nsd_id
177             package_info["nsdProvider"] = csars[0].vendor
178             package_info["nsdVersion"] = csars[0].version
179
180         #nss = NSInstModel.objects.filter(nspackage_id=csar_id)
181         nss = nfvolcm.getNsInsts_mock()
182         ns_instance_info = [{
183             "nsInstanceId": ns.id, 
184             "nsInstanceName": ns.name} for ns in nss]
185
186         return [0, {"csarId": csar_id, 
187             "packageInfo": package_info, 
188             "nsInstanceInfo": ns_instance_info}]
189
190     def delete_catalog(self, csar_id):
191         local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
192         fileutil.delete_dirs(local_path)
193
194
195
196