1 # Copyright 2017 ZTE Corporation.
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
21 from catalog.pub.config.config import CATALOG_ROOT_PATH
22 from catalog.pub.database.models import NSDModel, NfPackageModel
23 from catalog.pub.exceptions import CatalogException
24 from catalog.pub.msapi import nfvolcm
25 from catalog.pub.msapi import sdc
26 from catalog.pub.utils import fileutil
27 from catalog.pub.utils import toscaparser
29 logger = logging.getLogger(__name__)
31 STATUS_SUCCESS, STATUS_FAILED = "success", "failed"
34 def fmt_ns_pkg_rsp(status, desc, error_code="500"):
35 return [0, {"status": status, "statusDescription": desc, "errorCode": error_code}]
38 def ns_on_distribute(csar_id):
41 ret = NsPackage().on_distribute(csar_id)
42 except CatalogException as e:
43 NsPackage().delete_catalog(csar_id)
44 return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
46 logger.error(traceback.format_exc())
47 NsPackage().delete_catalog(csar_id)
48 return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
49 return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
52 def ns_delete_csar(csar_id, force_delete):
55 ret = NsPackage().delete_csar(csar_id, force_delete)
56 except CatalogException as e:
57 return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
59 logger.error(traceback.format_exc())
60 return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
61 return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
66 ret = NsPackage().get_csars()
67 except CatalogException as e:
70 logger.error(traceback.format_exc())
71 return [1, str(sys.exc_info())]
74 def ns_get_csar(csar_id):
77 ret = NsPackage().get_csar(csar_id)
78 except CatalogException as e:
81 logger.error(traceback.format_exc())
82 return [1, str(sys.exc_info())]
85 def parser_nsdmodel(csar_id,inputs):
88 nf_pkg = NSDModel.objects.filter(id=csar_id)
92 csar_path = pkg.nsd_path
93 ret={"model":toscaparser.parse_nsd(csar_path,inputs)}
95 except CatalogException as e:
98 logger.error(traceback.format_exc())
99 return [1, str(sys.exc_info())]
103 class NsPackage(object):
105 Actions for sdc ns package.
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)
115 nsd,local_file_name,nsd_json = self.get_nsd(csar_id)
117 nsd_id = nsd["metadata"]["id"]
118 if NSDModel.objects.filter(nsd_id=nsd_id):
119 raise CatalogException("NSD(%s) already exists." % nsd_id)
121 for vnf in nsd["vnfs"]:
122 vnfd_id = vnf["properties"]["id"]
123 pkg = NfPackageModel.objects.filter(vnfdid=vnfd_id)
125 raise CatalogException("VNF package(%s) is not distributed." % vnfd_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()
137 return [0, "CSAR(%s) distributed successfully." % csar_id]
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)
144 nsd_json = toscaparser.parse_nsd(local_file_name)
145 nsd = json.JSONDecoder().decode(nsd_json)
147 return nsd,local_file_name,nsd_json
149 def delete_csar(self, csar_id, force_delete):
152 NSInstModel.objects.filter(nspackage_id=csar_id).delete()
154 if NSInstModel.objects.filter(nspackage_id=csar_id):
155 raise CatalogException("CSAR(%s) is in using, cannot be deleted." % csar_id)
157 nfvolcm.delete_ns_inst_mock()
158 NSDModel.objects.filter(id=csar_id).delete()
159 return [0, "Delete CSAR(%s) successfully." % csar_id]
164 nss = NSDModel.objects.filter()
172 def get_csar(self, csar_id):
174 csars = NSDModel.objects.filter(id=csar_id)
176 package_info["nsdId"] = csars[0].nsd_id
177 package_info["nsdProvider"] = csars[0].vendor
178 package_info["nsdVersion"] = csars[0].version
180 #nss = NSInstModel.objects.filter(nspackage_id=csar_id)
181 nss = nfvolcm.getNsInsts_mock()
182 ns_instance_info = [{
183 "nsInstanceId": ns["nsInstanceId"],
184 "nsInstanceName": ns["nsInstanceName"]} for ns in nss]
186 return [0, {"csarId": csar_id,
187 "packageInfo": package_info,
188 "nsInstanceInfo": ns_instance_info}]
190 def delete_catalog(self, csar_id):
191 local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
192 fileutil.delete_dirs(local_path)