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