Deal with pnf descriptor 53/63653/1
authorbiancunkang <bian.cunkang@zte.com.cn>
Thu, 30 Aug 2018 01:43:18 +0000 (09:43 +0800)
committerbiancunkang <bian.cunkang@zte.com.cn>
Thu, 30 Aug 2018 01:43:18 +0000 (09:43 +0800)
Add parse_pnf and the assosiated change in test

Change-Id: I0f6fde22866fd226fb95010a6ff6e610f7fc9fd4
Issue-ID: VFC-1038
Signed-off-by: biancunkang <bian.cunkang@zte.com.cn>
catalog/packages/biz/pnf_descriptor.py
catalog/packages/tests/test_pnf_descriptor.py
catalog/packages/views/pnf_descriptor_views.py

index 463efee..0eeb833 100644 (file)
@@ -72,7 +72,7 @@ def upload(remote_file, pnfd_info_id):
         raise CatalogException('PNFD (%s) does not exist.' % pnfd_info_id)
 
     pnf_pkgs.update(onboardingState='UPLOADING')
-    local_file_name = remote_file.name  # TODO: common method
+    local_file_name = remote_file.name
     local_file_dir = os.path.join(CATALOG_ROOT_PATH, pnfd_info_id)
     local_file_name = os.path.join(local_file_dir, local_file_name)
     if not os.path.exists(local_file_dir):
@@ -81,9 +81,10 @@ def upload(remote_file, pnfd_info_id):
         for chunk in remote_file.chunks(chunk_size=1024 * 8):
             local_file.write(chunk)
     logger.info('PNFD(%s) content has been uploaded.' % pnfd_info_id)
+    return local_file_name
 
 
-def process(pnfd_info_id, local_file_name):
+def parse_pnfd_and_save(pnfd_info_id, local_file_name):
     logger.info('Start to process PNFD(%s)...' % pnfd_info_id)
     pnf_pkgs = PnfPackageModel.objects.filter(pnfPackageId=pnfd_info_id)
     pnf_pkgs.update(onboardingState='PROCESSING')
@@ -98,12 +99,10 @@ def process(pnfd_info_id, local_file_name):
 
     pnf_pkgs.update(
         pnfdId=pnfd_id,
-        pnfdName=pnfd["metadata"].get("name", pnfd_id),
-        pnfdDesginer=pnfd["metadata"].get("vendor", "undefined"),
-        pnfdDescription=pnfd["metadata"].get("description", ""),
         pnfdVersion=pnfd["metadata"].get("version", "undefined"),
-        pnfPackageUri=local_file_name,  # TODO
-        sdcCsarId=pnfd_info_id,
+        pnfPackageUri=local_file_name,
+        onboardingState="ONBOARDED",
+        usageState="NOT_IN_USE",
         localFilePath=local_file_name,
         pnfdModel=pnfd_json
     )
@@ -174,3 +173,8 @@ def fill_response_data(pnf_pkg):
         data['userDefinedData'] = user_defined_data
 
     return data
+
+
+def handle_upload_failed(pnf_pkg_id):
+    pnf_pkg = PnfPackageModel.objects.filter(pnfPackageId=pnf_pkg_id)
+    pnf_pkg.update(onboardingState="CREATED")
index 3714718..21953a0 100644 (file)
 import copy
 import json
 import os
+import mock
+
 
 from django.test import TestCase
 from rest_framework import status
 from rest_framework.test import APIClient
 from catalog.pub.database.models import PnfPackageModel
+from catalog.pub.utils import toscaparser
 
 
 class TestPnfDescriptor(TestCase):
@@ -44,6 +47,11 @@ class TestPnfDescriptor(TestCase):
             'userDefinedData': self.user_defined_data,
             '_links': None
         }
+        self.pnfd_data = {
+            "metadata": {
+                "id": "zte-1.0",
+            }
+        }
 
     def tearDown(self):
         pass
@@ -115,14 +123,15 @@ class TestPnfDescriptor(TestCase):
         self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT)
         self.assertEqual(None, resp.data)
 
-    def test_pnfd_content_upload_normal(self):
+    @mock.patch.object(toscaparser, "parse_pnfd")
+    def test_pnfd_content_upload_normal(self, mock_parse_pnfd):
         user_defined_data_json = json.JSONEncoder().encode(self.user_defined_data)
         PnfPackageModel(
             pnfPackageId='22',
             usageState='NOT_IN_USE',
             userDefinedData=user_defined_data_json,
         ).save()
-
+        mock_parse_pnfd.return_value = json.JSONEncoder().encode(self.pnfd_data)
         with open('pnfd_content.txt', 'wb') as fp:
             fp.write('test')
 
@@ -131,6 +140,9 @@ class TestPnfDescriptor(TestCase):
                 "/api/nsd/v1/pnf_descriptors/22/pnfd_content",
                 {'file': fp},
             )
+        pnf_pkg = PnfPackageModel.objects.filter(pnfPackageId="22")
+        self.assertEqual(pnf_pkg[0].pnfdId, "zte-1.0")
+        self.assertEqual(pnf_pkg[0].onboardingState, "ONBOARDED")
         self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT)
         self.assertEqual(None, resp.data)
         os.remove('pnfd_content.txt')
index 35ed83a..b0d02a8 100644 (file)
@@ -17,7 +17,8 @@ import traceback
 
 from django.http import FileResponse
 
-from catalog.packages.biz.pnf_descriptor import create, delete_single, download, query_multiple, query_single, upload
+from catalog.packages.biz.pnf_descriptor import create, delete_single, download, query_multiple, query_single, upload, \
+    parse_pnfd_and_save, handle_upload_failed
 from catalog.packages.serializers.create_pnfd_info_request import CreatePnfdInfoRequestSerializer
 from catalog.packages.serializers.pnfd_info import PnfdInfoSerializer
 from catalog.packages.serializers.pnfd_infos import PnfdInfosSerializer
@@ -159,12 +160,15 @@ def pnfd_content_ru(request, *args, **kwargs):
     if request.method == 'PUT':
         files = request.FILES.getlist('file')
         try:
-            upload(files[0], pnfd_info_id)
+            local_file_name = upload(files[0], pnfd_info_id)
+            parse_pnfd_and_save(pnfd_info_id, local_file_name)
             return Response(data=None, status=status.HTTP_204_NO_CONTENT)
         except CatalogException as e:
+            handle_upload_failed(pnfd_info_id)
             logger.error(e.message)
             error_msg = {'error': 'Uploading PNFD content failed.'}
         except Exception as e:
+            handle_upload_failed(pnfd_info_id)
             logger.error(e.message)
             logger.error(traceback.format_exc())
             error_msg = {'error': 'Uploading PNFD content failed.'}