import json
import logging
import traceback
+import os
from rest_framework.decorators import api_view
from rest_framework.response import Response
from driver.pub.utils import restcall
-from driver.pub.utils.restcall import req_by_msb
+from driver.pub.utils.restcall import req_by_msb, call_aai
+from driver.pub.config.config import VNF_FTP
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]
query_package_url = "api/nslcm/v1/vnfpackage/%s"
-# Query VNFM by VNFMID
+# 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 = req_by_msb("api/extsys/v1/vnfms/%s" % vnfmid, "GET")
+ 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
"additionalParam": ""}
create_vnf_resp_mapping = {
"VNFInstanceID": "vnfInstanceId",
- "JobId": "jobid",}
+ "JobId": "jobid"
+}
@api_view(http_method_names=['POST'])
try:
logger.debug("[%s] request.data=%s", fun_name(), request.data)
vnfm_id = ignorcase_get(kwargs, "vnfmid")
- ret = vnfm_get(vnfm_id)
+ 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 = {}
data["NFVOID"] = 1
data["VNFMID"] = vnfm_id
- # data["VNFD"] = ignorcase_get(packageInfo, "downloadUri")
- # data["VNFURL"] = ignorcase_get(packageInfo, "downloadUri")
- vnfdId = ignorcase_get(packageInfo, "vnfdId")
- from urlparse import urlparse
- vnfm_ip = urlparse(ignorcase_get(vnfm_info, "url")).netloc.split(':')[0]
- if "vCSCF_NF_ZTE" == vnfdId:
- data["VNFD"] = "ftp://VMVERSION:vmversion@" + "192.168.128.159" + ":21/CSCF"
- data["VNFURL"] = "ftp://VMVERSION:vmversion@" + "192.168.128.159" + ":21/CSCF"
- elif "vPCRF_NF_ZTE" == vnfdId:
- data["VNFD"] = "ftp://VMVERSION:vmversion@" + "192.168.128.159" + ":21/PCRF"
- data["VNFURL"] = "ftp://VMVERSION:vmversion@" + "192.168.128.159" + ":21/PCRF"
- elif "vTAS_NF_ZTE" == vnfdId:
- data["VNFD"] = "ftp://VMVERSION:vmversion@" + "192.168.128.159" + ":21/SSS"
- data["VNFURL"] = "ftp://VMVERSION:vmversion@" + "192.168.128.159" + ":21/SSS"
- elif "vSPGW_NF_ZTE" == vnfdId:
- data["VNFD"] = "ftp://VMVERSION:vmversion@" + "192.168.237.159" + ":21/vgw31"
- data["VNFURL"] = "ftp://VMVERSION:vmversion@" + "192.168.237.159" + ":21/vgw31"
+ # 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
+
+ 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})
data["extension"]["vnfid"] = data["VNFD"]
data["extension"]["multivim"] = 0
logger.debug("[%s] call_req data=%s", fun_name(), data)
+
ret = restcall.call_req(
base_url=ignorcase_get(vnfm_info, "url"),
user=ignorcase_get(vnfm_info, "userName"),
resource=create_vnf_url,
method='post',
content=json.JSONEncoder().encode(data))
+
logger.debug("[%s] call_req ret=%s", fun_name(), ret)
if ret[0] != 0:
return Response(data={'error': ret[1]}, status=ret[2])
try:
logger.debug("[%s] request.data=%s", fun_name(), request.data)
vnfm_id = ignorcase_get(kwargs, "vnfmid")
- ret = vnfm_get(vnfm_id)
+ 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])
vnf_detail_url = "v1/vnfs/%s"
vnf_detail_resp_mapping = {
- "VNFInstanseStatus": "status",}
+ "VNFInstanseStatus": "status"
+}
@api_view(http_method_names=['GET'])
try:
logger.debug("[%s] request.data=%s", fun_name(), request.data)
vnfm_id = ignorcase_get(kwargs, "vnfmid")
- ret = vnfm_get(vnfm_id)
+ 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])
"ErrorCode": "errorCode",
"ResponseId": "responseId",
"ResponseHistoryList": "responseHistoryList",
- "ResponseDescriptor": "responseDescriptor",}
+ "ResponseDescriptor": "responseDescriptor"
+}
@api_view(http_method_names=['GET'])
try:
logger.debug("[%s] request.data=%s", fun_name(), request.data)
vnfm_id = ignorcase_get(kwargs, "vnfmid")
- ret = vnfm_get(vnfm_id)
+ 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])
"VMFlavor": "",
"VMNumber": "",
"VMIDlist": "",
- "VMUUID": "",}
+ "VMUUID": ""
+}
@api_view(http_method_names=['POST'])
data["affectedVirtualStorage"] = []
data["affectedCp"] = []
- affectedvnfcs = ignorcase_get(ignorcase_get(request.data, "extension"), "affectedvnfc")
+ extension = ignorcase_get(request.data, "extension")
+ openo_notification = ignorcase_get(extension, "openo_notification")
+ if openo_notification:
+ affectedvnfcs = ignorcase_get(openo_notification, "affectedVnfc")
+ 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")
for affectedvnfc in affectedvnfcs:
data["affectedVnfc"].append({
- "vnfcInstanceId": ignorcase_get(affectedvnfc, "vnfcinstanceid"),
+ "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")
+ "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:
return Response(data={'error': ret[1]}, status=ret[2])
except Exception as e:
logger.error("Error occurred in LCM notification.")
+ logger.error(traceback.format_exc())
raise e
return Response(data=None, status=ret[2])
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, "nfInstanceId")
- ret = vnfm_get(vnfm_id)
+ 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")
+ # 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':''
+ 'vmlist': [{'VMNumber': number_of_steps, 'VMFlavor': aspect_id}],
+ 'extension': ''
}
'''
for vdu_id in get_vdus(vnfd_model, aspect_id):
content=json.JSONEncoder().encode(data))
logger.info("ret=%s", ret)
if ret[0] != 0:
- return Response(data={'error':'scale error'}, status=ret[2])
+ 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,error:%s", e.message)
+ 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'
+
+ 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"]
+ # jobId = resp_data["jobid"]
logger.info("resp_data=%s", resp_data)
except Exception as e:
- logger.error("Error occurred when scaling VNF")
+ logger.error("Error occurred when healing VNF,error:%s", e.message)
logger.error(traceback.format_exc())
- return Response(data={'error':'scale expection'}, status='500')
+ 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 = []