1 # Copyright 2016 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 lcm.pub.database.models import NSDModel, NSInstModel, NfPackageModel
22 from lcm.pub.utils.values import ignore_case_get
23 from lcm.pub.msapi.catalog import STATUS_ONBOARDED, P_STATUS_ENABLED
24 from lcm.pub.msapi.catalog import query_csar_from_catalog, set_csar_state
25 from lcm.pub.msapi.catalog import query_rawdata_from_catalog, delete_csar_from_catalog
26 from lcm.pub.exceptions import NSLCMException
27 from lcm.pub.utils import toscautil
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_common_call(fun, csar_id, operation=""):
44 ret = fun(csar_id, operation)
47 return fmt_ns_pkg_rsp(STATUS_FAILED, ret[1])
48 except NSLCMException as e:
49 return fmt_ns_pkg_rsp(STATUS_FAILED, e.message)
51 logger.error(traceback.format_exc())
52 return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info()))
53 return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
56 def ns_on_boarding(csar_id):
57 return ns_common_call(NsPackage().on_boarding, csar_id)
60 def ns_delete_csar(csar_id):
61 return ns_common_call(NsPackage().delete_csar, csar_id)
64 def ns_delete_pending_csar(csar_id):
65 return ns_common_call(NsPackage().delete_pending_csar, csar_id)
68 def ns_set_state_csar(csar_id, operation):
69 return ns_common_call(NsPackage().set_state_csar, csar_id, operation)
72 def ns_get_csar(csar_id):
75 ret = NsPackage().get_csar(csar_id)
76 except NSLCMException as e:
79 logger.error(traceback.format_exc())
80 return [1, str(sys.exc_info())]
84 ###############################################################################################################
87 class NsPackage(object):
89 Actions for ns package.
95 def on_boarding(self, csar_id):
96 csar = query_csar_from_catalog(csar_id)
97 if ignore_case_get(csar, "onBoardState") == STATUS_ONBOARDED:
98 raise NSLCMException("CSAR(%s) already onBoarded." % csar_id)
100 raw_data = query_rawdata_from_catalog(csar_id)
101 nsd = toscautil.convert_nsd_model(raw_data["rawData"]) # convert to inner json
102 nsd = json.JSONDecoder().decode(nsd)
103 nsd_id = nsd["metadata"]["id"]
104 if NSDModel.objects.filter(nsd_id=nsd_id):
105 raise NSLCMException("NSD(%s) already exists." % nsd_id)
107 for vnf in nsd["vnfs"]:
108 vnfd_id = vnf["properties"]["id"]
109 pkg = NfPackageModel.objects.filter(vnfdid=vnfd_id)
111 raise NSLCMException("VNF package(%s) is not onBoarded." % vnfd_id)
112 pkg_id = pkg[0].nfpackageid
113 if query_csar_from_catalog(pkg_id, "onBoardState") != STATUS_ONBOARDED:
114 raise NSLCMException("VNF package(%s) is not onBoarded on catalog." % pkg_id)
119 name=nsd["metadata"].get("name", nsd_id),
120 vendor=nsd["metadata"].get("vendor", "undefined"),
121 description=nsd["metadata"].get("description", ""),
122 version=nsd["metadata"].get("version", "undefined"),
123 nsd_model=json.JSONEncoder().encode(nsd)).save()
125 set_csar_state(csar_id, "onBoardState", STATUS_ONBOARDED)
126 set_csar_state(csar_id, "operationalState", P_STATUS_ENABLED)
128 return [0, "CSAR(%s) onBoarded successfully." % csar_id]
130 def delete_csar(self, csar_id):
131 if not NSDModel.objects.filter(id=csar_id):
132 return delete_csar_from_catalog(csar_id)
134 if NSInstModel.objects.filter(nspackage_id=csar_id):
135 return set_csar_state(csar_id, "deletionPending", True)
137 ret = delete_csar_from_catalog(csar_id)
139 NSDModel.objects.filter(id=csar_id).delete()
142 def delete_pending_csar(self, csar_id):
143 if not NSDModel.objects.filter(id=csar_id):
144 return [0, "Delete pending CSAR(%s) successfully." % csar_id]
146 pending = query_csar_from_catalog(csar_id, "deletionPending")
148 if pending.lower() == "false":
149 return [1, "CSAR(%s) need not to be deleted." % csar_id]
151 if NSInstModel.objects.filter(nspackage_id=csar_id):
152 return [1, "CSAR(%s) is in using, cannot be deleted." % csar_id]
154 ret = delete_csar_from_catalog(csar_id)
156 NSDModel.objects.filter(id=csar_id).delete()
159 def get_csar(self, csar_id):
162 csar_in_catalog = query_csar_from_catalog(csar_id)
164 "name", "provider", "version", "operationalState", "usageState",
165 "onBoardState", "processState", "deletionPending", "downloadUri",
166 "createTime", "modifyTime", "format", "size"]
167 for prop in props_of_catalog:
168 package_info[prop] = ignore_case_get(csar_in_catalog, prop)
170 csars = NSDModel.objects.filter(id=csar_id)
172 package_info["nsdId"] = csars[0].nsd_id
173 package_info["nsdProvider"] = csars[0].vendor
174 package_info["nsdVersion"] = csars[0].version
176 nss = NSInstModel.objects.filter(nspackage_id=csar_id)
177 ns_instance_info = [{"nsInstanceId": ns.id, "nsInstanceName": ns.name} for ns in nss]
179 return [0, {"csarId": csar_id, "packageInfo": package_info, "nsInstanceInfo": ns_instance_info}]
181 def set_state_csar(self, csar_id, operation):
182 if not NSDModel.objects.filter(id=csar_id):
183 raise NSLCMException("CSAR(%s) does not exist." % csar_id)
185 csar = query_csar_from_catalog(csar_id)
186 if ignore_case_get(csar, "operationalState") == operation.capitalize():
187 raise NSLCMException("CSAR(%s) already %s." % (csar_id, operation))
188 return set_csar_state(csar_id, 'operationState', operation.capitalize())