Add code for parsing nsd model
[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_nsdmodel(csar_id,inputs):
88     ret= None
89     try:
90         nf_pkg = NSDModel.objects.filter(id=csar_id)
91
92         if nf_pkg:
93             for pkg in nf_pkg:
94                 csarid = pkg.nsd_id
95                 csar_path = os.path.join(os.path.dirname(__file__), pkg.nsd_path)
96                 f = file(csar_path)
97                 line = f.readline(1)
98                 f.close()
99                 continue
100             ret={"model":toscaparser.parse_nsd(csar_path,inputs)}
101     except CatalogException as e:
102         return [1, e.message]
103     except:
104         logger.error(traceback.format_exc())
105         return [1, str(sys.exc_info())]
106     return [0,ret]
107
108 ###############################################################################################################
109
110 class NsPackage(object):
111     """
112     Actions for sdc ns package.
113     """
114
115     def __init__(self):
116         pass
117
118     def on_distribute(self, csar_id):
119         if NSDModel.objects.filter(id=csar_id):
120             raise CatalogException("NS CSAR(%s) already exists." % csar_id)
121
122         nsd,local_file_name,nsd_json = self.get_nsd(csar_id)
123
124         nsd_id = nsd["metadata"]["id"]
125         if NSDModel.objects.filter(nsd_id=nsd_id):
126             raise CatalogException("NSD(%s) already exists." % nsd_id)
127
128         for vnf in nsd["vnfs"]:
129             vnfd_id = vnf["properties"]["id"]
130             pkg = NfPackageModel.objects.filter(vnfdid=vnfd_id)
131             if not pkg:
132                 raise CatalogException("VNF package(%s) is not distributed." % vnfd_id)
133
134         NSDModel(
135             id=csar_id,
136             nsd_id=nsd_id,
137             name=nsd["metadata"].get("name", nsd_id),
138             vendor=nsd["metadata"].get("vendor", "undefined"),
139             description=nsd["metadata"].get("description", ""),
140             version=nsd["metadata"].get("version", "undefined"),
141             nsd_path=local_file_name,
142             nsd_model=nsd_json).save()
143
144         return [0, "CSAR(%s) distributed successfully." % csar_id]
145
146     def get_nsd(self, csar_id):
147         artifact = sdc.get_artifact(sdc.ASSETTYPE_SERVICES, csar_id)
148         local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
149         local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path)
150
151         nsd_json = toscaparser.parse_nsd(local_file_name)
152         nsd = json.JSONDecoder().decode(nsd_json)
153
154         return nsd,local_file_name,nsd_json
155
156     def delete_csar(self, csar_id, force_delete):
157         '''
158         if force_delete:
159             NSInstModel.objects.filter(nspackage_id=csar_id).delete()
160         else:
161             if NSInstModel.objects.filter(nspackage_id=csar_id):
162                 raise CatalogException("CSAR(%s) is in using, cannot be deleted." % csar_id)
163         '''
164         nfvolcm.delete_ns_inst_mock()
165         NSDModel.objects.filter(id=csar_id).delete()
166         return [0, "Delete CSAR(%s) successfully." % csar_id]
167
168
169     def get_csars(self):
170         csars = []
171         nss = NSDModel.objects.filter()
172         for ns in nss:
173             csars.append({
174                 "csarId": ns.id,
175                 "nsdId": ns.nsd_id
176             })
177         return [0,csars]
178
179     def get_csar(self, csar_id):
180         package_info = {}
181         csars = NSDModel.objects.filter(id=csar_id)
182         if csars:
183             package_info["nsdId"] = csars[0].nsd_id
184             package_info["nsdProvider"] = csars[0].vendor
185             package_info["nsdVersion"] = csars[0].version
186
187         #nss = NSInstModel.objects.filter(nspackage_id=csar_id)
188         nss = nfvolcm.getNsInsts_mock()
189         ns_instance_info = [{
190             "nsInstanceId": ns["nsInstanceId"],
191             "nsInstanceName": ns["nsInstanceName"]} for ns in nss]
192
193         return [0, {"csarId": csar_id, 
194             "packageInfo": package_info, 
195             "nsInstanceInfo": ns_instance_info}]
196
197     def delete_catalog(self, csar_id):
198         local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
199         fileutil.delete_dirs(local_path)
200
201
202
203