From: biancunkang Date: Mon, 27 Aug 2018 13:00:38 +0000 (+0800) Subject: Deal with nfPackage X-Git-Tag: 1.2.0~49 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=6d7b122d40e3ee932b3cb699319083b085704b59;p=vfc%2Fnfvo%2Fcatalog.git Deal with nfPackage Deal with fetch_part_vnf_pkg Change-Id: Ie17af57c6a0ed6aa525ce9b32e745e791913b643 Issue-ID: VFC-1038 Signed-off-by: biancunkang --- diff --git a/catalog/packages/biz/vnf_package.py b/catalog/packages/biz/vnf_package.py index 2c7c595a..d3f1f587 100644 --- a/catalog/packages/biz/vnf_package.py +++ b/catalog/packages/biz/vnf_package.py @@ -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 diff --git a/catalog/packages/tests/test_vnf_package.py b/catalog/packages/tests/test_vnf_package.py index 34a1a121..efde444d 100644 --- a/catalog/packages/tests/test_vnf_package.py +++ b/catalog/packages/tests/test_vnf_package.py @@ -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") diff --git a/catalog/packages/views/vnf_package_views.py b/catalog/packages/views/vnf_package_views.py index 43ac26fa..2bdd3eb8 100644 --- a/catalog/packages/views/vnf_package_views.py +++ b/catalog/packages/views/vnf_package_views.py @@ -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())