Deal with nfPackage 73/63073/1
authorbiancunkang <bian.cunkang@zte.com.cn>
Mon, 27 Aug 2018 13:00:38 +0000 (21:00 +0800)
committerbiancunkang <bian.cunkang@zte.com.cn>
Mon, 27 Aug 2018 13:00:38 +0000 (21:00 +0800)
Deal with fetch_part_vnf_pkg

Change-Id: Ie17af57c6a0ed6aa525ce9b32e745e791913b643
Issue-ID: VFC-1038
Signed-off-by: biancunkang <bian.cunkang@zte.com.cn>
catalog/packages/biz/vnf_package.py
catalog/packages/tests/test_vnf_package.py
catalog/packages/views/vnf_package_views.py

index 2c7c595..d3f1f58 100644 (file)
@@ -22,7 +22,7 @@ import urllib2
 import uuid
 
 from rest_framework import status
-from django.http import FileResponse
+from django.http import FileResponse, StreamingHttpResponse
 from catalog.pub.config.config import CATALOG_ROOT_PATH
 from catalog.pub.database.models import VnfPackageModel
 from catalog.pub.exceptions import CatalogException
@@ -170,15 +170,27 @@ def fill_response_data(nf_pkg):
     return pkg_info
 
 
-def fetch_vnf_pkg(vnf_pkg_id):
+def fetch_vnf_pkg(request, vnf_pkg_id):
     nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnf_pkg_id)
     if not nf_pkg.exists():
         raise CatalogException("VNF package (%s) does not exist" % vnf_pkg_id)
-    if nf_pkg[0].localFilePath != "ONBOARDED":
+    if nf_pkg[0].onboardingState != "ONBOARDED":
         raise CatalogException("VNF package (%s) is not on-boarded" % vnf_pkg_id)
     file_path = nf_pkg[0].localFilePath
     file_name = file_path.split('/')[-1]
     file_name = file_name.split('\\')[-1]
-    response = FileResponse(open(file_path, 'rb'), status=status.HTTP_200_OK)
+    file_range = request.META.get('RANGE')
+    if file_range:
+        start_end = file_range.split('-')
+        start = int(start_end[0])
+        end = int(start_end[1])
+        f = open(file_path, "rb")
+        f.seek(start, 0)
+        fs = f.read(end - start + 1)
+        response = StreamingHttpResponse(fs, status=status.HTTP_200_OK)
+        response['Content-Type'] = 'application/octet-stream'
+        response['Content-Range'] = file_range
+    else:
+        response = FileResponse(open(file_path, 'rb'), status=status.HTTP_200_OK)
     response['Content-Disposition'] = 'attachment; filename=%s' % file_name.encode('utf-8')
     return response
index 34a1a12..efde444 100644 (file)
@@ -409,3 +409,22 @@ class TestVnfPackage(TestCase):
         response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222")
         self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
         self.assertEqual(response.data, None)
+
+    def test_fetch_vnf_pkg(self):
+        pass
+
+    def test_fetch_partical_vnf_pkg(self):
+        with open("vnfPackage.csar", "wb") as fp:
+            fp.writelines("AAAABBBBCCCCDDDD")
+        VnfPackageModel.objects.create(
+            vnfPackageId="222",
+            onboardingState="ONBOARDED",
+            localFilePath="vnfPackage.csar"
+        )
+        response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content", RANGE="4-7")
+        partial_file_content = ''
+        for data in response.streaming_content:
+            partial_file_content = partial_file_content + data
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual('BBBB', partial_file_content)
+        os.remove("vnfPackage.csar")
index 43ac26f..2bdd3eb 100644 (file)
@@ -138,7 +138,7 @@ def upload_vnf_pkg_content(request, vnfPkgId):
 
     if request.method == "GET":
         try:
-            response = fetch_vnf_pkg(vnfPkgId)
+            response = fetch_vnf_pkg(request, vnfPkgId)
             return response
         except CatalogException:
             logger.error(traceback.format_exc())