1 # Copyright 2017 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
21 from 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
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
38 logger = logging.getLogger(__name__)
41 class VnfInstInfo(APIView):
43 request_body=VnfInstReqParamsSerializer(),
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"
50 def post(self, request, vnfmtype, vnfmid):
51 logger.debug("instantiate_vnf--post::> %s" % request.data)
52 logger.debug("Create vnf begin!")
54 requestSerializer = VnfInstReqParamsSerializer(data=request.data)
55 request_isValid = requestSerializer.is_valid()
56 if not request_isValid:
57 raise Exception(requestSerializer.errors)
59 # requestData = requestSerializer.data
60 requestData = request.data
62 "vnfdId": ignorcase_get(requestData, "vnfDescriptorId"),
63 "vnfInstanceName": ignorcase_get(requestData, "vnfInstanceName"),
64 "vnfInstanceDescription": ignorcase_get(requestData, "vnfInstanceDescription")
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!")
73 logger.debug("Instantiate vnf start!")
74 vnfInstanceId = resp["id"]
76 "flavourId": ignorcase_get(requestData, "flavourId"),
77 "extVirtualLinks": ignorcase_get(requestData, "extVirtualLink"),
78 "additionalParams": ignorcase_get(requestData, "additionalParam"),
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)
85 "vnfInstanceId": vnfInstanceId,
86 "jobId": ignorcase_get(resp, "jobId")
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)
94 logger.error(traceback.format_exc())
95 return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
98 class VnfTermInfo(APIView):
100 request_body=VnfTermReqSerializer(),
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"
107 def post(self, request, vnfmtype, vnfmid, vnfInstanceId):
108 logger.debug("terminate_vnf--post::> %s" % request.data)
109 logger.debug("Terminate vnf begin!")
113 "terminationType": ignorcase_get(request.data, "terminationType"),
114 "gracefulTerminationTimeout": ignorcase_get(request.data, "gracefulTerminationTimeout")
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)
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)
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!")
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)
140 logger.error(traceback.format_exc())
141 return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
144 class VnfQueryInfo(APIView):
145 @swagger_auto_schema(
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"
152 def get(self, request, vnfmtype, vnfmid, vnfInstanceId):
153 logger.debug("query_vnf--post::> %s" % request.data)
156 logger.debug("[%s] request.data=%s", fun_name(), request.data)
157 resp = do_queryvnf(request, vnfm_id, vnfInstanceId)
158 query_vnf_resp_mapping = {
160 "vnfInstanceName": "",
161 "vnfInstanceDescription": "",
169 ResponseInfo = ignorcase_get(resp, "ResponseInfo")
170 resp_response_data = mapping_conv(query_vnf_resp_mapping, ResponseInfo)
172 "vnfInfo": resp_response_data
174 id = ignorcase_get(ResponseInfo, "id")
176 resp_data["vnfInfo"]["vnfInstanceId"] = id
177 vnfPkgId = ignorcase_get(ResponseInfo, "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)
191 logger.error(traceback.format_exc())
192 return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
195 class VnfOperInfo(APIView):
196 @swagger_auto_schema(
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"
203 def get(self, request, vnfmtype, vnfmid, jobid):
204 logger.debug("operation_status--post::> %s" % request.data)
206 logger.debug("[%s] request.data=%s", fun_name(), request.data)
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)
214 ret = call_vnfm("api/vnflcm/v1/vnf_lc_ops/%s?responseId=%s" % (jobId, responseId), "GET", vnfm_info)
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
226 "jobId": ignorcase_get(ResponseInfo, "vnfLcOpId"),
227 "responseDescriptor": responseDescriptor
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)
234 logger.error(traceback.format_exc())
235 return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
238 class VnfGrantInfo(APIView):
239 @swagger_auto_schema(
240 request_body=GrantRequestSerializer(), # TODO: not used
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"
247 def put(self, request, vnfmtype):
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)
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)
268 logger.error(traceback.format_exc())
269 return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
272 class VnfNotifyInfo(APIView):
273 @swagger_auto_schema(
274 request_body=VnfNotifyReqSerializer(),
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"
281 def post(self, request, vnfmtype): # TODO: not compatable with VnfIdentifierCreationNotification and VnfIdentifierDeletionNotification
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)
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)
298 logger.error(traceback.format_exc())
299 return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
302 class VnfPkgsInfo(APIView):
303 def get(request, *args, **kwargs):
305 logger.debug("Enter %s", fun_name())
306 ret = req_by_msb("api/nslcm/v1/vnfpackage", "GET")
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)
316 logger.error(traceback.format_exc())
317 return Response(data={'error': 'unexpected exception'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
319 class QuerySingleVnfLcmOpOcc(APIView):
320 @swagger_auto_schema(
322 status.HTTP_200_OK: VNFLCMOpOccSerializer(),
323 status.HTTP_500_INTERNAL_SERVER_ERROR: ""
326 def get(self, request, vnfmtype, vnfmid, lcmopoccid):
327 logger.debug("[%s]LCMOpOccId = %s", fun_name(), lcmopoccid)
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)
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)
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)
346 logger.error(traceback.format_exc())
347 return Response(data={'error': traceback.format_exc()}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
350 class Subscription(APIView):
351 @swagger_auto_schema(
352 request_body=LccnSubscriptionRequestSerializer(),
354 status.HTTP_201_CREATED: LccnSubscriptionSerializer(),
355 status.HTTP_303_SEE_OTHER: None,
356 status.HTTP_500_INTERNAL_SERVER_ERROR: "INTERNAL_SERVER_ERROR"
359 def post(self, request, vnfmtype):
360 logger.debug("Subscription--post::> %s" % request.data)
361 logger.debug("Subscription begin!")
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)
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,
390 content=json.JSONEncoder().encode(data))
394 def mapping_conv(keyword_map, rest_return):
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))
401 value = ignorcase_get(rest_return, param)
403 resp_data[param] = value
408 return "=========%s=========" % inspect.stack()[1][3]
411 def ignorcase_get(args, key):
419 if old_key.upper() == key.upper():
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)
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])
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)
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:
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)
448 logger.error("Failed to query job: %s:%s", ret[2], ret[1])
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)
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
463 logger.error("Job(%s) failed: %s", job_id, job_desc)
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"}
471 logger.error("Job(%s) timeout", job_id)
472 raise GvnfmDriverException("Fail to get job status!")
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)
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])
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)
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])
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)
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])
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)
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])
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)
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])
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)
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])