fix NS update error
[vfc/nfvo/driver/vnfm/gvnfm.git] / gvnfmadapter / driver / interfaces / views.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 inspect
16 import json
17 import logging
18 import time
19 import traceback
20
21 from drf_yasg.utils import swagger_auto_schema
22 from rest_framework import status
23 from rest_framework.response import Response
24 from rest_framework.views import APIView
25
26 from driver.interfaces.serializers.serializers import VnfInstReqParamsSerializer, ResponseSerializer
27 from driver.interfaces.serializers.serializers import VnfNotifyReqSerializer, VNFLCMOpOccSerializer
28 from driver.interfaces.serializers.serializers import VnfOperRespSerializer
29 from driver.interfaces.serializers.serializers import VnfTermReqSerializer, VnfQueryRespSerializer
30 from driver.interfaces.serializers.grant_request import GrantRequestSerializer
31 from driver.interfaces.serializers.grant import GrantSerializer
32 from driver.interfaces.serializers.lccn_subscription import LccnSubscriptionSerializer
33 from driver.interfaces.serializers.lccn_subscription_request import LccnSubscriptionRequestSerializer
34 from driver.pub.exceptions import GvnfmDriverException
35 from driver.pub.utils import restcall
36 from driver.pub.utils.restcall import req_by_msb
37 from driver.interfaces.serializers.operate_request import VnfOperateRequestSerializer
38 from driver.interfaces.serializers.heal_request import HealVnfRequestSerializerToVnfm, VnfHealRequestSerializer
39 from driver.interfaces.serializers.response import ProblemDetailsSerializer
40
41 logger = logging.getLogger(__name__)
42
43
44 class VnfInstInfo(APIView):
45     @swagger_auto_schema(
46         request_body=VnfInstReqParamsSerializer(),
47         responses={
48             status.HTTP_201_CREATED: ResponseSerializer(),
49             status.HTTP_404_NOT_FOUND: "The vnfm instance id is wrong",
50             status.HTTP_500_INTERNAL_SERVER_ERROR: "The url is invalid"
51         }
52     )
53     def post(self, request, vnfmtype, vnfmid):
54         logger.debug("instantiate_vnf--post::> %s" % request.data)
55         logger.debug("Create vnf begin!")
56         try:
57             requestSerializer = VnfInstReqParamsSerializer(data=request.data)
58             request_isValid = requestSerializer.is_valid()
59             if not request_isValid:
60                 raise Exception(requestSerializer.errors)
61
62             # requestData = requestSerializer.data
63             requestData = request.data
64             input_data = {
65                 "vnfdId": ignorcase_get(requestData, "vnfDescriptorId"),
66                 "vnfInstanceName": ignorcase_get(requestData, "vnfInstanceName"),
67                 "vnfInstanceDescription": ignorcase_get(requestData, "vnfInstanceDescription")
68             }
69             vnfm_id = vnfmid
70             logger.debug("do_createvnf: request data=[%s],input_data=[%s],vnfm_id=[%s]",
71                          request.data, input_data, vnfm_id)
72             resp = do_createvnf(vnfm_id, input_data)
73             logger.debug("do_createvnf: response data=[%s]", resp)
74             logger.debug("Create vnf end!")
75
76             logger.debug("Instantiate vnf start!")
77             vnfInstanceId = resp["id"]
78             input_data = {
79                 "flavourId": ignorcase_get(requestData, "flavourId"),
80                 "extVirtualLinks": ignorcase_get(requestData, "extVirtualLink"),
81                 "additionalParams": ignorcase_get(requestData, "additionalParam"),
82             }
83             logger.debug("do_instvnf: vnfInstanceId=[%s],request data=[%s],input_data=[%s],vnfm_id=[%s]",
84                          vnfInstanceId, request.data, input_data, vnfm_id)
85             resp = do_instvnf(vnfInstanceId, vnfm_id, input_data)
86             logger.debug("do_instvnf: response data=[%s]", resp)
87             resp_data = {
88                 "vnfInstanceId": vnfInstanceId,
89                 "jobId": ignorcase_get(resp, "jobId")
90             }
91             logger.debug("Instantiate vnf end!")
92             return Response(data=resp_data, status=status.HTTP_201_CREATED)
93         except GvnfmDriverException as e:
94             logger.error('instantiate vnf failed, detail message: %s' % e.message)
95             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
96         except:
97             logger.error(traceback.format_exc())
98             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
99
100
101 class VnfTermInfo(APIView):
102     @swagger_auto_schema(
103         request_body=VnfTermReqSerializer(),
104         responses={
105             status.HTTP_201_CREATED: ResponseSerializer(),
106             status.HTTP_404_NOT_FOUND: "The vnfmid and vnfInstanceId are wrong",
107             status.HTTP_500_INTERNAL_SERVER_ERROR: "The url is invalid"
108         }
109     )
110     def post(self, request, vnfmtype, vnfmid, vnfInstanceId):
111         logger.debug("terminate_vnf--post::> %s" % request.data)
112         vnfm_id = vnfmid
113         try:
114             term_type = ignorcase_get(request.data, "terminationType")
115             input_data = {
116                 "terminationType": term_type.upper() if term_type else "FORCEFUL"
117             }
118             term_timeout = ignorcase_get(request.data, "gracefulTerminationTimeout")
119             if term_timeout:
120                 input_data["gracefulTerminationTimeout"] = int(term_timeout)
121
122             logger.debug("do_terminatevnf: vnfm_id=[%s],vnfInstanceId=[%s],input_data=[%s]",
123                          vnfm_id, vnfInstanceId, input_data)
124             resp = do_terminatevnf(vnfm_id, vnfInstanceId, input_data)
125             logger.debug("terminate_vnf: response data=[%s]", resp)
126
127             jobId = ignorcase_get(resp, "jobId")
128             logger.debug("wait4job: vnfm_id=[%s],jobId=[%s]", vnfm_id, jobId)
129             resp = wait4job(vnfm_id, jobId)
130             logger.debug("[wait4job] response=[%s]", resp)
131
132             resp = do_deletevnf(vnfm_id, vnfInstanceId)
133             logger.debug("do_deletevnf: response data=[%s]", resp)
134
135             resp_data = {
136                 "vnfInstanceId": vnfInstanceId,
137                 "jobId": jobId
138             }
139             return Response(data=resp_data, status=status.HTTP_201_CREATED)
140         except GvnfmDriverException as e:
141             logger.error('Terminate vnf failed, detail message: %s' % e.message)
142             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
143         except:
144             logger.error(traceback.format_exc())
145             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
146
147
148 class VnfQueryInfo(APIView):
149     @swagger_auto_schema(
150         responses={
151             status.HTTP_201_CREATED: VnfQueryRespSerializer(),
152             status.HTTP_404_NOT_FOUND: "The vnfmid and vnfInstanceId are wrong",
153             status.HTTP_500_INTERNAL_SERVER_ERROR: "The url is invalid"
154         }
155     )
156     def get(self, request, vnfmtype, vnfmid, vnfInstanceId):
157         logger.debug("query_vnf--post::> %s" % request.data)
158         vnfm_id = vnfmid
159         try:
160             logger.debug("[%s] request.data=%s", fun_name(), request.data)
161             resp = do_queryvnf(request, vnfm_id, vnfInstanceId)
162             query_vnf_resp_mapping = {
163                 "vnfInstanceId": "",
164                 "vnfInstanceName": "",
165                 "vnfInstanceDescription": "",
166                 "vnfdId": "",
167                 "vnfPackageId": "",
168                 "version": "",
169                 "vnfProvider": "",
170                 "vnfType": "",
171                 "vnfStatus": ""
172             }
173             ResponseInfo = ignorcase_get(resp, "ResponseInfo")
174             resp_response_data = mapping_conv(query_vnf_resp_mapping, ResponseInfo)
175             resp_data = {
176                 "vnfInfo": resp_response_data
177             }
178             id = ignorcase_get(ResponseInfo, "id")
179             if id:
180                 resp_data["vnfInfo"]["vnfInstanceId"] = id
181             vnfPkgId = ignorcase_get(ResponseInfo, "vnfPkgId")
182             if vnfPkgId:
183                 resp_data["vnfInfo"]["vnfPackageId"] = vnfPkgId
184             vnfSoftwareVersion = ignorcase_get(ResponseInfo, "vnfSoftwareVersion")
185             if vnfSoftwareVersion:
186                 resp_data["vnfInfo"]["version"] = vnfSoftwareVersion
187             if ignorcase_get(ResponseInfo, "instantiationState") == "INSTANTIATED":
188                 resp_data["vnfInfo"]["vnfStatus"] = "ACTIVE"
189             logger.debug("[%s]resp_data=%s", fun_name(), resp_data)
190             return Response(data=resp_data, status=status.HTTP_200_OK)
191         except GvnfmDriverException as e:
192             logger.error('Query vnf failed, detail message: %s' % e.message)
193             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
194         except:
195             logger.error(traceback.format_exc())
196             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
197
198
199 class VnfOperInfo(APIView):
200     @swagger_auto_schema(
201         responses={
202             status.HTTP_201_CREATED: VnfOperRespSerializer(),
203             status.HTTP_404_NOT_FOUND: "The vnfmid, jobid and responseId are wrong",
204             status.HTTP_500_INTERNAL_SERVER_ERROR: "The url is invalid"
205         }
206     )
207     def get(self, request, vnfmtype, vnfmid, jobid):
208         logger.debug("operation_status--post::> %s" % request.data)
209         try:
210             logger.debug("[%s] request.data=%s", fun_name(), request.data)
211             vnfm_id = vnfmid
212             jobId = jobid
213             responseId = ignorcase_get(request.META, 'responseId')
214             logger.debug("[operation_status] vnfm_id=%s", vnfm_id)
215             vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
216             logger.debug("[operation_status] vnfm_info=[%s]", vnfm_info)
217
218             ret = call_vnfm("api/vnflcm/v1/vnf_lc_ops/%s?responseId=%s" % (jobId, responseId), "GET", vnfm_info)
219             if ret[0] != 0:
220                 logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
221                 raise GvnfmDriverException('Failed to query vnf operation status.')
222             resp_data = json.JSONDecoder().decode(ret[1])
223             logger.debug("[%s]resp_data=%s", fun_name(), resp_data)
224             # ResponseInfo = ignorcase_get(resp_data, "ResponseInfo")
225             responseDescriptor = ignorcase_get(resp_data, "responseDescriptor")
226             status_tmp = ignorcase_get(responseDescriptor, "status")
227             # del responseDescriptor["lcmOperationStatus"]
228             responseDescriptor["status"] = status_tmp
229             operation_data = {
230                 "jobId": ignorcase_get(resp_data, "jobId"),
231                 "responseDescriptor": responseDescriptor
232             }
233             return Response(data=operation_data, status=status.HTTP_200_OK)
234         except GvnfmDriverException as e:
235             logger.error('Query vnf failed, detail message: %s' % e.message)
236             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
237         except:
238             logger.error(traceback.format_exc())
239             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
240
241
242 class VnfGrantInfo(APIView):
243     @swagger_auto_schema(
244         request_body=GrantRequestSerializer(),  # TODO: not used
245         responses={
246             status.HTTP_201_CREATED: GrantSerializer(),
247             status.HTTP_404_NOT_FOUND: "The request body is wrong",
248             status.HTTP_500_INTERNAL_SERVER_ERROR: "The url is invalid"
249         }
250     )
251     def put(self, request, vnfmtype):
252         try:
253             logger.debug("[grantvnf] req_data = %s", request.data)
254             grant_request = GrantRequestSerializer(data=request.data)
255             if not grant_request.is_valid():
256                 raise GvnfmDriverException(grant_request.error_messages)
257             ret = req_by_msb('api/nslcm/v2/grants', "POST", content=json.JSONEncoder().encode(request.data))
258             logger.debug("ret = %s", ret)
259             if ret[0] != 0:
260                 logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
261                 raise GvnfmDriverException('Failed to grant vnf.')
262             resp = json.JSONDecoder().decode(ret[1])
263             grant = GrantSerializer(data=resp)
264             if not grant.is_valid():
265                 logger.warn(grant.error_messages)
266                 # raise GvnfmDriverException(grant.error_messages)
267             logger.debug("[%s]resp_data=%s", fun_name(), resp)
268             return Response(data=resp, status=status.HTTP_201_CREATED)
269         except GvnfmDriverException as e:
270             logger.error('Grant vnf failed, detail message: %s' % e.message)
271             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
272         except:
273             logger.error(traceback.format_exc())
274             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
275
276
277 class VnfNotifyInfo(APIView):
278     @swagger_auto_schema(
279         request_body=VnfNotifyReqSerializer(),
280         responses={
281             status.HTTP_201_CREATED: "Successful Notify",
282             status.HTTP_404_NOT_FOUND: "The request body is wrong",
283             status.HTTP_500_INTERNAL_SERVER_ERROR: "The url is invalid"
284         }
285     )
286     def post(self, request, vnfmtype):  # TODO: not compatable with VnfIdentifierCreationNotification and VnfIdentifierDeletionNotification
287         try:
288             logger.debug("[%s]req_data = %s", fun_name(), request.data)
289             vnfminstid = ignorcase_get(request.data, 'vnfmInstId')
290             vnfinstanceid = ignorcase_get(request.data, 'vnfInstanceId')
291             request.data.pop("vnfmInstId")
292             ret = req_by_msb("api/nslcm/v2/ns/%s/vnfs/%s/Notify" % (vnfminstid, vnfinstanceid), "POST",
293                              json.JSONEncoder().encode(request.data))
294             logger.debug("[%s]data = %s", fun_name(), ret)
295             if ret[0] != 0:
296                 logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
297                 raise GvnfmDriverException('Failed to notify vnf.')
298             return Response(data=None, status=status.HTTP_200_OK)
299         except GvnfmDriverException as e:
300             logger.error('Grant vnf failed, detail message: %s' % e.message)
301             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
302         except:
303             logger.error(traceback.format_exc())
304             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
305
306
307 class VnfOperateView(APIView):
308     @swagger_auto_schema(
309         request_body=VnfOperateRequestSerializer(),
310         responses={
311             status.HTTP_202_ACCEPTED: "Success",
312             status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
313             status.HTTP_409_CONFLICT: ProblemDetailsSerializer(),
314             status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
315         }
316     )
317     def post(self, request, vnfmtype, vnfmid, vnfInstanceId):
318         logger.debug("operate_vnf--post::> %s" % request.data)
319         logger.debug("Operate vnf begin!")
320         try:
321             requestSerializer = VnfOperateRequestSerializer(data=request.data)
322             request_isValid = requestSerializer.is_valid()
323             if not request_isValid:
324                 raise Exception(requestSerializer.errors)
325             logger.debug("Operate vnf start!")
326             logger.debug("do_operate: vnfmid=[%s],vnfInstanceId=[%s],request data=[%s]",
327                          vnfmid, vnfInstanceId, request.data)
328             statusCode, resp, location = do_lcmVnf(vnfmid, vnfInstanceId, request.data, "operate")
329             logger.debug("do_operate: response data=[%s]", resp)
330             logger.debug("Operate vnf end!")
331             ret = int(statusCode)
332             if ret == status.HTTP_404_NOT_FOUND:
333                 return Response(data=resp, status=status.HTTP_404_NOT_FOUND)
334             elif ret == status.HTTP_409_CONFLICT:
335                 return Response(data=resp, status=status.HTTP_409_CONFLICT)
336             response = Response(data=resp, status=status.HTTP_202_ACCEPTED)
337             response["Location"] = location
338             return response
339         except GvnfmDriverException as e:
340             logger.error('operate vnf failed, detail message: %s' % e.message)
341             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
342         except:
343             logger.error(traceback.format_exc())
344             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
345
346
347 class VnfHealView(APIView):
348     @swagger_auto_schema(
349         request_body=VnfHealRequestSerializer(),
350         responses={
351             status.HTTP_202_ACCEPTED: "Success",
352             status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
353             status.HTTP_409_CONFLICT: ProblemDetailsSerializer(),
354             status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
355         }
356     )
357     def post(self, request, vnfmtype, vnfmid, vnfInstanceId):
358         logger.debug("Heal_vnf--post::> %s" % request.data)
359         logger.debug("Heal vnf begin!")
360         try:
361             requestSerializer = VnfHealRequestSerializer(data=request.data)
362             request_isValid = requestSerializer.is_valid()
363             if not request_isValid:
364                 raise Exception(requestSerializer.errors)
365             healdata = {
366                 u"additionalParams": {
367                     u"action": ignorcase_get(request.data, "action"),
368                     u"affectedvm": ignorcase_get(request.data, "affectedvm")
369                 }
370             }
371             input_data = HealVnfRequestSerializerToVnfm(data=healdata)
372             resp_isvalid = input_data.is_valid()
373             if not resp_isvalid:
374                 raise GvnfmDriverException(input_data.errors)
375             logger.debug("Heal vnf start!")
376             logger.debug("do_heal: vnfmid=[%s],vnfInstanceId=[%s],request data=[%s]",
377                          vnfmid, vnfInstanceId, input_data)
378             statusCode, resp, location = do_lcmVnf(vnfmid, vnfInstanceId, input_data.data, "heal")
379             logger.debug("do_heal: response data=[%s]", resp)
380             logger.debug("Heal vnf end!")
381             ret = int(statusCode)
382             if ret == status.HTTP_404_NOT_FOUND:
383                 return Response(data=resp, status=status.HTTP_404_NOT_FOUND)
384             elif ret == status.HTTP_409_CONFLICT:
385                 return Response(data=resp, status=status.HTTP_409_CONFLICT)
386             response = Response(data=None, status=status.HTTP_202_ACCEPTED)
387             response["Location"] = location
388             return response
389         except GvnfmDriverException as e:
390             logger.error('Heal vnf failed, detail message: %s' % e.message)
391             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
392         except:
393             logger.error(traceback.format_exc())
394             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
395
396
397 class VnfPkgsInfo(APIView):
398     def get(request, *args, **kwargs):
399         try:
400             logger.debug("Enter %s", fun_name())
401             ret = req_by_msb("api/nslcm/v1/vnfpackage", "GET")
402             if ret[0] != 0:
403                 logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
404                 raise GvnfmDriverException('Failed to get vnfpkgs.')
405             resp = json.JSONDecoder().decode(ret[1])
406             return Response(data=resp, status=status.HTTP_200_OK)
407         except GvnfmDriverException as e:
408             logger.error('Get vnfpkgs failed, detail message: %s' % e.message)
409             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
410         except:
411             logger.error(traceback.format_exc())
412             return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
413
414
415 class QuerySingleVnfLcmOpOcc(APIView):
416     @swagger_auto_schema(
417         responses={
418             status.HTTP_200_OK: VNFLCMOpOccSerializer(),
419             status.HTTP_500_INTERNAL_SERVER_ERROR: ""
420         }
421     )
422     def get(self, request, vnfmtype, vnfmid, lcmopoccid):
423         logger.debug("[%s]LCMOpOccId = %s", fun_name(), lcmopoccid)
424         try:
425             vnfm_info = get_vnfminfo_from_nslcm(vnfmid)
426             logger.debug("[get lcm op occ] vnfm_info=[%s]", vnfm_info)
427             ret = call_vnfm("api/vnflcm/v1/vnf_lcm_op_occs/%s" % lcmopoccid, "GET", vnfm_info)
428             if ret[0] != 0:
429                 logger.error("Status code is %s. detail is %s.", ret[2], ret[1])
430                 raise GvnfmDriverException("Failed to query vnf lcm op occ %s" % lcmopoccid)
431             resp_data = json.JSONDecoder().decode(ret[1])
432             vnf_lcm_op_occ_serializer = VNFLCMOpOccSerializer(data=resp_data)
433             if vnf_lcm_op_occ_serializer.is_valid():
434                 logger.debug("[%s]resp_data=%s" % (fun_name(), resp_data))
435                 return Response(data=vnf_lcm_op_occ_serializer.data, status=status.HTTP_200_OK)
436             else:
437                 raise GvnfmDriverException(vnf_lcm_op_occ_serializer.errors)
438         except GvnfmDriverException as e:
439             logger.error("Query vnflcmopocc failed, detail message: %s" % e.message)
440             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
441         except:
442             logger.error(traceback.format_exc())
443             return Response(data={'error': traceback.format_exc()}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
444
445
446 class Subscription(APIView):
447     @swagger_auto_schema(
448         request_body=LccnSubscriptionRequestSerializer(),
449         responses={
450             status.HTTP_201_CREATED: LccnSubscriptionSerializer(),
451             status.HTTP_303_SEE_OTHER: None,
452             status.HTTP_500_INTERNAL_SERVER_ERROR: "INTERNAL_SERVER_ERROR"
453         }
454     )
455     def post(self, request, vnfmtype, vnfmid):
456         logger.debug("Subscription--post::> %s" % request.data)
457         logger.debug("Subscription begin!")
458         try:
459             lccn_subscription_request_serializer = LccnSubscriptionRequestSerializer(data=request.data)
460             if not lccn_subscription_request_serializer.is_valid():
461                 raise GvnfmDriverException(lccn_subscription_request_serializer.error_messages)
462             resp_data = do_subscription(request.data, vnfmid)
463             lccn_subscription_serializer = LccnSubscriptionSerializer(data=resp_data)
464             if not lccn_subscription_serializer.is_valid():
465                 logger.debug("[%s]resp_data=%s" % (fun_name(), resp_data))
466                 raise GvnfmDriverException(lccn_subscription_serializer.errors)
467             logger.debug("Subscription end!")
468             return Response(data=lccn_subscription_serializer.data, status=status.HTTP_201_CREATED)
469         except GvnfmDriverException as e:
470             logger.error(e.message)
471             return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
472         except Exception as e:
473             logger.error(e.message)
474             logger.error(traceback.format_exc())
475             return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
476
477
478 def call_vnfm(resource, method, vnfm_info, data=""):
479     ret = restcall.call_req(
480         base_url=ignorcase_get(vnfm_info, "url"),
481         user=ignorcase_get(vnfm_info, "userName"),
482         passwd=ignorcase_get(vnfm_info, "password"),
483         auth_type=restcall.rest_no_auth,
484         resource=resource,
485         method=method,
486         content=json.JSONEncoder().encode(data))
487     return ret
488
489
490 def mapping_conv(keyword_map, rest_return):
491     resp_data = {}
492     for param in keyword_map:
493         # if keyword_map[param]:
494         if isinstance(keyword_map[param], dict):
495             resp_data[param] = mapping_conv(keyword_map[param], ignorcase_get(rest_return, param))
496         else:
497             value = ignorcase_get(rest_return, param)
498             if value:
499                 resp_data[param] = value
500     return resp_data
501
502
503 def fun_name():
504     return "=========%s=========" % inspect.stack()[1][3]
505
506
507 def ignorcase_get(args, key):
508     if not key:
509         return ""
510     if not args:
511         return ""
512     if key in args:
513         return args[key]
514     for old_key in args:
515         if old_key.upper() == key.upper():
516             return args[old_key]
517     return ""
518
519
520 def get_vnfminfo_from_nslcm(vnfm_id):
521     logger.debug("[get_vnfminfo_from_nslcm] vnfm_id=[%s]", vnfm_id)
522     # ret = req_by_msb("api/aai-esr-server/v1/vnfms/%s" % vnfm_id, "GET")
523     ret = req_by_msb("api/nslcm/v1/vnfms/%s" % vnfm_id, "GET")
524     logger.debug("[get_vnfminfo_from_nslcm] response=%s", ret)
525     if ret[0] != 0:
526         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
527         raise GvnfmDriverException("Failed to query vnfm(%s) from nslcm." % vnfm_id)
528     return json.JSONDecoder().decode(ret[1])
529
530
531 def wait4job(vnfm_id, job_id, gracefulTerminationTimeout=1200, retry_count=60, interval_second=3):
532     logger.debug("[wait4job] vnfm_id=[%s],jobId=[%s],gracefulTerminationTimeout=[%s]",
533                  vnfm_id, job_id, gracefulTerminationTimeout)
534     count = 0
535     response_id, new_response_id = 0, 0
536     job_end_normal, job_timeout = False, True
537     vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
538     logger.debug("[do_terminatevnf] vnfm_info=[%s]", vnfm_info)
539     while count < retry_count:
540         count = count + 1
541         time.sleep(interval_second)
542         ret = call_vnfm("api/vnflcm/v1/vnf_lc_ops/%s?responseId=%s" % (job_id, response_id), "GET", vnfm_info)
543         if ret[0] != 0:
544             logger.error("Failed to query job: %s:%s", ret[2], ret[1])
545             continue
546         job_result = json.JSONDecoder().decode(ret[1])
547         if "responseDescriptor" not in job_result:
548             logger.error("Job(%s) does not exist.", job_id)
549             continue
550         progress = str(job_result["responseDescriptor"]["progress"])
551         new_response_id = job_result["responseDescriptor"]["responseId"]
552         job_desc = job_result["responseDescriptor"]["statusDescription"]
553         if new_response_id != response_id:
554             logger.debug("%s:%s:%s", progress, new_response_id, job_desc)
555             response_id = new_response_id
556             count = 0
557         if progress == "255":
558             job_timeout = False
559             logger.error("Job(%s) failed: %s", job_id, job_desc)
560             break
561         elif progress == "100":
562             job_end_normal, job_timeout = True, False
563             logger.debug("Job(%s) ended normally,job_end_normal=[%s],job_timeout=[%s]",
564                          job_id, job_end_normal, job_timeout)
565             return {"success": "success"}
566     if job_timeout:
567         logger.error("Job(%s) timeout", job_id)
568     raise GvnfmDriverException("Fail to get job status!")
569
570
571 def do_createvnf(vnfm_id, data):
572     logger.debug("[%s] request.data=%s", fun_name(), data)
573     vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
574     logger.debug("[do_createvnf] vnfm_info=[%s]", vnfm_info)
575     ret = call_vnfm("api/vnflcm/v1/vnf_instances", "POST", vnfm_info, data)
576     logger.debug("[%s] call_req ret=%s", fun_name(), ret)
577     if ret[0] != 0:
578         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
579         raise GvnfmDriverException('Failed to create vnf.')
580     return json.JSONDecoder().decode(ret[1])
581
582
583 def do_instvnf(vnfInstanceId, vnfm_id, data):
584     logger.debug("[%s] request.data=%s", fun_name(), data)
585     vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
586     logger.debug("[do_instvnf] vnfm_info=[%s]", vnfm_info)
587     ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s/instantiate" % vnfInstanceId, "POST", vnfm_info, data)
588     logger.debug("[%s] call_req ret=%s", fun_name(), ret)
589     if ret[0] != 0:
590         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
591         raise GvnfmDriverException('Failed to inst vnf.')
592     return json.JSONDecoder().decode(ret[1])
593
594
595 def do_terminatevnf(vnfm_id, vnfInstanceId, data):
596     logger.debug("[%s] request.data=%s", fun_name(), data)
597     vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
598     logger.debug("[do_terminatevnf] vnfm_info=[%s]", vnfm_info)
599     ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s/terminate" % vnfInstanceId, "POST", vnfm_info, data)
600     if ret[0] != 0:
601         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
602         raise GvnfmDriverException('Failed to terminate vnf.')
603     return json.JSONDecoder().decode(ret[1])
604
605
606 def do_deletevnf(vnfm_id, vnfInstanceId):
607     logger.debug("[%s] vnfm_id=%s, vnfInstanceId=%s", fun_name(), vnfm_id, vnfInstanceId)
608     vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
609     logger.debug("[do_deletevnf] vnfm_info=[%s]", vnfm_info)
610     ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s" % vnfInstanceId, "DELETE", vnfm_info)
611     if ret[0] != 0:
612         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
613         raise GvnfmDriverException('Failed to delete vnf.')
614     return ret[1]
615
616
617 def do_lcmVnf(vnfm_id, vnfInstanceId, data, lcmType):
618     logger.debug("[%s] request.data=%s", fun_name(), data)
619     vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
620     logger.debug("[do_lcmVnf] vnfm_info=[%s]", vnfm_info)
621     ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s/%s" % (vnfInstanceId, lcmType), "POST", vnfm_info, data)
622     if ret[0] != 0 and int(ret[2]) != status.HTTP_404_NOT_FOUND and int(ret[2]) != status.HTTP_409_CONFLICT:
623         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
624         raise GvnfmDriverException('Failed to Operate vnf.')
625     return (ret[2], json.JSONDecoder().decode(ret[1]), ret[3])
626
627
628 def do_queryvnf(data, vnfm_id, vnfInstanceId):
629     logger.debug("[%s] request.data=%s", fun_name(), data)
630     vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
631     logger.debug("[do_deletevnf] vnfm_info=[%s]", vnfm_info)
632     ret = call_vnfm("api/vnflcm/v1/vnf_instances/%s" % vnfInstanceId, "GET", vnfm_info)
633     if ret[0] != 0:
634         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
635         raise GvnfmDriverException('Failed to query vnf.')
636     return json.JSONDecoder().decode(ret[1])
637
638
639 def do_subscription(data, vnfm_id):
640     logger.debug("[%s] request.data=%s", fun_name(), data)
641     vnfm_info = get_vnfminfo_from_nslcm(vnfm_id)
642     logger.debug("[do_subscription] vnfm_info=[%s]", vnfm_info)
643     ret = call_vnfm("api/vnflcm/v1/subscriptions", "POST", vnfm_info, data)
644     logger.debug("[%s] call_req ret=%s", fun_name(), ret)
645     if ret[0] != 0:
646         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
647         raise GvnfmDriverException('Failed to subscribe.')
648     return json.JSONDecoder().decode(ret[1])