code refactor for genericparser 99/86599/4 1.0.0
authoryangyan <yangyanyj@chinamobile.com>
Tue, 30 Apr 2019 07:59:45 +0000 (15:59 +0800)
committerYan Yang <yangyanyj@chinamobile.com>
Tue, 30 Apr 2019 08:25:47 +0000 (08:25 +0000)
Change-Id: I68a128944cde015d767576fc4e159d67db2d6b5d
Issue-ID: VFC-1372
Signed-off-by: yangyan <yangyanyj@chinamobile.com>
35 files changed:
docker/docker-env-conf.sh
genericparser/packages/biz/common.py
genericparser/packages/biz/pnf_descriptor.py
genericparser/packages/biz/vnf_pkg_subscription.py
genericparser/packages/const.py
genericparser/packages/tests/const.py
genericparser/packages/tests/test_ns_descriptor.py
genericparser/packages/tests/test_nsdm_subscription.py
genericparser/packages/tests/test_nspackage.py
genericparser/packages/tests/test_pnf_descriptor.py
genericparser/packages/tests/test_service_descriptor.py
genericparser/packages/tests/test_vnf_package.py
genericparser/packages/tests/test_vnf_pkg_subscription.py
genericparser/packages/tests/test_vnfpackage.py
genericparser/packages/views/common.py
genericparser/packages/views/ns_descriptor_views.py
genericparser/packages/views/nsdm_subscription_views.py
genericparser/packages/views/pnf_descriptor_views.py
genericparser/packages/views/vnf_package_artifact_views.py
genericparser/packages/views/vnf_package_subscription_views.py
genericparser/packages/views/vnf_package_views.py
genericparser/pub/config/config.py
genericparser/pub/database/admin.py [new file with mode: 0644]
genericparser/pub/exceptions.py
genericparser/pub/utils/toscaparsers/tests.py
genericparser/pub/utils/toscaparsers/vnfdmodel.py
genericparser/pub/utils/toscaparsers/vnfdparser/__init__.py [new file with mode: 0644]
genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_251.py [new file with mode: 0644]
genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_base.py [new file with mode: 0644]
genericparser/samples/tests.py
genericparser/samples/urls.py
genericparser/samples/views.py
genericparser/settings.py
genericparser/urls.py
run.sh

index c919dda..f62c52a 100755 (executable)
@@ -2,7 +2,6 @@
 
 install_sf(){
 
 
 install_sf(){
 
-    sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
     apk --no-cache update
     apk --no-cache add bash curl gcc wget mysql-client openssl-dev
     apk --no-cache add python-dev libffi-dev musl-dev py2-virtualenv
     apk --no-cache update
     apk --no-cache add bash curl gcc wget mysql-client openssl-dev
     apk --no-cache add python-dev libffi-dev musl-dev py2-virtualenv
@@ -13,7 +12,6 @@ install_sf(){
     unzip modeling-genericparser.zip && \
     rm -rf modeling-genericparser.zip && \
     pip install --upgrade setuptools pip  && \
     unzip modeling-genericparser.zip && \
     rm -rf modeling-genericparser.zip && \
     pip install --upgrade setuptools pip  && \
-
     pip install --no-cache-dir --pre -r  /service/modeling/genericparser/requirements.txt
 }
 
     pip install --no-cache-dir --pre -r  /service/modeling/genericparser/requirements.txt
 }
 
@@ -32,11 +30,11 @@ config_logdir(){
 
     if [ ! -d "/var/log/onap" ]; then
        sudo mkdir /var/log/onap
 
     if [ ! -d "/var/log/onap" ]; then
        sudo mkdir /var/log/onap
-    fi 
-   
+    fi
+
     sudo chown onap:onap -R /var/log/onap
     chmod g+s /var/log/onap
     sudo chown onap:onap -R /var/log/onap
     chmod g+s /var/log/onap
-    
+
 }
 
 clean_sf_cache(){
 }
 
 clean_sf_cache(){
index be5627e..9b72b63 100644 (file)
@@ -45,7 +45,7 @@ def read(file_path, start, end):
 def parse_file_range(file_path, file_range):
     start, end = 0, os.path.getsize(file_path)
     if file_range:
 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)
+        [start, range_end] = file_range.split('-')
+        range_end = range_end.strip() if range_end.strip() else end
+        start, end = int(start.strip()), int(range_end)
     return start, end
     return start, end
index ae635ff..d29a2ad 100644 (file)
@@ -53,7 +53,8 @@ class PnfDescriptor(object):
         logger.info('A PNFD(%s) has been created.' % data['id'])
         return data
 
         logger.info('A PNFD(%s) has been created.' % data['id'])
         return data
 
-    def query_multiple(self, pnfdId=None):
+    def query_multiple(self, request):
+        pnfdId = request.query_params.get('pnfdId')
         if pnfdId:
             pnf_pkgs = PnfPackageModel.objects.filter(pnfdId=pnfdId)
         else:
         if pnfdId:
             pnf_pkgs = PnfPackageModel.objects.filter(pnfdId=pnfdId)
         else:
@@ -140,10 +141,10 @@ class PnfDescriptor(object):
         pnfdName = ""
         if pnfd.get("pnf", "") != "":
             if pnfd["pnf"].get("properties", "") != "":
         pnfdName = ""
         if pnfd.get("pnf", "") != "":
             if pnfd["pnf"].get("properties", "") != "":
-                pnfd_id = pnfd["pnf"].get("properties", "").get("descriptor_id", "")
-                pnfdVersion = pnfd["pnf"].get("properties", "").get("version", "")
-                pnfdProvider = pnfd["pnf"].get("properties", "").get("provider", "")
-                pnfdName = pnfd["pnf"].get("properties", "").get("name", "")
+                pnfd_id = pnfd["pnf"].get("properties", {}).get("descriptor_id", "")
+                pnfdVersion = pnfd["pnf"].get("properties", {}).get("version", "")
+                pnfdProvider = pnfd["pnf"].get("properties", {}).get("provider", "")
+                pnfdName = pnfd["pnf"].get("properties", {}).get("name", "")
         if pnfd_id == "":
             pnfd_id = pnfd["metadata"].get("descriptor_id", "")
             if pnfd_id == "":
         if pnfd_id == "":
             pnfd_id = pnfd["metadata"].get("descriptor_id", "")
             if pnfd_id == "":
@@ -212,7 +213,7 @@ class PnfDescriptor(object):
         pnf_pkg.update(onboardingState=PKG_STATUS.CREATED)
 
     def parse_pnfd(self, csar_id, inputs):
         pnf_pkg.update(onboardingState=PKG_STATUS.CREATED)
 
     def parse_pnfd(self, csar_id, inputs):
-        ret = None
+
         try:
             pnf_pkg = PnfPackageModel.objects.filter(pnfPackageId=csar_id)
             if not pnf_pkg:
         try:
             pnf_pkg = PnfPackageModel.objects.filter(pnfPackageId=csar_id)
             if not pnf_pkg:
index 349db08..29f202f 100644 (file)
@@ -65,11 +65,16 @@ class CreateSubscription(object):
         try:
             response = requests.get(self.callback_uri, timeout=2)
             if response.status_code != status.HTTP_204_NO_CONTENT:
         try:
             response = requests.get(self.callback_uri, timeout=2)
             if response.status_code != status.HTTP_204_NO_CONTENT:
-                raise VnfPkgSubscriptionException("callbackUri %s returns %s status "
-                                                  "code." % (self.callback_uri, response.status_code))
+                raise VnfPkgSubscriptionException(
+                    "callbackUri %s returns %s status code." % (
+                        self.callback_uri,
+                        response.status_code
+                    )
+                )
         except Exception:
         except Exception:
-            raise VnfPkgSubscriptionException("callbackUri %s didn't return 204 status"
-                                              "code." % self.callback_uri)
+            raise VnfPkgSubscriptionException(
+                "callbackUri %s didn't return 204 status code." % self.callback_uri
+            )
 
     def do_biz(self):
         self.subscription_id = str(uuid.uuid4())
 
     def do_biz(self):
         self.subscription_id = str(uuid.uuid4())
@@ -77,7 +82,9 @@ class CreateSubscription(object):
         self.check_valid_auth_info()
         self.check_valid()
         self.save_db()
         self.check_valid_auth_info()
         self.check_valid()
         self.save_db()
-        subscription = VnfPkgSubscriptionModel.objects.get(subscription_id=self.subscription_id)
+        subscription = VnfPkgSubscriptionModel.objects.get(
+            subscription_id=self.subscription_id
+        )
         if subscription:
             return subscription.toDict()
 
         if subscription:
             return subscription.toDict()
 
index 86fbb79..2b8778b 100644 (file)
 
 from genericparser.pub.utils.jobutil import enum
 
 
 from genericparser.pub.utils.jobutil import enum
 
-PKG_STATUS = enum(CREATED="CREATED", UPLOADING="UPLOADING", PROCESSING="PROCESSING", ONBOARDED="ONBOARDED",
-                  IN_USE="IN_USE", NOT_IN_USE="NOT_IN_USE", ENABLED="ENABLED", DISABLED="DISABLED")
+PKG_STATUS = enum(
+    CREATED="CREATED",
+    UPLOADING="UPLOADING",
+    PROCESSING="PROCESSING",
+    ONBOARDED="ONBOARDED",
+    IN_USE="IN_USE",
+    NOT_IN_USE="NOT_IN_USE",
+    ENABLED="ENABLED",
+    DISABLED="DISABLED"
+)
 
 
-AUTH_TYPES = ["BASIC", "OAUTH2_CLIENT_CREDENTIALS", "TLS_CERT"]
+AUTH_TYPES = [
+    "BASIC",
+    "OAUTH2_CLIENT_CREDENTIALS",
+    "TLS_CERT"
+]
 
 BASIC = "BASIC"
 
 OAUTH2_CLIENT_CREDENTIALS = "OAUTH2_CLIENT_CREDENTIALS"
 
 
 BASIC = "BASIC"
 
 OAUTH2_CLIENT_CREDENTIALS = "OAUTH2_CLIENT_CREDENTIALS"
 
-NOTIFICATION_TYPES = ["VnfPackageOnboardingNotification", "VnfPackageChangeNotification"]
+NOTIFICATION_TYPES = [
+    "VnfPackageOnboardingNotification",
+    "VnfPackageChangeNotification"
+]
 
 VNFPKG_SUBSCRIPTION_ROOT_URI = "api/vnfpkgm/v1/subscriptions/"
 
 NSDM_SUBSCRIPTION_ROOT_URI = "api/nsd/v1/subscriptions/"
 
 
 VNFPKG_SUBSCRIPTION_ROOT_URI = "api/vnfpkgm/v1/subscriptions/"
 
 NSDM_SUBSCRIPTION_ROOT_URI = "api/nsd/v1/subscriptions/"
 
-NSDM_NOTIFICATION_FILTERS = ["notificationTypes", "nsdInfoId", "nsdName",
-                             "nsdId", "nsdVersion", "nsdDesigner",
-                             "nsdInvariantId", "vnfPkgIds", "pnfdInfoIds",
-                             "nestedNsdInfoIds", "nsdOnboardingState",
-                             "nsdOperationalState", "nsdUsageState",
-                             "pnfdId", "pnfdName", "pnfdVersion",
-                             "pnfdProvider", "pnfdInvariantId",
-                             "pnfdOnboardingState", "pnfdUsageState"]
-
-NSDM_NOTIFICATION_TYPES = ["NsdOnBoardingNotification",
-                           "NsdOnboardingFailureNotification",
-                           "NsdChangeNotification",
-                           "NsdDeletionNotification",
-                           "PnfdOnBoardingNotification",
-                           "PnfdOnBoardingFailureNotification",
-                           "PnfdDeletionNotification"]
+NSDM_NOTIFICATION_FILTERS = [
+    "notificationTypes",
+    "nsdInfoId",
+    "nsdName",
+    "nsdId",
+    "nsdVersion",
+    "nsdDesigner",
+    "nsdInvariantId",
+    "vnfPkgIds",
+    "pnfdInfoIds",
+    "nestedNsdInfoIds",
+    "nsdOnboardingState",
+    "nsdOperationalState",
+    "nsdUsageState",
+    "pnfdId",
+    "pnfdName",
+    "pnfdVersion",
+    "pnfdProvider",
+    "pnfdInvariantId",
+    "pnfdOnboardingState",
+    "pnfdUsageState"
+]
+
+NSDM_NOTIFICATION_TYPES = [
+    "NsdOnBoardingNotification",
+    "NsdOnboardingFailureNotification",
+    "NsdChangeNotification",
+    "NsdDeletionNotification",
+    "PnfdOnBoardingNotification",
+    "PnfdOnBoardingFailureNotification",
+    "PnfdDeletionNotification"
+]
index caf60e3..a98ccb6 100644 (file)
@@ -455,3 +455,142 @@ pnfd_data = {
         "id": "zte-1.0",
     }
 }
         "id": "zte-1.0",
     }
 }
+
+sd_data = {
+    "inputs": {
+        "sdwanvpnresource_list": [
+            {
+                "sdwanvpn_topology": "",
+                "required": True,
+                "type": "string"
+            }
+        ]
+    },
+    "pnfs": [
+        {
+            "pnf_id": "m6000_s",
+            "cps": [],
+            "description": "",
+            "properties": {
+                "vendor": "zte",
+                "request_reclassification": False,
+                "pnf_type": "m6000s",
+                "version": "1.0",
+                "management_address": "111111",
+                "id": "m6000_s",
+                "nsh_aware": False
+            }
+        }
+    ],
+    "description": "",
+    "vnfs": [
+        {
+            "vnf_id": "sdwansiteresource",
+            "description": "",
+            "properties": {
+                "sdwandevice_type": "",
+                "sdwandevice_class": "PNF",
+                "multi_stage_design": "false",
+                "min_instances": "1",
+                "sdwansite_controlPoint": "",
+                "id": "cd557883-ac4b-462d-aa01-421b5fa606b1",
+                "sdwansite_longitude": "",
+                "sdwansite_latitude": "",
+                "sdwansite_postcode": "",
+                "sdwansite_type": "",
+                "nf_naming": {
+                    "ecomp_generated_naming": True
+                },
+                "sdwansite_emails": "",
+                "sdwansite_role": "",
+                "vnfm_info": "",
+                "sdwansite_address": "",
+                "sdwansite_description": "",
+                "availability_zone_max_count": "1",
+                "sdwansite_name": ""
+            }
+        }
+    ],
+    "service": {
+        "type": "org.openecomp.service.EnhanceService",
+        "properties": {
+            "descriptor_id": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+            "designer": "",
+            "invariant_id": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+            "name": "Enhance_Service",
+            "verison": ""
+        },
+        "metadata": {
+            "category": "E2E Service",
+            "serviceType": "",
+            "description": "Enhance_Service",
+            "instantiationType": "A-la-carte",
+            "type": "Service",
+            "environmentContext": "General_Revenue-Bearing",
+            "serviceEcompNaming": True,
+            "UUID": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+            "ecompGeneratedNaming": True,
+            "serviceRole": "",
+            "invariantUUID": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+            "namingPolicy": "",
+            "name": "Enhance_Service"
+        }
+    },
+    "metadata": {
+        "category": "E2E Service",
+        "serviceType": "",
+        "description": "Enhance_Service",
+        "instantiationType": "A-la-carte",
+        "type": "Service",
+        "environmentContext": "General_Revenue-Bearing",
+        "serviceEcompNaming": True,
+        "UUID": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
+        "ecompGeneratedNaming": True,
+        "serviceRole": "",
+        "invariantUUID": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
+        "namingPolicy": "",
+        "name": "Enhance_Service"
+    }
+}
+
+vnf_subscription_data = {
+    "filters": {
+        "notificationTypes": [
+            "VnfPackageOnboardingNotification"
+        ],
+        "vnfProductsFromProviders": {
+            "vnfProvider": "string",
+            "vnfProducts": {
+                "vnfProductName": "string",
+                "versions": {
+                    "vnfSoftwareVersion": "string",
+                    "vnfdVersions": [
+                        "string"
+                    ]
+                }
+            }
+        },
+        "vnfdId": [
+            "3fa85f64-5717-4562-b3fc-2c963f66afa6"
+        ],
+        "vnfPkgId": [
+            "3fa85f64-5717-4562-b3fc-2c963f66afa6"
+        ],
+        "operationalState": [
+            "ENABLED"
+        ],
+        "usageState": [
+            "IN_USE"
+        ]
+    },
+    "callbackUri": "http://www.vnf1.com/notification",
+    "authentication": {
+        "authType": [
+            "BASIC"
+        ],
+        "paramsBasic": {
+            "userName": "string",
+            "password": "string"
+        }
+    }
+}
index 6c4133c..862030a 100644 (file)
@@ -248,7 +248,7 @@ class TestNsDescriptor(TestCase):
 
         response = self.client.get(
             "/api/nsd/v1/ns_descriptors/23/nsd_content",
 
         response = self.client.get(
             "/api/nsd/v1/ns_descriptors/23/nsd_content",
-            RANGE='5-10',
+            HTTP_RANGE='5-10',
             format='json'
         )
         partial_file_content = ''
             format='json'
         )
         partial_file_content = ''
index 2d98d7a..99ec92f 100644 (file)
@@ -100,8 +100,7 @@ class TestNsdmSubscription(TestCase):
         expected_data = {
             'status': 500,
             'detail': "callbackUri http://callbackuri.com didn't"
         expected_data = {
             'status': 500,
             'detail': "callbackUri http://callbackuri.com didn't"
-                      " return 204 statuscode.",
-            'title': 'Creating Subscription Failed!'
+                      " return 204 statuscode."
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=self.subscription, format='json')
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=self.subscription, format='json')
@@ -149,7 +148,6 @@ class TestNsdmSubscription(TestCase):
             'status': 303,
             'detail': 'Already Subscription exists with'
                       ' the same callbackUri and filter',
             'status': 303,
             'detail': 'Already Subscription exists with'
                       ' the same callbackUri and filter',
-            'title': 'Creating Subscription Failed!'
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=self.subscription, format='json')
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=self.subscription, format='json')
@@ -192,7 +190,6 @@ class TestNsdmSubscription(TestCase):
         expected_data = {
             'status': 400,
             'detail': 'Auth type should be BASIC',
         expected_data = {
             'status': 400,
             'detail': 'Auth type should be BASIC',
-            'title': 'Creating Subscription Failed!'
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
@@ -218,7 +215,6 @@ class TestNsdmSubscription(TestCase):
         expected_data = {
             'status': 400,
             'detail': 'Auth type should be OAUTH2_CLIENT_CREDENTIALS',
         expected_data = {
             'status': 400,
             'detail': 'Auth type should be OAUTH2_CLIENT_CREDENTIALS',
-            'title': 'Creating Subscription Failed!'
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
@@ -241,7 +237,6 @@ class TestNsdmSubscription(TestCase):
         expected_data = {
             'status': 400,
             'detail': 'userName and password needed for BASIC',
         expected_data = {
             'status': 400,
             'detail': 'userName and password needed for BASIC',
-            'title': 'Creating Subscription Failed!'
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
@@ -267,7 +262,6 @@ class TestNsdmSubscription(TestCase):
             'status': 400,
             'detail': 'clientId, clientPassword and tokenEndpoint'
                       ' required for OAUTH2_CLIENT_CREDENTIALS',
             'status': 400,
             'detail': 'clientId, clientPassword and tokenEndpoint'
                       ' required for OAUTH2_CLIENT_CREDENTIALS',
-            'title': 'Creating Subscription Failed!'
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
@@ -296,7 +290,6 @@ class TestNsdmSubscription(TestCase):
             'status': 400,
             'detail': 'Notification Filter should contain'
                       ' either nsdId or nsdInfoId',
             'status': 400,
             'detail': 'Notification Filter should contain'
                       ' either nsdId or nsdInfoId',
-            'title': 'Creating Subscription Failed!'
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
@@ -325,7 +318,6 @@ class TestNsdmSubscription(TestCase):
             'status': 400,
             'detail': 'Notification Filter should contain'
                       ' either pnfdId or pnfdInfoIds',
             'status': 400,
             'detail': 'Notification Filter should contain'
                       ' either pnfdId or pnfdInfoIds',
-            'title': 'Creating Subscription Failed!'
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
         }
         response = self.client.post("/api/nsd/v1/subscriptions",
                                     data=dummy_subscription, format='json')
@@ -459,7 +451,6 @@ class TestNsdmSubscription(TestCase):
 
     def test_nsdm_get_subscription_failure(self):
         expected_data = {
 
     def test_nsdm_get_subscription_failure(self):
         expected_data = {
-            "title": "Query Subscription Failed!",
             "status": 404,
             "detail": "Subscription(" + self.subscription_id + ") "
             "doesn't exists"
             "status": 404,
             "detail": "Subscription(" + self.subscription_id + ") "
             "doesn't exists"
index 100ebd5..393e0f7 100644 (file)
@@ -21,6 +21,7 @@ from django.test import Client
 from genericparser.pub.utils import restcall, toscaparsers
 from genericparser.pub.database.models import NSPackageModel, VnfPackageModel, PnfPackageModel
 from genericparser.pub.msapi import sdc
 from genericparser.pub.utils import restcall, toscaparsers
 from genericparser.pub.database.models import NSPackageModel, VnfPackageModel, PnfPackageModel
 from genericparser.pub.msapi import sdc
+from .const import nsd_data
 
 
 class TestNsPackage(TestCase):
 
 
 class TestNsPackage(TestCase):
@@ -28,226 +29,7 @@ class TestNsPackage(TestCase):
         self.client = Client()
         NSPackageModel.objects.filter().delete()
         VnfPackageModel.objects.filter().delete()
         self.client = Client()
         NSPackageModel.objects.filter().delete()
         VnfPackageModel.objects.filter().delete()
-        self.nsd_data = {"vnffgs": [{"vnffg_id": "vnffg1",
-                                     "description": "",
-                                     "members": ["path1",
-                                                 "path2"],
-                                     "properties": {"vendor": "zte",
-                                                    "connection_point": ["m6000_data_in",
-                                                                         "m600_tunnel_cp",
-                                                                         "m6000_data_out"],
-                                                    "version": "1.0",
-                                                    "constituent_vnfs": ["VFW",
-                                                                         "VNAT"],
-                                                    "number_of_endpoints": 3,
-                                                    "dependent_virtual_link": ["sfc_data_network",
-                                                                               "ext_datanet_net",
-                                                                               "ext_mnet_net"]}}],
-                         "inputs": {"sfc_data_network": {"type": "string",
-                                                         "value": "sfc_data_network"},
-                                    "externalDataNetworkName": {"type": "string",
-                                                                "value": "vlan_4004_tunnel_net"},
-                                    "externalManageNetworkName": {"type": "string",
-                                                                  "value": "vlan_4008_mng_net"},
-                                    "NatIpRange": {"type": "string",
-                                                   "value": "192.167.0.10-192.168.0.20"},
-                                    "externalPluginManageNetworkName": {"type": "string",
-                                                                        "value": "vlan_4007_plugin_net"}},
-                         "pnfs": [{"pnf_id": "m6000_s",
-                                   "cps": [],
-                                   "description": "",
-                                   "properties": {"vendor": "zte",
-                                                  "request_reclassification": False,
-                                                  "pnf_type": "m6000s",
-                                                  "version": "1.0",
-                                                  "management_address": "111111",
-                                                  "id": "m6000_s",
-                                                  "nsh_aware": False}}],
-                         "fps": [{"properties": {"symmetric": False,
-                                                 "policy": {"type": "ACL",
-                                                            "criteria": {"dest_port_range": "1-100",
-                                                                         "ip_protocol": "tcp",
-                                                                         "source_ip_range": ["119.1.1.1-119.1.1.10"],
-                                                                         "dest_ip_range": [{"get_input": "NatIpRange"}],
-                                                                         "dscp": 0,
-                                                                         "source_port_range": "1-100"}}},
-                                  "forwarder_list": [{"capability": "",
-                                                      "type": "cp",
-                                                      "node_name": "m6000_data_out"},
-                                                     {"capability": "",
-                                                      "type": "cp",
-                                                      "node_name": "m600_tunnel_cp"},
-                                                     {"capability": "vnat_fw_inout",
-                                                      "type": "vnf",
-                                                      "node_name": "VNAT"}],
-                                  "description": "",
-                                  "fp_id": "path2"},
-                                 {"properties": {"symmetric": True,
-                                                 "policy": {"type": "ACL",
-                                                            "criteria": {"dest_port_range": "1-100",
-                                                                         "ip_protocol": "tcp",
-                                                                         "source_ip_range": ["1-100"],
-                                                                         "dest_ip_range": ["1-100"],
-                                                                         "dscp": 4,
-                                                                         "source_port_range": "1-100"}}},
-                                  "forwarder_list": [{"capability": "",
-                                                      "type": "cp",
-                                                      "node_name": "m6000_data_in"},
-                                                     {"capability": "",
-                                                      "type": "cp",
-                                                      "node_name": "m600_tunnel_cp"},
-                                                     {"capability": "vfw_fw_inout",
-                                                      "type": "vnf",
-                                                      "node_name": "VFW"},
-                                                     {"capability": "vnat_fw_inout",
-                                                      "type": "vnf",
-                                                      "node_name": "VNAT"},
-                                                     {"capability": "",
-                                                      "type": "cp",
-                                                      "node_name": "m600_tunnel_cp"},
-                                                     {"capability": "",
-                                                      "type": "cp",
-                                                      "node_name": "m6000_data_out"}],
-                                  "description": "",
-                                  "fp_id": "path1"}],
-                         "routers": [],
-                         "vnfs": [{"vnf_id": "VFW",
-                                   "description": "",
-                                   "properties": {"plugin_info": "vbrasplugin_1.0",
-                                                  "vendor": "zte",
-                                                  "is_shared": False,
-                                                  "adjust_vnf_capacity": True,
-                                                  "name": "VFW",
-                                                  "vnf_extend_type": "driver",
-                                                  "csarVersion": "v1.0",
-                                                  "csarType": "NFAR",
-                                                  "csarProvider": "ZTE",
-                                                  "version": "1.0",
-                                                  "nsh_aware": True,
-                                                  "cross_dc": False,
-                                                  "vnf_type": "VFW",
-                                                  "vmnumber_overquota_alarm": True,
-                                                  "vnfd_version": "1.0.0",
-                                                  "externalPluginManageNetworkName": "vlan_4007_plugin_net",
-                                                  "id": "vcpe_vfw_zte_1_0",
-                                                  "request_reclassification": False},
-                                   "dependencies": [{"key_name": "vfw_ctrl_by_manager_cp",
-                                                     "vl_id": "ext_mnet_net"},
-                                                    {"key_name": "vfw_data_cp",
-                                                     "vl_id": "sfc_data_network"}],
-                                   "type": "tosca.nodes.nfv.ext.zte.VNF.VFW",
-                                   "networks": []}],
-                         "ns_exposed": {"external_cps": [],
-                                        "forward_cps": []},
-                         "policies": [{"file_url": "policies/abc.drl",
-                                       "name": "aaa"}],
-                         "vls": [{"route_id": "",
-                                  "vl_id": "ext_mnet_net",
-                                  "route_external": False,
-                                  "description": "",
-                                  "properties": {"name": "vlan_4008_mng_net",
-                                                 "mtu": 1500,
-                                                 "location_info": {"tenant": "admin",
-                                                                   "vimid": 2,
-                                                                   "availability_zone": "nova"},
-                                                 "ip_version": 4,
-                                                 "dhcp_enabled": True,
-                                                 "network_name": "vlan_4008_mng_net",
-                                                 "network_type": "vlan"}},
-                                 {"route_id": "",
-                                  "vl_id": "ext_datanet_net",
-                                  "route_external": False,
-                                  "description": "",
-                                  "properties": {"name": "vlan_4004_tunnel_net",
-                                                 "mtu": 1500,
-                                                 "location_info": {"tenant": "admin",
-                                                                   "vimid": 2,
-                                                                   "availability_zone": "nova"},
-                                                 "ip_version": 4,
-                                                 "dhcp_enabled": True,
-                                                 "network_name": "vlan_4004_tunnel_net",
-                                                 "network_type": "vlan"}},
-                                 {"route_id": "",
-                                  "vl_id": "sfc_data_network",
-                                  "route_external": False,
-                                  "description": "",
-                                  "properties": {"name": "sfc_data_network",
-                                                 "dhcp_enabled": True,
-                                                 "is_predefined": False,
-                                                 "location_info": {"tenant": "admin",
-                                                                   "vimid": 2,
-                                                                   "availability_zone": "nova"},
-                                                 "ip_version": 4,
-                                                 "mtu": 1500,
-                                                 "network_name": "sfc_data_network",
-                                                 "network_type": "vlan"}}],
-                         "cps": [{"pnf_id": "m6000_s",
-                                  "vl_id": "path2",
-                                  "description": "",
-                                  "cp_id": "m6000_data_out",
-                                  "properties": {"direction": "bidirectional",
-                                                 "vnic_type": "normal",
-                                                 "bandwidth": 0,
-                                                 "mac_address": "11-22-33-22-11-44",
-                                                 "interface_name": "xgei-0/4/1/5",
-                                                 "ip_address": "176.1.1.2",
-                                                 "order": 0,
-                                                 "sfc_encapsulation": "mac"}},
-                                 {"pnf_id": "m6000_s",
-                                  "vl_id": "ext_datanet_net",
-                                  "description": "",
-                                  "cp_id": "m600_tunnel_cp",
-                                  "properties": {"direction": "bidirectional",
-                                                 "vnic_type": "normal",
-                                                 "bandwidth": 0,
-                                                 "mac_address": "00-11-00-22-33-00",
-                                                 "interface_name": "gei-0/4/0/13",
-                                                 "ip_address": "191.167.100.5",
-                                                 "order": 0,
-                                                 "sfc_encapsulation": "mac"}},
-                                 {"pnf_id": "m6000_s",
-                                  "vl_id": "path2",
-                                  "description": "",
-                                  "cp_id": "m6000_data_in",
-                                  "properties": {"direction": "bidirectional",
-                                                 "vnic_type": "normal",
-                                                 "bandwidth": 0,
-                                                 "mac_address": "11-22-33-22-11-41",
-                                                 "interface_name": "gei-0/4/0/7",
-                                                 "ip_address": "1.1.1.1",
-                                                 "order": 0,
-                                                 "sfc_encapsulation": "mac",
-                                                 "bond": "none"}},
-                                 {"pnf_id": "m6000_s",
-                                  "vl_id": "ext_mnet_net",
-                                  "description": "",
-                                  "cp_id": "m600_mnt_cp",
-                                  "properties": {"direction": "bidirectional",
-                                                 "vnic_type": "normal",
-                                                 "bandwidth": 0,
-                                                 "mac_address": "00-11-00-22-33-11",
-                                                 "interface_name": "gei-0/4/0/1",
-                                                 "ip_address": "10.46.244.51",
-                                                 "order": 0,
-                                                 "sfc_encapsulation": "mac",
-                                                 "bond": "none"}}],
-                         "metadata": {"invariant_id": "vcpe_ns_sff_1",
-                                      "name": "VCPE_NS",
-                                      "csarVersion": "v1.0",
-                                      "csarType": "NSAR",
-                                      "csarProvider": "ZTE",
-                                      "version": 1,
-                                      "vendor": "ZTE",
-                                      "id": "VCPE_NS",
-                                      "description": "vcpe_ns"},
-                         "ns": {
-                             "properties": {
-                                 "descriptor_id": "VCPE_NS",
-                                 "version": 1,
-                                 "name": "VCPE_NS",
-                                 "desginer": "ZTE",
-                                 "invariant_id": "vcpe_ns_sff_1"}}
-                         }
+        self.nsd_data = nsd_data
 
     def tearDown(self):
         pass
 
     def tearDown(self):
         pass
index 22615f5..fc32bbe 100644 (file)
@@ -17,6 +17,7 @@ import copy
 import json
 import mock
 import os
 import json
 import mock
 import os
+import shutil
 
 from django.test import TestCase
 from rest_framework import status
 
 from django.test import TestCase
 from rest_framework import status
@@ -24,6 +25,7 @@ from rest_framework.test import APIClient
 from genericparser.packages.biz.pnf_descriptor import PnfDescriptor
 from genericparser.packages.const import PKG_STATUS
 from genericparser.packages.tests.const import pnfd_data
 from genericparser.packages.biz.pnf_descriptor import PnfDescriptor
 from genericparser.packages.const import PKG_STATUS
 from genericparser.packages.tests.const import pnfd_data
+from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH
 from genericparser.pub.database.models import PnfPackageModel, NSPackageModel
 from genericparser.pub.utils import toscaparsers
 
 from genericparser.pub.database.models import PnfPackageModel, NSPackageModel
 from genericparser.pub.utils import toscaparsers
 
@@ -54,7 +56,9 @@ class TestPnfDescriptor(TestCase):
         }
 
     def tearDown(self):
         }
 
     def tearDown(self):
-        pass
+        file_path = os.path.join(GENERICPARSER_ROOT_PATH, "22")
+        if os.path.exists(file_path):
+            shutil.rmtree(file_path)
 
     def test_pnfd_create_normal(self):
         request_data = {'userDefinedData': self.user_defined_data}
 
     def test_pnfd_create_normal(self):
         request_data = {'userDefinedData': self.user_defined_data}
index 30eafe0..0734577 100644 (file)
@@ -22,6 +22,7 @@ from genericparser.packages.const import PKG_STATUS
 from genericparser.pub.database.models import ServicePackageModel, VnfPackageModel, PnfPackageModel
 from genericparser.pub.exceptions import PackageNotFoundException
 from genericparser.pub.utils import toscaparsers
 from genericparser.pub.database.models import ServicePackageModel, VnfPackageModel, PnfPackageModel
 from genericparser.pub.exceptions import PackageNotFoundException
 from genericparser.pub.utils import toscaparsers
+from .const import sd_data
 
 logger = logging.getLogger(__name__)
 
 
 logger = logging.getLogger(__name__)
 
@@ -37,102 +38,7 @@ class TestServiceDescription(TestCase):
         self.data = {
             'userDefinedData': self.user_defined_data,
         }
         self.data = {
             'userDefinedData': self.user_defined_data,
         }
-        self.sd_data = {
-            "inputs": {
-                "sdwanvpnresource_list": [
-                    {
-                        "sdwanvpn_topology": "",
-                        "required": True,
-                        "type": "string"
-                    }
-                ]
-            },
-            "pnfs": [
-                {
-                    "pnf_id": "m6000_s",
-                    "cps": [],
-                    "description": "",
-                    "properties": {
-                        "vendor": "zte",
-                        "request_reclassification": False,
-                        "pnf_type": "m6000s",
-                        "version": "1.0",
-                        "management_address": "111111",
-                        "id": "m6000_s",
-                        "nsh_aware": False
-                    }
-                }
-            ],
-            "description": "",
-            "vnfs": [
-                {
-                    "vnf_id": "sdwansiteresource",
-                    "description": "",
-                    "properties": {
-                        "sdwandevice_type": "",
-                        "sdwandevice_class": "PNF",
-                        "multi_stage_design": "false",
-                        "min_instances": "1",
-                        "sdwansite_controlPoint": "",
-                        "id": "cd557883-ac4b-462d-aa01-421b5fa606b1",
-                        "sdwansite_longitude": "",
-                        "sdwansite_latitude": "",
-                        "sdwansite_postcode": "",
-                        "sdwansite_type": "",
-                        "nf_naming": {
-                            "ecomp_generated_naming": True
-                        },
-                        "sdwansite_emails": "",
-                        "sdwansite_role": "",
-                        "vnfm_info": "",
-                        "sdwansite_address": "",
-                        "sdwansite_description": "",
-                        "availability_zone_max_count": "1",
-                        "sdwansite_name": ""
-                    }
-                }
-            ],
-            "service": {
-                "type": "org.openecomp.service.EnhanceService",
-                "properties": {
-                    "descriptor_id": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
-                    "designer": "",
-                    "invariant_id": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
-                    "name": "Enhance_Service",
-                    "verison": ""
-                },
-                "metadata": {
-                    "category": "E2E Service",
-                    "serviceType": "",
-                    "description": "Enhance_Service",
-                    "instantiationType": "A-la-carte",
-                    "type": "Service",
-                    "environmentContext": "General_Revenue-Bearing",
-                    "serviceEcompNaming": True,
-                    "UUID": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
-                    "ecompGeneratedNaming": True,
-                    "serviceRole": "",
-                    "invariantUUID": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
-                    "namingPolicy": "",
-                    "name": "Enhance_Service"
-                }
-            },
-            "metadata": {
-                "category": "E2E Service",
-                "serviceType": "",
-                "description": "Enhance_Service",
-                "instantiationType": "A-la-carte",
-                "type": "Service",
-                "environmentContext": "General_Revenue-Bearing",
-                "serviceEcompNaming": True,
-                "UUID": "49ee73f4-1e31-4054-b871-eb9b1c29999b",
-                "ecompGeneratedNaming": True,
-                "serviceRole": "",
-                "invariantUUID": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207",
-                "namingPolicy": "",
-                "name": "Enhance_Service"
-            }
-        }
+        self.sd_data = sd_data
         ServicePackageModel.objects.filter().delete()
 
     def tearDown(self):
         ServicePackageModel.objects.filter().delete()
 
     def tearDown(self):
index 22488ba..31c7223 100644 (file)
@@ -16,6 +16,7 @@ import json
 import os
 import urllib2
 import mock
 import os
 import urllib2
 import mock
+import shutil
 
 from django.test import TestCase
 from rest_framework import status
 
 from django.test import TestCase
 from rest_framework import status
@@ -42,7 +43,9 @@ class TestVnfPackage(TestCase):
         self.client = APIClient()
 
     def tearDown(self):
         self.client = APIClient()
 
     def tearDown(self):
-        pass
+        file_path = os.path.join(GENERICPARSER_ROOT_PATH, "222")
+        if os.path.exists(file_path):
+            shutil.rmtree(file_path)
 
     @mock.patch.object(toscaparsers, 'parse_vnfd')
     def test_upload_vnf_pkg(self, mock_parse_vnfd):
 
     @mock.patch.object(toscaparsers, 'parse_vnfd')
     def test_upload_vnf_pkg(self, mock_parse_vnfd):
@@ -250,7 +253,7 @@ class TestVnfPackage(TestCase):
             onboardingState="ONBOARDED",
             localFilePath="vnfPackage.csar"
         )
             onboardingState="ONBOARDED",
             localFilePath="vnfPackage.csar"
         )
-        response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content", RANGE="4-7")
+        response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content", HTTP_RANGE="4-7")
         partial_file_content = ''
         for data in response.streaming_content:
             partial_file_content = partial_file_content + data
         partial_file_content = ''
         for data in response.streaming_content:
             partial_file_content = partial_file_content + data
@@ -258,6 +261,22 @@ class TestVnfPackage(TestCase):
         self.assertEqual('BBB', partial_file_content)
         os.remove("vnfPackage.csar")
 
         self.assertEqual('BBB', partial_file_content)
         os.remove("vnfPackage.csar")
 
+    def test_fetch_last_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", HTTP_RANGE=" 4-")
+        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('BBBBCCCCDDDD', partial_file_content)
+        os.remove("vnfPackage.csar")
+
     def test_fetch_vnf_pkg_when_pkg_not_exist(self):
         response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content")
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
     def test_fetch_vnf_pkg_when_pkg_not_exist(self):
         response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content")
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
index 25e8c5d..e35f195 100644 (file)
 
 import uuid
 import mock
 
 import uuid
 import mock
+
 from rest_framework.test import APIClient
 from django.test import TestCase
 from rest_framework.test import APIClient
 from django.test import TestCase
+
 from genericparser.pub.database.models import VnfPkgSubscriptionModel
 from genericparser.pub.database.models import VnfPkgSubscriptionModel
+from .const import vnf_subscription_data
 
 
 class TestNfPackageSubscription(TestCase):
     def setUp(self):
         self.client = APIClient()
         VnfPkgSubscriptionModel.objects.filter().delete()
 
 
 class TestNfPackageSubscription(TestCase):
     def setUp(self):
         self.client = APIClient()
         VnfPkgSubscriptionModel.objects.filter().delete()
-        self.vnf_subscription_data = {
-            "filters": {
-                "notificationTypes": [
-                    "VnfPackageOnboardingNotification"
-                ],
-                "vnfProductsFromProviders": {
-                    "vnfProvider": "string",
-                    "vnfProducts": {
-                        "vnfProductName": "string",
-                        "versions": {
-                            "vnfSoftwareVersion": "string",
-                            "vnfdVersions": [
-                                "string"
-                            ]
-                        }
-                    }
-                },
-                "vnfdId": [
-                    "3fa85f64-5717-4562-b3fc-2c963f66afa6"
-                ],
-                "vnfPkgId": [
-                    "3fa85f64-5717-4562-b3fc-2c963f66afa6"
-                ],
-                "operationalState": [
-                    "ENABLED"
-                ],
-                "usageState": [
-                    "IN_USE"
-                ]
-            },
-            "callbackUri": "http://www.vnf1.com/notification",
-            "authentication": {
-                "authType": [
-                    "BASIC"
-                ],
-                "paramsBasic": {
-                    "userName": "string",
-                    "password": "string"
-                }
-            }
-        }
+        self.vnf_subscription_data = vnf_subscription_data
 
     def tearDown(self):
         pass
 
     def tearDown(self):
         pass
@@ -75,9 +38,16 @@ class TestNfPackageSubscription(TestCase):
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
-        response = self.client.post("/api/vnfpkgm/v1/subscriptions", data=self.vnf_subscription_data, format='json')
+        response = self.client.post(
+            "/api/vnfpkgm/v1/subscriptions",
+            data=self.vnf_subscription_data,
+            format='json'
+        )
         self.assertEqual(201, response.status_code)
         self.assertEqual(201, response.status_code)
-        self.assertEqual(self.vnf_subscription_data["callbackUri"], response.data["callbackUri"])
+        self.assertEqual(
+            self.vnf_subscription_data["callbackUri"],
+            response.data["callbackUri"]
+        )
         self.assertEqual(temp_uuid, response.data["id"])
 
     @mock.patch("requests.get")
         self.assertEqual(temp_uuid, response.data["id"])
 
     @mock.patch("requests.get")
@@ -88,15 +58,26 @@ class TestNfPackageSubscription(TestCase):
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.side_effect = [temp_uuid, temp1_uuid]
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.side_effect = [temp_uuid, temp1_uuid]
-        response = self.client.post("/api/vnfpkgm/v1/subscriptions", data=self.vnf_subscription_data, format='json')
+        response = self.client.post(
+            "/api/vnfpkgm/v1/subscriptions",
+            data=self.vnf_subscription_data,
+            format='json'
+        )
         self.assertEqual(201, response.status_code)
         self.assertEqual(201, response.status_code)
-        self.assertEqual(self.vnf_subscription_data["callbackUri"], response.data["callbackUri"])
+        self.assertEqual(
+            self.vnf_subscription_data["callbackUri"],
+            response.data["callbackUri"]
+        )
         self.assertEqual(temp_uuid, response.data["id"])
         temp_uuid = "00442b18-a5c7-11e8-998c-bf1755941f12"
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
         self.assertEqual(temp_uuid, response.data["id"])
         temp_uuid = "00442b18-a5c7-11e8-998c-bf1755941f12"
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
-        response = self.client.post("/api/vnfpkgm/v1/subscriptions", data=self.vnf_subscription_data, format='json')
+        response = self.client.post(
+            "/api/vnfpkgm/v1/subscriptions",
+            data=self.vnf_subscription_data,
+            format='json'
+        )
         self.assertEqual(303, response.status_code)
 
     @mock.patch("requests.get")
         self.assertEqual(303, response.status_code)
 
     @mock.patch("requests.get")
@@ -106,10 +87,15 @@ class TestNfPackageSubscription(TestCase):
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
-        self.client.post("/api/vnfpkgm/v1/subscriptions",
-                         data=self.vnf_subscription_data, format='json')
-        response = self.client.get("/api/vnfpkgm/v1/subscriptions?usageState=IN_USE",
-                                   format='json')
+        self.client.post(
+            "/api/vnfpkgm/v1/subscriptions",
+            data=self.vnf_subscription_data,
+            format='json'
+        )
+        response = self.client.get(
+            "/api/vnfpkgm/v1/subscriptions?usageState=IN_USE",
+            format='json'
+        )
         self.assertEqual(200, response.status_code)
         self.assertEqual(1, len(response.data))
 
         self.assertEqual(200, response.status_code)
         self.assertEqual(1, len(response.data))
 
@@ -120,10 +106,15 @@ class TestNfPackageSubscription(TestCase):
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
-        self.client.post("/api/vnfpkgm/v1/subscriptions",
-                         data=self.vnf_subscription_data, format='json')
-        response = self.client.get("/api/vnfpkgm/v1/subscriptions?dummy=dummy",
-                                   format='json')
+        self.client.post(
+            "/api/vnfpkgm/v1/subscriptions",
+            data=self.vnf_subscription_data,
+            format='json'
+        )
+        response = self.client.get(
+            "/api/vnfpkgm/v1/subscriptions?dummy=dummy",
+            format='json'
+        )
         self.assertEqual(400, response.status_code)
 
     @mock.patch("requests.get")
         self.assertEqual(400, response.status_code)
 
     @mock.patch("requests.get")
@@ -133,10 +124,15 @@ class TestNfPackageSubscription(TestCase):
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
-        self.client.post("/api/vnfpkgm/v1/subscriptions",
-                         data=self.vnf_subscription_data, format='json')
-        response = self.client.get("/api/vnfpkgm/v1/subscriptions/" + temp_uuid,
-                                   format='json')
+        self.client.post(
+            "/api/vnfpkgm/v1/subscriptions",
+            data=self.vnf_subscription_data,
+            format='json'
+        )
+        response = self.client.get(
+            "/api/vnfpkgm/v1/subscriptions/%s" % temp_uuid,
+            format='json'
+        )
         self.assertEqual(200, response.status_code)
         self.assertEqual(temp_uuid, response.data["id"])
 
         self.assertEqual(200, response.status_code)
         self.assertEqual(temp_uuid, response.data["id"])
 
@@ -148,10 +144,15 @@ class TestNfPackageSubscription(TestCase):
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
-        self.client.post("/api/vnfpkgm/v1/subscriptions",
-                         data=self.vnf_subscription_data, format='json')
-        response = self.client.get("/api/vnfpkgm/v1/subscriptions/" + dummy_uuid,
-                                   format='json')
+        self.client.post(
+            "/api/vnfpkgm/v1/subscriptions",
+            data=self.vnf_subscription_data,
+            format='json'
+        )
+        response = self.client.get(
+            "/api/vnfpkgm/v1/subscriptions/%s" % dummy_uuid,
+            format='json'
+        )
         self.assertEqual(404, response.status_code)
 
     @mock.patch("requests.get")
         self.assertEqual(404, response.status_code)
 
     @mock.patch("requests.get")
@@ -162,16 +163,21 @@ class TestNfPackageSubscription(TestCase):
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
         mock_requests.return_value.status_code = 204
         mock_requests.get.status_code = 204
         mock_uuid4.return_value = temp_uuid
-        self.client.post("/api/vnfpkgm/v1/subscriptions",
-                         data=self.vnf_subscription_data, format='json')
-        self.client.get("/api/vnfpkgm/v1/subscriptions/" + dummy_uuid,
-                        format='json')
-        response = self.client.delete("/api/vnfpkgm/v1/subscriptions/" + temp_uuid)
+        self.client.post(
+            "/api/vnfpkgm/v1/subscriptions",
+            data=self.vnf_subscription_data,
+            format='json'
+        )
+        self.client.get(
+            "/api/vnfpkgm/v1/subscriptions/%s" % dummy_uuid,
+            format='json'
+        )
+        response = self.client.delete("/api/vnfpkgm/v1/subscriptions/%s" % temp_uuid)
         self.assertEqual(204, response.status_code)
 
     @mock.patch("requests.get")
     @mock.patch.object(uuid, 'uuid4')
     def test_delete_subscription_with_id_not_exists(self, mock_uuid4, mock_requests):
         dummy_uuid = str(uuid.uuid4())
         self.assertEqual(204, response.status_code)
 
     @mock.patch("requests.get")
     @mock.patch.object(uuid, 'uuid4')
     def test_delete_subscription_with_id_not_exists(self, mock_uuid4, mock_requests):
         dummy_uuid = str(uuid.uuid4())
-        response = self.client.delete("/api/vnfpkgm/v1/subscriptions/" + dummy_uuid)
+        response = self.client.delete("/api/vnfpkgm/v1/subscriptions/%s" % dummy_uuid)
         self.assertEqual(404, response.status_code)
         self.assertEqual(404, response.status_code)
index 34b9134..70f7021 100644 (file)
@@ -22,6 +22,7 @@ from genericparser.pub.database.models import JobStatusModel, JobModel
 from genericparser.pub.database.models import VnfPackageModel
 from genericparser.pub.msapi import sdc
 from genericparser.pub.utils import restcall, toscaparsers
 from genericparser.pub.database.models import VnfPackageModel
 from genericparser.pub.msapi import sdc
 from genericparser.pub.utils import restcall, toscaparsers
+from .const import vnfd_data
 
 
 class TestNfPackage(TestCase):
 
 
 class TestNfPackage(TestCase):
@@ -30,220 +31,7 @@ class TestNfPackage(TestCase):
         VnfPackageModel.objects.filter().delete()
         JobModel.objects.filter().delete()
         JobStatusModel.objects.filter().delete()
         VnfPackageModel.objects.filter().delete()
         JobModel.objects.filter().delete()
         JobStatusModel.objects.filter().delete()
-        self.vnfd_data = {
-            "volume_storages": [
-                {
-                    "properties": {
-                        "size_of_storage": {
-                            "factor": 10,
-                            "value": 10000000000,
-                            "unit": "GB",
-                            "unit_size": 1000000000
-                        },
-                        "type_of_storage": "volume",
-                        "rdma_enabled": False,
-                        "size": "10 GB"
-                    },
-                    "volume_storage_id": "vNAT_Storage_6wdgwzedlb6sq18uzrr41sof7",
-                    "description": ""
-                }
-            ],
-            "inputs": {},
-            "vdus": [
-                {
-                    "volume_storages": [
-                        "vNAT_Storage_6wdgwzedlb6sq18uzrr41sof7"
-                    ],
-                    "description": "",
-                    "dependencies": [],
-                    "vls": [],
-                    "properties": {
-                        "name": "vNat",
-                        "configurable_properties": {
-                            "test": {
-                                "additional_vnfc_configurable_properties": {
-                                    "aaa": "1",
-                                    "bbb": "2",
-                                    "ccc": "3"
-                                }
-                            }
-                        },
-                        "description": "the virtual machine of vNat",
-                        "nfvi_constraints": [
-                            "test"
-                        ],
-                        "boot_order": [
-                            "vNAT_Storage"
-                        ]
-                    },
-                    "vdu_id": "vdu_vNat",
-                    "artifacts": [
-                        {
-                            "artifact_name": "vNatVNFImage",
-                            "type": "tosca.artifacts.nfv.SwImage",
-                            "properties": {
-                                "operating_system": "linux",
-                                "sw_image": "/swimages/vRouterVNF_ControlPlane.qcow2",
-                                "name": "vNatVNFImage",
-                                "container_format": "bare",
-                                "min_ram": "1 GB",
-                                "disk_format": "qcow2",
-                                "supported_virtualisation_environments": [
-                                    "test_0"
-                                ],
-                                "version": "1.0",
-                                "checksum": "5000",
-                                "min_disk": "10 GB",
-                                "size": "10 GB"
-                            },
-                            "file": "/swimages/vRouterVNF_ControlPlane.qcow2"
-                        }
-                    ],
-                    "nfv_compute": {
-                        "flavor_extra_specs": {
-                            "hw:cpu_sockets": "2",
-                            "sw:ovs_dpdk": "true",
-                            "hw:cpu_threads": "2",
-                            "hw:numa_mem.1": "3072",
-                            "hw:numa_mem.0": "1024",
-                            "hw:numa_nodes": "2",
-                            "hw:numa_cpus.0": "0,1",
-                            "hw:numa_cpus.1": "2,3,4,5",
-                            "hw:cpu_cores": "2",
-                            "hw:cpu_threads_policy": "isolate"
-                        },
-                        "cpu_frequency": "2.4 GHz",
-                        "num_cpus": 2,
-                        "mem_size": "10 GB"
-                    },
-                    "local_storages": [],
-                    "image_file": "vNatVNFImage",
-                    "cps": []
-                }
-            ],
-            "image_files": [
-                {
-                    "properties": {
-                        "operating_system": "linux",
-                        "sw_image": "/swimages/vRouterVNF_ControlPlane.qcow2",
-                        "name": "vNatVNFImage",
-                        "container_format": "bare",
-                        "min_ram": "1 GB",
-                        "disk_format": "qcow2",
-                        "supported_virtualisation_environments": [
-                            "test_0"
-                        ],
-                        "version": "1.0",
-                        "checksum": "5000",
-                        "min_disk": "10 GB",
-                        "size": "10 GB"
-                    },
-                    "image_file_id": "vNatVNFImage",
-                    "description": ""
-                }
-            ],
-            "routers": [],
-            "local_storages": [],
-            "vnf_exposed": {
-                "external_cps": [
-                    {
-                        "key_name": "sriov_plane",
-                        "cp_id": "SRIOV_Port"
-                    }
-                ],
-                "forward_cps": []
-            },
-            "vls": [
-                {
-                    "route_id": "",
-                    "vl_id": "sriov_link",
-                    "route_external": False,
-                    "description": "",
-                    "properties": {
-                        "vl_flavours": {
-                            "vl_id": "aaaa"
-                        },
-                        "connectivity_type": {
-                            "layer_protocol": "ipv4",
-                            "flow_pattern": "flat"
-                        },
-                        "description": "sriov_link",
-                        "test_access": [
-                            "test"
-                        ]
-                    }
-                }
-            ],
-            "cps": [
-                {
-                    "vl_id": "sriov_link",
-                    "vdu_id": "vdu_vNat",
-                    "description": "",
-                    "cp_id": "SRIOV_Port",
-                    "properties": {
-                        "address_data": [
-                            {
-                                "address_type": "ip_address",
-                                "l3_address_data": {
-                                    "ip_address_type": "ipv4",
-                                    "floating_ip_activated": False,
-                                    "number_of_ip_address": 1,
-                                    "ip_address_assignment": True
-                                }
-                            }
-                        ],
-                        "description": "sriov port",
-                        "layer_protocol": "ipv4",
-                        "virtual_network_interface_requirements": [
-                            {
-                                "requirement": {
-                                    "SRIOV": "true"
-                                },
-                                "support_mandatory": False,
-                                "name": "sriov",
-                                "description": "sriov"
-                            },
-                            {
-                                "requirement": {
-                                    "SRIOV": "False"
-                                },
-                                "support_mandatory": False,
-                                "name": "normal",
-                                "description": "normal"
-                            }
-                        ],
-                        "role": "root",
-                        "bitrate_requirement": 10
-                    }
-                }
-            ],
-            "metadata": {
-                "vnfSoftwareVersion": "1.0.0",
-                "vnfProductName": "zte",
-                "localizationLanguage": [
-                    "english",
-                    "chinese"
-                ],
-                "vnfProvider": "zte",
-                "vnfmInfo": "zte",
-                "defaultLocalizationLanguage": "english",
-                "vnfdId": "zte-hss-1.0",
-                "id": "zte-hss-1.0",
-                "vnfProductInfoDescription": "hss",
-                "vnfdVersion": "1.0.0",
-                "vnfProductInfoName": "hss"
-            },
-            "vnf": {
-                "properties": {
-                    "descriptor_id": "zte-hss-1.0",
-                    "descriptor_verison": "1.0.0",
-                    "software_version": "1.0.0",
-                    "provider": "zte"
-                },
-                "metadata": {
-                }
-            }
-        }
+        self.vnfd_data = vnfd_data
 
     def tearDown(self):
         pass
 
     def tearDown(self):
         pass
@@ -257,32 +45,44 @@ class TestNfPackage(TestCase):
 
     @mock.patch.object(NfDistributeThread, 'run')
     def test_nf_pkg_distribute_normal(self, mock_run):
 
     @mock.patch.object(NfDistributeThread, 'run')
     def test_nf_pkg_distribute_normal(self, mock_run):
-        resp = self.client.post("/api/parser/v1/vnfpackages", {
-            "csarId": "1",
-            "vimIds": ["1"]
-        }, format='json')
+        resp = self.client.post(
+            "/api/parser/v1/vnfpackages",
+            {
+                "csarId": "1",
+                "vimIds": ["1"]
+            },
+            format='json'
+        )
         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
 
     def test_nf_pkg_distribute_when_csar_already_exist(self):
         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
 
     def test_nf_pkg_distribute_when_csar_already_exist(self):
-        VnfPackageModel(vnfPackageId="1", vnfdId="vcpe_vfw_zte_1_0").save()
-        NfDistributeThread(csar_id="1",
-                           vim_ids=["1"],
-                           lab_vim_id="",
-                           job_id="2").run()
+        VnfPackageModel(
+            vnfPackageId="1",
+            vnfdId="vcpe_vfw_zte_1_0"
+        ).save()
+        NfDistributeThread(
+            csar_id="1",
+            vim_ids=["1"],
+            lab_vim_id="",
+            job_id="2"
+        ).run()
         self.assert_job_result("2", 255, "NF CSAR(1) already exists.")
 
     @mock.patch.object(restcall, 'call_req')
     @mock.patch.object(sdc, 'download_artifacts')
     @mock.patch.object(toscaparsers, 'parse_vnfd')
     def test_nf_pkg_distribute_when_vnfd_already_exist(self,
         self.assert_job_result("2", 255, "NF CSAR(1) already exists.")
 
     @mock.patch.object(restcall, 'call_req')
     @mock.patch.object(sdc, 'download_artifacts')
     @mock.patch.object(toscaparsers, 'parse_vnfd')
     def test_nf_pkg_distribute_when_vnfd_already_exist(self,
-                                                       mock_parse_vnfd, mock_download_artifacts, mock_call_req):
+                                                       mock_parse_vnfd,
+                                                       mock_download_artifacts,
+                                                       mock_call_req):
         mock_parse_vnfd.return_value = json.JSONEncoder().encode(self.vnfd_data)
         mock_download_artifacts.return_value = "/home/hss.csar"
         mock_call_req.return_value = [0, json.JSONEncoder().encode([{
             "uuid": "1",
             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/hss.csar"
         }]), '200']
         mock_parse_vnfd.return_value = json.JSONEncoder().encode(self.vnfd_data)
         mock_download_artifacts.return_value = "/home/hss.csar"
         mock_call_req.return_value = [0, json.JSONEncoder().encode([{
             "uuid": "1",
             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/hss.csar"
         }]), '200']
-        VnfPackageModel(vnfPackageId="2", vnfdId="zte-hss-1.0").save()
+        VnfPackageModel(vnfPackageId="2",
+                        vnfdId="zte-hss-1.0").save()
         NfDistributeThread(csar_id="1",
                            vim_ids=["1"],
                            lab_vim_id="",
         NfDistributeThread(csar_id="1",
                            vim_ids=["1"],
                            lab_vim_id="",
@@ -319,10 +119,24 @@ class TestNfPackage(TestCase):
         self.assert_job_result("2", 100, "Delete CSAR(2) successfully.")
 
     def test_nf_pkg_get_all(self):
         self.assert_job_result("2", 100, "Delete CSAR(2) successfully.")
 
     def test_nf_pkg_get_all(self):
-        VnfPackageModel(vnfPackageId="3", vnfdId="3", vnfVendor='3', vnfdVersion='3',
-                        vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
-        VnfPackageModel(vnfPackageId="4", vnfdId="4", vnfVendor='4', vnfdVersion='4',
-                        vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
+        VnfPackageModel(
+            vnfPackageId="3",
+            vnfdId="3",
+            vnfVendor='3',
+            vnfdVersion='3',
+            vnfSoftwareVersion='',
+            vnfPackageUri='',
+            vnfdModel=''
+        ).save()
+        VnfPackageModel(
+            vnfPackageId="4",
+            vnfdId="4",
+            vnfVendor='4',
+            vnfdVersion='4',
+            vnfSoftwareVersion='',
+            vnfPackageUri='',
+            vnfdModel=''
+        ).save()
         resp = self.client.get("/api/parser/v1/vnfpackages")
         self.assertEqual(resp.status_code, status.HTTP_200_OK)
         expect_data = [
         resp = self.client.get("/api/parser/v1/vnfpackages")
         self.assertEqual(resp.status_code, status.HTTP_200_OK)
         expect_data = [
@@ -358,8 +172,15 @@ class TestNfPackage(TestCase):
         self.assertEqual(expect_data, resp.data)
 
     def test_nf_pkg_get_one(self):
         self.assertEqual(expect_data, resp.data)
 
     def test_nf_pkg_get_one(self):
-        VnfPackageModel(vnfPackageId="4", vnfdId="4", vnfVendor='4', vnfdVersion='4',
-                        vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
+        VnfPackageModel(
+            vnfPackageId="4",
+            vnfdId="4",
+            vnfVendor='4',
+            vnfdVersion='4',
+            vnfSoftwareVersion='',
+            vnfPackageUri='',
+            vnfdModel=''
+        ).save()
 
         resp = self.client.get("/api/parser/v1/vnfpackages/4")
         self.assertEqual(resp.status_code, status.HTTP_200_OK)
 
         resp = self.client.get("/api/parser/v1/vnfpackages/4")
         self.assertEqual(resp.status_code, status.HTTP_200_OK)
@@ -380,8 +201,13 @@ class TestNfPackage(TestCase):
         self.assertEqual(expect_data, resp.data)
 
     def test_nf_pkg_get_one_failed(self):
         self.assertEqual(expect_data, resp.data)
 
     def test_nf_pkg_get_one_failed(self):
-        VnfPackageModel(vnfPackageId="4", vnfdId="4", vnfVendor='4', vnfdVersion='4',
-                        vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
+        VnfPackageModel(vnfPackageId="4",
+                        vnfdId="4",
+                        vnfVendor='4',
+                        vnfdVersion='4',
+                        vnfSoftwareVersion='',
+                        vnfPackageUri='',
+                        vnfdModel='').save()
 
         resp = self.client.get("/api/parser/v1/vnfpackages/2")
         self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
 
         resp = self.client.get("/api/parser/v1/vnfpackages/2")
         self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
index 70637a9..41ba17c 100644 (file)
@@ -19,10 +19,14 @@ from rest_framework import status
 from rest_framework.response import Response
 
 from genericparser.pub.exceptions import GenericparserException
 from rest_framework.response import Response
 
 from genericparser.pub.exceptions import GenericparserException
+from genericparser.pub.exceptions import BadRequestException
 from genericparser.pub.exceptions import NsdmBadRequestException
 from genericparser.pub.exceptions import PackageNotFoundException
 from genericparser.pub.exceptions import ResourceNotFoundException
 from genericparser.pub.exceptions import ArtifactNotFoundException
 from genericparser.pub.exceptions import NsdmBadRequestException
 from genericparser.pub.exceptions import PackageNotFoundException
 from genericparser.pub.exceptions import ResourceNotFoundException
 from genericparser.pub.exceptions import ArtifactNotFoundException
+from genericparser.pub.exceptions import NsdmDuplicateSubscriptionException
+from genericparser.pub.exceptions import VnfPkgDuplicateSubscriptionException
+from genericparser.pub.exceptions import VnfPkgSubscriptionException
 
 logger = logging.getLogger(__name__)
 
 
 logger = logging.getLogger(__name__)
 
@@ -54,6 +58,18 @@ def view_safe_call_with_log(logger):
         def wrapper(*args, **kwargs):
             try:
                 return func(*args, **kwargs)
         def wrapper(*args, **kwargs):
             try:
                 return func(*args, **kwargs)
+            except NsdmDuplicateSubscriptionException as e:
+                logger.error(e.message)
+                return make_error_resp(
+                    detail=e.message,
+                    status=status.HTTP_303_SEE_OTHER
+                )
+            except VnfPkgDuplicateSubscriptionException as e:
+                logger.error(e.message)
+                return make_error_resp(
+                    detail=e.message,
+                    status=status.HTTP_303_SEE_OTHER
+                )
             except PackageNotFoundException as e:
                 logger.error(e.message)
                 return make_error_resp(
             except PackageNotFoundException as e:
                 logger.error(e.message)
                 return make_error_resp(
@@ -72,12 +88,24 @@ def view_safe_call_with_log(logger):
                     detail=e.message,
                     status=status.HTTP_404_NOT_FOUND
                 )
                     detail=e.message,
                     status=status.HTTP_404_NOT_FOUND
                 )
+            except BadRequestException as e:
+                logger.error(e.message)
+                return make_error_resp(
+                    detail=e.message,
+                    status=status.HTTP_400_BAD_REQUEST
+                )
             except NsdmBadRequestException as e:
                 logger.error(e.message)
                 return make_error_resp(
                     detail=e.message,
                     status=status.HTTP_400_BAD_REQUEST
                 )
             except NsdmBadRequestException as e:
                 logger.error(e.message)
                 return make_error_resp(
                     detail=e.message,
                     status=status.HTTP_400_BAD_REQUEST
                 )
+            except VnfPkgSubscriptionException as e:
+                logger.error(e.message)
+                return make_error_resp(
+                    detail=e.message,
+                    status=status.HTTP_500_INTERNAL_SERVER_ERROR
+                )
             except GenericparserException as e:
                 logger.error(e.message)
                 return make_error_resp(
             except GenericparserException as e:
                 logger.error(e.message)
                 return make_error_resp(
index 86a3e9e..bbe51ea 100644 (file)
@@ -134,6 +134,6 @@ def nsd_content_ru(request, **kwargs):
             raise e
 
     if request.method == 'GET':
             raise e
 
     if request.method == 'GET':
-        file_range = request.META.get('RANGE')
+        file_range = request.META.get('HTTP_RANGE')
         file_iterator = NsDescriptor().download(nsd_info_id, file_range)
         return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK)
         file_iterator = NsDescriptor().download(nsd_info_id, file_range)
         return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK)
index 865ece4..cd80e6d 100644 (file)
 # limitations under the License.
 
 import logging
 # limitations under the License.
 
 import logging
-import traceback
 
 from drf_yasg.utils import swagger_auto_schema, no_body
 from rest_framework import status
 from rest_framework.decorators import api_view
 from rest_framework.response import Response
 
 
 from drf_yasg.utils import swagger_auto_schema, no_body
 from rest_framework import status
 from rest_framework.decorators import api_view
 from rest_framework.response import Response
 
-from genericparser.packages.serializers.nsdm_filter_data \
-    import NsdmNotificationsFilter
-from genericparser.packages.serializers.nsdm_subscription import \
-    NsdmSubscriptionsSerializer, \
-    NsdmSubscriptionIdSerializer, \
-    NsdmSubscriptionSerializer, \
-    NsdmSubscriptionRequestSerializer
-from genericparser.packages.serializers.response \
-    import ProblemDetailsSerializer
-from genericparser.pub.exceptions import \
-    ResourceNotFoundException, \
-    NsdmBadRequestException, NsdmDuplicateSubscriptionException
-from genericparser.packages.biz.nsdm_subscription import NsdmSubscription
+from genericparser.packages.serializers.nsdm_filter_data import NsdmNotificationsFilter
+from genericparser.packages.serializers.nsdm_subscription import NsdmSubscriptionsSerializer
+from genericparser.packages.serializers.nsdm_subscription import NsdmSubscriptionIdSerializer
+from genericparser.packages.serializers.nsdm_subscription import NsdmSubscriptionSerializer
+from genericparser.packages.serializers.nsdm_subscription import NsdmSubscriptionRequestSerializer
 
 
+from genericparser.packages.serializers.response import ProblemDetailsSerializer
+from genericparser.pub.exceptions import NsdmBadRequestException
+from .common import view_safe_call_with_log
+from genericparser.packages.biz.nsdm_subscription import NsdmSubscription
 
 logger = logging.getLogger(__name__)
 
 
 logger = logging.getLogger(__name__)
 
@@ -46,17 +41,6 @@ def validate_data(data, serializer):
     return serialized_data
 
 
     return serialized_data
 
 
-def get_problem_details_serializer(title, status_code, error_message):
-    problem_details = {
-        "title": title,
-        "status": status_code,
-        "detail": error_message
-    }
-    problem_details_serializer = ProblemDetailsSerializer(data=problem_details)
-    problem_details_serializer.is_valid()
-    return problem_details_serializer
-
-
 @swagger_auto_schema(
     method='POST',
     operation_description="Create Subscription for NSD Management",
 @swagger_auto_schema(
     method='POST',
     operation_description="Create Subscription for NSD Management",
@@ -80,84 +64,33 @@ def get_problem_details_serializer(title, status_code, error_message):
     }
 )
 @api_view(http_method_names=['POST', 'GET'])
     }
 )
 @api_view(http_method_names=['POST', 'GET'])
+@view_safe_call_with_log(logger=logger)
 def nsd_subscription_rc(request):
     if request.method == 'POST':
         logger.debug("SubscribeNotification--post::> %s" % request.data)
 def nsd_subscription_rc(request):
     if request.method == 'POST':
         logger.debug("SubscribeNotification--post::> %s" % request.data)
-        try:
-            title = 'Creating Subscription Failed!'
-            nsdm_subscription_request = \
-                validate_data(request.data,
-                              NsdmSubscriptionRequestSerializer)
-            subscription = NsdmSubscription().create(
-                nsdm_subscription_request.data)
-            subscription_resp = validate_data(subscription,
-                                              NsdmSubscriptionSerializer)
-            return Response(data=subscription_resp.data,
-                            status=status.HTTP_201_CREATED)
-        except NsdmDuplicateSubscriptionException as e:
-            logger.error(e.message)
-            problem_details_serializer = \
-                get_problem_details_serializer(title,
-                                               status.HTTP_303_SEE_OTHER,
-                                               e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_303_SEE_OTHER)
-        except NsdmBadRequestException as e:
-            problem_details_serializer = \
-                get_problem_details_serializer(title,
-                                               status.HTTP_400_BAD_REQUEST,
-                                               e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_400_BAD_REQUEST)
-        except Exception as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = \
-                get_problem_details_serializer(
-                    title,
-                    status.HTTP_500_INTERNAL_SERVER_ERROR,
-                    e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+        nsdm_subscription_request = \
+            validate_data(request.data,
+                          NsdmSubscriptionRequestSerializer)
+        subscription = NsdmSubscription().create(
+            nsdm_subscription_request.data)
+        subscription_resp = validate_data(subscription,
+                                          NsdmSubscriptionSerializer)
+        return Response(data=subscription_resp.data,
+                        status=status.HTTP_201_CREATED)
+
     if request.method == 'GET':
         logger.debug("Subscription Notification GET %s" % request.query_params)
     if request.method == 'GET':
         logger.debug("Subscription Notification GET %s" % request.query_params)
-        try:
-            title = 'Query Subscription Failed!'
-            request_query_params = {}
-            if request.query_params:
-                request_query_params = \
-                    validate_data(request.query_params,
-                                  NsdmNotificationsFilter).data
-            subscription_data = \
-                NsdmSubscription().query_multi_subscriptions(
-                    request_query_params)
-            subscriptions = validate_data(subscription_data,
-                                          NsdmSubscriptionsSerializer)
-            return Response(data=subscriptions.data, status=status.HTTP_200_OK)
-        except NsdmBadRequestException as e:
-            logger.error(e.message)
-            problem_details_serializer = \
-                get_problem_details_serializer(title,
-                                               status.HTTP_400_BAD_REQUEST,
-                                               e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_400_BAD_REQUEST)
-        except ResourceNotFoundException as e:
-            problem_details_serializer = \
-                get_problem_details_serializer(title,
-                                               status.HTTP_404_NOT_FOUND,
-                                               e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_404_NOT_FOUND)
-        except Exception as e:
-            logger.error(e.message)
-            problem_details_serializer = \
-                get_problem_details_serializer(
-                    title,
-                    status.HTTP_500_INTERNAL_SERVER_ERROR,
-                    traceback.format_exc())
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+        request_query_params = {}
+        if request.query_params:
+            request_query_params = \
+                validate_data(request.query_params,
+                              NsdmNotificationsFilter).data
+        subscription_data = \
+            NsdmSubscription().query_multi_subscriptions(
+                request_query_params)
+        subscriptions = validate_data(subscription_data,
+                                      NsdmSubscriptionsSerializer)
+        return Response(data=subscriptions.data, status=status.HTTP_200_OK)
 
 
 @swagger_auto_schema(
 
 
 @swagger_auto_schema(
@@ -183,77 +116,14 @@ def nsd_subscription_rc(request):
     }
 )
 @api_view(http_method_names=['GET', 'DELETE'])
     }
 )
 @api_view(http_method_names=['GET', 'DELETE'])
+@view_safe_call_with_log(logger=logger)
 def nsd_subscription_rd(request, **kwargs):
     subscription_id = kwargs.get("subscriptionId")
 def nsd_subscription_rd(request, **kwargs):
     subscription_id = kwargs.get("subscriptionId")
+    validate_data({'subscription_id': subscription_id}, NsdmSubscriptionIdSerializer)
     if request.method == 'GET':
     if request.method == 'GET':
-        try:
-            title = 'Query Subscription Failed!'
-            validate_data({'subscription_id': subscription_id},
-                          NsdmSubscriptionIdSerializer)
-            subscription_data = \
-                NsdmSubscription().query_single_subscription(subscription_id)
-            subscription = validate_data(subscription_data,
-                                         NsdmSubscriptionSerializer)
-            return Response(data=subscription.data, status=status.HTTP_200_OK)
-        except NsdmBadRequestException as e:
-            logger.error(e.message)
-            problem_details_serializer = \
-                get_problem_details_serializer(title,
-                                               status.HTTP_400_BAD_REQUEST,
-                                               e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_400_BAD_REQUEST)
-        except ResourceNotFoundException as e:
-            logger.error(e.message)
-            problem_details_serializer = \
-                get_problem_details_serializer(title,
-                                               status.HTTP_404_NOT_FOUND,
-                                               e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_404_NOT_FOUND)
-        except Exception as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = \
-                get_problem_details_serializer(
-                    title,
-                    status.HTTP_500_INTERNAL_SERVER_ERROR,
-                    "Query of subscriptioni(%s) Failed"
-                    % subscription_id)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+        subscription_data = NsdmSubscription().query_single_subscription(subscription_id)
+        subscription = validate_data(subscription_data, NsdmSubscriptionSerializer)
+        return Response(data=subscription.data, status=status.HTTP_200_OK)
     elif request.method == 'DELETE':
     elif request.method == 'DELETE':
-        try:
-            title = 'Delete Subscription Failed!'
-            validate_data({'subscription_id': subscription_id},
-                          NsdmSubscriptionIdSerializer)
-            subscription_data = NsdmSubscription().\
-                delete_single_subscription(subscription_id)
-            return Response(status=status.HTTP_204_NO_CONTENT)
-        except NsdmBadRequestException as e:
-            logger.error(e.message)
-            problem_details_serializer = \
-                get_problem_details_serializer(title,
-                                               status.HTTP_400_BAD_REQUEST,
-                                               e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_400_BAD_REQUEST)
-        except ResourceNotFoundException as e:
-            logger.error(e.message)
-            problem_details_serializer = \
-                get_problem_details_serializer(title,
-                                               status.HTTP_404_NOT_FOUND,
-                                               e.message)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_404_NOT_FOUND)
-        except Exception as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = \
-                get_problem_details_serializer(
-                    title,
-                    status.HTTP_500_INTERNAL_SERVER_ERROR,
-                    "Delete of subscription(%s) Failed"
-                    % subscription_id)
-            return Response(data=problem_details_serializer.data,
-                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+        subscription_data = NsdmSubscription().delete_single_subscription(subscription_id)
+        return Response(status=status.HTTP_204_NO_CONTENT)
index e82374f..7abd8ad 100644 (file)
@@ -25,10 +25,10 @@ from genericparser.packages.serializers.create_pnfd_info_request import CreatePn
 from genericparser.packages.serializers.pnfd_info import PnfdInfoSerializer
 from genericparser.packages.serializers.pnfd_infos import PnfdInfosSerializer
 from genericparser.packages.views.common import validate_data
 from genericparser.packages.serializers.pnfd_info import PnfdInfoSerializer
 from genericparser.packages.serializers.pnfd_infos import PnfdInfosSerializer
 from genericparser.packages.views.common import validate_data
-from genericparser.pub.exceptions import GenericparserException
 from genericparser.packages.serializers.genericparser_serializers import ParseModelRequestSerializer
 from genericparser.packages.serializers.genericparser_serializers import ParseModelResponseSerializer
 from genericparser.packages.serializers.genericparser_serializers import InternalErrorRequestSerializer
 from genericparser.packages.serializers.genericparser_serializers import ParseModelRequestSerializer
 from genericparser.packages.serializers.genericparser_serializers import ParseModelResponseSerializer
 from genericparser.packages.serializers.genericparser_serializers import InternalErrorRequestSerializer
+from genericparser.packages.serializers.response import ProblemDetailsSerializer
 from genericparser.pub.utils.syscomm import fun_name
 from genericparser.pub.utils.values import ignore_case_get
 from .common import view_safe_call_with_log
 from genericparser.pub.utils.syscomm import fun_name
 from genericparser.pub.utils.values import ignore_case_get
 from .common import view_safe_call_with_log
@@ -42,8 +42,8 @@ logger = logging.getLogger(__name__)
     request_body=no_body,
     responses={
         status.HTTP_200_OK: PnfdInfoSerializer(),
     request_body=no_body,
     responses={
         status.HTTP_200_OK: PnfdInfoSerializer(),
-        status.HTTP_404_NOT_FOUND: "PNFD does not exist",
-        status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
+        status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
+        status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
     }
 )
 @swagger_auto_schema(
     }
 )
 @swagger_auto_schema(
@@ -52,7 +52,7 @@ logger = logging.getLogger(__name__)
     request_body=no_body,
     responses={
         status.HTTP_204_NO_CONTENT: "No content",
     request_body=no_body,
     responses={
         status.HTTP_204_NO_CONTENT: "No content",
-        status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
+        status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
     }
 )
 @api_view(http_method_names=['GET', 'DELETE'])
     }
 )
 @api_view(http_method_names=['GET', 'DELETE'])
@@ -77,7 +77,7 @@ def pnfd_info_rd(request, **kwargs):  # TODO
     request_body=CreatePnfdInfoRequestSerializer(),
     responses={
         status.HTTP_201_CREATED: PnfdInfoSerializer(),
     request_body=CreatePnfdInfoRequestSerializer(),
     responses={
         status.HTTP_201_CREATED: PnfdInfoSerializer(),
-        status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
+        status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
     }
 )
 @swagger_auto_schema(
     }
 )
 @swagger_auto_schema(
@@ -86,7 +86,7 @@ def pnfd_info_rd(request, **kwargs):  # TODO
     request_body=no_body,
     responses={
         status.HTTP_200_OK: PnfdInfosSerializer(),
     request_body=no_body,
     responses={
         status.HTTP_200_OK: PnfdInfosSerializer(),
-        status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
+        status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
     }
 )
 @api_view(http_method_names=['POST', 'GET'])
     }
 )
 @api_view(http_method_names=['POST', 'GET'])
@@ -99,11 +99,7 @@ def pnf_descriptors_rc(request):
         return Response(data=pnfd_info.data, status=status.HTTP_201_CREATED)
 
     if request.method == 'GET':
         return Response(data=pnfd_info.data, status=status.HTTP_201_CREATED)
 
     if request.method == 'GET':
-        pnfdId = request.query_params.get('pnfdId', None)
-        if pnfdId:
-            data = PnfDescriptor().query_multiple(pnfdId)
-        else:
-            data = PnfDescriptor().query_multiple()
+        data = PnfDescriptor().query_multiple(request)
         pnfd_infos = validate_data(data, PnfdInfosSerializer)
         return Response(data=pnfd_infos.data, status=status.HTTP_200_OK)
 
         pnfd_infos = validate_data(data, PnfdInfosSerializer)
         return Response(data=pnfd_infos.data, status=status.HTTP_200_OK)
 
@@ -114,7 +110,7 @@ def pnf_descriptors_rc(request):
     request_body=no_body,
     responses={
         status.HTTP_204_NO_CONTENT: "No content",
     request_body=no_body,
     responses={
         status.HTTP_204_NO_CONTENT: "No content",
-        status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
+        status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
     }
 )
 @swagger_auto_schema(
     }
 )
 @swagger_auto_schema(
@@ -123,8 +119,8 @@ def pnf_descriptors_rc(request):
     request_body=no_body,
     responses={
         status.HTTP_204_NO_CONTENT: 'PNFD file',
     request_body=no_body,
     responses={
         status.HTTP_204_NO_CONTENT: 'PNFD file',
-        status.HTTP_404_NOT_FOUND: "PNFD does not exist",
-        status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
+        status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
+        status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
     }
 )
 @api_view(http_method_names=['PUT', 'GET'])
     }
 )
 @api_view(http_method_names=['PUT', 'GET'])
@@ -137,9 +133,6 @@ def pnfd_content_ru(request, **kwargs):
             local_file_name = PnfDescriptor().upload(files[0], pnfd_info_id)
             PnfDescriptor().parse_pnfd_and_save(pnfd_info_id, local_file_name)
             return Response(data=None, status=status.HTTP_204_NO_CONTENT)
             local_file_name = PnfDescriptor().upload(files[0], pnfd_info_id)
             PnfDescriptor().parse_pnfd_and_save(pnfd_info_id, local_file_name)
             return Response(data=None, status=status.HTTP_204_NO_CONTENT)
-        except GenericparserException as e:
-            PnfDescriptor().handle_upload_failed(pnfd_info_id)
-            raise e
         except Exception as e:
             PnfDescriptor().handle_upload_failed(pnfd_info_id)
             raise e
         except Exception as e:
             PnfDescriptor().handle_upload_failed(pnfd_info_id)
             raise e
index a6d57f8..164db6c 100644 (file)
@@ -39,7 +39,7 @@ class FetchVnfPkgmArtifactsView(APIView):
 
     @swagger_auto_schema(
         responses={
 
     @swagger_auto_schema(
         responses={
-            status.HTTP_200_OK: None,
+            status.HTTP_200_OK: "HTTP_200_OK",
             status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
             status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
         }
             status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
             status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
         }
index 897b43c..135b625 100644 (file)
@@ -12,8 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
-import traceback
 import logging
 
 from drf_yasg.utils import swagger_auto_schema
 import logging
 
 from drf_yasg.utils import swagger_auto_schema
@@ -21,26 +19,29 @@ from rest_framework import status
 from rest_framework.views import APIView
 from rest_framework.response import Response
 
 from rest_framework.views import APIView
 from rest_framework.response import Response
 
-from genericparser.packages.serializers.vnf_pkg_subscription import PkgmSubscriptionRequestSerializer, \
-    PkgmSubscriptionSerializer, PkgmSubscriptionsSerializer
+from genericparser.packages.serializers.vnf_pkg_subscription import PkgmSubscriptionRequestSerializer
+from genericparser.packages.serializers.vnf_pkg_subscription import PkgmSubscriptionSerializer
+from genericparser.packages.serializers.vnf_pkg_subscription import PkgmSubscriptionsSerializer
 from genericparser.packages.serializers.response import ProblemDetailsSerializer
 from genericparser.packages.serializers.response import ProblemDetailsSerializer
-from genericparser.packages.biz.vnf_pkg_subscription import CreateSubscription, QuerySubscription, TerminateSubscription
+from genericparser.packages.biz.vnf_pkg_subscription import CreateSubscription
+from genericparser.packages.biz.vnf_pkg_subscription import QuerySubscription
+from genericparser.packages.biz.vnf_pkg_subscription import TerminateSubscription
 from genericparser.packages.views.common import validate_data
 from genericparser.packages.views.common import validate_data
-from genericparser.pub.exceptions import VnfPkgDuplicateSubscriptionException, VnfPkgSubscriptionException, \
-    SubscriptionDoesNotExistsException
+from genericparser.pub.exceptions import VnfPkgSubscriptionException
+from genericparser.pub.exceptions import BadRequestException
 
 
-logger = logging.getLogger(__name__)
-VALID_FILTERS = ["callbackUri", "notificationTypes", "vnfdId", "vnfPkgId", "operationalState", "usageState"]
+from .common import view_safe_call_with_log
 
 
+logger = logging.getLogger(__name__)
 
 
-def get_problem_details_serializer(status_code, error_message):
-    problem_details = {
-        "status": status_code,
-        "detail": error_message
-    }
-    problem_details_serializer = ProblemDetailsSerializer(data=problem_details)
-    problem_details_serializer.is_valid()
-    return problem_details_serializer
+VALID_FILTERS = [
+    "callbackUri",
+    "notificationTypes",
+    "vnfdId",
+    "vnfPkgId",
+    "operationalState",
+    "usageState"
+]
 
 
 class CreateQuerySubscriptionView(APIView):
 
 
 class CreateQuerySubscriptionView(APIView):
@@ -52,25 +53,14 @@ class CreateQuerySubscriptionView(APIView):
             status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
         }
     )
             status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error"
         }
     )
+    @view_safe_call_with_log(logger=logger)
     def post(self, request):
         logger.debug("Create VNF package Subscription> %s" % request.data)
     def post(self, request):
         logger.debug("Create VNF package Subscription> %s" % request.data)
-        try:
-            vnf_pkg_subscription_request = validate_data(request.data, PkgmSubscriptionRequestSerializer)
-            data = CreateSubscription(vnf_pkg_subscription_request.data).do_biz()
-            subscription_info = validate_data(data, PkgmSubscriptionSerializer)
-            return Response(data=subscription_info.data, status=status.HTTP_201_CREATED)
-        except VnfPkgDuplicateSubscriptionException as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = get_problem_details_serializer(status.HTTP_303_SEE_OTHER,
-                                                                        traceback.format_exc())
-            return Response(data=problem_details_serializer.data, status=status.HTTP_303_SEE_OTHER)
-        except Exception as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = get_problem_details_serializer(status.HTTP_500_INTERNAL_SERVER_ERROR,
-                                                                        traceback.format_exc())
-            return Response(data=problem_details_serializer.data, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+
+        vnf_pkg_subscription_request = validate_data(request.data, PkgmSubscriptionRequestSerializer)
+        data = CreateSubscription(vnf_pkg_subscription_request.data).do_biz()
+        subscription_info = validate_data(data, PkgmSubscriptionSerializer)
+        return Response(data=subscription_info.data, status=status.HTTP_201_CREATED)
 
     @swagger_auto_schema(
         responses={
 
     @swagger_auto_schema(
         responses={
@@ -79,27 +69,20 @@ class CreateQuerySubscriptionView(APIView):
             status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
         }
     )
             status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
         }
     )
+    @view_safe_call_with_log(logger=logger)
     def get(self, request):
         logger.debug("SubscribeNotification--get::> %s" % request.query_params)
     def get(self, request):
         logger.debug("SubscribeNotification--get::> %s" % request.query_params)
-        try:
-            if request.query_params and not set(request.query_params).issubset(set(VALID_FILTERS)):
-                problem_details_serializer = get_problem_details_serializer(status.HTTP_400_BAD_REQUEST,
-                                                                            "Not a valid filter")
-                return Response(data=problem_details_serializer.data, status=status.HTTP_400_BAD_REQUEST)
-            resp_data = QuerySubscription().query_multi_subscriptions(request.query_params)
 
 
-            subscriptions_serializer = PkgmSubscriptionsSerializer(data=resp_data)
-            if not subscriptions_serializer.is_valid():
-                raise VnfPkgSubscriptionException(subscriptions_serializer.errors)
+        if request.query_params and not set(request.query_params).issubset(set(VALID_FILTERS)):
+            raise BadRequestException("Not a valid filter")
+
+        resp_data = QuerySubscription().query_multi_subscriptions(request.query_params)
 
 
-            return Response(data=subscriptions_serializer.data, status=status.HTTP_200_OK)
+        subscriptions_serializer = PkgmSubscriptionsSerializer(data=resp_data)
+        if not subscriptions_serializer.is_valid():
+            raise VnfPkgSubscriptionException(subscriptions_serializer.errors)
 
 
-        except Exception as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = get_problem_details_serializer(status.HTTP_500_INTERNAL_SERVER_ERROR,
-                                                                        traceback.format_exc())
-            return Response(data=problem_details_serializer.data, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+        return Response(data=subscriptions_serializer.data, status=status.HTTP_200_OK)
 
 
 class QueryTerminateSubscriptionView(APIView):
 
 
 class QueryTerminateSubscriptionView(APIView):
@@ -111,29 +94,17 @@ class QueryTerminateSubscriptionView(APIView):
             status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
         }
     )
             status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
         }
     )
+    @view_safe_call_with_log(logger=logger)
     def get(self, request, subscriptionId):
         logger.debug("SubscribeNotification--get::> %s" % subscriptionId)
     def get(self, request, subscriptionId):
         logger.debug("SubscribeNotification--get::> %s" % subscriptionId)
-        try:
-
-            resp_data = QuerySubscription().query_single_subscription(subscriptionId)
-
-            subscription_serializer = PkgmSubscriptionSerializer(data=resp_data)
-            if not subscription_serializer.is_valid():
-                raise VnfPkgSubscriptionException(subscription_serializer.errors)
-
-            return Response(data=subscription_serializer.data, status=status.HTTP_200_OK)
-        except SubscriptionDoesNotExistsException as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = get_problem_details_serializer(status.HTTP_404_NOT_FOUND,
-                                                                        traceback.format_exc())
-            return Response(data=problem_details_serializer.data, status=status.HTTP_404_NOT_FOUND)
-        except Exception as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = get_problem_details_serializer(status.HTTP_500_INTERNAL_SERVER_ERROR,
-                                                                        traceback.format_exc())
-            return Response(data=problem_details_serializer.data, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+
+        resp_data = QuerySubscription().query_single_subscription(subscriptionId)
+
+        subscription_serializer = PkgmSubscriptionSerializer(data=resp_data)
+        if not subscription_serializer.is_valid():
+            raise VnfPkgSubscriptionException(subscription_serializer.errors)
+
+        return Response(data=subscription_serializer.data, status=status.HTTP_200_OK)
 
     @swagger_auto_schema(
         responses={
 
     @swagger_auto_schema(
         responses={
@@ -142,20 +113,9 @@ class QueryTerminateSubscriptionView(APIView):
             status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
         }
     )
             status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
         }
     )
+    @view_safe_call_with_log(logger=logger)
     def delete(self, request, subscriptionId):
         logger.debug("SubscribeNotification--get::> %s" % subscriptionId)
     def delete(self, request, subscriptionId):
         logger.debug("SubscribeNotification--get::> %s" % subscriptionId)
-        try:
-            TerminateSubscription().terminate(subscriptionId)
-            return Response(status=status.HTTP_204_NO_CONTENT)
-        except SubscriptionDoesNotExistsException as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = get_problem_details_serializer(status.HTTP_404_NOT_FOUND,
-                                                                        traceback.format_exc())
-            return Response(data=problem_details_serializer.data, status=status.HTTP_404_NOT_FOUND)
-        except Exception as e:
-            logger.error(e.message)
-            logger.error(traceback.format_exc())
-            problem_details_serializer = get_problem_details_serializer(status.HTTP_500_INTERNAL_SERVER_ERROR,
-                                                                        traceback.format_exc())
-            return Response(data=problem_details_serializer.data, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+
+        TerminateSubscription().terminate(subscriptionId)
+        return Response(status=status.HTTP_204_NO_CONTENT)
index 91238f9..bfb1224 100644 (file)
@@ -19,13 +19,15 @@ from drf_yasg.utils import swagger_auto_schema, no_body
 from rest_framework import status
 from rest_framework.decorators import api_view
 from rest_framework.response import Response
 from rest_framework import status
 from rest_framework.decorators import api_view
 from rest_framework.response import Response
-from genericparser.pub.exceptions import GenericparserException
 from genericparser.packages.serializers.upload_vnf_pkg_from_uri_req import UploadVnfPackageFromUriRequestSerializer
 from genericparser.packages.serializers.create_vnf_pkg_info_req import CreateVnfPkgInfoRequestSerializer
 from genericparser.packages.serializers.vnf_pkg_info import VnfPkgInfoSerializer
 from genericparser.packages.serializers.vnf_pkg_infos import VnfPkgInfosSerializer
 from genericparser.packages.serializers.upload_vnf_pkg_from_uri_req import UploadVnfPackageFromUriRequestSerializer
 from genericparser.packages.serializers.create_vnf_pkg_info_req import CreateVnfPkgInfoRequestSerializer
 from genericparser.packages.serializers.vnf_pkg_info import VnfPkgInfoSerializer
 from genericparser.packages.serializers.vnf_pkg_infos import VnfPkgInfosSerializer
-from genericparser.packages.biz.vnf_package import VnfPackage, VnfPkgUploadThread, parse_vnfd_and_save, handle_upload_failed
-from genericparser.packages.views.common import validate_data
+from genericparser.packages.biz.vnf_package import VnfPackage
+from genericparser.packages.biz.vnf_package import VnfPkgUploadThread
+from genericparser.packages.biz.vnf_package import parse_vnfd_and_save
+from genericparser.packages.biz.vnf_package import handle_upload_failed
+from .common import validate_data
 from .common import view_safe_call_with_log
 
 logger = logging.getLogger(__name__)
 from .common import view_safe_call_with_log
 
 logger = logging.getLogger(__name__)
@@ -60,7 +62,8 @@ def vnf_packages_rc(request):
 
     if request.method == 'POST':
         logger.debug("Create VNF package> %s" % request.data)
 
     if request.method == 'POST':
         logger.debug("Create VNF package> %s" % request.data)
-        create_vnf_pkg_info_request = validate_data(request.data, CreateVnfPkgInfoRequestSerializer)
+        create_vnf_pkg_info_request = validate_data(request.data,
+                                                    CreateVnfPkgInfoRequestSerializer)
         data = VnfPackage().create_vnf_pkg(create_vnf_pkg_info_request.data)
         vnf_pkg_info = validate_data(data, VnfPkgInfoSerializer)
         return Response(data=vnf_pkg_info.data, status=status.HTTP_201_CREATED)
         data = VnfPackage().create_vnf_pkg(create_vnf_pkg_info_request.data)
         vnf_pkg_info = validate_data(data, VnfPkgInfoSerializer)
         return Response(data=vnf_pkg_info.data, status=status.HTTP_201_CREATED)
@@ -96,15 +99,12 @@ def package_content_ru(request, **kwargs):
             local_file_name = VnfPackage().upload(vnf_pkg_id, files[0])
             parse_vnfd_and_save(vnf_pkg_id, local_file_name)
             return Response(None, status=status.HTTP_202_ACCEPTED)
             local_file_name = VnfPackage().upload(vnf_pkg_id, files[0])
             parse_vnfd_and_save(vnf_pkg_id, local_file_name)
             return Response(None, status=status.HTTP_202_ACCEPTED)
-        except GenericparserException as e:
-            handle_upload_failed(vnf_pkg_id)
-            raise e
         except Exception as e:
             handle_upload_failed(vnf_pkg_id)
             raise e
 
     if request.method == "GET":
         except Exception as e:
             handle_upload_failed(vnf_pkg_id)
             raise e
 
     if request.method == "GET":
-        file_range = request.META.get('RANGE')
+        file_range = request.META.get('HTTP_RANGE')
         file_iterator = VnfPackage().download(vnf_pkg_id, file_range)
         return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK)
 
         file_iterator = VnfPackage().download(vnf_pkg_id, file_range)
         return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK)
 
@@ -123,12 +123,10 @@ def package_content_ru(request, **kwargs):
 def upload_from_uri_c(request, **kwargs):
     vnf_pkg_id = kwargs.get("vnfPkgId")
     try:
 def upload_from_uri_c(request, **kwargs):
     vnf_pkg_id = kwargs.get("vnfPkgId")
     try:
-        upload_vnf_from_uri_request = validate_data(request.data, UploadVnfPackageFromUriRequestSerializer)
+        upload_vnf_from_uri_request = validate_data(request.data,
+                                                    UploadVnfPackageFromUriRequestSerializer)
         VnfPkgUploadThread(upload_vnf_from_uri_request.data, vnf_pkg_id).start()
         return Response(None, status=status.HTTP_202_ACCEPTED)
         VnfPkgUploadThread(upload_vnf_from_uri_request.data, vnf_pkg_id).start()
         return Response(None, status=status.HTTP_202_ACCEPTED)
-    except GenericparserException as e:
-        handle_upload_failed(vnf_pkg_id)
-        raise e
     except Exception as e:
         handle_upload_failed(vnf_pkg_id)
         raise e
     except Exception as e:
         handle_upload_failed(vnf_pkg_id)
         raise e
index 60b4836..574d4d7 100644 (file)
@@ -81,3 +81,5 @@ GENERICPARSER_URL_PATH = None
 SDC_BASE_URL = "http://msb-iag/api"
 SDC_USER = "aai"
 SDC_PASSWD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U"
 SDC_BASE_URL = "http://msb-iag/api"
 SDC_USER = "aai"
 SDC_PASSWD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U"
+
+VNFD_SCHEMA_VERSION_DEFAULT = "base"
diff --git a/genericparser/pub/database/admin.py b/genericparser/pub/database/admin.py
new file mode 100644 (file)
index 0000000..ec7a92a
--- /dev/null
@@ -0,0 +1,361 @@
+# Copyright 2019 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from django.contrib import admin
+
+from genericparser.pub.database.models import NSPackageModel
+from genericparser.pub.database.models import ServicePackageModel
+from genericparser.pub.database.models import VnfPackageModel
+from genericparser.pub.database.models import PnfPackageModel
+from genericparser.pub.database.models import SoftwareImageModel
+from genericparser.pub.database.models import JobModel
+from genericparser.pub.database.models import JobStatusModel
+from genericparser.pub.database.models import NsdmSubscriptionModel
+from genericparser.pub.database.models import VnfPkgSubscriptionModel
+
+
+@admin.register(NSPackageModel)
+class NSPackageModelAdmin(admin.ModelAdmin):
+    list_display_links = ('nsPackageId', 'nsdName')
+    fields = [
+        "nsPackageId",
+        "nsPackageUri",
+        "checksum",
+        "sdcCsarId",
+        "onboardingState",
+        "operationalState",
+        "usageState",
+        "deletionPending",
+        "nsdId",
+        "invariantId",
+        "nsdName",
+        "nsdDesginer",
+        "nsdDescription",
+        "nsdVersion",
+        "userDefinedData",
+        "localFilePath",
+        "nsdModel"
+    ]
+
+    list_display = [
+        "nsPackageId",
+        "nsPackageUri",
+        "checksum",
+        "sdcCsarId",
+        "onboardingState",
+        "operationalState",
+        "usageState",
+        "deletionPending",
+        "nsdId",
+        "invariantId",
+        "nsdName",
+        "nsdDesginer",
+        "nsdDescription",
+        "nsdVersion",
+        "userDefinedData",
+        "localFilePath",
+        "nsdModel"
+    ]
+
+    search_fields = (
+        "nsPackageId",
+        "nsdId",
+        "nsdName",
+        "sdcCsarId"
+    )
+
+
+@admin.register(ServicePackageModel)
+class ServicePackageModelAdmin(admin.ModelAdmin):
+    list_display_links = ('servicePackageId', 'servicedName')
+    fields = [
+        "servicePackageId",
+        "servicePackageUri",
+        "checksum",
+        "sdcCsarId",
+        "onboardingState",
+        "operationalState",
+        "usageState",
+        "deletionPending",
+        "servicedId",
+        "invariantId",
+        "servicedName",
+        "servicedDesigner",
+        "servicedDescription",
+        "servicedVersion",
+        "userDefinedData",
+        "localFilePath",
+        "servicedModel"
+    ]
+
+    list_display = [
+        "servicePackageId",
+        "servicePackageUri",
+        "checksum",
+        "sdcCsarId",
+        "onboardingState",
+        "operationalState",
+        "usageState",
+        "deletionPending",
+        "servicedId",
+        "invariantId",
+        "servicedName",
+        "servicedDesigner",
+        "servicedDescription",
+        "servicedVersion",
+        "userDefinedData",
+        "localFilePath",
+        "servicedModel"
+    ]
+
+    search_fields = (
+        "servicePackageId",
+        "sdcCsarId",
+        "servicedName",
+        "onboardingState"
+    )
+
+
+@admin.register(VnfPackageModel)
+class VnfPackageModelAdmin(admin.ModelAdmin):
+    list_display_links = ('vnfPackageId', 'vnfdId')
+    fields = [
+        "vnfPackageId",
+        "vnfPackageUri",
+        "SdcCSARUri",
+        "checksum",
+        "onboardingState",
+        "operationalState",
+        "usageState",
+        "deletionPending",
+        "vnfdId",
+        "vnfVendor",
+        "vnfdProductName",
+        "vnfdVersion",
+        "vnfSoftwareVersion",
+        "userDefinedData",
+        "localFilePath",
+        "vnfdModel"
+    ]
+
+    list_display = [
+        "vnfPackageId",
+        "vnfPackageUri",
+        "SdcCSARUri",
+        "checksum",
+        "onboardingState",
+        "operationalState",
+        "usageState",
+        "deletionPending",
+        "vnfdId",
+        "vnfVendor",
+        "vnfdProductName",
+        "vnfdVersion",
+        "vnfSoftwareVersion",
+        "userDefinedData",
+        "localFilePath",
+        "vnfdModel"
+    ]
+
+    search_fields = (
+        "vnfPackageId",
+        "onboardingState",
+        "vnfdId"
+    )
+
+
+@admin.register(PnfPackageModel)
+class PnfPackageModelAdmin(admin.ModelAdmin):
+    list_display_links = ('pnfPackageId', 'pnfdId')
+    fields = [
+        "pnfPackageId",
+        "pnfPackageUri",
+        "sdcCSARUri",
+        "checksum",
+        "onboardingState",
+        "usageState",
+        "deletionPending",
+        "pnfdId",
+        "pnfVendor",
+        "pnfdProductName",
+        "pnfdVersion",
+        "pnfSoftwareVersion",
+        "userDefinedData",
+        "localFilePath",
+        "pnfdModel",
+        "pnfdName"
+    ]
+
+    list_display = [
+        "pnfPackageId",
+        "pnfPackageUri",
+        "sdcCSARUri",
+        "checksum",
+        "onboardingState",
+        "usageState",
+        "deletionPending",
+        "pnfdId",
+        "pnfVendor",
+        "pnfdProductName",
+        "pnfdVersion",
+        "pnfSoftwareVersion",
+        "userDefinedData",
+        "localFilePath",
+        "pnfdModel",
+        "pnfdName"
+    ]
+
+    search_fields = (
+        "pnfPackageId",
+        "onboardingState",
+        "pnfdId"
+    )
+
+
+@admin.register(SoftwareImageModel)
+class SoftwareImageModelAdmin(admin.ModelAdmin):
+    list_display_links = ('imageid', 'vnfPackageId')
+    fields = [
+        "imageid",
+        "containerFormat",
+        "diskFormat",
+        "mindisk",
+        "minram",
+        "usermetadata",
+        "vnfPackageId",
+        "filePath",
+        "status",
+        "vimid"
+    ]
+
+    list_display = [
+        "imageid",
+        "containerFormat",
+        "diskFormat",
+        "mindisk",
+        "minram",
+        "usermetadata",
+        "vnfPackageId",
+        "filePath",
+        "status",
+        "vimid"
+    ]
+
+    search_fields = (
+        "imageid",
+        "vnfPackageId",
+        "vimid"
+    )
+
+
+@admin.register(NsdmSubscriptionModel)
+class NsdmSubscriptionModelAdmin(admin.ModelAdmin):
+    list_display_links = ('subscriptionid', 'notificationTypes')
+    fields = [
+        "subscriptionid",
+        "notificationTypes",
+        "auth_info",
+        "callback_uri",
+        "nsdInfoId",
+        "nsdId",
+        "nsdName",
+        "nsdVersion",
+        "nsdDesigner",
+        "nsdInvariantId",
+        "vnfPkgIds",
+        "pnfdInfoIds",
+        "nestedNsdInfoIds",
+        "nsdOnboardingState",
+        "nsdOperationalState",
+        "nsdUsageState",
+        "pnfdId",
+        "pnfdName",
+        "pnfdVersion",
+        "pnfdProvider",
+        "pnfdInvariantId",
+        "pnfdOnboardingState",
+        "pnfdUsageState",
+        "links"
+    ]
+
+    list_display = [
+        "subscriptionid",
+        "notificationTypes",
+        "auth_info",
+        "callback_uri",
+        "nsdInfoId",
+        "nsdId",
+        "nsdName",
+        "nsdVersion",
+        "nsdDesigner",
+        "nsdInvariantId",
+        "vnfPkgIds",
+        "pnfdInfoIds",
+        "nestedNsdInfoIds",
+        "nsdOnboardingState",
+        "nsdOperationalState",
+        "nsdUsageState",
+        "pnfdId",
+        "pnfdName",
+        "pnfdVersion",
+        "pnfdProvider",
+        "pnfdInvariantId",
+        "pnfdOnboardingState",
+        "pnfdUsageState",
+        "links"
+    ]
+
+    search_fields = (
+        "subscriptionid",
+        "notificationTypes"
+    )
+
+
+@admin.register(VnfPkgSubscriptionModel)
+class VnfPkgSubscriptionModelAdmin(admin.ModelAdmin):
+    list_display_links = ('subscription_id', 'notification_types')
+    fields = [
+        "subscription_id",
+        "callback_uri",
+        "auth_info",
+        "usage_states",
+        "notification_types",
+        "vnfd_id",
+        "vnf_pkg_id",
+        "operation_states",
+        "vnf_products_from_provider",
+        "links"
+    ]
+
+    list_display = [
+        "subscription_id",
+        "callback_uri",
+        "auth_info",
+        "usage_states",
+        "notification_types",
+        "vnfd_id",
+        "vnf_pkg_id",
+        "operation_states",
+        "vnf_products_from_provider",
+        "links"
+    ]
+
+    search_fields = (
+        "subscription_id",
+        "notification_types"
+    )
+
+
+admin.site.register(JobModel)
+admin.site.register(JobStatusModel)
index 626e567..b3c797d 100644 (file)
@@ -49,5 +49,9 @@ class NsdmDuplicateSubscriptionException(GenericparserException):
     pass
 
 
     pass
 
 
+class BadRequestException(GenericparserException):
+    pass
+
+
 class ArtifactNotFoundException(GenericparserException):
     pass
 class ArtifactNotFoundException(GenericparserException):
     pass
index c461790..e28f712 100644 (file)
@@ -35,26 +35,26 @@ class TestToscaparser(TestCase):
     def test_vnfd_parse(self):
         self.remove_temp_dir()
         input_parameters = [{"value": "222222", "key": "sdncontroller"}]
     def test_vnfd_parse(self):
         self.remove_temp_dir()
         input_parameters = [{"value": "222222", "key": "sdncontroller"}]
-        vcpe = ["vgw", "infra", "vbng", "vbrgemu", "vgmux"]
+        # vcpe = ["vgw", "infra", "vbng", "vbrgemu", "vgmux"]
+        vcpe_part = 'vgw'
         sriov_path = os.path.dirname(os.path.abspath(__file__)) + "/testdata/vnf/vcpesriov"
         sriov_path = os.path.dirname(os.path.abspath(__file__)) + "/testdata/vnf/vcpesriov"
-        for vcpe_part in vcpe:
-            csar_file = ("%s/%s.csar" % (sriov_path, vcpe_part))
-            logger.debug("csar_file:%s", csar_file)
-            vnfd_json = parse_vnfd(csar_file, input_parameters)
-            metadata = json.loads(vnfd_json).get("metadata")
-            logger.debug("sriov metadata:%s", metadata)
-            self.assertEqual(("vCPE_%s" % vcpe_part), metadata.get("template_name", ""))
-            if vcpe_part == "infra":
-                self.assertEqual("b1bb0ce7-1111-4fa7-95ed-4840d70a1177", json.loads(vnfd_json)["vnf"]["properties"]["descriptor_id"])
+        csar_file = ("%s/%s.csar" % (sriov_path, vcpe_part))
+        logger.debug("csar_file:%s", csar_file)
+        vnfd_json = parse_vnfd(csar_file, input_parameters)
+        metadata = json.loads(vnfd_json).get("metadata")
+        logger.debug("sriov metadata:%s", metadata)
+        self.assertEqual(("vCPE_%s" % vcpe_part), metadata.get("template_name", ""))
+        if vcpe_part == "infra":
+            self.assertEqual("b1bb0ce7-1111-4fa7-95ed-4840d70a1177",
+                             json.loads(vnfd_json)["vnf"]["properties"]["descriptor_id"])
 
         dpdk_path = os.path.dirname(os.path.abspath(__file__)) + "/testdata/vnf/vcpedpdk"
 
         dpdk_path = os.path.dirname(os.path.abspath(__file__)) + "/testdata/vnf/vcpedpdk"
-        for vcpe_part in vcpe:
-            csar_file = ("%s/%s.csar" % (dpdk_path, vcpe_part))
-            logger.debug("csar_file:%s", csar_file)
-            vnfd_json = parse_vnfd(csar_file, input_parameters)
-            metadata = json.loads(vnfd_json).get("metadata")
-            logger.debug("dpdk metadata:%s", metadata)
-            self.assertEqual(("vCPE_%s" % vcpe_part), metadata.get("template_name", ""))
+        csar_file = ("%s/%s.csar" % (dpdk_path, vcpe_part))
+        logger.debug("csar_file:%s", csar_file)
+        vnfd_json = parse_vnfd(csar_file, input_parameters)
+        metadata = json.loads(vnfd_json).get("metadata")
+        logger.debug("dpdk metadata:%s", metadata)
+        self.assertEqual(("vCPE_%s" % vcpe_part), metadata.get("template_name", ""))
 
     def test_pnfd_parse(self):
         self.remove_temp_dir()
 
     def test_pnfd_parse(self):
         self.remove_temp_dir()
index 7b4423d..37a6472 100644 (file)
 
 import functools
 import logging
 
 import functools
 import logging
-import os
+from genericparser.pub.config.config import VNFD_SCHEMA_VERSION_DEFAULT
 from genericparser.pub.utils.toscaparsers.basemodel import BaseInfoModel
 from genericparser.pub.utils.toscaparsers.basemodel import BaseInfoModel
+from genericparser.pub.utils.toscaparsers.vnfdparser import CreateVnfdSOLParser
 # from genericparser.pub.exceptions import CatalogException
 
 logger = logging.getLogger(__name__)
 
 # from genericparser.pub.exceptions import CatalogException
 
 logger = logging.getLogger(__name__)
 
-SECTIONS = (VDU_COMPUTE_TYPE, VNF_VL_TYPE, VDU_CP_TYPE, VDU_STORAGE_TYPE) = \
-           ('tosca.nodes.nfv.Vdu.Compute', 'tosca.nodes.nfv.VnfVirtualLink', 'tosca.nodes.nfv.VduCp', 'tosca.nodes.nfv.Vdu.VirtualStorage')
-
 NFV_VNF_RELATIONSHIPS = [["tosca.relationships.nfv.VirtualLinksTo", "tosca.relationships.nfv.VduAttachesTo", "tosca.relationships.nfv.AttachesTo", "tosca.relationships.nfv.Vdu.AttachedTo", "tosca.relationships.DependsOn"],
                          ["tosca.nodes.relationships.VirtualBindsTo", "tosca.relationships.nfv.VirtualBindsTo"]]
 
 NFV_VNF_RELATIONSHIPS = [["tosca.relationships.nfv.VirtualLinksTo", "tosca.relationships.nfv.VduAttachesTo", "tosca.relationships.nfv.AttachesTo", "tosca.relationships.nfv.Vdu.AttachedTo", "tosca.relationships.DependsOn"],
                          ["tosca.nodes.relationships.VirtualBindsTo", "tosca.relationships.nfv.VirtualBindsTo"]]
 
@@ -30,236 +28,21 @@ NFV_VNF_RELATIONSHIPS = [["tosca.relationships.nfv.VirtualLinksTo", "tosca.relat
 class EtsiVnfdInfoModel(BaseInfoModel):
 
     def __init__(self, path, params):
 class EtsiVnfdInfoModel(BaseInfoModel):
 
     def __init__(self, path, params):
+        self.vnf = {}
         super(EtsiVnfdInfoModel, self).__init__(path, params)
 
     def parseModel(self, tosca):
         super(EtsiVnfdInfoModel, self).__init__(path, params)
 
     def parseModel(self, tosca):
-        self.vnf = {}
-        self.vnf = self._build_vnf(tosca)
         self.metadata = self.buildMetadata(tosca)
         self.inputs = self.buildInputs(tosca)
         self.metadata = self.buildMetadata(tosca)
         self.inputs = self.buildInputs(tosca)
-        nodeTemplates = map(functools.partial(self.buildNode, tosca=tosca),
-                            tosca.nodetemplates)
-        node_types = tosca.topology_template.custom_defs
+        nodeTemplates = map(functools.partial(self.buildNode, tosca=tosca), tosca.nodetemplates)
         self.basepath = self.get_base_path(tosca)
         self.basepath = self.get_base_path(tosca)
-        self.volume_storages = self._get_all_volume_storage(nodeTemplates, node_types)
-        self.vdus = self._get_all_vdu(nodeTemplates, node_types)
-        self.vls = self._get_all_vl(nodeTemplates, node_types)
-        self.cps = self._get_all_cp(nodeTemplates, node_types)
-        self.vnf_exposed = self._get_all_endpoint_exposed()
+        node_types = tosca.topology_template.custom_defs
+        sol_version = self.metadata.get("VNFD_SCHEMA_VERSION", VNFD_SCHEMA_VERSION_DEFAULT) if isinstance(self.metadata, dict) else VNFD_SCHEMA_VERSION_DEFAULT
+        vnfd_sol_parser = CreateVnfdSOLParser(sol_version, self)
+        self.vnf = vnfd_sol_parser.build_vnf(tosca)
+        self.volume_storages = vnfd_sol_parser.get_all_volume_storage(nodeTemplates, node_types)
+        self.vdus = vnfd_sol_parser.get_all_vdu(nodeTemplates, node_types)
+        self.vls = vnfd_sol_parser.get_all_vl(nodeTemplates, node_types)
+        self.cps = vnfd_sol_parser.get_all_cp(nodeTemplates, node_types)
+        self.vnf_exposed = vnfd_sol_parser.get_all_endpoint_exposed()
         self.graph = self.get_deploy_graph(tosca, NFV_VNF_RELATIONSHIPS)
         self.graph = self.get_deploy_graph(tosca, NFV_VNF_RELATIONSHIPS)
-
-    def _get_all_volume_storage(self, nodeTemplates, node_types):
-        rets = []
-        for node in nodeTemplates:
-            if self.isNodeTypeX(node, node_types, VDU_STORAGE_TYPE):
-                ret = {}
-                ret['volume_storage_id'] = node['name']
-                if 'description' in node:
-                    ret['description'] = node['description']
-                ret['properties'] = node['properties']
-                # image_file should be gotten form artifacts TODO
-                # ret['artifacts'] = self._build_artifacts(node)
-                rets.append(ret)
-        return rets
-
-    def _get_all_vdu(self, nodeTemplates, node_types):
-        rets = []
-        inject_files = []
-        for node in nodeTemplates:
-            logger.debug("nodeTemplates :%s", node)
-            if self.isNodeTypeX(node, node_types, VDU_COMPUTE_TYPE):
-                ret = {}
-                ret['vdu_id'] = node['name']
-                ret['type'] = node['nodeType']
-                if 'description' in node:
-                    ret['description'] = node['description']
-                ret['properties'] = node['properties']
-                if 'inject_files' in node['properties']:
-                    inject_files = node['properties']['inject_files']
-                if inject_files is not None:
-                    if isinstance(inject_files, list):
-                        for inject_file in inject_files:
-                            source_path = os.path.join(self.basepath, inject_file['source_path'])
-                            with open(source_path, "rb") as f:
-                                source_data = f.read()
-                                source_data_base64 = source_data.encode("base64")
-                                inject_file["source_data_base64"] = source_data_base64
-                    if isinstance(inject_files, dict):
-                        source_path = os.path.join(self.basepath, inject_files['source_path'])
-                        with open(source_path, "rb") as f:
-                            source_data = f.read()
-                            source_data_base64 = source_data.encode("base64")
-                            inject_files["source_data_base64"] = source_data_base64
-                virtual_storages = self.getRequirementByName(node, 'virtual_storage')
-                ret['virtual_storages'] = map(functools.partial(self._trans_virtual_storage), virtual_storages)
-                ret['dependencies'] = map(lambda x: self.get_requirement_node_name(x), self.getNodeDependencys(node))
-                virtual_compute = self.getCapabilityByName(node, 'virtual_compute')
-                if virtual_compute is not None and 'properties' in virtual_compute:
-                    ret['virtual_compute'] = virtual_compute['properties']
-                ret['vls'] = self._get_linked_vl_ids(node, nodeTemplates)
-                ret['cps'] = self._get_virtal_binding_cp_ids(node, nodeTemplates)
-                ret['artifacts'] = self.build_artifacts(node)
-                rets.append(ret)
-        logger.debug("rets:%s", rets)
-        return rets
-
-    def _trans_virtual_storage(self, virtual_storage):
-        if isinstance(virtual_storage, str):
-            return {"virtual_storage_id": virtual_storage}
-        else:
-            ret = {}
-            ret['virtual_storage_id'] = self.get_requirement_node_name(virtual_storage)
-            return ret
-
-    def _get_linked_vl_ids(self, node, node_templates):
-        vl_ids = []
-        cps = self._get_virtal_binding_cps(node, node_templates)
-        for cp in cps:
-            vl_reqs = self.getRequirementByName(cp, 'virtual_link')
-            for vl_req in vl_reqs:
-                vl_ids.append(self.get_requirement_node_name(vl_req))
-        return vl_ids
-
-    def _get_virtal_binding_cp_ids(self, node, nodeTemplates):
-        return map(lambda x: x['name'], self._get_virtal_binding_cps(node, nodeTemplates))
-
-    def _get_virtal_binding_cps(self, node, nodeTemplates):
-        cps = []
-        for tmpnode in nodeTemplates:
-            if 'requirements' in tmpnode:
-                for item in tmpnode['requirements']:
-                    for key, value in item.items():
-                        if key.upper().startswith('VIRTUAL_BINDING'):
-                            req_node_name = self.get_requirement_node_name(value)
-                            if req_node_name is not None and req_node_name == node['name']:
-                                cps.append(tmpnode)
-        return cps
-
-    def _get_all_vl(self, nodeTemplates, node_types):
-        vls = []
-        for node in nodeTemplates:
-            if self.isNodeTypeX(node, node_types, VNF_VL_TYPE):
-                vl = dict()
-                vl['vl_id'] = node['name']
-                vl['description'] = node['description']
-                vl['properties'] = node['properties']
-                vls.append(vl)
-        return vls
-
-    def _get_all_cp(self, nodeTemplates, node_types):
-        cps = []
-        for node in nodeTemplates:
-            if self.isNodeTypeX(node, node_types, VDU_CP_TYPE):
-                cp = {}
-                cp['cp_id'] = node['name']
-                cp['cpd_id'] = node['name']
-                cp['description'] = node['description']
-                cp['properties'] = node['properties']
-                cp['vl_id'] = self._get_node_vl_id(node)
-                cp['vdu_id'] = self._get_node_vdu_id(node)
-                vls = self._buil_cp_vls(node)
-                if len(vls) > 1:
-                    cp['vls'] = vls
-                cps.append(cp)
-        return cps
-
-    def _get_node_vdu_id(self, node):
-        vdu_ids = map(lambda x: self.get_requirement_node_name(x), self.getRequirementByName(node, 'virtual_binding'))
-        if len(vdu_ids) > 0:
-            return vdu_ids[0]
-        return ""
-
-    def _get_node_vl_id(self, node):
-        vl_ids = map(lambda x: self.get_requirement_node_name(x), self.getRequirementByName(node, 'virtual_link'))
-        if len(vl_ids) > 0:
-            return vl_ids[0]
-        return ""
-
-    def _buil_cp_vls(self, node):
-        return map(lambda x: self._build_cp_vl(x), self.getRequirementByName(node, 'virtual_link'))
-
-    def _build_cp_vl(self, req):
-        cp_vl = {}
-        cp_vl['vl_id'] = self.get_prop_from_obj(req, 'node')
-        relationship = self.get_prop_from_obj(req, 'relationship')
-        if relationship is not None:
-            properties = self.get_prop_from_obj(relationship, 'properties')
-            if properties is not None and isinstance(properties, dict):
-                for key, value in properties.items():
-                    cp_vl[key] = value
-        return cp_vl
-
-    def _get_all_endpoint_exposed(self):
-        if self.vnf:
-            external_cps = self._get_external_cps(self.vnf.get('requirements', None))
-            forward_cps = self._get_forward_cps(self.vnf.get('capabilities', None))
-            return {"external_cps": external_cps, "forward_cps": forward_cps}
-        return {}
-
-    def _get_external_cps(self, vnf_requirements):
-        external_cps = []
-        if vnf_requirements:
-            if isinstance(vnf_requirements, dict):
-                for key, value in vnf_requirements.items():
-                    if isinstance(value, list) and len(value) > 0:
-                        external_cps.append({"key_name": key, "cpd_id": value[0]})
-                    else:
-                        external_cps.append({"key_name": key, "cpd_id": value})
-            elif isinstance(vnf_requirements, list):
-                for vnf_requirement in vnf_requirements:
-                    for key, value in vnf_requirement.items():
-                        if isinstance(value, list) and len(value) > 0:
-                            external_cps.append({"key_name": key, "cpd_id": value[0]})
-                        else:
-                            external_cps.append({"key_name": key, "cpd_id": value})
-        return external_cps
-
-    def _get_forward_cps(self, vnf_capabilities):
-        forward_cps = []
-        if vnf_capabilities:
-            for key, value in vnf_capabilities.items():
-                if isinstance(value, list) and len(value) > 0:
-                    forward_cps.append({"key_name": key, "cpd_id": value[0]})
-                else:
-                    forward_cps.append({"key_name": key, "cpd_id": value})
-        return forward_cps
-
-    # def get_substitution_mappings(self, tosca):
-    #    node = {}
-    #    substitution_mappings = tosca.tpl['topology_template'].get('substitution_mappings', None)
-    #    if substitution_mappings:
-    #        node = substitution_mappings.get('properties', {})
-    #        node['type'] = substitution_mappings['node_type']
-    #    return node
-
-    def _build_vnf(self, tosca):
-        vnf = self.get_substitution_mappings(tosca)
-        properties = vnf.get("properties", {})
-        metadata = vnf.get("metadata", {})
-        if properties.get("descriptor_id", "") == "":
-            descriptor_id = metadata.get("descriptor_id", "")
-            if descriptor_id == "":
-                descriptor_id = metadata.get("id", "")
-            if descriptor_id == "":
-                descriptor_id = metadata.get("UUID", "")
-            properties["descriptor_id"] = descriptor_id
-
-        if properties.get("descriptor_verison", "") == "":
-            version = metadata.get("template_version", "")
-            if version == "":
-                version = metadata.get("version", "")
-            properties["descriptor_verison"] = version
-
-        if properties.get("provider", "") == "":
-            provider = metadata.get("template_author", "")
-            if provider == "":
-                provider = metadata.get("provider", "")
-            properties["provider"] = provider
-
-        if properties.get("template_name", "") == "":
-            template_name = metadata.get("template_name", "")
-            if template_name == "":
-                template_name = metadata.get("template_name", "")
-            properties["template_name"] = template_name
-
-        return vnf
diff --git a/genericparser/pub/utils/toscaparsers/vnfdparser/__init__.py b/genericparser/pub/utils/toscaparsers/vnfdparser/__init__.py
new file mode 100644 (file)
index 0000000..179fb4c
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2019 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from genericparser.pub.utils.toscaparsers.vnfdparser.vnfd_sol_base import VnfdSOLBase
+from genericparser.pub.utils.toscaparsers.vnfdparser.vnfd_sol_251 import VnfdSOL251
+
+
+def CreateVnfdSOLParser(sol_version, etsi_vnfd_model):
+    switcher = {
+        "base": VnfdSOLBase(etsi_vnfd_model),
+        "2.5.1+1": VnfdSOL251(etsi_vnfd_model)
+    }
+    return switcher.get(sol_version, lambda: "Invalid Version")
diff --git a/genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_251.py b/genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_251.py
new file mode 100644 (file)
index 0000000..d6c15de
--- /dev/null
@@ -0,0 +1,235 @@
+# Copyright 2019 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import functools
+import logging
+import os
+
+
+logger = logging.getLogger(__name__)
+
+SECTIONS = (VDU_COMPUTE_TYPE, VNF_VL_TYPE, VDU_CP_TYPE, VDU_STORAGE_TYPE) = \
+           ('tosca.nodes.nfv.Vdu.Compute', 'tosca.nodes.nfv.VnfVirtualLink', 'tosca.nodes.nfv.VduCp', 'tosca.nodes.nfv.Vdu.VirtualStorage')
+
+
+class VnfdSOL251():
+
+    def __init__(self, model):
+        self.model = model
+
+    def build_vnf(self, tosca):
+        vnf = self.model.get_substitution_mappings(tosca)
+        properties = vnf.get("properties", {})
+        metadata = vnf.get("metadata", {})
+        if properties.get("descriptor_id", "") == "":
+            descriptor_id = metadata.get("descriptor_id", "")
+            if descriptor_id == "":
+                descriptor_id = metadata.get("id", "")
+            if descriptor_id == "":
+                descriptor_id = metadata.get("UUID", "")
+            properties["descriptor_id"] = descriptor_id
+
+        if properties.get("descriptor_verison", "") == "":
+            version = metadata.get("template_version", "")
+            if version == "":
+                version = metadata.get("version", "")
+            properties["descriptor_verison"] = version
+
+        if properties.get("provider", "") == "":
+            provider = metadata.get("template_author", "")
+            if provider == "":
+                provider = metadata.get("provider", "")
+            properties["provider"] = provider
+
+        if properties.get("template_name", "") == "":
+            template_name = metadata.get("template_name", "")
+            if template_name == "":
+                template_name = metadata.get("template_name", "")
+            properties["template_name"] = template_name
+
+        return vnf
+
+    def get_all_vl(self, nodeTemplates, node_types):
+        vls = []
+        for node in nodeTemplates:
+            if self.model.isNodeTypeX(node, node_types, VNF_VL_TYPE):
+                vl = dict()
+                vl['vl_id'] = node['name']
+                vl['description'] = node['description']
+                vl['properties'] = node['properties']
+                vls.append(vl)
+        return vls
+
+    def get_all_cp(self, nodeTemplates, node_types):
+        cps = []
+        for node in nodeTemplates:
+            if self.model.isNodeTypeX(node, node_types, VDU_CP_TYPE):
+                cp = {}
+                cp['cp_id'] = node['name']
+                cp['cpd_id'] = node['name']
+                cp['description'] = node['description']
+                cp['properties'] = node['properties']
+                cp['vl_id'] = self._get_node_vl_id(node)
+                cp['vdu_id'] = self._get_node_vdu_id(node)
+                vls = self._buil_cp_vls(node)
+                if len(vls) > 1:
+                    cp['vls'] = vls
+                cps.append(cp)
+        return cps
+
+    def get_all_volume_storage(self, nodeTemplates, node_types):
+        rets = []
+        for node in nodeTemplates:
+            if self.model.isNodeTypeX(node, node_types, VDU_STORAGE_TYPE):
+                ret = {}
+                ret['volume_storage_id'] = node['name']
+                if 'description' in node:
+                    ret['description'] = node['description']
+                ret['properties'] = node['properties']
+                rets.append(ret)
+        return rets
+
+    def get_all_vdu(self, nodeTemplates, node_types):
+        rets = []
+        inject_files = []
+        for node in nodeTemplates:
+            logger.debug("nodeTemplates :%s", node)
+            if self.model.isNodeTypeX(node, node_types, VDU_COMPUTE_TYPE):
+                ret = {}
+                ret['vdu_id'] = node['name']
+                ret['type'] = node['nodeType']
+                if 'description' in node:
+                    ret['description'] = node['description']
+                ret['properties'] = node['properties']
+                if 'inject_files' in node['properties']:
+                    inject_files = node['properties']['inject_files']
+                if inject_files is not None:
+                    if isinstance(inject_files, list):
+                        for inject_file in inject_files:
+                            source_path = os.path.join(self.model.basepath, inject_file['source_path'])
+                            with open(source_path, "rb") as f:
+                                source_data = f.read()
+                                source_data_base64 = source_data.encode("base64")
+                                inject_file["source_data_base64"] = source_data_base64
+                    if isinstance(inject_files, dict):
+                        source_path = os.path.join(self.model.basepath, inject_files['source_path'])
+                        with open(source_path, "rb") as f:
+                            source_data = f.read()
+                            source_data_base64 = source_data.encode("base64")
+                            inject_files["source_data_base64"] = source_data_base64
+                virtual_storages = self.model.getRequirementByName(node, 'virtual_storage')
+                ret['virtual_storages'] = map(functools.partial(self._trans_virtual_storage), virtual_storages)
+                ret['dependencies'] = map(lambda x: self.model.get_requirement_node_name(x), self.model.getNodeDependencys(node))
+                virtual_compute = self.model.getCapabilityByName(node, 'virtual_compute')
+                if virtual_compute is not None and 'properties' in virtual_compute:
+                    ret['virtual_compute'] = virtual_compute['properties']
+                ret['vls'] = self._get_linked_vl_ids(node, nodeTemplates)
+                ret['cps'] = self._get_virtal_binding_cp_ids(node, nodeTemplates)
+                ret['artifacts'] = self.model.build_artifacts(node)
+                rets.append(ret)
+        logger.debug("rets:%s", rets)
+        return rets
+
+    def get_all_endpoint_exposed(self):
+        if self.model.vnf:
+            external_cps = self._get_external_cps(self.model.vnf.get('requirements', None))
+            forward_cps = self._get_forward_cps(self.model.vnf.get('capabilities', None))
+            return {"external_cps": external_cps, "forward_cps": forward_cps}
+        return {}
+
+    def _trans_virtual_storage(self, virtual_storage):
+        if isinstance(virtual_storage, str):
+            return {"virtual_storage_id": virtual_storage}
+        else:
+            ret = {}
+            ret['virtual_storage_id'] = self.model.get_requirement_node_name(virtual_storage)
+            return ret
+
+    def _get_linked_vl_ids(self, node, node_templates):
+        vl_ids = []
+        cps = self._get_virtal_binding_cps(node, node_templates)
+        for cp in cps:
+            vl_reqs = self.model.getRequirementByName(cp, 'virtual_link')
+            for vl_req in vl_reqs:
+                vl_ids.append(self.model.get_requirement_node_name(vl_req))
+        return vl_ids
+
+    def _get_virtal_binding_cp_ids(self, node, nodeTemplates):
+        return map(lambda x: x['name'], self._get_virtal_binding_cps(node, nodeTemplates))
+
+    def _get_virtal_binding_cps(self, node, nodeTemplates):
+        cps = []
+        for tmpnode in nodeTemplates:
+            if 'requirements' in tmpnode:
+                for item in tmpnode['requirements']:
+                    for key, value in item.items():
+                        if key.upper().startswith('VIRTUAL_BINDING'):
+                            req_node_name = self.model.get_requirement_node_name(value)
+                            if req_node_name is not None and req_node_name == node['name']:
+                                cps.append(tmpnode)
+        return cps
+
+    def _get_node_vdu_id(self, node):
+        vdu_ids = map(lambda x: self.model.get_requirement_node_name(x), self.model.getRequirementByName(node, 'virtual_binding'))
+        if len(vdu_ids) > 0:
+            return vdu_ids[0]
+        return ""
+
+    def _get_node_vl_id(self, node):
+        vl_ids = map(lambda x: self.model.get_requirement_node_name(x), self.model.getRequirementByName(node, 'virtual_link'))
+        if len(vl_ids) > 0:
+            return vl_ids[0]
+        return ""
+
+    def _buil_cp_vls(self, node):
+        return map(lambda x: self._build_cp_vl(x), self.model.getRequirementByName(node, 'virtual_link'))
+
+    def _build_cp_vl(self, req):
+        cp_vl = {}
+        cp_vl['vl_id'] = self.model.get_prop_from_obj(req, 'node')
+        relationship = self.model.get_prop_from_obj(req, 'relationship')
+        if relationship is not None:
+            properties = self.model.get_prop_from_obj(relationship, 'properties')
+            if properties is not None and isinstance(properties, dict):
+                for key, value in properties.items():
+                    cp_vl[key] = value
+        return cp_vl
+
+    def _get_external_cps(self, vnf_requirements):
+        external_cps = []
+        if vnf_requirements:
+            if isinstance(vnf_requirements, dict):
+                for key, value in vnf_requirements.items():
+                    if isinstance(value, list) and len(value) > 0:
+                        external_cps.append({"key_name": key, "cpd_id": value[0]})
+                    else:
+                        external_cps.append({"key_name": key, "cpd_id": value})
+            elif isinstance(vnf_requirements, list):
+                for vnf_requirement in vnf_requirements:
+                    for key, value in vnf_requirement.items():
+                        if isinstance(value, list) and len(value) > 0:
+                            external_cps.append({"key_name": key, "cpd_id": value[0]})
+                        else:
+                            external_cps.append({"key_name": key, "cpd_id": value})
+        return external_cps
+
+    def _get_forward_cps(self, vnf_capabilities):
+        forward_cps = []
+        if vnf_capabilities:
+            for key, value in vnf_capabilities.items():
+                if isinstance(value, list) and len(value) > 0:
+                    forward_cps.append({"key_name": key, "cpd_id": value[0]})
+                else:
+                    forward_cps.append({"key_name": key, "cpd_id": value})
+        return forward_cps
diff --git a/genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_base.py b/genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_base.py
new file mode 100644 (file)
index 0000000..d14b380
--- /dev/null
@@ -0,0 +1,235 @@
+# Copyright 2019 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import functools
+import logging
+import os
+
+
+logger = logging.getLogger(__name__)
+
+SECTIONS = (VDU_COMPUTE_TYPE, VNF_VL_TYPE, VDU_CP_TYPE, VDU_STORAGE_TYPE) = \
+           ('tosca.nodes.nfv.Vdu.Compute', 'tosca.nodes.nfv.VnfVirtualLink', 'tosca.nodes.nfv.VduCp', 'tosca.nodes.nfv.Vdu.VirtualStorage')
+
+
+class VnfdSOLBase():
+
+    def __init__(self, model):
+        self.model = model
+
+    def build_vnf(self, tosca):
+        vnf = self.model.get_substitution_mappings(tosca)
+        properties = vnf.get("properties", {})
+        metadata = vnf.get("metadata", {})
+        if properties.get("descriptor_id", "") == "":
+            descriptor_id = metadata.get("descriptor_id", "")
+            if descriptor_id == "":
+                descriptor_id = metadata.get("id", "")
+            if descriptor_id == "":
+                descriptor_id = metadata.get("UUID", "")
+            properties["descriptor_id"] = descriptor_id
+
+        if properties.get("descriptor_verison", "") == "":
+            version = metadata.get("template_version", "")
+            if version == "":
+                version = metadata.get("version", "")
+            properties["descriptor_verison"] = version
+
+        if properties.get("provider", "") == "":
+            provider = metadata.get("template_author", "")
+            if provider == "":
+                provider = metadata.get("provider", "")
+            properties["provider"] = provider
+
+        if properties.get("template_name", "") == "":
+            template_name = metadata.get("template_name", "")
+            if template_name == "":
+                template_name = metadata.get("template_name", "")
+            properties["template_name"] = template_name
+        logger.debug("vnf:%s", vnf)
+        return vnf
+
+    def get_all_vl(self, nodeTemplates, node_types):
+        vls = []
+        for node in nodeTemplates:
+            if self.model.isNodeTypeX(node, node_types, VNF_VL_TYPE):
+                vl = dict()
+                vl['vl_id'] = node['name']
+                vl['description'] = node['description']
+                vl['properties'] = node['properties']
+                vls.append(vl)
+        return vls
+
+    def get_all_cp(self, nodeTemplates, node_types):
+        cps = []
+        for node in nodeTemplates:
+            if self.model.isNodeTypeX(node, node_types, VDU_CP_TYPE):
+                cp = {}
+                cp['cp_id'] = node['name']
+                cp['cpd_id'] = node['name']
+                cp['description'] = node['description']
+                cp['properties'] = node['properties']
+                cp['vl_id'] = self._get_node_vl_id(node)
+                cp['vdu_id'] = self._get_node_vdu_id(node)
+                vls = self._buil_cp_vls(node)
+                if len(vls) > 1:
+                    cp['vls'] = vls
+                cps.append(cp)
+        return cps
+
+    def get_all_volume_storage(self, nodeTemplates, node_types):
+        rets = []
+        for node in nodeTemplates:
+            if self.model.isNodeTypeX(node, node_types, VDU_STORAGE_TYPE):
+                ret = {}
+                ret['volume_storage_id'] = node['name']
+                if 'description' in node:
+                    ret['description'] = node['description']
+                ret['properties'] = node['properties']
+                rets.append(ret)
+        return rets
+
+    def get_all_vdu(self, nodeTemplates, node_types):
+        rets = []
+        inject_files = []
+        for node in nodeTemplates:
+            logger.debug("nodeTemplates :%s", node)
+            if self.model.isNodeTypeX(node, node_types, VDU_COMPUTE_TYPE):
+                ret = {}
+                ret['vdu_id'] = node['name']
+                ret['type'] = node['nodeType']
+                if 'description' in node:
+                    ret['description'] = node['description']
+                ret['properties'] = node['properties']
+                if 'inject_files' in node['properties']:
+                    inject_files = node['properties']['inject_files']
+                if inject_files is not None:
+                    if isinstance(inject_files, list):
+                        for inject_file in inject_files:
+                            source_path = os.path.join(self.model.basepath, inject_file['source_path'])
+                            with open(source_path, "rb") as f:
+                                source_data = f.read()
+                                source_data_base64 = source_data.encode("base64")
+                                inject_file["source_data_base64"] = source_data_base64
+                    if isinstance(inject_files, dict):
+                        source_path = os.path.join(self.model.basepath, inject_files['source_path'])
+                        with open(source_path, "rb") as f:
+                            source_data = f.read()
+                            source_data_base64 = source_data.encode("base64")
+                            inject_files["source_data_base64"] = source_data_base64
+                virtual_storages = self.model.getRequirementByName(node, 'virtual_storage')
+                ret['virtual_storages'] = map(functools.partial(self._trans_virtual_storage), virtual_storages)
+                ret['dependencies'] = map(lambda x: self.model.get_requirement_node_name(x), self.model.getNodeDependencys(node))
+                virtual_compute = self.model.getCapabilityByName(node, 'virtual_compute')
+                if virtual_compute is not None and 'properties' in virtual_compute:
+                    ret['virtual_compute'] = virtual_compute['properties']
+                ret['vls'] = self._get_linked_vl_ids(node, nodeTemplates)
+                ret['cps'] = self._get_virtal_binding_cp_ids(node, nodeTemplates)
+                ret['artifacts'] = self.model.build_artifacts(node)
+                rets.append(ret)
+        logger.debug("rets:%s", rets)
+        return rets
+
+    def get_all_endpoint_exposed(self):
+        if self.model.vnf:
+            external_cps = self._get_external_cps(self.model.vnf.get('requirements', None))
+            forward_cps = self._get_forward_cps(self.model.vnf.get('capabilities', None))
+            return {"external_cps": external_cps, "forward_cps": forward_cps}
+        return {}
+
+    def _trans_virtual_storage(self, virtual_storage):
+        if isinstance(virtual_storage, str):
+            return {"virtual_storage_id": virtual_storage}
+        else:
+            ret = {}
+            ret['virtual_storage_id'] = self.model.get_requirement_node_name(virtual_storage)
+            return ret
+
+    def _get_linked_vl_ids(self, node, node_templates):
+        vl_ids = []
+        cps = self._get_virtal_binding_cps(node, node_templates)
+        for cp in cps:
+            vl_reqs = self.model.getRequirementByName(cp, 'virtual_link')
+            for vl_req in vl_reqs:
+                vl_ids.append(self.model.get_requirement_node_name(vl_req))
+        return vl_ids
+
+    def _get_virtal_binding_cp_ids(self, node, nodeTemplates):
+        return map(lambda x: x['name'], self._get_virtal_binding_cps(node, nodeTemplates))
+
+    def _get_virtal_binding_cps(self, node, nodeTemplates):
+        cps = []
+        for tmpnode in nodeTemplates:
+            if 'requirements' in tmpnode:
+                for item in tmpnode['requirements']:
+                    for key, value in item.items():
+                        if key.upper().startswith('VIRTUAL_BINDING'):
+                            req_node_name = self.model.get_requirement_node_name(value)
+                            if req_node_name is not None and req_node_name == node['name']:
+                                cps.append(tmpnode)
+        return cps
+
+    def _get_node_vdu_id(self, node):
+        vdu_ids = map(lambda x: self.model.get_requirement_node_name(x), self.model.getRequirementByName(node, 'virtual_binding'))
+        if len(vdu_ids) > 0:
+            return vdu_ids[0]
+        return ""
+
+    def _get_node_vl_id(self, node):
+        vl_ids = map(lambda x: self.model.get_requirement_node_name(x), self.model.getRequirementByName(node, 'virtual_link'))
+        if len(vl_ids) > 0:
+            return vl_ids[0]
+        return ""
+
+    def _buil_cp_vls(self, node):
+        return map(lambda x: self._build_cp_vl(x), self.model.getRequirementByName(node, 'virtual_link'))
+
+    def _build_cp_vl(self, req):
+        cp_vl = {}
+        cp_vl['vl_id'] = self.model.get_prop_from_obj(req, 'node')
+        relationship = self.model.get_prop_from_obj(req, 'relationship')
+        if relationship is not None:
+            properties = self.model.get_prop_from_obj(relationship, 'properties')
+            if properties is not None and isinstance(properties, dict):
+                for key, value in properties.items():
+                    cp_vl[key] = value
+        return cp_vl
+
+    def _get_external_cps(self, vnf_requirements):
+        external_cps = []
+        if vnf_requirements:
+            if isinstance(vnf_requirements, dict):
+                for key, value in vnf_requirements.items():
+                    if isinstance(value, list) and len(value) > 0:
+                        external_cps.append({"key_name": key, "cpd_id": value[0]})
+                    else:
+                        external_cps.append({"key_name": key, "cpd_id": value})
+            elif isinstance(vnf_requirements, list):
+                for vnf_requirement in vnf_requirements:
+                    for key, value in vnf_requirement.items():
+                        if isinstance(value, list) and len(value) > 0:
+                            external_cps.append({"key_name": key, "cpd_id": value[0]})
+                        else:
+                            external_cps.append({"key_name": key, "cpd_id": value})
+        return external_cps
+
+    def _get_forward_cps(self, vnf_capabilities):
+        forward_cps = []
+        if vnf_capabilities:
+            for key, value in vnf_capabilities.items():
+                if isinstance(value, list) and len(value) > 0:
+                    forward_cps.append({"key_name": key, "cpd_id": value[0]})
+                else:
+                    forward_cps.append({"key_name": key, "cpd_id": value})
+        return forward_cps
index 9e4c027..81ef49a 100644 (file)
@@ -31,3 +31,15 @@ class SampleViewTest(unittest.TestCase):
         self.assertEqual(status.HTTP_200_OK, response.status_code, response.content)
         resp_data = json.loads(response.content)
         self.assertEqual({"status": "active"}, resp_data)
         self.assertEqual(status.HTTP_200_OK, response.status_code, response.content)
         resp_data = json.loads(response.content)
         self.assertEqual({"status": "active"}, resp_data)
+
+
+class CallbackSampleTest(unittest.TestCase):
+    def setUp(self):
+        self.client = Client()
+
+    def tearDown(self):
+        pass
+
+    def test_callback(self):
+        response = self.client.get("/api/genericparser/v1/callback_sample")
+        self.assertEqual(status.HTTP_204_NO_CONTENT, response.status_code, response.content)
index 725b343..bb21d5a 100644 (file)
@@ -17,4 +17,6 @@ from genericparser.samples import views
 
 urlpatterns = [
     url(r'^api/genericparser/v1/mandb/(?P<modelName>[a-zA-Z\-]+)$', views.TablesList.as_view()),
 
 urlpatterns = [
     url(r'^api/genericparser/v1/mandb/(?P<modelName>[a-zA-Z\-]+)$', views.TablesList.as_view()),
-    url(r'^samples/$', views.SampleList.as_view()), ]
+    url(r'^api/genericparser/v1/callback_sample$', views.CallbackSample.as_view()),
+    url(r'^samples/$', views.SampleList.as_view())
+]
index 524280f..006f0e5 100644 (file)
@@ -31,6 +31,15 @@ class SampleList(APIView):
         return Response({"status": "active"})
 
 
         return Response({"status": "active"})
 
 
+class CallbackSample(APIView):
+    """
+    Callback Sample.
+    """
+    def get(self, request, format=None):
+        logger.debug("Callback Sample")
+        return Response(data={}, status=status.HTTP_204_NO_CONTENT)
+
+
 class TablesList(APIView):
     def delete(self, request, modelName):
         logger.debug("Start delete model %s", modelName)
 class TablesList(APIView):
     def delete(self, request, modelName):
         logger.debug("Start delete model %s", modelName)
index 9bdeb1e..f59c0da 100644 (file)
@@ -48,6 +48,7 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'django.contrib.admin',
     'rest_framework',
     'genericparser.pub.database',
     'genericparser.samples',
     'rest_framework',
     'genericparser.pub.database',
     'genericparser.samples',
index 8e9b0aa..a3cf4ff 100644 (file)
 # limitations under the License.
 
 from django.conf.urls import include, url
 # limitations under the License.
 
 from django.conf.urls import include, url
+from django.contrib import admin
+
 
 from genericparser.pub.config.config import REG_TO_MSB_WHEN_START, REG_TO_MSB_REG_URL, REG_TO_MSB_REG_PARAM
 
 urlpatterns = [
 
 from genericparser.pub.config.config import REG_TO_MSB_WHEN_START, REG_TO_MSB_REG_URL, REG_TO_MSB_REG_PARAM
 
 urlpatterns = [
+    url(r'^api/genericparser/v1/admin', admin.site.urls),
     url(r'^', include('genericparser.samples.urls')),
     url(r'^', include('genericparser.packages.urls')),
     url(r'^', include('genericparser.jobs.urls')),
     url(r'^', include('genericparser.samples.urls')),
     url(r'^', include('genericparser.packages.urls')),
     url(r'^', include('genericparser.jobs.urls')),
diff --git a/run.sh b/run.sh
index d8879e8..7912bd9 100755 (executable)
--- a/run.sh
+++ b/run.sh
@@ -22,7 +22,7 @@ fi
 # nohup uwsgi --http :8806 -t 120 --module genericparser.wsgi --master --processes 4 &
 
 
 # nohup uwsgi --http :8806 -t 120 --module genericparser.wsgi --master --processes 4 &
 
 
-if [ ${SSL_ENABLED} = "true" ]; then
+if [ "${SSL_ENABLED}" = "true" ]; then
     nohup uwsgi --https :8806,genericparser/pub/ssl/cert/foobar.crt,genericparser/pub/ssl/cert/foobar.key, -t 120 --module genericparser.wsgi --master --processes 4 &
 else
     nohup uwsgi --http :8806 -t 120 --module genericparser.wsgi --master --processes 4 &
     nohup uwsgi --https :8806,genericparser/pub/ssl/cert/foobar.crt,genericparser/pub/ssl/cert/foobar.key, -t 120 --module genericparser.wsgi --master --processes 4 &
 else
     nohup uwsgi --http :8806 -t 120 --module genericparser.wsgi --master --processes 4 &