remove swagger test function
[vfc/nfvo/lcm.git] / lcm / packages / ns_package.py
1 # Copyright 2016 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
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
28
29 logger = logging.getLogger(__name__)
30
31 STATUS_SUCCESS, STATUS_FAILED = "success", "failed"
32
33
34 def fmt_ns_pkg_rsp(status, desc, error_code="500"):
35     return [0, {"status": status, "statusDescription": desc, "errorCode": error_code}]
36
37
38 def ns_common_call(fun, csar_id, operation=""):
39     ret = None
40     try:
41         if operation == "":
42             ret = fun(csar_id)
43         else:
44             ret = fun(csar_id, operation)
45
46         if ret[0] != 0:
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)
50     except:
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], "")
54
55
56 def ns_on_boarding(csar_id):
57     return ns_common_call(NsPackage().on_boarding, csar_id)
58
59
60 def ns_delete_csar(csar_id):
61     return ns_common_call(NsPackage().delete_csar, csar_id)
62
63
64 def ns_delete_pending_csar(csar_id):
65     return ns_common_call(NsPackage().delete_pending_csar, csar_id)
66
67
68 def ns_set_state_csar(csar_id, operation):
69     return ns_common_call(NsPackage().set_state_csar, csar_id, operation)
70
71
72 def ns_get_csar(csar_id):
73     ret = None
74     try:
75         ret = NsPackage().get_csar(csar_id)
76     except NSLCMException as e:
77         return [1, e.message]
78     except:
79         logger.error(traceback.format_exc())
80         return [1, str(sys.exc_info())]
81     return ret
82
83
84 ###############################################################################################################
85
86
87 class NsPackage(object):
88     """
89     Actions for ns package.
90     """
91
92     def __init__(self):
93         pass
94
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)
99
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)
106
107         for vnf in nsd["vnfs"]:
108             vnfd_id = vnf["properties"]["id"]
109             pkg = NfPackageModel.objects.filter(vnfdid=vnfd_id)
110             if not pkg:
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)
115
116         NSDModel(
117             id=csar_id,
118             nsd_id=nsd_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()
124
125         set_csar_state(csar_id, "onBoardState", STATUS_ONBOARDED)
126         set_csar_state(csar_id, "operationalState", P_STATUS_ENABLED)
127
128         return [0, "CSAR(%s) onBoarded successfully." % csar_id]
129
130     def delete_csar(self, csar_id):
131         if not NSDModel.objects.filter(id=csar_id):
132             return delete_csar_from_catalog(csar_id)
133
134         if NSInstModel.objects.filter(nspackage_id=csar_id):
135             return set_csar_state(csar_id, "deletionPending", True)
136
137         ret = delete_csar_from_catalog(csar_id)
138         if ret[0] == 0:
139             NSDModel.objects.filter(id=csar_id).delete()
140         return ret
141
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]
145
146         pending = query_csar_from_catalog(csar_id, "deletionPending")
147
148         if pending.lower() == "false":
149             return [1, "CSAR(%s) need not to be deleted." % csar_id]
150
151         if NSInstModel.objects.filter(nspackage_id=csar_id):
152             return [1, "CSAR(%s) is in using, cannot be deleted." % csar_id]
153
154         ret = delete_csar_from_catalog(csar_id)
155         if ret[0] == 0:
156             NSDModel.objects.filter(id=csar_id).delete()
157         return ret
158
159     def get_csar(self, csar_id):
160         package_info = {}
161
162         csar_in_catalog = query_csar_from_catalog(csar_id)
163         props_of_catalog = [
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)
169
170         csars = NSDModel.objects.filter(id=csar_id)
171         if csars:
172             package_info["nsdId"] = csars[0].nsd_id
173             package_info["nsdProvider"] = csars[0].vendor
174             package_info["nsdVersion"] = csars[0].version
175
176         nss = NSInstModel.objects.filter(nspackage_id=csar_id)
177         ns_instance_info = [{"nsInstanceId": ns.id, "nsInstanceName": ns.name} for ns in nss]
178
179         return [0, {"csarId": csar_id, "packageInfo": package_info, "nsInstanceInfo": ns_instance_info}]
180
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)
184
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())