Merge "Transfer data to nfv-lcm"
[vfc/nfvo/driver/vnfm/svnfm.git] / zte / vmanager / driver / interfaces / views.py
index 485657e..76b010f 100644 (file)
@@ -15,8 +15,8 @@
 import inspect
 import json
 import logging
-import traceback
 import os
+import traceback
 
 from drf_yasg.utils import swagger_auto_schema
 from rest_framework import status
@@ -24,10 +24,11 @@ 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, HealRespSerializer
+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
-from driver.pub.config.config import VNF_FTP
 
 logger = logging.getLogger(__name__)
 
@@ -310,138 +311,156 @@ def grantvnf(request, *args, **kwargs):
     return Response(data=resp_data, status=ret[2])
 
 
-@api_view(http_method_names=['POST'])
-def notify(request, *args, **kwargs):
-    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])
-    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])
+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
 
 
-@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")
-        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 Scale(APIView):
+    @swagger_auto_schema(
+        request_body=ScaleReqSerializer(),
+        responses={
+            status.HTTP_202_ACCEPTED: InstScaleHealRespSerializer(),
+            status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
         }
+    )
+    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)
 
-        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=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])
-        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])
+            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: HealRespSerializer(),
+            status.HTTP_202_ACCEPTED: InstScaleHealRespSerializer(),
             status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
         }
     )
@@ -456,7 +475,8 @@ class Heal(APIView):
 
             ret = get_vnfminfo_from_nslcm(vnfmid)
             if ret[0] != 0:
-                return Response(data={'error': ret[1]}, status=ret[2])
+                raise Exception(ret[1])
+
             vnfm_info = json.JSONDecoder().decode(ret[1])
             data = {}
             data['action'] = ignorcase_get(healReqSerializer.data, 'action')
@@ -483,7 +503,7 @@ class Heal(APIView):
                 raise Exception('heal error')
             resp_data = json.JSONDecoder().decode(ret[1])
             logger.info("resp_data=%s", resp_data)
-            healRespSerializer = HealRespSerializer(data=resp_data)
+            healRespSerializer = InstScaleHealRespSerializer(data=resp_data)
             if not healRespSerializer.is_valid():
                 raise Exception(healRespSerializer.errors)