import inspect
import json
import logging
+import os
import traceback
+from drf_yasg.utils import swagger_auto_schema
+from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
+from rest_framework.views import APIView
+from driver.interfaces.serializers import HealReqSerializer, InstScaleHealRespSerializer, ScaleReqSerializer, \
+ NotifyReqSerializer
+from driver.pub.config.config import VNF_FTP
from driver.pub.utils import restcall
-from driver.pub.utils.restcall import req_by_msb, call_aai
+from driver.pub.utils.restcall import req_by_msb
logger = logging.getLogger(__name__)
+def load_json_file(file_name):
+ json_file = os.path.join(os.path.dirname(__file__), "data/" + file_name)
+ f = open(json_file)
+ json_data = json.JSONDecoder().decode(f.read())
+ f.close()
+ return json_data
+
+
def fun_name():
return "=================%s==================" % inspect.stack()[1][3]
return resp_data
-query_vnfd_url = "api/nslcm/v1/vnfpackage/%s"
-query_vnfm_url = "api/extsys/v1/vnfms/%s"
-query_package_url = "api/nslcm/v1/vnfpackage/%s"
-
-#Query vnfm_info from nslcm
+# Query vnfm_info from nslcm
def get_vnfminfo_from_nslcm(vnfmid):
ret = req_by_msb("api/nslcm/v1/vnfms/%s" % vnfmid, "GET")
return ret
-# Query vnfm_info from esr
-def vnfm_get(vnfmid):
- ret = call_aai("api/aai-esr-server/v1/vnfms/%s" % vnfmid, "GET")
- return ret
# Query vnfd_info from nslcm
def vnfd_get(vnfpackageid):
ret = req_by_msb("api/nslcm/v1/vnfpackage/%s" % vnfpackageid, "GET")
return ret
+
# Query vnfpackage_info from nslcm
def vnfpackage_get(csarid):
ret = req_by_msb("api/nslcm/v1/vnfpackage/%s" % csarid, "GET")
return ret
-# ==================================================
-create_vnf_url = "v1/vnfs"
-create_vnf_param_mapping = {
- "packageUrl": "",
- "instantiateUrl": "",
- "instantiationLevel": "",
- "vnfInstanceName": "",
- "vnfPackageId": "",
- "vnfDescriptorId": "",
- "flavorId": "",
- "vnfInstanceDescription": "",
- "extVirtualLink": "",
- "additionalParam": ""}
-create_vnf_resp_mapping = {
- "VNFInstanceID": "vnfInstanceId",
- "JobId": "jobid",}
-
-
@api_view(http_method_names=['POST'])
def instantiate_vnf(request, *args, **kwargs):
try:
data = {}
data["NFVOID"] = 1
data["VNFMID"] = vnfm_id
- vnfdId = ignorcase_get(packageInfo, "vnfdId")
+ vnfdModel = json.loads(ignorcase_get(packageInfo, "vnfdModel"))
+ metadata = ignorcase_get(vnfdModel, "metadata")
+ vnfd_name = ignorcase_get(metadata, "name")
# TODO convert sdc vnf package to vnf vender package
- from urlparse import urlparse
- vnfm_ip = urlparse(ignorcase_get(vnfm_info, "url")).netloc.split(':')[0]
- VNFS = ["SPGW", "MME"]
- if vnfdId in VNFS:
- data["VNFD"] = "ftp://VMVERSION:vmversion@" + vnfm_ip + ":21/" + vnfdId
- data["VNFURL"] = "ftp://VMVERSION:vmversion@" + vnfm_ip + ":21/" + vnfdId
+ inputs = []
+ if "SPGW" in vnfd_name.upper():
+ data["VNFD"] = VNF_FTP + "SPGW"
+ inputs = load_json_file("SPGW" + "_inputs.json")
+ elif "MME" in vnfd_name.upper():
+ data["VNFD"] = VNF_FTP + "MME"
+ inputs = load_json_file("MME" + "_inputs.json")
else:
data["VNFD"] = ignorcase_get(packageInfo, "downloadUri")
- data["VNFURL"] = ignorcase_get(packageInfo, "downloadUri")
+
+ data["VNFURL"] = data["VNFD"]
data["extension"] = {}
- inputs = []
for name, value in ignorcase_get(ignorcase_get(request.data, "additionalParam"), "inputs").items():
inputs.append({"name": name, "value": value})
- logger.info(
- "ignorcase_get(request.data, \"additionalParam\") = %s" % ignorcase_get(request.data, "additionalParam"))
data["extension"]["inputs"] = json.dumps(inputs)
- data["extension"]["extVirtualLinks"] = ignorcase_get(
- ignorcase_get(request.data, "additionalParam"), "extVirtualLinks")
+ additionalParam = ignorcase_get(request.data, "additionalParam")
+ data["extension"]["extVirtualLinks"] = ignorcase_get(additionalParam, "extVirtualLinks")
data["extension"]["vnfinstancename"] = ignorcase_get(request.data, "vnfInstanceName")
data["extension"]["vnfid"] = data["VNFD"]
data["extension"]["multivim"] = 0
user=ignorcase_get(vnfm_info, "userName"),
passwd=ignorcase_get(vnfm_info, "password"),
auth_type=restcall.rest_no_auth,
- resource=create_vnf_url,
+ resource="v1/vnfs",
method='post',
content=json.JSONEncoder().encode(data))
if ret[0] != 0:
return Response(data={'error': ret[1]}, status=ret[2])
resp = json.JSONDecoder().decode(ret[1])
- resp_data = mapping_conv(create_vnf_resp_mapping, resp)
+ resp_data = {
+ "vnfInstanceId": ignorcase_get(resp, "VNFInstanceID"),
+ "jobId": ignorcase_get(resp, "JobId")
+ }
logger.info("[%s]resp_data=%s", fun_name(), resp_data)
except Exception as e:
logger.error("Error occurred when instantiating VNF")
return Response(data=resp_data, status=ret[2])
-# ==================================================
-vnf_delete_url = "v1/vnfs/%s"
-vnf_delete_param_mapping = {
- "terminationType": "terminationType",
- "gracefulTerminationTimeout": "gracefulTerminationTimeout"}
-vnf_delete_resp_mapping = {
- "vnfInstanceId": "vnfInstanceId",
- "JobId": "jobid"}
-
-
@api_view(http_method_names=['POST'])
def terminate_vnf(request, *args, **kwargs):
try:
return Response(data={'error': ret[1]}, status=ret[2])
vnfm_info = json.JSONDecoder().decode(ret[1])
logger.debug("[%s] vnfm_info=%s", fun_name(), vnfm_info)
- data = {}
- logger.debug("[%s]req_data=%s", fun_name(), data)
ret = restcall.call_req(
base_url=ignorcase_get(vnfm_info, "url"),
user=ignorcase_get(vnfm_info, "userName"),
passwd=ignorcase_get(vnfm_info, "password"),
auth_type=restcall.rest_no_auth,
- resource=vnf_delete_url % (ignorcase_get(kwargs, "vnfInstanceID")),
+ resource="v1/vnfs/%s" % (ignorcase_get(kwargs, "vnfInstanceID")),
method='delete',
- content=json.JSONEncoder().encode(data))
+ content=json.JSONEncoder().encode(request.data))
if ret[0] != 0:
return Response(data={'error': ret[1]}, status=ret[2])
resp = json.JSONDecoder().decode(ret[1])
- resp_data = mapping_conv(vnf_delete_resp_mapping, resp)
+ resp_data = {
+ "vnfInstanceId": ignorcase_get(resp, "VNFInstanceID"),
+ "jobId": ignorcase_get(resp, "JobId")
+ }
logger.debug("[%s]resp_data=%s", fun_name(), resp_data)
except Exception as e:
logger.error("Error occurred when terminating VNF")
return Response(data=resp_data, status=ret[2])
-# ==================================================
-
-
-vnf_detail_url = "v1/vnfs/%s"
-vnf_detail_resp_mapping = {
- "VNFInstanseStatus": "status",}
-
-
@api_view(http_method_names=['GET'])
def query_vnf(request, *args, **kwargs):
try:
return Response(data={'error': ret[1]}, status=ret[2])
vnfm_info = json.JSONDecoder().decode(ret[1])
logger.debug("[%s] vnfm_info=%s", fun_name(), vnfm_info)
- data = {}
ret = restcall.call_req(
base_url=ignorcase_get(vnfm_info, "url"),
user=ignorcase_get(vnfm_info, "userName"),
passwd=ignorcase_get(vnfm_info, "password"),
auth_type=restcall.rest_no_auth,
- resource=vnf_detail_url % (ignorcase_get(kwargs, "vnfInstanceID")),
+ resource="v1/vnfs/%s" % (ignorcase_get(kwargs, "vnfInstanceID")),
method='get',
- content=json.JSONEncoder().encode(data))
+ content=json.JSONEncoder().encode({}))
if ret[0] != 0:
return Response(data={'error': ret[1]}, status=ret[2])
resp = json.JSONDecoder().decode(ret[1])
return Response(data=resp_data, status=ret[2])
-# Get Operation Status
-operation_status_url = '/v1/jobs/{jobId}?NFVOID={nfvoId}&VNFMID={vnfmId}&ResponseID={responseId}'
-operation_status_resp_map = {
- "JobId": "jobId",
- "Status": "status",
- "Progress": "progress",
- "StatusDescription": "currentStep",
- "ErrorCode": "errorCode",
- "ResponseId": "responseId",
- "ResponseHistoryList": "responseHistoryList",
- "ResponseDescriptor": "responseDescriptor",}
-
-
@api_view(http_method_names=['GET'])
def operation_status(request, *args, **kwargs):
data = {}
return Response(data={'error': ret[1]}, status=ret[2])
vnfm_info = json.JSONDecoder().decode(ret[1])
logger.debug("[%s] vnfm_info=%s", fun_name(), vnfm_info)
+ operation_status_url = '/v1/jobs/{jobId}?NFVOID={nfvoId}&VNFMID={vnfmId}&ResponseID={responseId}'
ret = restcall.call_req(
base_url=ignorcase_get(vnfm_info, 'url'),
user=ignorcase_get(vnfm_info, 'userName'),
return Response(data=resp_data, status=ret[2])
-# Grant VNF Lifecycle Operation
-grant_vnf_url = 'api/nslcm/v1/ns/grantvnf'
-grant_vnf_param_map = {
- "VNFMID": "",
- "NFVOID": "",
- "VIMID": "",
- "ExVIMIDList": "",
- "ExVIMID": "",
- "Tenant": "",
- "VNFInstanceID": "vnfInstanceId",
- "OperationRight": "",
- "VMList": "",
- "VMFlavor": "",
- "VMNumber": ""}
-
-
@api_view(http_method_names=['PUT'])
def grantvnf(request, *args, **kwargs):
logger.info("=====grantvnf=====")
try:
- resp_data = {}
logger.info("req_data = %s", request.data)
+ grant_vnf_param_map = {
+ "VNFMID": "",
+ "NFVOID": "",
+ "VIMID": "",
+ "ExVIMIDList": "",
+ "ExVIMID": "",
+ "Tenant": "",
+ "VNFInstanceID": "vnfInstanceId",
+ "OperationRight": "",
+ "VMList": "",
+ "VMFlavor": "",
+ "VMNumber": ""
+ }
data = mapping_conv(grant_vnf_param_map, request.data)
- logger.info("grant_vnf_url = %s", grant_vnf_url)
data["vnfDescriptorId"] = ""
if ignorcase_get(request.data, "operationright") == 0:
data["lifecycleOperation"] = "Instantiate"
for vm in ignorcase_get(request.data, "vmlist"):
for i in range(int(ignorcase_get(vm, "vmnumber"))):
data["addresource"].append(
- {"type": "vdu",
- "resourceDefinitionId": i,
- "vdu": ignorcase_get(vm, "vmflavor"),
- "vimid": ignorcase_get(vm, "vimid"),
- "tenant": ignorcase_get(vm, "tenant")
- })
+ {
+ "type": "vdu",
+ "resourceDefinitionId": i,
+ "vdu": ignorcase_get(vm, "vmflavor"),
+ "vimid": ignorcase_get(vm, "vimid"),
+ "tenant": ignorcase_get(vm, "tenant")})
data["additionalparam"] = {}
data["additionalparam"]["vnfmid"] = ignorcase_get(request.data, "vnfmid")
data["additionalparam"]["vimid"] = ignorcase_get(request.data, "vimid")
data["additionalparam"]["tenant"] = ignorcase_get(request.data, "tenant")
- logger.info("data = %s", data)
- ret = req_by_msb(grant_vnf_url, "POST", content=json.JSONEncoder().encode(data))
+ ret = req_by_msb('api/nslcm/v1/ns/grantvnf', "POST", content=json.JSONEncoder().encode(data))
logger.info("ret = %s", ret)
if ret[0] != 0:
return Response(data={'error': ret[1]}, status=ret[2])
resp = json.JSONDecoder().decode(ret[1])
-
- resp_data['vimid'] = ignorcase_get(resp['vim'], 'vimid')
- resp_data['tenant'] = ignorcase_get(ignorcase_get(resp['vim'], 'accessinfo'), 'tenant')
-
+ resp_data = {
+ 'vimid': ignorcase_get(resp['vim'], 'vimid'),
+ 'tenant': ignorcase_get(ignorcase_get(resp['vim'], 'accessinfo'), 'tenant')
+ }
logger.info("[%s]resp_data=%s", fun_name(), resp_data)
except Exception as e:
logger.error("Error occurred in Grant VNF.")
return Response(data=resp_data, status=ret[2])
-# Notify LCM Events
-notify_url = 'api/nslcm/v1/ns/{vnfmid}/vnfs/{vnfInstanceId}/Notify'
-notify_param_map = {
- "NFVOID": "",
- "VNFMID": "VNFMID",
- "VIMID": "vimid",
- "VNFInstanceID": "vnfInstanceId",
- "TimeStamp": "",
- "EventType": "operation",
- "VMList": "",
- "VMFlavor": "",
- "VMNumber": "",
- "VMIDlist": "",
- "VMUUID": "",}
-
-
-@api_view(http_method_names=['POST'])
-def notify(request, *args, **kwargs):
- try:
- logger.info("[%s]req_data = %s", fun_name(), request.data)
- data = mapping_conv(notify_param_map, request.data)
- logger.info("[%s]data = %s", fun_name(), data)
-
- data["status"] = "result"
- data["jobId"] = "notMust"
- data["affectedVnfc"] = []
- data["affectedVl"] = []
- data["affectedVirtualStorage"] = []
- data["affectedCp"] = []
-
- affectedvnfcs = ignorcase_get(ignorcase_get(request.data, "extension"), "affectedvnfc")
- affectedvls = ignorcase_get(ignorcase_get(request.data, "extension"), "affectedvl")
- affectedcps = ignorcase_get(ignorcase_get(request.data, "extension"), "affectedcp")
- vnfdmodule = ignorcase_get(ignorcase_get(request.data, "extension"), "vnfdmodule")
-
- data["vnfdmodule"] = vnfdmodule
-
- for affectedvnfc in affectedvnfcs:
- data["affectedVnfc"].append({
- "vnfcInstanceId": ignorcase_get(affectedvnfc, "vnfcinstanceid"),
- "vduId": ignorcase_get(affectedvnfc, "vduId"),
- "changeType": ignorcase_get(affectedvnfc, "changeType"),
- "vimid": ignorcase_get(ignorcase_get(affectedvnfc, "computeresource"), "vimid"),
- "vmId": ignorcase_get(ignorcase_get(affectedvnfc, "computeresource"), "resourceid"),
- "vmName": ignorcase_get(ignorcase_get(affectedvnfc, "computeresource"), "resourcename")
- })
-
- for affectedvl in affectedvls:
- data["affectedVl"].append({
- "vlInstanceId": ignorcase_get(affectedvl, "virtuallinkinstanceid"),
- "vimid": ignorcase_get(ignorcase_get(affectedvl, "networkresource"), "vimid"),
- "vldid": ignorcase_get(affectedvl, "virtuallinkdescid"),
- "vllid": ignorcase_get(ignorcase_get(affectedvl, "networkresource"), "resourceid"),
- "vlName": ignorcase_get(ignorcase_get(affectedvl, "networkresource"), "resourcename")
- })
-
- for affectedcp in affectedcps:
- data["affectedCp"].append(affectedcp)
- # {
- # "virtualLinkInstanceId": ignorcase_get(affectedcp, "virtuallinkinstanceid"),
- # "ownerId": ignorcase_get(affectedcp, "ownerId"),
- # "ownerType": ignorcase_get(affectedcp, "ownerType")
- # }
- ret = req_by_msb(notify_url.format(vnfmid=ignorcase_get(data, 'VNFMID'),
- vnfInstanceId=ignorcase_get(data, 'vnfinstanceid')),
- "POST", content=json.JSONEncoder().encode(data))
-
- logger.info("[%s]data = %s", fun_name(), ret)
- if ret[0] != 0:
- return Response(data={'error': ret[1]}, status=ret[2])
- except Exception as e:
- logger.error("Error occurred in LCM notification.")
- raise e
- return Response(data=None, status=ret[2])
-
-
-nf_scaling_url = '/v1/vnfs/{vnfInstanceID}/scale'
-
-
-@api_view(http_method_names=['POST'])
-def scale(request, *args, **kwargs):
- logger.info("====scale_vnf===")
- try:
- logger.info("request.data = %s", request.data)
- logger.info("requested_url = %s", request.get_full_path())
- vnfm_id = ignorcase_get(kwargs, "vnfmid")
- nf_instance_id = ignorcase_get(kwargs, "vnfInstanceId")
- ret = get_vnfminfo_from_nslcm(vnfm_id)
- if ret[0] != 0:
- return Response(data={'error': ret[1]}, status=ret[2])
- vnfm_info = json.JSONDecoder().decode(ret[1])
- scale_type = ignorcase_get(request.data, "type")
- aspect_id = ignorcase_get(request.data, "aspectId")
- number_of_steps = ignorcase_get(request.data, "numberOfSteps")
- extension = ignorcase_get(request.data, "additionalParam")
- vnfd_model = ignorcase_get(extension, "vnfdModel")
- data = {
- 'vnfmid': vnfm_id,
- 'nfvoid': 1,
- 'scaletype': '0' if scale_type == 'SCALE_OUT' else '1',
- 'vmlist': [{'VMNumber':number_of_steps,'VMFlavor':aspect_id}],
- 'extension':''
+class Notify(APIView):
+ @swagger_auto_schema(
+ request_body=NotifyReqSerializer()
+ )
+ def post(self, request):
+ try:
+ logger.info("[%s]req_data = %s", fun_name(), request.data)
+ notify_param_map = {
+ "NFVOID": "",
+ "VNFMID": "VNFMID",
+ "VIMID": "vimid",
+ "VNFInstanceID": "vnfInstanceId",
+ "TimeStamp": "",
+ "EventType": "operation",
+ "VMList": "",
+ "VMFlavor": "",
+ "VMNumber": "",
+ "VMIDlist": "",
+ "VMUUID": ""
+ }
+ data = mapping_conv(notify_param_map, request.data)
+ logger.info("[%s]data = %s", fun_name(), data)
+
+ data["status"] = "result"
+ data["jobId"] = "notMust"
+ data["affectedVnfc"] = []
+ data["affectedVl"] = []
+ data["affectedVirtualStorage"] = []
+ data["affectedCp"] = []
+
+ extension = ignorcase_get(request.data, "extension")
+ openo_notification = ignorcase_get(extension, "openo_notification")
+ if openo_notification:
+ affectedvnfcs = ignorcase_get(openo_notification, "affectedVnfc")
+ affectedvls = ignorcase_get(openo_notification, "affectedvirtuallink")
+ affectedcps = ignorcase_get(openo_notification, "affectedCp")
+ vnfdmodule = ignorcase_get(openo_notification, "vnfdmodule")
+ else:
+ affectedvnfcs = ignorcase_get(ignorcase_get(request.data, "extension"), "affectedvnfc")
+ affectedvls = ignorcase_get(ignorcase_get(request.data, "extension"), "affectedvl")
+ affectedcps = ignorcase_get(ignorcase_get(request.data, "extension"), "affectedcp")
+ vnfdmodule = ignorcase_get(ignorcase_get(request.data, "extension"), "vnfdmodule")
+
+ data["vnfdmodule"] = vnfdmodule
+
+ for affectedvnfc in affectedvnfcs:
+ data["affectedVnfc"].append({
+ "vnfcInstanceId": ignorcase_get(affectedvnfc, "vnfcInstanceId"),
+ "vduId": ignorcase_get(affectedvnfc, "vduId"),
+ "changeType": ignorcase_get(affectedvnfc, "changeType"),
+ "vimId": ignorcase_get(ignorcase_get(affectedvnfc, "computeResource"), "vimId"),
+ "vmId": ignorcase_get(ignorcase_get(affectedvnfc, "computeResource"), "resourceId"),
+ "vmName": ignorcase_get(ignorcase_get(affectedvnfc, "computeResource"), "resourceName")
+ })
+
+ for affectedvl in affectedvls:
+ data["affectedVl"].append({
+ "vlInstanceId": ignorcase_get(affectedvl, "virtualLinkInstanceId"),
+ "changeType": ignorcase_get(affectedvl, "changeType"),
+ "vimId": ignorcase_get(ignorcase_get(affectedvl, "networkResource"), "vimId"),
+ "vldId": ignorcase_get(affectedvl, "virtuallinkdescid"),
+ "networkResource": {
+ "resourceType": "network",
+ "resourceId": ignorcase_get(ignorcase_get(affectedvl, "networkresource"), "resourceid"),
+ "resourceName": ignorcase_get(ignorcase_get(affectedvl, "networkresource"), "resourcename")
+ }
+ })
+
+ for affectedcp in affectedcps:
+ data["affectedCp"].append(affectedcp)
+
+ notify_url = 'api/nslcm/v1/ns/{vnfmid}/vnfs/{vnfInstanceId}/Notify'
+ ret = req_by_msb(notify_url.format(vnfmid=ignorcase_get(data, 'VNFMID'),
+ vnfInstanceId=ignorcase_get(data, 'vnfinstanceid')),
+ "POST", content=json.JSONEncoder().encode(data))
+
+ logger.info("[%s]data = %s", fun_name(), ret)
+ if ret[0] != 0:
+ return Response(data={'error': ret[1]}, status=ret[2])
+ return Response(data=None, status=ret[2])
+ except Exception as e:
+ logger.error("Error occurred in LCM notification.")
+ logger.error(traceback.format_exc())
+ raise e
+
+
+class Scale(APIView):
+ @swagger_auto_schema(
+ request_body=ScaleReqSerializer(),
+ responses={
+ status.HTTP_202_ACCEPTED: InstScaleHealRespSerializer(),
+ status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
}
- '''
- for vdu_id in get_vdus(vnfd_model, aspect_id):
- data['vmlist'].append({
- "VMFlavor": vdu_id,
- "VMNumber": number_of_steps
- })
- '''
- logger.info("data = %s", data)
- ret = restcall.call_req(
- base_url=ignorcase_get(vnfm_info, "url"),
- user=ignorcase_get(vnfm_info, "userName"),
- passwd=ignorcase_get(vnfm_info, "password"),
- auth_type=restcall.rest_no_auth,
- resource=nf_scaling_url.format(vnfInstanceID=nf_instance_id),
- method='put', # POST
- content=json.JSONEncoder().encode(data))
- logger.info("ret=%s", ret)
- if ret[0] != 0:
- return Response(data={'error':'scale error'}, status=ret[2])
- resp_data = json.JSONDecoder().decode(ret[1])
- # jobId = resp_data["jobid"]
- logger.info("resp_data=%s", resp_data)
- except Exception as e:
- logger.error("Error occurred when scaling VNF")
- logger.error(traceback.format_exc())
- return Response(data={'error':'scale expection'}, status='500')
- return Response(data=resp_data, status=ret[2])
-
-
-nf_healing_url = '/api/v1/nf_m_i/nfs/{vnfInstanceID}/vms/operation'
-
-@api_view(http_method_names=['POST'])
-def heal(request, *args, **kwargs):
- logger.info("====heal_vnf===")
- try:
- logger.info("request.data = %s", request.data)
- logger.info("requested_url = %s", request.get_full_path())
- vnfm_id = ignorcase_get(kwargs, "vnfmid")
- nf_instance_id = ignorcase_get(kwargs, "vnfInstanceId")
- ret = get_vnfminfo_from_nslcm(vnfm_id)
- if ret[0] != 0:
- return Response(data={'error': ret[1]}, status=ret[2])
- vnfm_info = json.JSONDecoder().decode(ret[1])
- data = request.data
- data['lifecycleoperation'] = 'operate'
- data['isgrace'] = 'force'
+ )
+ def post(self, request, vnfmid, vnfInstanceId):
+ logger.info("====scale_vnf===")
+ try:
+ logger.info("request.data = %s", request.data)
+ logger.info("requested_url = %s", request.get_full_path())
+ scaleReqSerializer = ScaleReqSerializer(data=request.data)
+ if not scaleReqSerializer.is_valid():
+ raise Exception(scaleReqSerializer.errors)
+
+ ret = get_vnfminfo_from_nslcm(vnfmid)
+ if ret[0] != 0:
+ raise Exception(ret[1])
+
+ vnfm_info = json.JSONDecoder().decode(ret[1])
+ scale_type = ignorcase_get(scaleReqSerializer.data, "type")
+ aspect_id = ignorcase_get(scaleReqSerializer.data, "aspectId")
+ number_of_steps = ignorcase_get(scaleReqSerializer.data, "numberOfSteps")
+ data = {
+ 'vnfmid': vnfmid,
+ 'nfvoid': 1,
+ 'scaletype': '0' if scale_type == 'SCALE_OUT' else '1',
+ 'vmlist': [{'VMNumber': number_of_steps, 'VMFlavor': aspect_id}],
+ 'extension': ''
+ }
+
+ logger.info("data = %s", data)
+ ret = restcall.call_req(
+ base_url=ignorcase_get(vnfm_info, "url"),
+ user=ignorcase_get(vnfm_info, "userName"),
+ passwd=ignorcase_get(vnfm_info, "password"),
+ auth_type=restcall.rest_no_auth,
+ resource='/v1/vnfs/{vnfInstanceID}/scale'.format(vnfInstanceID=vnfInstanceId),
+ method='put', # POST
+ content=json.JSONEncoder().encode(data))
+ logger.info("ret=%s", ret)
+ if ret[0] != 0:
+ raise Exception('scale error')
+
+ resp_data = json.JSONDecoder().decode(ret[1])
+ logger.info("resp_data=%s", resp_data)
+ scaleRespSerializer = InstScaleHealRespSerializer(data=resp_data)
+ if not scaleRespSerializer.is_valid():
+ raise Exception(scaleRespSerializer.errors)
+
+ return Response(data=scaleRespSerializer.data, status=status.HTTP_202_ACCEPTED)
+ except Exception as e:
+ logger.error("Error occurred when scaling VNF,error:%s", e.message)
+ logger.error(traceback.format_exc())
+ return Response(data={'error': 'scale expection'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+
+
+class Heal(APIView):
+ @swagger_auto_schema(
+ request_body=HealReqSerializer(),
+ responses={
+ status.HTTP_202_ACCEPTED: InstScaleHealRespSerializer(),
+ status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
+ }
+ )
+ def post(self, request, vnfmid, vnfInstanceId):
+ logger.info("====heal_vnf===")
+ try:
+ logger.info("request.data = %s", request.data)
+ logger.info("requested_url = %s", request.get_full_path())
+ healReqSerializer = HealReqSerializer(data=request.data)
+ if not healReqSerializer.is_valid():
+ raise Exception(healReqSerializer.errors)
+
+ ret = get_vnfminfo_from_nslcm(vnfmid)
+ if ret[0] != 0:
+ raise Exception(ret[1])
+
+ vnfm_info = json.JSONDecoder().decode(ret[1])
+ data = {}
+ data['action'] = ignorcase_get(healReqSerializer.data, 'action')
+ affectedvm = ignorcase_get(healReqSerializer.data, 'affectedvm')
+ data['affectedvm'] = []
+ if isinstance(affectedvm, list):
+ data['affectedvm'] = affectedvm
+ else:
+ data['affectedvm'].append(affectedvm)
+ data['lifecycleoperation'] = 'operate'
+ data['isgrace'] = 'force'
+
+ logger.info("data = %s", data)
+ ret = restcall.call_req(
+ base_url=ignorcase_get(vnfm_info, "url"),
+ user=ignorcase_get(vnfm_info, "userName"),
+ passwd=ignorcase_get(vnfm_info, "password"),
+ auth_type=restcall.rest_no_auth,
+ resource='/api/v1/nf_m_i/nfs/{vnfInstanceID}/vms/operation'.format(vnfInstanceID=vnfInstanceId),
+ method='post',
+ content=json.JSONEncoder().encode(data))
+ logger.info("ret=%s", ret)
+ if ret[0] != 0:
+ raise Exception('heal error')
+ resp_data = json.JSONDecoder().decode(ret[1])
+ logger.info("resp_data=%s", resp_data)
+ healRespSerializer = InstScaleHealRespSerializer(data=resp_data)
+ if not healRespSerializer.is_valid():
+ raise Exception(healRespSerializer.errors)
+
+ return Response(data=healRespSerializer.data, status=status.HTTP_202_ACCEPTED)
+ except Exception as e:
+ logger.error("Error occurred when healing VNF,error:%s", e.message)
+ logger.error(traceback.format_exc())
+ return Response(data={'error': 'heal expection'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
- logger.info("data = %s", data)
- ret = restcall.call_req(
- base_url=ignorcase_get(vnfm_info, "url"),
- user=ignorcase_get(vnfm_info, "userName"),
- passwd=ignorcase_get(vnfm_info, "password"),
- auth_type=restcall.rest_no_auth,
- resource=nf_healing_url.format(vnfInstanceID=nf_instance_id),
- method='put', # POST
- content=json.JSONEncoder().encode(data))
- logger.info("ret=%s", ret)
- if ret[0] != 0:
- return Response(data={'error': 'heal error'}, status=ret[2])
- resp_data = json.JSONDecoder().decode(ret[1])
- # jobId = resp_data["jobid"]
- logger.info("resp_data=%s", resp_data)
- except Exception as e:
- logger.error("Error occurred when healing VNF")
- logger.error(traceback.format_exc())
- return Response(data={'error': 'heal expection'}, status='500')
- return Response(data=resp_data, status=ret[2])
-#@staticmethod
def get_vdus(nf_model, aspect_id):
associated_group = ''
members = []