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 NSPackageModel
23 from catalog.pub.exceptions import CatalogException
24 from catalog.pub.msapi import sdc
25 from catalog.pub.utils import fileutil
26 from catalog.pub.utils import toscaparser
27 from rest_framework import status
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)
56 except NSLCMException 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], "")
67 ret = NsPackage().get_csars()
68 except CatalogException as e:
71 logger.error(traceback.format_exc())
72 return [1, str(sys.exc_info())]
75 def ns_get_csar(csar_id):
78 ret = NsPackage().get_csar(csar_id)
79 except CatalogException as e:
82 logger.error(traceback.format_exc())
83 return [1, str(sys.exc_info())]
86 def parse_nsd(csar_id, inputs):
89 ns_pkg = NSPackageModel.objects.filter(nsPackageId=csar_id)
91 csar_path = ns_pkg[0].localFilePath
92 ret = {"model": toscaparser.parse_nsd(csar_path, inputs)}
93 except CatalogException as e:
96 logger.error(traceback.format_exc())
97 return [1, str(sys.exc_info())]
101 class NsPackage(object):
103 Actions for sdc ns package.
109 def on_distribute(self, csar_id):
110 if NSDModel.objects.filter(id=csar_id):
111 raise NSLCMException("NS CSAR(%s) already exists." % csar_id)
113 artifact = sdc.get_artifact(sdc.ASSETTYPE_SERVICES, csar_id)
114 local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
115 local_file_name = sdc.download_artifacts(artifact["toscaModelURL"],
116 local_path, "%s.csar" % artifact.get("name", csar_id))
118 nsd_json = toscaparser.parse_nsd(local_file_name)
119 nsd = json.JSONDecoder().decode(nsd_json)
121 nsd_id = nsd["metadata"]["id"]
122 if NSDModel.objects.filter(nsd_id=nsd_id):
123 raise NSLCMException("NSD(%s) already exists." % nsd_id)
125 for vnf in nsd["vnfs"]:
126 vnfd_id = vnf["properties"]["id"]
127 pkg = NfPackageModel.objects.filter(vnfdid=vnfd_id)
129 raise NSLCMException("VNF package(%s) is not distributed." % vnfd_id)
134 nsdName=nsd["metadata"].get("name", nsd_id),
135 nsdDesginer=nsd["metadata"].get("vendor", "undefined"),
136 nsdDescription=nsd["metadata"].get("description", ""),
137 nsdVersion=nsd["metadata"].get("version", "undefined"),
138 nsPackageUri=local_file_name,
140 localFilePath=local_file_name,
144 return [0, "CSAR(%s) distributed successfully." % csar_id]
146 def delete_csar(self, csar_id):
147 NSDModel.objects.filter(id=csar_id).delete()
148 return [0, "Delete CSAR(%s) successfully." % csar_id]
152 nss = NSPackageModel.objects.filter()
155 "csarId": ns.nsPackageId,
160 def get_csar(self, csar_id):
162 csars = NSPackageModel.objects.filter(nsPackageId=csar_id)
164 package_info["nsdId"] = csars[0].nsdId
165 package_info["nsdProvider"] = csars[0].nsdDesginer
166 package_info["nsdVersion"] = csars[0].nsdVersion
168 return [0, {"csarId": csar_id,
169 "packageInfo": package_info}]
171 def delete_catalog(self, csar_id):
172 local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
173 fileutil.delete_dirs(local_path)