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