diff options
-rw-r--r-- | zte/vmanager/driver/interfaces/urls.py | 1 | ||||
-rw-r--r-- | zte/vmanager/driver/interfaces/views.py | 34 |
2 files changed, 35 insertions, 0 deletions
diff --git a/zte/vmanager/driver/interfaces/urls.py b/zte/vmanager/driver/interfaces/urls.py index 65331fc0..82cc1ffd 100644 --- a/zte/vmanager/driver/interfaces/urls.py +++ b/zte/vmanager/driver/interfaces/urls.py @@ -35,5 +35,6 @@ urlpatterns = [ url(r'^api/ztevnfmdriver/v1/subscribe/(?P<subscribeId>[0-9a-zA-Z\-\_]+)$', views.SubscribeDetail.as_view(), name='subscribe_detail'), url(r'^api/ztevnfmdriver/v1/subscribe$', views.Subscribe.as_view(), name='subscribe'), url(r'^api/ztevnfmdriver/v1/vnfpkgs$', views.VnfPkgs.as_view(), name='VnfPkgs'), + url(r'^api/ztevnfmdriver/v1/vnfpkgs/(?P<packageId>[0-9a-zA-Z\-\_]+)/(?P<fileName>[0-9a-zA-Z\.\-\_]+)$', views.VnfPkg.as_view(), name='VnfPkg'), url(r'^samples/$', views.SampleList.as_view(), name='samples') ] diff --git a/zte/vmanager/driver/interfaces/views.py b/zte/vmanager/driver/interfaces/views.py index 3fc6272d..7376d4d2 100644 --- a/zte/vmanager/driver/interfaces/views.py +++ b/zte/vmanager/driver/interfaces/views.py @@ -23,6 +23,7 @@ from drf_yasg.utils import swagger_auto_schema from rest_framework import status 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, \ @@ -31,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__) @@ -42,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] @@ -662,3 +684,15 @@ class VnfPkgs(APIView): }] } 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) |