From 52a969dcc2a935930a559b1780d7c95e1cc45d73 Mon Sep 17 00:00:00 2001 From: yangyan Date: Tue, 30 Apr 2019 15:59:45 +0800 Subject: [PATCH] code refactor for genericparser Change-Id: I68a128944cde015d767576fc4e159d67db2d6b5d Issue-ID: VFC-1372 Signed-off-by: yangyan --- docker/docker-env-conf.sh | 8 +- genericparser/packages/biz/common.py | 6 +- genericparser/packages/biz/pnf_descriptor.py | 13 +- genericparser/packages/biz/vnf_pkg_subscription.py | 17 +- genericparser/packages/const.py | 71 ++-- genericparser/packages/tests/const.py | 139 ++++++++ genericparser/packages/tests/test_ns_descriptor.py | 2 +- .../packages/tests/test_nsdm_subscription.py | 11 +- genericparser/packages/tests/test_nspackage.py | 222 +------------ .../packages/tests/test_pnf_descriptor.py | 6 +- .../packages/tests/test_service_descriptor.py | 98 +----- genericparser/packages/tests/test_vnf_package.py | 23 +- .../packages/tests/test_vnf_pkg_subscription.py | 142 ++++---- genericparser/packages/tests/test_vnfpackage.py | 292 ++++------------- genericparser/packages/views/common.py | 28 ++ .../packages/views/ns_descriptor_views.py | 2 +- .../packages/views/nsdm_subscription_views.py | 206 +++--------- .../packages/views/pnf_descriptor_views.py | 27 +- .../packages/views/vnf_package_artifact_views.py | 2 +- .../views/vnf_package_subscription_views.py | 132 +++----- genericparser/packages/views/vnf_package_views.py | 22 +- genericparser/pub/config/config.py | 2 + genericparser/pub/database/admin.py | 361 +++++++++++++++++++++ genericparser/pub/exceptions.py | 4 + genericparser/pub/utils/toscaparsers/tests.py | 34 +- genericparser/pub/utils/toscaparsers/vnfdmodel.py | 243 +------------- .../pub/utils/toscaparsers/vnfdparser/__init__.py | 24 ++ .../utils/toscaparsers/vnfdparser/vnfd_sol_251.py | 235 ++++++++++++++ .../utils/toscaparsers/vnfdparser/vnfd_sol_base.py | 235 ++++++++++++++ genericparser/samples/tests.py | 12 + genericparser/samples/urls.py | 4 +- genericparser/samples/views.py | 9 + genericparser/settings.py | 1 + genericparser/urls.py | 3 + run.sh | 2 +- 35 files changed, 1434 insertions(+), 1204 deletions(-) create mode 100644 genericparser/pub/database/admin.py create mode 100644 genericparser/pub/utils/toscaparsers/vnfdparser/__init__.py create mode 100644 genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_251.py create mode 100644 genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_base.py diff --git a/docker/docker-env-conf.sh b/docker/docker-env-conf.sh index c919dda..f62c52a 100755 --- a/docker/docker-env-conf.sh +++ b/docker/docker-env-conf.sh @@ -2,7 +2,6 @@ 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 @@ -13,7 +12,6 @@ install_sf(){ 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 } @@ -32,11 +30,11 @@ config_logdir(){ 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 - + } clean_sf_cache(){ diff --git a/genericparser/packages/biz/common.py b/genericparser/packages/biz/common.py index be5627e..9b72b63 100644 --- a/genericparser/packages/biz/common.py +++ b/genericparser/packages/biz/common.py @@ -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: - [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 diff --git a/genericparser/packages/biz/pnf_descriptor.py b/genericparser/packages/biz/pnf_descriptor.py index ae635ff..d29a2ad 100644 --- a/genericparser/packages/biz/pnf_descriptor.py +++ b/genericparser/packages/biz/pnf_descriptor.py @@ -53,7 +53,8 @@ class PnfDescriptor(object): 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: @@ -140,10 +141,10 @@ class PnfDescriptor(object): 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 == "": @@ -212,7 +213,7 @@ class PnfDescriptor(object): 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: diff --git a/genericparser/packages/biz/vnf_pkg_subscription.py b/genericparser/packages/biz/vnf_pkg_subscription.py index 349db08..29f202f 100644 --- a/genericparser/packages/biz/vnf_pkg_subscription.py +++ b/genericparser/packages/biz/vnf_pkg_subscription.py @@ -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: - 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: - 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()) @@ -77,7 +82,9 @@ class CreateSubscription(object): 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() diff --git a/genericparser/packages/const.py b/genericparser/packages/const.py index 86fbb79..2b8778b 100644 --- a/genericparser/packages/const.py +++ b/genericparser/packages/const.py @@ -14,34 +14,65 @@ 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" -NOTIFICATION_TYPES = ["VnfPackageOnboardingNotification", "VnfPackageChangeNotification"] +NOTIFICATION_TYPES = [ + "VnfPackageOnboardingNotification", + "VnfPackageChangeNotification" +] 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" +] diff --git a/genericparser/packages/tests/const.py b/genericparser/packages/tests/const.py index caf60e3..a98ccb6 100644 --- a/genericparser/packages/tests/const.py +++ b/genericparser/packages/tests/const.py @@ -455,3 +455,142 @@ pnfd_data = { "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" + } + } +} diff --git a/genericparser/packages/tests/test_ns_descriptor.py b/genericparser/packages/tests/test_ns_descriptor.py index 6c4133c..862030a 100644 --- a/genericparser/packages/tests/test_ns_descriptor.py +++ b/genericparser/packages/tests/test_ns_descriptor.py @@ -248,7 +248,7 @@ class TestNsDescriptor(TestCase): response = self.client.get( "/api/nsd/v1/ns_descriptors/23/nsd_content", - RANGE='5-10', + HTTP_RANGE='5-10', format='json' ) partial_file_content = '' diff --git a/genericparser/packages/tests/test_nsdm_subscription.py b/genericparser/packages/tests/test_nsdm_subscription.py index 2d98d7a..99ec92f 100644 --- a/genericparser/packages/tests/test_nsdm_subscription.py +++ b/genericparser/packages/tests/test_nsdm_subscription.py @@ -100,8 +100,7 @@ class TestNsdmSubscription(TestCase): 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') @@ -149,7 +148,6 @@ class TestNsdmSubscription(TestCase): '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') @@ -192,7 +190,6 @@ class TestNsdmSubscription(TestCase): 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') @@ -218,7 +215,6 @@ class TestNsdmSubscription(TestCase): 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') @@ -241,7 +237,6 @@ class TestNsdmSubscription(TestCase): 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') @@ -267,7 +262,6 @@ class TestNsdmSubscription(TestCase): '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') @@ -296,7 +290,6 @@ class TestNsdmSubscription(TestCase): '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') @@ -325,7 +318,6 @@ class TestNsdmSubscription(TestCase): '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') @@ -459,7 +451,6 @@ class TestNsdmSubscription(TestCase): def test_nsdm_get_subscription_failure(self): expected_data = { - "title": "Query Subscription Failed!", "status": 404, "detail": "Subscription(" + self.subscription_id + ") " "doesn't exists" diff --git a/genericparser/packages/tests/test_nspackage.py b/genericparser/packages/tests/test_nspackage.py index 100ebd5..393e0f7 100644 --- a/genericparser/packages/tests/test_nspackage.py +++ b/genericparser/packages/tests/test_nspackage.py @@ -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 .const import nsd_data class TestNsPackage(TestCase): @@ -28,226 +29,7 @@ class TestNsPackage(TestCase): 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 diff --git a/genericparser/packages/tests/test_pnf_descriptor.py b/genericparser/packages/tests/test_pnf_descriptor.py index 22615f5..fc32bbe 100644 --- a/genericparser/packages/tests/test_pnf_descriptor.py +++ b/genericparser/packages/tests/test_pnf_descriptor.py @@ -17,6 +17,7 @@ import copy import json import mock import os +import shutil 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.pub.config.config import GENERICPARSER_ROOT_PATH from genericparser.pub.database.models import PnfPackageModel, NSPackageModel from genericparser.pub.utils import toscaparsers @@ -54,7 +56,9 @@ class TestPnfDescriptor(TestCase): } 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} diff --git a/genericparser/packages/tests/test_service_descriptor.py b/genericparser/packages/tests/test_service_descriptor.py index 30eafe0..0734577 100644 --- a/genericparser/packages/tests/test_service_descriptor.py +++ b/genericparser/packages/tests/test_service_descriptor.py @@ -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 .const import sd_data logger = logging.getLogger(__name__) @@ -37,102 +38,7 @@ class TestServiceDescription(TestCase): 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): diff --git a/genericparser/packages/tests/test_vnf_package.py b/genericparser/packages/tests/test_vnf_package.py index 22488ba..31c7223 100644 --- a/genericparser/packages/tests/test_vnf_package.py +++ b/genericparser/packages/tests/test_vnf_package.py @@ -16,6 +16,7 @@ import json import os import urllib2 import mock +import shutil from django.test import TestCase from rest_framework import status @@ -42,7 +43,9 @@ class TestVnfPackage(TestCase): 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): @@ -250,7 +253,7 @@ class TestVnfPackage(TestCase): 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 @@ -258,6 +261,22 @@ class TestVnfPackage(TestCase): 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) diff --git a/genericparser/packages/tests/test_vnf_pkg_subscription.py b/genericparser/packages/tests/test_vnf_pkg_subscription.py index 25e8c5d..e35f195 100644 --- a/genericparser/packages/tests/test_vnf_pkg_subscription.py +++ b/genericparser/packages/tests/test_vnf_pkg_subscription.py @@ -14,56 +14,19 @@ import uuid import mock + from rest_framework.test import APIClient from django.test import TestCase + 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() - 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 @@ -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 - 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(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") @@ -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] - 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(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 - 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") @@ -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 - 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)) @@ -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 - 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") @@ -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 - 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"]) @@ -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 - 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") @@ -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 - 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()) - 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) diff --git a/genericparser/packages/tests/test_vnfpackage.py b/genericparser/packages/tests/test_vnfpackage.py index 34b9134..70f7021 100644 --- a/genericparser/packages/tests/test_vnfpackage.py +++ b/genericparser/packages/tests/test_vnfpackage.py @@ -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 .const import vnfd_data class TestNfPackage(TestCase): @@ -30,220 +31,7 @@ class TestNfPackage(TestCase): 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 @@ -257,32 +45,44 @@ class TestNfPackage(TestCase): @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): - 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, - 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'] - 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="", @@ -319,10 +119,24 @@ class TestNfPackage(TestCase): 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 = [ @@ -358,8 +172,15 @@ class TestNfPackage(TestCase): 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) @@ -380,8 +201,13 @@ class TestNfPackage(TestCase): 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) diff --git a/genericparser/packages/views/common.py b/genericparser/packages/views/common.py index 70637a9..41ba17c 100644 --- a/genericparser/packages/views/common.py +++ b/genericparser/packages/views/common.py @@ -19,10 +19,14 @@ from rest_framework import status 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 NsdmDuplicateSubscriptionException +from genericparser.pub.exceptions import VnfPkgDuplicateSubscriptionException +from genericparser.pub.exceptions import VnfPkgSubscriptionException logger = logging.getLogger(__name__) @@ -54,6 +58,18 @@ def view_safe_call_with_log(logger): 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( @@ -72,12 +88,24 @@ def view_safe_call_with_log(logger): 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 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( diff --git a/genericparser/packages/views/ns_descriptor_views.py b/genericparser/packages/views/ns_descriptor_views.py index 86a3e9e..bbe51ea 100644 --- a/genericparser/packages/views/ns_descriptor_views.py +++ b/genericparser/packages/views/ns_descriptor_views.py @@ -134,6 +134,6 @@ def nsd_content_ru(request, **kwargs): 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) diff --git a/genericparser/packages/views/nsdm_subscription_views.py b/genericparser/packages/views/nsdm_subscription_views.py index 865ece4..cd80e6d 100644 --- a/genericparser/packages/views/nsdm_subscription_views.py +++ b/genericparser/packages/views/nsdm_subscription_views.py @@ -13,27 +13,22 @@ # 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 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__) @@ -46,17 +41,6 @@ def validate_data(data, serializer): 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", @@ -80,84 +64,33 @@ def get_problem_details_serializer(title, status_code, error_message): } ) @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) - 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) - 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( @@ -183,77 +116,14 @@ def nsd_subscription_rc(request): } ) @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") + validate_data({'subscription_id': subscription_id}, NsdmSubscriptionIdSerializer) 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': - 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) diff --git a/genericparser/packages/views/pnf_descriptor_views.py b/genericparser/packages/views/pnf_descriptor_views.py index e82374f..7abd8ad 100644 --- a/genericparser/packages/views/pnf_descriptor_views.py +++ b/genericparser/packages/views/pnf_descriptor_views.py @@ -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.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.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 @@ -42,8 +42,8 @@ logger = logging.getLogger(__name__) 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( @@ -52,7 +52,7 @@ logger = logging.getLogger(__name__) 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']) @@ -77,7 +77,7 @@ def pnfd_info_rd(request, **kwargs): # TODO 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( @@ -86,7 +86,7 @@ def pnfd_info_rd(request, **kwargs): # TODO 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']) @@ -99,11 +99,7 @@ def pnf_descriptors_rc(request): 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) @@ -114,7 +110,7 @@ def pnf_descriptors_rc(request): 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( @@ -123,8 +119,8 @@ def pnf_descriptors_rc(request): 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']) @@ -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) - 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 diff --git a/genericparser/packages/views/vnf_package_artifact_views.py b/genericparser/packages/views/vnf_package_artifact_views.py index a6d57f8..164db6c 100644 --- a/genericparser/packages/views/vnf_package_artifact_views.py +++ b/genericparser/packages/views/vnf_package_artifact_views.py @@ -39,7 +39,7 @@ class FetchVnfPkgmArtifactsView(APIView): @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() } diff --git a/genericparser/packages/views/vnf_package_subscription_views.py b/genericparser/packages/views/vnf_package_subscription_views.py index 897b43c..135b625 100644 --- a/genericparser/packages/views/vnf_package_subscription_views.py +++ b/genericparser/packages/views/vnf_package_subscription_views.py @@ -12,8 +12,6 @@ # 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 @@ -21,26 +19,29 @@ from rest_framework import status 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.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.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): @@ -52,25 +53,14 @@ class CreateQuerySubscriptionView(APIView): 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) - 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={ @@ -79,27 +69,20 @@ class CreateQuerySubscriptionView(APIView): 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) - 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): @@ -111,29 +94,17 @@ class QueryTerminateSubscriptionView(APIView): 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) - 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={ @@ -142,20 +113,9 @@ class QueryTerminateSubscriptionView(APIView): 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) - 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) diff --git a/genericparser/packages/views/vnf_package_views.py b/genericparser/packages/views/vnf_package_views.py index 91238f9..bfb1224 100644 --- a/genericparser/packages/views/vnf_package_views.py +++ b/genericparser/packages/views/vnf_package_views.py @@ -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 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.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__) @@ -60,7 +62,8 @@ def vnf_packages_rc(request): 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) @@ -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) - 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": - 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) @@ -123,12 +123,10 @@ def package_content_ru(request, **kwargs): 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) - except GenericparserException as e: - handle_upload_failed(vnf_pkg_id) - raise e except Exception as e: handle_upload_failed(vnf_pkg_id) raise e diff --git a/genericparser/pub/config/config.py b/genericparser/pub/config/config.py index 60b4836..574d4d7 100644 --- a/genericparser/pub/config/config.py +++ b/genericparser/pub/config/config.py @@ -81,3 +81,5 @@ GENERICPARSER_URL_PATH = None 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 index 0000000..ec7a92a --- /dev/null +++ b/genericparser/pub/database/admin.py @@ -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) diff --git a/genericparser/pub/exceptions.py b/genericparser/pub/exceptions.py index 626e567..b3c797d 100644 --- a/genericparser/pub/exceptions.py +++ b/genericparser/pub/exceptions.py @@ -49,5 +49,9 @@ class NsdmDuplicateSubscriptionException(GenericparserException): pass +class BadRequestException(GenericparserException): + pass + + class ArtifactNotFoundException(GenericparserException): pass diff --git a/genericparser/pub/utils/toscaparsers/tests.py b/genericparser/pub/utils/toscaparsers/tests.py index c461790..e28f712 100644 --- a/genericparser/pub/utils/toscaparsers/tests.py +++ b/genericparser/pub/utils/toscaparsers/tests.py @@ -35,26 +35,26 @@ class TestToscaparser(TestCase): 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" - 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" - 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() diff --git a/genericparser/pub/utils/toscaparsers/vnfdmodel.py b/genericparser/pub/utils/toscaparsers/vnfdmodel.py index 7b4423d..37a6472 100644 --- a/genericparser/pub/utils/toscaparsers/vnfdmodel.py +++ b/genericparser/pub/utils/toscaparsers/vnfdmodel.py @@ -14,15 +14,13 @@ 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.vnfdparser import CreateVnfdSOLParser # 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"]] @@ -30,236 +28,21 @@ NFV_VNF_RELATIONSHIPS = [["tosca.relationships.nfv.VirtualLinksTo", "tosca.relat class EtsiVnfdInfoModel(BaseInfoModel): def __init__(self, path, params): + self.vnf = {} 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) - 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.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) - - 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 index 0000000..179fb4c --- /dev/null +++ b/genericparser/pub/utils/toscaparsers/vnfdparser/__init__.py @@ -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 index 0000000..d6c15de --- /dev/null +++ b/genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_251.py @@ -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 index 0000000..d14b380 --- /dev/null +++ b/genericparser/pub/utils/toscaparsers/vnfdparser/vnfd_sol_base.py @@ -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 diff --git a/genericparser/samples/tests.py b/genericparser/samples/tests.py index 9e4c027..81ef49a 100644 --- a/genericparser/samples/tests.py +++ b/genericparser/samples/tests.py @@ -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) + + +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) diff --git a/genericparser/samples/urls.py b/genericparser/samples/urls.py index 725b343..bb21d5a 100644 --- a/genericparser/samples/urls.py +++ b/genericparser/samples/urls.py @@ -17,4 +17,6 @@ from genericparser.samples import views urlpatterns = [ url(r'^api/genericparser/v1/mandb/(?P[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()) +] diff --git a/genericparser/samples/views.py b/genericparser/samples/views.py index 524280f..006f0e5 100644 --- a/genericparser/samples/views.py +++ b/genericparser/samples/views.py @@ -31,6 +31,15 @@ class SampleList(APIView): 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) diff --git a/genericparser/settings.py b/genericparser/settings.py index 9bdeb1e..f59c0da 100644 --- a/genericparser/settings.py +++ b/genericparser/settings.py @@ -48,6 +48,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.admin', 'rest_framework', 'genericparser.pub.database', 'genericparser.samples', diff --git a/genericparser/urls.py b/genericparser/urls.py index 8e9b0aa..a3cf4ff 100644 --- a/genericparser/urls.py +++ b/genericparser/urls.py @@ -13,10 +13,13 @@ # 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 = [ + 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')), diff --git a/run.sh b/run.sh index d8879e8..7912bd9 100755 --- a/run.sh +++ b/run.sh @@ -22,7 +22,7 @@ fi # 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 & -- 2.16.6