Optimize vfc-ztevnfmdriver termination Code
[vfc/nfvo/driver/vnfm/svnfm.git] / zte / vmanager / driver / interfaces / views.py
index dc94f83..54c0266 100644 (file)
@@ -16,16 +16,26 @@ import inspect
 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, call_aai
+from driver.pub.utils.restcall import req_by_msb
+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]
 
@@ -51,51 +61,30 @@ def mapping_conv(keyword_map, rest_return):
     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 by VNFMID
-def vnfm_get(vnfmid):
-    ret = call_aai("api/aai-esr-server/v1/vnfms/%s" % vnfmid, "GET")
+# 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 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:
         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])
@@ -116,28 +105,29 @@ def instantiate_vnf(request, *args, **kwargs):
         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
@@ -148,7 +138,7 @@ def instantiate_vnf(request, *args, **kwargs):
             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))
 
@@ -156,7 +146,10 @@ def instantiate_vnf(request, *args, **kwargs):
         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")
@@ -164,40 +157,31 @@ def instantiate_vnf(request, *args, **kwargs):
     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:
         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])
         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")
@@ -205,12 +189,10 @@ def terminate_vnf(request, *args, **kwargs):
     return Response(data=resp_data, status=ret[2])
 
 
-# ==================================================
-
-
 vnf_detail_url = "v1/vnfs/%s"
 vnf_detail_resp_mapping = {
-    "VNFInstanseStatus": "status",}
+    "VNFInstanseStatus": "status"
+}
 
 
 @api_view(http_method_names=['GET'])
@@ -218,7 +200,7 @@ def query_vnf(request, *args, **kwargs):
     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])
@@ -254,7 +236,8 @@ operation_status_resp_map = {
     "ErrorCode": "errorCode",
     "ResponseId": "responseId",
     "ResponseHistoryList": "responseHistoryList",
-    "ResponseDescriptor": "responseDescriptor",}
+    "ResponseDescriptor": "responseDescriptor"
+}
 
 
 @api_view(http_method_names=['GET'])
@@ -263,7 +246,7 @@ def operation_status(request, *args, **kwargs):
     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])
@@ -362,7 +345,8 @@ notify_param_map = {
     "VMFlavor": "",
     "VMNumber": "",
     "VMIDlist": "",
-    "VMUUID": "",}
+    "VMUUID": ""
+}
 
 
 @api_view(http_method_names=['POST'])
@@ -379,21 +363,29 @@ def notify(request, *args, **kwargs):
         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")
+        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"),
+                "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:
@@ -407,11 +399,7 @@ def notify(request, *args, **kwargs):
 
         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))
@@ -421,6 +409,7 @@ def notify(request, *args, **kwargs):
             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])
 
@@ -436,21 +425,21 @@ def scale(request, *args, **kwargs):
         logger.info("requested_url = %s", request.get_full_path())
         vnfm_id = ignorcase_get(kwargs, "vnfmid")
         nf_instance_id = ignorcase_get(kwargs, "vnfInstanceId")
-        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])
         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):
@@ -470,19 +459,19 @@ def scale(request, *args, **kwargs):
             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")
+        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={'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===")
@@ -491,11 +480,18 @@ def heal(request, *args, **kwargs):
         logger.info("requested_url = %s", request.get_full_path())
         vnfm_id = ignorcase_get(kwargs, "vnfmid")
         nf_instance_id = ignorcase_get(kwargs, "vnfInstanceId")
-        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 = request.data
+        data = {}
+        data['action'] = ignorcase_get(request.data, 'action')
+        affectedvm = ignorcase_get(request.data, 'affectedvm')
+        data['affectedvm'] = []
+        if isinstance(affectedvm, list):
+            data['affectedvm'] = affectedvm
+        else:
+            data['affectedvm'].append(affectedvm)
         data['lifecycleoperation'] = 'operate'
         data['isgrace'] = 'force'
 
@@ -506,21 +502,20 @@ def heal(request, *args, **kwargs):
             passwd=ignorcase_get(vnfm_info, "password"),
             auth_type=restcall.rest_no_auth,
             resource=nf_healing_url.format(vnfInstanceID=nf_instance_id),
-            method='put',  # POST
+            method='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("Error occurred when healing VNF,error:%s", e.message)
         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 = []