Add api adaptor for vnf pkg download
[vfc/nfvo/driver/vnfm/svnfm.git] / zte / vmanager / driver / interfaces / views.py
index 1bf6c5c..7376d4d 100644 (file)
@@ -21,9 +21,9 @@ import traceback
 from drf_yasg import openapi
 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 django.http import StreamingHttpResponse
 
 from driver.interfaces.serializers import HealReqSerializer, InstScaleHealRespSerializer, ScaleReqSerializer, \
     NotifyReqSerializer, GrantRespSerializer, GrantReqSerializer, JobQueryRespSerializer, TerminateVnfRequestSerializer, \
@@ -32,6 +32,8 @@ from driver.pub.config.config import VNF_FTP
 from driver.pub.utils import restcall
 from driver.pub.utils.restcall import req_by_msb
 
+CHUNK_SIZE = 1024 * 8
+
 logger = logging.getLogger(__name__)
 
 
@@ -43,6 +45,25 @@ def load_json_file(file_name):
     return json_data
 
 
+def read(file_path, start, end):
+    fp = open(file_path, 'rb')
+    fp.seek(start)
+    pos = start
+    while pos + CHUNK_SIZE < end:
+        yield fp.read(CHUNK_SIZE)
+        pos = fp.tell()
+    yield fp.read(end - pos)
+
+
+def parse_file_range(file_path, file_range):
+    start, end = 0, os.path.getsize(file_path)
+    if file_range:
+        [start, end] = file_range.split('-')
+        start, end = start.strip(), end.strip()
+        start, end = int(start), int(end)
+    return start, end
+
+
 def fun_name():
     return "=================%s==================" % inspect.stack()[1][3]
 
@@ -78,7 +99,7 @@ def vnfpackage_get(csarid):
     return ret
 
 
-class InstamtiateVnf(APIView):
+class InstantiateVnf(APIView):
     @swagger_auto_schema(
         request_body=InstantiateVnfRequestSerializer(),
         responses={
@@ -237,7 +258,8 @@ class QueryVnf(APIView):
             logger.debug("[%s] request.data=%s", fun_name(), request.data)
             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])
             logger.debug("[%s] vnfm_info=%s", fun_name(), vnfm_info)
             ret = restcall.call_req(
@@ -249,15 +271,20 @@ class QueryVnf(APIView):
                 method='get',
                 content=json.JSONEncoder().encode({}))
             if ret[0] != 0:
-                return Response(data={'error': ret[1]}, status=ret[2])
+                raise Exception(ret[1])
+
             resp = json.JSONDecoder().decode(ret[1])
             vnf_status = ignorcase_get(resp, "vnfinstancestatus")
             resp_data = {"vnfInfo": {"vnfStatus": vnf_status}}
             logger.debug("[%s]resp_data=%s", fun_name(), resp_data)
+            queryVnfResponseSerializer = QueryVnfResponseSerializer(data=resp_data)
+            if not queryVnfResponseSerializer.is_valid():
+                raise Exception(queryVnfResponseSerializer.errors)
+            return Response(data=queryVnfResponseSerializer.data, status=status.HTTP_200_OK)
         except Exception as e:
-            logger.error("Error occurred when querying VNF information.")
-            raise e
-        return Response(data=resp_data, status=ret[2])
+            logger.error("Error occurred when querying VNF information,error:%s", e.message)
+            logger.error(traceback.format_exc())
+            return Response(data={'error': 'QueryVnf expection'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
 class JobView(APIView):
@@ -606,6 +633,66 @@ def get_vdus(nf_model, aspect_id):
     return members
 
 
-@api_view(http_method_names=['GET'])
-def samples(request, *args, **kwargs):
-    return Response(data={"status": "ok"})
+class SampleList(APIView):
+    @swagger_auto_schema(
+        responses={
+            status.HTTP_200_OK: 'Successfully'})
+    def get(self, request):
+        logger.debug("get")
+        return Response({"status": "active"})
+
+
+class Subscribe(APIView):
+    def get(self, request):
+        logger.debug("====Subscribe get====")
+        resp_data = {
+            "subscriptions": [{
+                "subscribeid": "cdbddb00-452c-11e9-91e8-acc860114657",
+                "filter": [{
+                    "vendor": "ZTE",
+                    "type": "vCPE",
+                }],
+                "notificationuri": " https://127.0.0.1:80/v2/vnfm/vnfds/notification",
+            }]
+        }
+        return Response(data=resp_data, status=status.HTTP_200_OK)
+
+    def post(self, request):
+        logger.debug("====Subscribe post====")
+        resp_data = {"subscribeid": "cdbddb00-452c-11e9-91e8-acc860114657"}
+        return Response(data=resp_data, status=status.HTTP_201_CREATED)
+
+
+class SubscribeDetail(APIView):
+    def delete(self, request, subscribeId):
+        logger.debug("====SubscribeDetail delete %s====", subscribeId)
+        return Response(status=status.HTTP_204_NO_CONTENT)
+
+
+class VnfPkgs(APIView):
+    def get(self, request):
+        logger.debug("====VnfPkgs get====")
+        resp_data = {
+            "data": [{
+                "packageid": "924fc980-4530-11e9-ae68-acc860114657",
+                "vendor": "ZTE",
+                "type": "vCPE",
+                "vnfdfile": "MRP6600_FS_SRIOV_4NIC_200W.zip",
+                "imagefiles": ["MRP6600_FS_SRIOV_MRPISU_IMGV500R008C20SPC030T.tar"],
+                "swfiles": ["MRP6600_SRV_V500R008C20SPC030T.tar"],
+                "description": "This is a service for vCPE.",
+            }]
+        }
+        return Response(data=resp_data, status=status.HTTP_200_OK)
+
+
+class VnfPkg(APIView):
+    def get(self, request, packageId, fileName):
+        logger.debug("====VnfPkg get====%s, %s", packageId, fileName)
+        file_range = request.META.get('RANGE')
+        logger.debug('file_range: %s' % file_range)
+        # TODO: get filepath
+        local_file_path = fileName
+        start, end = parse_file_range(local_file_path, file_range)
+        file_iterator = read(local_file_path, start, end)
+        return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK)