From a32c2b20207885d895bd96204cc166fca14db97b Mon Sep 17 00:00:00 2001 From: dyh Date: Wed, 4 Sep 2019 09:52:48 +0800 Subject: update for change to etsicatalog Change-Id: Idc2a6950960a324964500a8c4701be422de2b782 Issue-ID: MODELING-216 Signed-off-by: dyh --- genericparser/packages/__init__.py | 13 - genericparser/packages/biz/__init__.py | 13 - genericparser/packages/biz/common.py | 51 -- genericparser/packages/biz/ns_descriptor.py | 239 --------- genericparser/packages/biz/nsdm_subscription.py | 218 -------- genericparser/packages/biz/pnf_descriptor.py | 228 -------- genericparser/packages/biz/sdc_ns_package.py | 172 ------ genericparser/packages/biz/sdc_service_package.py | 124 ----- genericparser/packages/biz/sdc_vnf_package.py | 254 --------- genericparser/packages/biz/service_descriptor.py | 130 ----- genericparser/packages/biz/vnf_package.py | 227 -------- genericparser/packages/biz/vnf_pkg_artifacts.py | 43 -- genericparser/packages/biz/vnf_pkg_subscription.py | 190 ------- genericparser/packages/const.py | 78 --- genericparser/packages/serializers/__init__.py | 13 - genericparser/packages/serializers/checksum.py | 30 -- .../serializers/create_nsd_info_request.py | 29 - .../serializers/create_pnfd_info_request.py | 29 - .../serializers/create_vnf_pkg_info_req.py | 27 - .../serializers/genericparser_serializers.py | 442 --------------- genericparser/packages/serializers/link.py | 24 - genericparser/packages/serializers/nsd_info.py | 161 ------ genericparser/packages/serializers/nsd_infos.py | 20 - .../packages/serializers/nsdm_filter_data.py | 177 ------ .../packages/serializers/nsdm_subscription.py | 84 --- genericparser/packages/serializers/pnfd_info.py | 107 ---- genericparser/packages/serializers/pnfd_infos.py | 20 - .../packages/serializers/problem_details.py | 58 -- genericparser/packages/serializers/response.py | 51 -- .../packages/serializers/subscription_auth_data.py | 77 --- .../serializers/upload_vnf_pkg_from_uri_req.py | 36 -- .../packages/serializers/vnf_pkg_artifact_info.py | 39 -- genericparser/packages/serializers/vnf_pkg_info.py | 127 ----- .../packages/serializers/vnf_pkg_infos.py | 20 - .../packages/serializers/vnf_pkg_notifications.py | 117 ---- .../serializers/vnf_pkg_software_image_info.py | 96 ---- .../packages/serializers/vnf_pkg_subscription.py | 93 ---- genericparser/packages/tests/__init__.py | 13 - genericparser/packages/tests/const.py | 596 --------------------- genericparser/packages/tests/test_health_check.py | 44 -- genericparser/packages/tests/test_ns_descriptor.py | 302 ----------- .../packages/tests/test_nsdm_subscription.py | 521 ------------------ genericparser/packages/tests/test_nspackage.py | 246 --------- .../packages/tests/test_pnf_descriptor.py | 287 ---------- .../packages/tests/test_service_descriptor.py | 95 ---- .../packages/tests/test_servicepackage.py | 481 ----------------- genericparser/packages/tests/test_vnf_package.py | 391 -------------- .../packages/tests/test_vnf_pkg_subscription.py | 183 ------- genericparser/packages/tests/test_vnfpackage.py | 231 -------- genericparser/packages/urls.py | 72 --- genericparser/packages/views/__init__.py | 13 - genericparser/packages/views/catalog_views.py | 535 ------------------ genericparser/packages/views/common.py | 123 ----- genericparser/packages/views/health_check_views.py | 31 -- .../packages/views/ns_descriptor_views.py | 139 ----- .../packages/views/nsdm_subscription_views.py | 127 ----- .../packages/views/pnf_descriptor_views.py | 166 ------ .../packages/views/vnf_package_artifact_views.py | 54 -- .../views/vnf_package_subscription_views.py | 121 ----- genericparser/packages/views/vnf_package_views.py | 167 ------ 60 files changed, 8795 deletions(-) delete mode 100644 genericparser/packages/__init__.py delete mode 100644 genericparser/packages/biz/__init__.py delete mode 100644 genericparser/packages/biz/common.py delete mode 100644 genericparser/packages/biz/ns_descriptor.py delete mode 100644 genericparser/packages/biz/nsdm_subscription.py delete mode 100644 genericparser/packages/biz/pnf_descriptor.py delete mode 100644 genericparser/packages/biz/sdc_ns_package.py delete mode 100644 genericparser/packages/biz/sdc_service_package.py delete mode 100644 genericparser/packages/biz/sdc_vnf_package.py delete mode 100644 genericparser/packages/biz/service_descriptor.py delete mode 100644 genericparser/packages/biz/vnf_package.py delete mode 100644 genericparser/packages/biz/vnf_pkg_artifacts.py delete mode 100644 genericparser/packages/biz/vnf_pkg_subscription.py delete mode 100644 genericparser/packages/const.py delete mode 100644 genericparser/packages/serializers/__init__.py delete mode 100644 genericparser/packages/serializers/checksum.py delete mode 100644 genericparser/packages/serializers/create_nsd_info_request.py delete mode 100644 genericparser/packages/serializers/create_pnfd_info_request.py delete mode 100644 genericparser/packages/serializers/create_vnf_pkg_info_req.py delete mode 100644 genericparser/packages/serializers/genericparser_serializers.py delete mode 100644 genericparser/packages/serializers/link.py delete mode 100644 genericparser/packages/serializers/nsd_info.py delete mode 100644 genericparser/packages/serializers/nsd_infos.py delete mode 100644 genericparser/packages/serializers/nsdm_filter_data.py delete mode 100644 genericparser/packages/serializers/nsdm_subscription.py delete mode 100644 genericparser/packages/serializers/pnfd_info.py delete mode 100644 genericparser/packages/serializers/pnfd_infos.py delete mode 100644 genericparser/packages/serializers/problem_details.py delete mode 100644 genericparser/packages/serializers/response.py delete mode 100644 genericparser/packages/serializers/subscription_auth_data.py delete mode 100644 genericparser/packages/serializers/upload_vnf_pkg_from_uri_req.py delete mode 100644 genericparser/packages/serializers/vnf_pkg_artifact_info.py delete mode 100644 genericparser/packages/serializers/vnf_pkg_info.py delete mode 100644 genericparser/packages/serializers/vnf_pkg_infos.py delete mode 100644 genericparser/packages/serializers/vnf_pkg_notifications.py delete mode 100644 genericparser/packages/serializers/vnf_pkg_software_image_info.py delete mode 100644 genericparser/packages/serializers/vnf_pkg_subscription.py delete mode 100644 genericparser/packages/tests/__init__.py delete mode 100644 genericparser/packages/tests/const.py delete mode 100644 genericparser/packages/tests/test_health_check.py delete mode 100644 genericparser/packages/tests/test_ns_descriptor.py delete mode 100644 genericparser/packages/tests/test_nsdm_subscription.py delete mode 100644 genericparser/packages/tests/test_nspackage.py delete mode 100644 genericparser/packages/tests/test_pnf_descriptor.py delete mode 100644 genericparser/packages/tests/test_service_descriptor.py delete mode 100644 genericparser/packages/tests/test_servicepackage.py delete mode 100644 genericparser/packages/tests/test_vnf_package.py delete mode 100644 genericparser/packages/tests/test_vnf_pkg_subscription.py delete mode 100644 genericparser/packages/tests/test_vnfpackage.py delete mode 100644 genericparser/packages/urls.py delete mode 100644 genericparser/packages/views/__init__.py delete mode 100644 genericparser/packages/views/catalog_views.py delete mode 100644 genericparser/packages/views/common.py delete mode 100644 genericparser/packages/views/health_check_views.py delete mode 100644 genericparser/packages/views/ns_descriptor_views.py delete mode 100644 genericparser/packages/views/nsdm_subscription_views.py delete mode 100644 genericparser/packages/views/pnf_descriptor_views.py delete mode 100644 genericparser/packages/views/vnf_package_artifact_views.py delete mode 100644 genericparser/packages/views/vnf_package_subscription_views.py delete mode 100644 genericparser/packages/views/vnf_package_views.py (limited to 'genericparser/packages') diff --git a/genericparser/packages/__init__.py b/genericparser/packages/__init__.py deleted file mode 100644 index c7b6818..0000000 --- a/genericparser/packages/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2017 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. diff --git a/genericparser/packages/biz/__init__.py b/genericparser/packages/biz/__init__.py deleted file mode 100644 index 342c2a8..0000000 --- a/genericparser/packages/biz/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2018 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. diff --git a/genericparser/packages/biz/common.py b/genericparser/packages/biz/common.py deleted file mode 100644 index 9b72b63..0000000 --- a/genericparser/packages/biz/common.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2018 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 os - -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH -from genericparser.pub.utils import fileutil - -CHUNK_SIZE = 1024 * 8 - - -def save(remote_file, vnf_pkg_id): - local_file_name = remote_file.name - local_file_dir = os.path.join(GENERICPARSER_ROOT_PATH, vnf_pkg_id) - local_file_name = os.path.join(local_file_dir, local_file_name) - if not os.path.exists(local_file_dir): - fileutil.make_dirs(local_file_dir) - with open(local_file_name, 'wb') as local_file: - for chunk in remote_file.chunks(chunk_size=CHUNK_SIZE): - local_file.write(chunk) - return local_file_name - - -def read(file_path, start, end): - fp = open(file_path, 'rb') - fp.seek(start) - pos = start - while pos + CHUNK_SIZE < end: - yield fp.read(CHUNK_SIZE) - pos = fp.tell() - yield fp.read(end - pos) - - -def parse_file_range(file_path, file_range): - start, end = 0, os.path.getsize(file_path) - if file_range: - [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/ns_descriptor.py b/genericparser/packages/biz/ns_descriptor.py deleted file mode 100644 index 60d4a26..0000000 --- a/genericparser/packages/biz/ns_descriptor.py +++ /dev/null @@ -1,239 +0,0 @@ -# Copyright 2018 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 json -import logging -import os -import uuid - -from genericparser.packages.biz.common import parse_file_range, read, save -from genericparser.packages.const import PKG_STATUS -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH -from genericparser.pub.database.models import NSPackageModel, PnfPackageModel, VnfPackageModel -from genericparser.pub.exceptions import GenericparserException, ResourceNotFoundException -from genericparser.pub.utils import fileutil, toscaparsers -from genericparser.pub.utils.values import ignore_case_get - -logger = logging.getLogger(__name__) - -METADATA = "metadata" - - -class NsDescriptor(object): - - def __init__(self): - pass - - def create(self, data, id=None): - logger.info('Start to create a NSD...') - user_defined_data = ignore_case_get(data, 'userDefinedData', {}) - data = { - 'id': id if id else str(uuid.uuid4()), - 'nsdOnboardingState': PKG_STATUS.CREATED, - 'nsdOperationalState': PKG_STATUS.DISABLED, - 'nsdUsageState': PKG_STATUS.NOT_IN_USE, - 'userDefinedData': user_defined_data, - '_links': None # TODO - } - NSPackageModel.objects.create( - nsPackageId=data['id'], - onboardingState=data['nsdOnboardingState'], - operationalState=data['nsdOperationalState'], - usageState=data['nsdUsageState'], - userDefinedData=json.dumps(user_defined_data) - ) - logger.info('A NSD(%s) has been created.' % data['id']) - return data - - def query_multiple(self, nsdId=None): - if nsdId: - ns_pkgs = NSPackageModel.objects.filter(nsdId=nsdId) - else: - ns_pkgs = NSPackageModel.objects.all() - response_data = [] - for ns_pkg in ns_pkgs: - data = self.fill_resp_data(ns_pkg) - response_data.append(data) - return response_data - - def query_single(self, nsd_info_id): - ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id) - if not ns_pkgs.exists(): - logger.error('NSD(%s) does not exist.' % nsd_info_id) - raise ResourceNotFoundException('NSD(%s) does not exist.' % nsd_info_id) - return self.fill_resp_data(ns_pkgs[0]) - - def delete_single(self, nsd_info_id): - logger.info('Start to delete NSD(%s)...' % nsd_info_id) - ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id) - if not ns_pkgs.exists(): - logger.info('NSD(%s) has been deleted.' % nsd_info_id) - return - ''' - if ns_pkgs[0].operationalState != PKG_STATUS.DISABLED: - logger.error('NSD(%s) shall be DISABLED.' % nsd_info_id) - raise GenericparserException('NSD(%s) shall be DISABLED.' % nsd_info_id) - if ns_pkgs[0].usageState != PKG_STATUS.NOT_IN_USE: - logger.error('NSD(%s) shall be NOT_IN_USE.' % nsd_info_id) - raise GenericparserException('NSD(%s) shall be NOT_IN_USE.' % nsd_info_id) - ''' - ns_pkgs.delete() - ns_pkg_path = os.path.join(GENERICPARSER_ROOT_PATH, nsd_info_id) - fileutil.delete_dirs(ns_pkg_path) - logger.info('NSD(%s) has been deleted.' % nsd_info_id) - - def upload(self, nsd_info_id, remote_file): - logger.info('Start to upload NSD(%s)...' % nsd_info_id) - ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id) - if not ns_pkgs.exists(): - logger.error('NSD(%s) does not exist.' % nsd_info_id) - raise GenericparserException('NSD(%s) does not exist.' % nsd_info_id) - ns_pkgs.update(onboardingState=PKG_STATUS.UPLOADING) - - local_file_name = save(remote_file, nsd_info_id) - logger.info('NSD(%s) content has been uploaded.' % nsd_info_id) - return local_file_name - - def download(self, nsd_info_id, file_range): - logger.info('Start to download NSD(%s)...' % nsd_info_id) - ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id) - if not ns_pkgs.exists(): - logger.error('NSD(%s) does not exist.' % nsd_info_id) - raise ResourceNotFoundException('NSD(%s) does not exist.' % nsd_info_id) - if ns_pkgs[0].onboardingState != PKG_STATUS.ONBOARDED: - logger.error('NSD(%s) is not ONBOARDED.' % nsd_info_id) - raise GenericparserException('NSD(%s) is not ONBOARDED.' % nsd_info_id) - - local_file_path = ns_pkgs[0].localFilePath - start, end = parse_file_range(local_file_path, file_range) - logger.info('NSD(%s) has been downloaded.' % nsd_info_id) - return read(local_file_path, start, end) - - def parse_nsd_and_save(self, nsd_info_id, local_file_name): - logger.info('Start to process NSD(%s)...' % nsd_info_id) - ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id) - ns_pkgs.update(onboardingState=PKG_STATUS.PROCESSING) - - nsd_json = toscaparsers.parse_nsd(local_file_name) - logger.debug("%s", nsd_json) - nsd = json.JSONDecoder().decode(nsd_json) - - nsd_id = nsd.get("ns", {}).get("properties", {}).get("descriptor_id", "") - nsd_name = nsd.get("ns", {}).get("properties", {}).get("name", "") - nsd_version = nsd.get("ns", {}).get("properties", {}).get("version", "") - nsd_designer = nsd.get("ns", {}).get("properties", {}).get("designer", "") - invariant_id = nsd.get("ns", {}).get("properties", {}).get("invariant_id", "") - if nsd_id == "": - raise GenericparserException("nsd_id(%s) does not exist in metadata." % nsd_id) - other_nspkg = NSPackageModel.objects.filter(nsdId=nsd_id) - if other_nspkg and other_nspkg[0].nsPackageId != nsd_info_id: - logger.warn("NSD(%s,%s) already exists.", nsd_id, other_nspkg[0].nsPackageId) - raise GenericparserException("NSD(%s) already exists." % nsd_id) - - for vnf in nsd["vnfs"]: - vnfd_id = vnf["properties"].get("descriptor_id", "undefined") - if vnfd_id == "undefined": - vnfd_id = vnf["properties"].get("id", "undefined") - pkg = VnfPackageModel.objects.filter(vnfdId=vnfd_id) - if not pkg: - pkg = VnfPackageModel.objects.filter(vnfPackageId=vnfd_id) - if not pkg: - vnfd_name = vnf.get("vnf_id", "undefined") - logger.error("[%s] is not distributed.", vnfd_name) - raise GenericparserException("VNF package(%s) is not distributed." % vnfd_id) - - for pnf in nsd["pnfs"]: - pnfd_id = pnf["properties"].get("descriptor_id", "undefined") - if pnfd_id == "undefined": - pnfd_id = pnf["properties"].get("id", "undefined") - pkg = PnfPackageModel.objects.filter(pnfdId=pnfd_id) - if not pkg: - pkg = PnfPackageModel.objects.filter(pnfPackageId=pnfd_id) - if not pkg: - pnfd_name = pnf.get("pnf_id", "undefined") - logger.error("[%s] is not distributed.", pnfd_name) - raise GenericparserException("PNF package(%s) is not distributed." % pnfd_name) - - ns_pkgs.update( - nsdId=nsd_id, - nsdName=nsd_name, - nsdDesginer=nsd_designer, - nsdDescription=nsd.get("description", ""), - nsdVersion=nsd_version, - invariantId=invariant_id, - onboardingState=PKG_STATUS.ONBOARDED, - operationalState=PKG_STATUS.ENABLED, - usageState=PKG_STATUS.NOT_IN_USE, - nsPackageUri=local_file_name, - sdcCsarId=nsd_info_id, - localFilePath=local_file_name, - nsdModel=nsd_json - ) - logger.info('NSD(%s) has been processed.' % nsd_info_id) - - def fill_resp_data(self, ns_pkg): - data = { - 'id': ns_pkg.nsPackageId, - 'nsdId': ns_pkg.nsdId, - 'nsdName': ns_pkg.nsdName, - 'nsdVersion': ns_pkg.nsdVersion, - 'nsdDesigner': ns_pkg.nsdDesginer, - 'nsdInvariantId': ns_pkg.invariantId, - 'vnfPkgIds': [], - 'pnfdInfoIds': [], # TODO - 'nestedNsdInfoIds': [], # TODO - 'nsdOnboardingState': ns_pkg.onboardingState, - 'onboardingFailureDetails': None, # TODO - 'nsdOperationalState': ns_pkg.operationalState, - 'nsdUsageState': ns_pkg.usageState, - 'userDefinedData': {}, - '_links': None # TODO - } - - if ns_pkg.nsdModel: - nsd_model = json.JSONDecoder().decode(ns_pkg.nsdModel) - vnf_pkg_ids = [] - for vnf in nsd_model['vnfs']: - vnfd_id = vnf["properties"].get("descriptor_id", "undefined") - if vnfd_id == "undefined": - vnfd_id = vnf["properties"].get("id", "undefined") - pkgs = VnfPackageModel.objects.filter(vnfdId=vnfd_id) - if not pkgs: - pkgs = VnfPackageModel.objects.filter(vnfPackageId=vnfd_id) - for pkg in pkgs: - vnf_pkg_ids.append(pkg.vnfPackageId) - data['vnfPkgIds'] = vnf_pkg_ids - - pnf_info_ids = [] - for pnf in nsd_model['pnfs']: - pnfd_id = pnf["properties"].get("descriptor_id", "undefined") - if pnfd_id == "undefined": - pnfd_id = pnf["properties"].get("id", "undefined") - pkgs = PnfPackageModel.objects.filter(pnfdId=pnfd_id) - if not pkgs: - pkgs = PnfPackageModel.objects.filter(pnfPackageId=pnfd_id) - for pkg in pkgs: - pnf_info_ids.append(pkg.pnfPackageId) - data['pnfInfoIds'] = pnf_info_ids # TODO: need reconfirming - - if ns_pkg.userDefinedData: - user_defined_data = json.JSONDecoder().decode(ns_pkg.userDefinedData) - data['userDefinedData'] = user_defined_data - - return data - - def handle_upload_failed(self, nsd_info_id): - ns_pkg = NSPackageModel.objects.filter(nsPackageId=nsd_info_id) - ns_pkg.update(onboardingState=PKG_STATUS.CREATED) diff --git a/genericparser/packages/biz/nsdm_subscription.py b/genericparser/packages/biz/nsdm_subscription.py deleted file mode 100644 index dfcd2ec..0000000 --- a/genericparser/packages/biz/nsdm_subscription.py +++ /dev/null @@ -1,218 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 ast -import json -import logging -import requests -import uuid - -from collections import Counter - -from rest_framework import status - -from genericparser.packages import const -from genericparser.pub.database.models import NsdmSubscriptionModel -from genericparser.pub.exceptions import GenericparserException, \ - ResourceNotFoundException, \ - NsdmBadRequestException, NsdmDuplicateSubscriptionException -from genericparser.pub.utils.values import ignore_case_get - -logger = logging.getLogger(__name__) - -PARAMSBASICKEYS = ["userName", "password"] - -PARAMSOAUTH2CLIENTCREDENTIALSKEYS = ["clientId", "clientPassword", - "tokenEndpoint"] - - -def is_filter_type_equal(new_filter, existing_filter): - return Counter(list(set(new_filter))) == Counter(existing_filter) - - -class NsdmSubscription: - - def __init__(self): - pass - - def query_single_subscription(self, subscription_id): - logger.debug("Start Query Subscription... ") - subscription = \ - NsdmSubscriptionModel.objects.filter( - subscriptionid=subscription_id) - if not subscription.exists(): - raise ResourceNotFoundException( - "Subscription(%s) doesn't exists" % subscription_id) - logger.debug("Subscription found... ") - return self.fill_resp_data(subscription[0]) - - def delete_single_subscription(self, subscription_id): - logger.debug("Start Delete Subscription... ") - subscription = \ - NsdmSubscriptionModel.objects.filter( - subscriptionid=subscription_id) - if not subscription.exists(): - raise ResourceNotFoundException( - "Subscription(%s) doesn't exists" % subscription_id) - subscription.delete() - logger.debug("Deleted Subscription... ") - - def query_multi_subscriptions(self, query_params): - self.params = query_params - query_data = {} - logger.debug("Start QueryMultiSubscriptions get --> " - "Check for filters in query params" % self.params) - for query, value in list(self.params.items()): - if query in const.NSDM_NOTIFICATION_FILTERS and value: - query_data[query + '__icontains'] = json.dumps(list(set(value))) - # Query the database with filters if the request - # has fields in request params, else fetch all records - if query_data: - subscriptions = NsdmSubscriptionModel.objects.filter(**query_data) - else: - subscriptions = NsdmSubscriptionModel.objects.all() - if not subscriptions.exists(): - raise ResourceNotFoundException("Subscriptions doesn't exist") - return [self.fill_resp_data(subscription) - for subscription in subscriptions] - - def check_callbackuri_connection(self): - logger.debug("Create Subscription --> Test Callback URI --" - "Sending GET request to %s" % self.callback_uri) - try: - response = requests.get(self.callback_uri, timeout=2) - if response.status_code != status.HTTP_204_NO_CONTENT: - raise GenericparserException("callbackUri %s returns %s status " - "code." % (self.callback_uri, - response.status_code)) - except Exception: - raise GenericparserException("callbackUri %s didn't return 204 status" - "code." % self.callback_uri) - - def fill_resp_data(self, subscription): - subscription_filter = dict() - for filter_type in const.NSDM_NOTIFICATION_FILTERS: - if subscription.__dict__[filter_type]: - subscription_filter[filter_type] = \ - ast.literal_eval(subscription.__dict__[filter_type]) - resp_data = { - 'id': subscription.subscriptionid, - 'callbackUri': subscription.callback_uri, - 'filter': subscription_filter, - '_links': json.loads(subscription.links) - } - return resp_data - - def create(self, data): - logger.debug("Start Create Subscription... ") - self.filter = ignore_case_get(data, "filter", {}) - self.callback_uri = ignore_case_get(data, "callbackUri") - self.authentication = ignore_case_get(data, "authentication", {}) - self.subscription_id = str(uuid.uuid4()) - self.check_callbackuri_connection() - self.check_valid_auth_info() - self.check_filter_types() - self.check_valid() - self.save_db() - subscription = \ - NsdmSubscriptionModel.objects.get( - subscriptionid=self.subscription_id) - return self.fill_resp_data(subscription) - - def check_filter_types(self): - # Check if both nsdId and nsdInfoId - # or pnfdId and pnfdInfoId are present - logger.debug("Create Subscription --> Validating Filters... ") - if self.filter and \ - self.filter.get("nsdId", "") and \ - self.filter.get("nsdInfoId", ""): - raise NsdmBadRequestException("Notification Filter should contain" - " either nsdId or nsdInfoId") - if self.filter and \ - self.filter.get("pnfdId", "") and \ - self.filter.get("pnfdInfoIds", ""): - raise NsdmBadRequestException("Notification Filter should contain" - " either pnfdId or pnfdInfoIds") - - def check_valid_auth_info(self): - logger.debug("Create Subscription --> Validating Auth " - "details if provided... ") - if self.authentication.get("paramsBasic", {}) and \ - const.BASIC not in self.authentication.get("authType", ''): - raise NsdmBadRequestException('Auth type should be ' + const.BASIC) - if self.authentication.get("paramsOauth2ClientCredentials", {}) and \ - const.OAUTH2_CLIENT_CREDENTIALS not in \ - self.authentication.get("authType", ''): - raise NsdmBadRequestException('Auth type should ' - 'be ' + const.OAUTH2_CLIENT_CREDENTIALS) - if const.BASIC in self.authentication.get("authType", '') and \ - "paramsBasic" in list(self.authentication.keys()) and \ - not is_filter_type_equal(PARAMSBASICKEYS, list( - self.authentication.get("paramsBasic").keys())): - raise NsdmBadRequestException('userName and password needed ' - 'for ' + const.BASIC) - if const.OAUTH2_CLIENT_CREDENTIALS in \ - self.authentication.get("authType", '') and \ - "paramsOauth2ClientCredentials" in \ - list(self.authentication.keys()) and \ - not is_filter_type_equal(PARAMSOAUTH2CLIENTCREDENTIALSKEYS, list( - self.authentication.get("paramsOauth2ClientCredentials").keys())): - raise NsdmBadRequestException('clientId, clientPassword and ' - 'tokenEndpoint required ' - 'for ' + const.OAUTH2_CLIENT_CREDENTIALS) - - def check_filter_exists(self, subscription): - for filter_type in const.NSDM_NOTIFICATION_FILTERS: - if not is_filter_type_equal(self.filter.get(filter_type, []), - ast.literal_eval( - getattr(subscription, - filter_type))): - return False - return True - - def check_valid(self): - logger.debug("Create Subscription --> Checking DB if " - "same subscription exists already exists... ") - subscriptions = \ - NsdmSubscriptionModel.objects.filter( - callback_uri=self.callback_uri) - if not subscriptions.exists(): - return - for subscription in subscriptions: - if self.check_filter_exists(subscription): - raise NsdmDuplicateSubscriptionException( - "Already Subscription exists with the " - "same callbackUri and filter") - - def save_db(self): - logger.debug("Create Subscription --> Saving the subscription " - "%s to the database" % self.subscription_id) - links = { - "self": { - "href": - const.NSDM_SUBSCRIPTION_ROOT_URI + self.subscription_id - } - } - subscription_save_db = { - "subscriptionid": self.subscription_id, - "callback_uri": self.callback_uri, - "auth_info": self.authentication, - "links": json.dumps(links) - } - for filter_type in const.NSDM_NOTIFICATION_FILTERS: - if self.filter: - subscription_save_db[filter_type] = json.dumps( - list(set(self.filter.get(filter_type, [])))) - NsdmSubscriptionModel.objects.create(**subscription_save_db) - logger.debug('Create Subscription[%s] success', self.subscription_id) diff --git a/genericparser/packages/biz/pnf_descriptor.py b/genericparser/packages/biz/pnf_descriptor.py deleted file mode 100644 index 561c8fa..0000000 --- a/genericparser/packages/biz/pnf_descriptor.py +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright 2018 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 json -import logging -import os -import uuid - -from genericparser.packages.biz.common import read, save -from genericparser.packages.const import PKG_STATUS -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH -from genericparser.pub.database.models import NSPackageModel, PnfPackageModel -from genericparser.pub.exceptions import GenericparserException, ResourceNotFoundException -from genericparser.pub.utils import fileutil, toscaparsers -from genericparser.pub.utils.values import ignore_case_get - -logger = logging.getLogger(__name__) - - -class PnfDescriptor(object): - - def __init__(self): - pass - - def create(self, data): - logger.info('Start to create a PNFD...') - user_defined_data = ignore_case_get(data, 'userDefinedData', {}) - data = { - 'id': str(uuid.uuid4()), - 'pnfdOnboardingState': PKG_STATUS.CREATED, - 'pnfdUsageState': PKG_STATUS.NOT_IN_USE, - 'userDefinedData': user_defined_data, - '_links': None # TODO - } - PnfPackageModel.objects.create( - pnfPackageId=data['id'], - onboardingState=data['pnfdOnboardingState'], - usageState=data['pnfdUsageState'], - userDefinedData=json.dumps(user_defined_data) - ) - logger.info('A PNFD(%s) has been created.' % data['id']) - return data - - def query_multiple(self, request): - pnfdId = request.query_params.get('pnfdId') - if pnfdId: - pnf_pkgs = PnfPackageModel.objects.filter(pnfdId=pnfdId) - else: - pnf_pkgs = PnfPackageModel.objects.all() - response_data = [] - for pnf_pkg in pnf_pkgs: - data = self.fill_response_data(pnf_pkg) - response_data.append(data) - return response_data - - def query_single(self, pnfd_info_id): - pnf_pkgs = PnfPackageModel.objects.filter(pnfPackageId=pnfd_info_id) - if not pnf_pkgs.exists(): - logger.error('PNFD(%s) does not exist.' % pnfd_info_id) - raise ResourceNotFoundException('PNFD(%s) does not exist.' % pnfd_info_id) - return self.fill_response_data(pnf_pkgs[0]) - - def upload(self, remote_file, pnfd_info_id): - logger.info('Start to upload PNFD(%s)...' % pnfd_info_id) - pnf_pkgs = PnfPackageModel.objects.filter(pnfPackageId=pnfd_info_id) - if not pnf_pkgs.exists(): - logger.info('PNFD(%s) does not exist.' % pnfd_info_id) - raise GenericparserException('PNFD (%s) does not exist.' % pnfd_info_id) - pnf_pkgs.update(onboardingState=PKG_STATUS.UPLOADING) - - local_file_name = save(remote_file, pnfd_info_id) - logger.info('PNFD(%s) content has been uploaded.' % pnfd_info_id) - return local_file_name - - def delete_single(self, pnfd_info_id): - logger.info('Start to delete PNFD(%s)...' % pnfd_info_id) - pnf_pkgs = PnfPackageModel.objects.filter(pnfPackageId=pnfd_info_id) - if not pnf_pkgs.exists(): - logger.info('PNFD(%s) has been deleted.' % pnfd_info_id) - return - ''' - if pnf_pkgs[0].usageState != PKG_STATUS.NOT_IN_USE: - logger.info('PNFD(%s) shall be NOT_IN_USE.' % pnfd_info_id) - raise GenericparserException('PNFD(%s) shall be NOT_IN_USE.' % pnfd_info_id) - ''' - del_pnfd_id = pnf_pkgs[0].pnfdId - ns_pkgs = NSPackageModel.objects.all() - for ns_pkg in ns_pkgs: - nsd_model = None - if ns_pkg.nsdModel: - nsd_model = json.JSONDecoder().decode(ns_pkg.nsdModel) - if not nsd_model: - continue - for pnf in nsd_model['pnfs']: - if del_pnfd_id == pnf["properties"]["id"]: - logger.warn("PNFD(%s) is referenced in NSD", del_pnfd_id) - raise GenericparserException('PNFD(%s) is referenced.' % pnfd_info_id) - pnf_pkgs.delete() - pnf_pkg_path = os.path.join(GENERICPARSER_ROOT_PATH, pnfd_info_id) - fileutil.delete_dirs(pnf_pkg_path) - logger.debug('PNFD(%s) has been deleted.' % pnfd_info_id) - - def download(self, pnfd_info_id): - logger.info('Start to download PNFD(%s)...' % pnfd_info_id) - pnf_pkgs = PnfPackageModel.objects.filter(pnfPackageId=pnfd_info_id) - if not pnf_pkgs.exists(): - logger.error('PNFD(%s) does not exist.' % pnfd_info_id) - raise ResourceNotFoundException('PNFD(%s) does not exist.' % pnfd_info_id) - if pnf_pkgs[0].onboardingState != PKG_STATUS.ONBOARDED: - logger.error('PNFD(%s) is not ONBOARDED.' % pnfd_info_id) - raise GenericparserException('PNFD(%s) is not ONBOARDED.' % pnfd_info_id) - - local_file_path = pnf_pkgs[0].localFilePath - start, end = 0, os.path.getsize(local_file_path) - logger.info('PNFD(%s) has been downloaded.' % pnfd_info_id) - return read(local_file_path, start, end) - - def parse_pnfd_and_save(self, pnfd_info_id, local_file_name): - logger.info('Start to process PNFD(%s)...' % pnfd_info_id) - pnf_pkgs = PnfPackageModel.objects.filter(pnfPackageId=pnfd_info_id) - pnf_pkgs.update(onboardingState=PKG_STATUS.PROCESSING) - pnfd_json = toscaparsers.parse_pnfd(local_file_name) - pnfd = json.JSONDecoder().decode(pnfd_json) - - logger.debug("pnfd_json is %s" % pnfd_json) - pnfd_id = "" - pnfdVersion = "" - pnfdProvider = "" - 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", "") - if pnfd_id == "": - pnfd_id = pnfd["metadata"].get("descriptor_id", "") - if pnfd_id == "": - pnfd_id = pnfd["metadata"].get("id", "") - if pnfd_id == "": - pnfd_id = pnfd["metadata"].get("UUID", "") - if pnfd_id == "": - raise GenericparserException('pnfd_id is Null.') - - if pnfdVersion == "": - pnfdVersion = pnfd["metadata"].get("template_version", "") - if pnfdVersion == "": - pnfdVersion = pnfd["metadata"].get("version", "") - - if pnfdProvider == "": - pnfdProvider = pnfd["metadata"].get("template_author", "") - if pnfdVersion == "": - pnfdVersion = pnfd["metadata"].get("provider", "") - - if pnfdName == "": - pnfdName = pnfd["metadata"].get("template_name", "") - if pnfdVersion == "": - pnfdName = pnfd["metadata"].get("name", "") - - if pnfd_id: - other_pnf = PnfPackageModel.objects.filter(pnfdId=pnfd_id) - if other_pnf and other_pnf[0].pnfPackageId != pnfd_info_id: - logger.info('PNFD(%s) already exists.' % pnfd_id) - raise GenericparserException("PNFD(%s) already exists." % pnfd_id) - - pnf_pkgs.update( - pnfdId=pnfd_id, - pnfdName=pnfdName, - pnfdVersion=pnfdVersion, - pnfVendor=pnfdProvider, - pnfPackageUri=local_file_name, - onboardingState=PKG_STATUS.ONBOARDED, - usageState=PKG_STATUS.NOT_IN_USE, - localFilePath=local_file_name, - pnfdModel=pnfd_json - ) - logger.info('PNFD(%s) has been processed.' % pnfd_info_id) - - def fill_response_data(self, pnf_pkg): - data = { - 'id': pnf_pkg.pnfPackageId, - 'pnfdId': pnf_pkg.pnfdId, - 'pnfdName': pnf_pkg.pnfdName, - 'pnfdVersion': pnf_pkg.pnfdVersion, - 'pnfdProvider': pnf_pkg.pnfVendor, - 'pnfdInvariantId': None, # TODO - 'pnfdOnboardingState': pnf_pkg.onboardingState, - 'onboardingFailureDetails': None, # TODO - 'pnfdUsageState': pnf_pkg.usageState, - 'userDefinedData': {}, - '_links': None # TODO - } - if pnf_pkg.userDefinedData: - user_defined_data = json.JSONDecoder().decode(pnf_pkg.userDefinedData) - data['userDefinedData'] = user_defined_data - - return data - - def handle_upload_failed(self, pnf_pkg_id): - pnf_pkg = PnfPackageModel.objects.filter(pnfPackageId=pnf_pkg_id) - pnf_pkg.update(onboardingState=PKG_STATUS.CREATED) - - def parse_pnfd(self, csar_id, inputs): - - try: - pnf_pkg = PnfPackageModel.objects.filter(pnfPackageId=csar_id) - if not pnf_pkg: - raise GenericparserException("PNF CSAR(%s) does not exist." % csar_id) - csar_path = pnf_pkg[0].localFilePath - ret = {"model": toscaparsers.parse_pnfd(csar_path, inputs)} - except GenericparserException as e: - return [1, e.args[0]] - except Exception as e: - logger.error(e.args[0]) - return [1, e.args[0]] - return [0, ret] diff --git a/genericparser/packages/biz/sdc_ns_package.py b/genericparser/packages/biz/sdc_ns_package.py deleted file mode 100644 index 63a077f..0000000 --- a/genericparser/packages/biz/sdc_ns_package.py +++ /dev/null @@ -1,172 +0,0 @@ -# Copyright 2017 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 logging -import os -import sys -import traceback - -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH, GENERICPARSER_URL_PATH -from genericparser.pub.config.config import REG_TO_MSB_REG_PARAM -from genericparser.pub.database.models import NSPackageModel -from genericparser.pub.exceptions import GenericparserException -from genericparser.pub.msapi import sdc -from genericparser.pub.utils import toscaparsers -from genericparser.packages.biz.ns_descriptor import NsDescriptor -from genericparser.pub.utils import fileutil - -logger = logging.getLogger(__name__) - -STATUS_SUCCESS, STATUS_FAILED = "success", "failed" - -METADATA = "metadata" - - -def fmt_ns_pkg_rsp(status, desc, error_code="500"): - return [0, {"status": status, "statusDescription": desc, "errorCode": error_code}] - - -def ns_on_distribute(csar_id): - ret = None - try: - ret = NsPackage().on_distribute(csar_id) - except GenericparserException as e: - NsPackage().delete_csar(csar_id) - return fmt_ns_pkg_rsp(STATUS_FAILED, e.args[0]) - except: - logger.error(traceback.format_exc()) - NsPackage().delete_csar(csar_id) - return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info())) - if ret[0]: - return fmt_ns_pkg_rsp(STATUS_FAILED, ret[1]) - return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "") - - -def ns_delete_csar(csar_id): - ret = None - try: - ret = NsPackage().delete_csar(csar_id) - except GenericparserException as e: - return fmt_ns_pkg_rsp(STATUS_FAILED, e.args[0]) - except: - logger.error(traceback.format_exc()) - return fmt_ns_pkg_rsp(STATUS_FAILED, str(sys.exc_info())) - return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "") - - -def ns_get_csars(): - ret = None - try: - ret = NsPackage().get_csars() - except GenericparserException as e: - return [1, e.args[0]] - except: - logger.error(traceback.format_exc()) - return [1, str(sys.exc_info())] - return ret - - -def ns_get_csar(csar_id): - ret = None - try: - ret = NsPackage().get_csar(csar_id) - except GenericparserException as e: - return [1, e.args[0]] - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - return [1, str(sys.exc_info())] - return ret - - -def parse_nsd(csar_id, inputs): - ret = None - try: - ns_pkg = NSPackageModel.objects.filter(nsPackageId=csar_id) - if not ns_pkg: - raise GenericparserException("NS CSAR(%s) does not exist." % csar_id) - csar_path = ns_pkg[0].localFilePath - ret = {"model": toscaparsers.parse_nsd(csar_path, inputs)} - except GenericparserException as e: - return [1, e.args[0]] - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - return [1, str(sys.exc_info())] - return [0, ret] - - -class NsPackage(object): - """ - Actions for sdc ns package. - """ - - def __init__(self): - pass - - def on_distribute(self, csar_id): - if NSPackageModel.objects.filter(nsPackageId=csar_id): - return [1, "NS CSAR(%s) already exists." % csar_id] - - artifact = sdc.get_artifact(sdc.ASSETTYPE_SERVICES, csar_id) - local_path = os.path.join(GENERICPARSER_ROOT_PATH, csar_id) - csar_name = "%s.csar" % artifact.get("name", csar_id) - local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path, csar_name) - if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"): - artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/ns.csar") - if os.path.exists(artifact_vnf_file): - local_file_name = artifact_vnf_file - - data = { - 'userDefinedData': {} - } - nsd = NsDescriptor() - nsd.create(data, csar_id) - nsd.parse_nsd_and_save(csar_id, local_file_name) - return [0, "CSAR(%s) distributed successfully." % csar_id] - - def delete_csar(self, csar_id): - nsd = NsDescriptor() - nsd.delete_single(csar_id) - return [0, "Delete CSAR(%s) successfully." % csar_id] - - def get_csars(self): - csars = [] - nss = NSPackageModel.objects.filter() - for ns in nss: - ret = self.get_csar(ns.nsPackageId) - csars.append(ret[1]) - return [0, csars] - - def get_csar(self, csar_id): - package_info = {} - csars = NSPackageModel.objects.filter(nsPackageId=csar_id) - if csars: - package_info["nsdId"] = csars[0].nsdId - package_info["nsPackageId"] = csars[0].nsPackageId - package_info["nsdProvider"] = csars[0].nsdDesginer - package_info["nsdVersion"] = csars[0].nsdVersion - package_info["csarName"] = csars[0].nsPackageUri - package_info["nsdModel"] = csars[0].nsdModel - package_info["nsdInvariantId"] = csars[0].invariantId - package_info["downloadUrl"] = "http://%s:%s/%s/%s/%s" % ( - REG_TO_MSB_REG_PARAM[0]["nodes"][0]["ip"], - REG_TO_MSB_REG_PARAM[0]["nodes"][0]["port"], - GENERICPARSER_URL_PATH, - csar_id, - csars[0].nsPackageUri) - else: - raise GenericparserException("Ns package[%s] not Found." % csar_id) - - return [0, {"csarId": csar_id, "packageInfo": package_info}] diff --git a/genericparser/packages/biz/sdc_service_package.py b/genericparser/packages/biz/sdc_service_package.py deleted file mode 100644 index 0d57ceb..0000000 --- a/genericparser/packages/biz/sdc_service_package.py +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright (c) 2019, CMCC Technologies. Co., Ltd. -# -# 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 logging -import traceback - -from coverage.xmlreport import os - -from genericparser.packages.biz.service_descriptor import ServiceDescriptor -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH, REG_TO_MSB_REG_PARAM, GENERICPARSER_URL_PATH -from genericparser.pub.database.models import ServicePackageModel, VnfPackageModel, PnfPackageModel -from genericparser.pub.exceptions import GenericparserException, PackageNotFoundException, \ - PackageHasExistsException -from genericparser.pub.msapi import sdc -from genericparser.pub.utils import fileutil, toscaparsers - -logger = logging.getLogger(__name__) - - -class ServicePackage(object): - """ - Actions for sdc service package. - """ - - def __init__(self): - pass - - def on_distribute(self, csar_id): - if ServicePackageModel.objects.filter(servicePackageId=csar_id): - raise PackageHasExistsException("Service CSAR(%s) already exists." % csar_id) - - try: - service = sdc.get_asset(sdc.ASSETTYPE_SERVICES, csar_id) - # check if the related resources exist - resources = service.get('resources', None) - if resources: - for resource in resources: - if not VnfPackageModel.objects.filter(vnfPackageId=resource['resourceUUID']) and \ - not PnfPackageModel.objects.filter(pnfPackageId=resource['resourceUUID']): - logger.error("Resource [%s] is not distributed.", resource['resourceUUID']) - raise GenericparserException("Resource (%s) is not distributed." % resource['resourceUUID']) - - # download csar package - local_path = os.path.join(GENERICPARSER_ROOT_PATH, csar_id) - csar_name = "%s.csar" % service.get("name", csar_id) - local_file_name = sdc.download_artifacts(service["toscaModelURL"], local_path, csar_name) - if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"): - fileutil.unzip_file(local_file_name, local_path, "") - data = { - 'userDefinedData': {} - } - serviced = ServiceDescriptor() - serviced.create(data, csar_id) - serviced.parse_serviced_and_save(csar_id, local_file_name) - - except Exception as e: - logger.error(traceback.format_exc()) - if ServicePackageModel.objects.filter(servicePackageId=csar_id): - ServicePackage().delete_csar(csar_id) - raise e - - def delete_csar(self, csar_id): - serviced = ServiceDescriptor() - serviced.delete_single(csar_id) - - def get_csars(self): - csars = [] - packages = ServicePackageModel.objects.filter() - for package in packages: - csar = self.get_csar(package.servicePackageId) - csars.append(csar) - return csars - - def get_csar(self, csar_id): - package_info = {} - csars = ServicePackageModel.objects.filter(servicePackageId=csar_id) - if csars: - package_info["servicedId"] = csars[0].servicedId - package_info["servicePackageId"] = csars[0].servicePackageId - package_info["servicedProvider"] = csars[0].servicedDesigner - package_info["servicedVersion"] = csars[0].servicedVersion - package_info["csarName"] = csars[0].servicePackageUri - package_info["servicedModel"] = csars[0].servicedModel - package_info["servicedInvariantId"] = csars[0].invariantId - package_info["downloadUrl"] = "http://%s:%s/%s/%s/%s" % ( - REG_TO_MSB_REG_PARAM[0]["nodes"][0]["ip"], - REG_TO_MSB_REG_PARAM[0]["nodes"][0]["port"], - GENERICPARSER_URL_PATH, - csar_id, - csars[0].servicePackageUri) - else: - error_message = "Service package[%s] not Found." % csar_id - logger.error(error_message) - raise PackageNotFoundException(error_message) - - return {"csarId": csar_id, "packageInfo": package_info} - - def parse_serviced(self, csar_id, inputs): - service_pkg = ServicePackageModel.objects.filter(servicePackageId=csar_id) - if not service_pkg: - raise PackageNotFoundException("Service CSAR(%s) does not exist." % csar_id) - - try: - csar_path = service_pkg[0].localFilePath - ret = {"model": toscaparsers.parse_sd(csar_path, inputs)} - return ret - except GenericparserException as e: - logger.error(e.args[0]) - raise e - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - raise e diff --git a/genericparser/packages/biz/sdc_vnf_package.py b/genericparser/packages/biz/sdc_vnf_package.py deleted file mode 100644 index 3a271b7..0000000 --- a/genericparser/packages/biz/sdc_vnf_package.py +++ /dev/null @@ -1,254 +0,0 @@ -# Copyright 2017 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 json -import logging -import os -import sys -import threading -import traceback - -from genericparser.packages.const import PKG_STATUS -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH, GENERICPARSER_URL_PATH -from genericparser.pub.config.config import REG_TO_MSB_REG_PARAM -from genericparser.pub.database.models import VnfPackageModel -from genericparser.pub.exceptions import GenericparserException -from genericparser.pub.msapi import sdc -from genericparser.pub.utils import fileutil -from genericparser.pub.utils import toscaparsers -from genericparser.pub.utils.jobutil import JobUtil - -logger = logging.getLogger(__name__) - -JOB_ERROR = 255 - - -def nf_get_csars(): - ret = None - try: - ret = NfPackage().get_csars() - except GenericparserException as e: - return [1, e.args[0]] - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - return [1, str(sys.exc_info())] - return ret - - -def nf_get_csar(csar_id): - ret = None - try: - ret = NfPackage().get_csar(csar_id) - except GenericparserException as e: - return [1, e.args[0]] - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - return [1, str(sys.exc_info())] - return ret - - -def parse_vnfd(csar_id, inputs): - ret = None - try: - nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=csar_id) - if not nf_pkg: - raise GenericparserException("VNF CSAR(%s) does not exist." % csar_id) - csar_path = nf_pkg[0].localFilePath - ret = {"model": toscaparsers.parse_vnfd(csar_path, inputs)} - except GenericparserException as e: - return [1, e.args[0]] - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - return [1, str(sys.exc_info())] - return [0, ret] - - -class NfDistributeThread(threading.Thread): - """ - Sdc NF Package Distribute - """ - - def __init__(self, csar_id, vim_ids, lab_vim_id, job_id): - threading.Thread.__init__(self) - self.csar_id = csar_id - self.vim_ids = vim_ids - self.lab_vim_id = lab_vim_id - self.job_id = job_id - - self.csar_save_path = os.path.join(GENERICPARSER_ROOT_PATH, csar_id) - - def run(self): - try: - self.on_distribute() - except GenericparserException as e: - self.rollback_distribute() - JobUtil.add_job_status(self.job_id, JOB_ERROR, e.args[0]) - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - logger.error(str(sys.exc_info())) - self.rollback_distribute() - JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to distribute CSAR(%s)" % self.csar_id) - - def on_distribute(self): - JobUtil.create_job( - inst_type='nf', - jobaction='on_distribute', - inst_id=self.csar_id, - job_id=self.job_id) - JobUtil.add_job_status(self.job_id, 5, "Start CSAR(%s) distribute." % self.csar_id) - - if VnfPackageModel.objects.filter(vnfPackageId=self.csar_id): - err_msg = "NF CSAR(%s) already exists." % self.csar_id - JobUtil.add_job_status(self.job_id, JOB_ERROR, err_msg) - return - - artifact = sdc.get_artifact(sdc.ASSETTYPE_RESOURCES, self.csar_id) - local_path = os.path.join(GENERICPARSER_ROOT_PATH, self.csar_id) - csar_name = "%s.csar" % artifact.get("name", self.csar_id) - local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path, csar_name) - if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"): - artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/vnf.csar") - if os.path.exists(artifact_vnf_file): - local_file_name = artifact_vnf_file - - vnfd_json = toscaparsers.parse_vnfd(local_file_name) - vnfd = json.JSONDecoder().decode(vnfd_json) - - if not vnfd.get("vnf"): - raise GenericparserException("VNF properties and metadata in VNF Package(id=%s) are empty." % self.csar_id) - - vnfd_id = vnfd["vnf"]["properties"].get("descriptor_id", "") - if VnfPackageModel.objects.filter(vnfdId=vnfd_id): - logger.error("VNF package(%s) already exists.", vnfd_id) - raise GenericparserException("VNF package(%s) already exists." % vnfd_id) - JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id) - vnfd_ver = vnfd["vnf"]["properties"].get("descriptor_version", "") - vnf_provider = vnfd["vnf"]["properties"].get("provider", "") - vnf_software_version = vnfd["vnf"]["properties"].get("software_version", "") - vnfd_product_name = vnfd["vnf"]["properties"].get("product_name", "") - VnfPackageModel( - vnfPackageId=self.csar_id, - vnfdId=vnfd_id, - vnfVendor=vnf_provider, - vnfdProductName=vnfd_product_name, - vnfdVersion=vnfd_ver, - vnfSoftwareVersion=vnf_software_version, - vnfdModel=vnfd_json, - localFilePath=local_file_name, - vnfPackageUri=csar_name, - onboardingState=PKG_STATUS.ONBOARDED, - operationalState=PKG_STATUS.ENABLED, - usageState=PKG_STATUS.NOT_IN_USE - ).save() - JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id) - - def rollback_distribute(self): - try: - VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete() - fileutil.delete_dirs(self.csar_save_path) - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - logger.error(str(sys.exc_info())) - - -class NfPkgDeleteThread(threading.Thread): - """ - Sdc NF Package Deleting - """ - - def __init__(self, csar_id, job_id): - threading.Thread.__init__(self) - self.csar_id = csar_id - self.job_id = job_id - - def run(self): - try: - self.delete_csar() - except GenericparserException as e: - JobUtil.add_job_status(self.job_id, JOB_ERROR, e.args[0]) - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - logger.error(str(sys.exc_info())) - JobUtil.add_job_status(self.job_id, JOB_ERROR, "Failed to delete CSAR(%s)" % self.csar_id) - - def delete_csar(self): - JobUtil.create_job( - inst_type='nf', - jobaction='delete', - inst_id=self.csar_id, - job_id=self.job_id) - JobUtil.add_job_status(self.job_id, 5, "Start to delete CSAR(%s)." % self.csar_id) - - VnfPackageModel.objects.filter(vnfPackageId=self.csar_id).delete() - - JobUtil.add_job_status(self.job_id, 50, "Delete local CSAR(%s) file." % self.csar_id) - - csar_save_path = os.path.join(GENERICPARSER_ROOT_PATH, self.csar_id) - fileutil.delete_dirs(csar_save_path) - - JobUtil.add_job_status(self.job_id, 100, "Delete CSAR(%s) successfully." % self.csar_id) - - -class NfPackage(object): - """ - Actions for sdc nf package. - """ - - def __init__(self): - pass - - def get_csars(self): - csars = [] - nf_pkgs = VnfPackageModel.objects.filter() - for nf_pkg in nf_pkgs: - ret = self.get_csar(nf_pkg.vnfPackageId) - csars.append(ret[1]) - return [0, csars] - - def get_csar(self, csar_id): - pkg_info = {} - nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=csar_id) - if not nf_pkg: - nf_pkg = VnfPackageModel.objects.filter(vnfdId=csar_id) - - if nf_pkg: - db_csar_id = nf_pkg[0].vnfPackageId - pkg_info["vnfdId"] = nf_pkg[0].vnfdId - pkg_info["vnfPackageId"] = nf_pkg[0].vnfPackageId - pkg_info["vnfdProvider"] = nf_pkg[0].vnfVendor - pkg_info["vnfdVersion"] = nf_pkg[0].vnfdVersion - pkg_info["vnfVersion"] = nf_pkg[0].vnfSoftwareVersion - pkg_info["csarName"] = nf_pkg[0].vnfPackageUri - pkg_info["vnfdModel"] = nf_pkg[0].vnfdModel - pkg_info["downloadUrl"] = "http://%s:%s/%s/%s/%s" % ( - REG_TO_MSB_REG_PARAM[0]["nodes"][0]["ip"], - REG_TO_MSB_REG_PARAM[0]["nodes"][0]["port"], - GENERICPARSER_URL_PATH, - db_csar_id, - nf_pkg[0].vnfPackageUri) - else: - raise GenericparserException("Vnf package[%s] not Found." % csar_id) - - csar_info = { - "csarId": db_csar_id, - "packageInfo": pkg_info, - "imageInfo": [] - } - return [0, csar_info] diff --git a/genericparser/packages/biz/service_descriptor.py b/genericparser/packages/biz/service_descriptor.py deleted file mode 100644 index b8cba6d..0000000 --- a/genericparser/packages/biz/service_descriptor.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (c) 2019, CMCC Technologies. Co., Ltd. -# -# 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 json -import logging -import os -import uuid - - -from genericparser.packages.const import PKG_STATUS -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH -from genericparser.pub.database.models import ServicePackageModel, VnfPackageModel, PnfPackageModel -from genericparser.pub.exceptions import GenericparserException, PackageNotFoundException -from genericparser.pub.utils import toscaparsers, fileutil -from genericparser.pub.utils.values import ignore_case_get - -logger = logging.getLogger(__name__) - - -class ServiceDescriptor(object): - """ - Action for Service Descriptor - """ - - def __init__(self): - pass - - def create(self, data, csar_id=None): - logger.info('Start to create a ServiceD...') - user_defined_data = ignore_case_get(data, 'userDefinedData', {}) - data = { - 'id': csar_id if csar_id else str(uuid.uuid4()), - 'servicedOnboardingState': PKG_STATUS.CREATED, - 'servicedOperationalState': PKG_STATUS.DISABLED, - 'servicedUsageState': PKG_STATUS.NOT_IN_USE, - 'userDefinedData': user_defined_data, - '_links': None # TODO - } - ServicePackageModel.objects.create( - servicePackageId=data['id'], - onboardingState=data['servicedOnboardingState'], - operationalState=data['servicedOperationalState'], - usageState=data['servicedUsageState'], - userDefinedData=json.dumps(user_defined_data) - ) - logger.info('A ServiceD(%s) has been created.' % data['id']) - return data - - def parse_serviced_and_save(self, serviced_info_id, local_file_name): - logger.info('Start to process ServiceD(%s)...' % serviced_info_id) - service_pkgs = ServicePackageModel.objects.filter(servicePackageId=serviced_info_id) - service_pkgs.update(onboardingState=PKG_STATUS.PROCESSING) - - serviced_json = toscaparsers.parse_sd(local_file_name) - serviced = json.JSONDecoder().decode(serviced_json) - - serviced_id = serviced.get("service", {}).get("properties", {}).get("descriptor_id", "") - serviced_name = serviced.get("service", {}).get("properties", {}).get("name", "") - serviced_version = serviced.get("service", {}).get("properties", {}).get("version", "") - serviced_designer = serviced.get("service", {}).get("properties", {}).get("designer", "") - invariant_id = serviced.get("service", {}).get("properties", {}).get("invariant_id", "") - if serviced_id == "": - raise GenericparserException("serviced_id(%s) does not exist in metadata." % serviced_id) - other_nspkg = ServicePackageModel.objects.filter(servicedId=serviced_id) - if other_nspkg and other_nspkg[0].servicePackageId != serviced_info_id: - logger.warn("ServiceD(%s,%s) already exists.", serviced_id, other_nspkg[0].servicePackageId) - raise GenericparserException("ServiceD(%s) already exists." % serviced_id) - - for vnf in serviced["vnfs"]: - vnfd_id = vnf["properties"].get("descriptor_id", "undefined") - if vnfd_id == "undefined": - vnfd_id = vnf["properties"].get("id", "undefined") - pkg = VnfPackageModel.objects.filter(vnfdId=vnfd_id) - if not pkg: - pkg = VnfPackageModel.objects.filter(vnfPackageId=vnfd_id) - if not pkg: - vnfd_name = vnf.get("vnf_id", "undefined") - logger.error("[%s] is not distributed.", vnfd_name) - raise GenericparserException("VNF package(%s) is not distributed." % vnfd_id) - - for pnf in serviced["pnfs"]: - pnfd_id = pnf["properties"].get("descriptor_id", "undefined") - if pnfd_id == "undefined": - pnfd_id = pnf["properties"].get("id", "undefined") - pkg = PnfPackageModel.objects.filter(pnfdId=pnfd_id) - if not pkg: - pkg = PnfPackageModel.objects.filter(pnfPackageId=pnfd_id) - if not pkg: - pnfd_name = pnf.get("pnf_id", "undefined") - logger.error("[%s] is not distributed.", pnfd_name) - raise GenericparserException("PNF package(%s) is not distributed." % pnfd_name) - - service_pkgs.update( - servicedId=serviced_id, - servicedName=serviced_name, - servicedDesigner=serviced_designer, - servicedDescription=serviced.get("description", ""), - servicedVersion=serviced_version, - invariantId=invariant_id, - onboardingState=PKG_STATUS.ONBOARDED, - operationalState=PKG_STATUS.ENABLED, - usageState=PKG_STATUS.NOT_IN_USE, - servicePackageUri=local_file_name, - sdcCsarId=serviced_info_id, - localFilePath=local_file_name, - servicedModel=serviced_json - ) - logger.info('ServiceD(%s) has been processed.' % serviced_info_id) - - def delete_single(self, serviced_info_id): - logger.info('Start to delete ServiceD(%s)...' % serviced_info_id) - service_pkgs = ServicePackageModel.objects.filter(servicePackageId=serviced_info_id) - if not service_pkgs.exists(): - logger.warn('ServiceD(%s) not found.' % serviced_info_id) - raise PackageNotFoundException("Service package[%s] not Found." % serviced_info_id) - service_pkgs.delete() - service_pkg_path = os.path.join(GENERICPARSER_ROOT_PATH, serviced_info_id) - fileutil.delete_dirs(service_pkg_path) - logger.info('ServiceD(%s) has been deleted.' % serviced_info_id) diff --git a/genericparser/packages/biz/vnf_package.py b/genericparser/packages/biz/vnf_package.py deleted file mode 100644 index cf67a76..0000000 --- a/genericparser/packages/biz/vnf_package.py +++ /dev/null @@ -1,227 +0,0 @@ -# Copyright 2018 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 json -import logging -import os -import sys -import threading -import traceback -import urllib -import uuid - -from genericparser.packages.biz.common import parse_file_range, read, save -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH -from genericparser.pub.database.models import VnfPackageModel, NSPackageModel -from genericparser.pub.exceptions import GenericparserException, ResourceNotFoundException -from genericparser.pub.utils.values import ignore_case_get -from genericparser.pub.utils import fileutil, toscaparsers -from genericparser.packages.const import PKG_STATUS - - -logger = logging.getLogger(__name__) - - -class VnfPackage(object): - - def __init__(self): - pass - - def create_vnf_pkg(self, data): - user_defined_data = ignore_case_get(data, "userDefinedData", {}) - vnf_pkg_id = str(uuid.uuid4()) - VnfPackageModel.objects.create( - vnfPackageId=vnf_pkg_id, - onboardingState=PKG_STATUS.CREATED, - operationalState=PKG_STATUS.DISABLED, - usageState=PKG_STATUS.NOT_IN_USE, - userDefinedData=json.dumps(user_defined_data) - ) - data = { - "id": vnf_pkg_id, - "onboardingState": PKG_STATUS.CREATED, - "operationalState": PKG_STATUS.DISABLED, - "usageState": PKG_STATUS.NOT_IN_USE, - "userDefinedData": user_defined_data, - "_links": None - } - return data - - def query_multiple(self): - pkgs_info = [] - nf_pkgs = VnfPackageModel.objects.filter() - for nf_pkg in nf_pkgs: - ret = fill_response_data(nf_pkg) - pkgs_info.append(ret) - return pkgs_info - - def query_single(self, vnf_pkg_id): - nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnf_pkg_id) - if not nf_pkg.exists(): - logger.error('VNF package(%s) does not exist.' % vnf_pkg_id) - raise ResourceNotFoundException('VNF package(%s) does not exist.' % vnf_pkg_id) - return fill_response_data(nf_pkg[0]) - - def delete_vnf_pkg(self, vnf_pkg_id): - vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnf_pkg_id) - if not vnf_pkg.exists(): - logger.debug('VNF package(%s) has been deleted.' % vnf_pkg_id) - return - ''' - if vnf_pkg[0].operationalState != PKG_STATUS.DISABLED: - raise GenericparserException("The VNF package (%s) is not disabled" % vnf_pkg_id) - if vnf_pkg[0].usageState != PKG_STATUS.NOT_IN_USE: - raise GenericparserException("The VNF package (%s) is in use" % vnf_pkg_id) - ''' - del_vnfd_id = vnf_pkg[0].vnfdId - ns_pkgs = NSPackageModel.objects.all() - for ns_pkg in ns_pkgs: - nsd_model = None - if ns_pkg.nsdModel: - nsd_model = json.JSONDecoder().decode(ns_pkg.nsdModel) - if not nsd_model: - continue - for vnf in nsd_model['vnfs']: - if del_vnfd_id == vnf["properties"]["descriptor_id"]: - raise GenericparserException('VNFD(%s) is referenced.' % del_vnfd_id) - vnf_pkg.delete() - vnf_pkg_path = os.path.join(GENERICPARSER_ROOT_PATH, vnf_pkg_id) - fileutil.delete_dirs(vnf_pkg_path) - logger.info('VNF package(%s) has been deleted.' % vnf_pkg_id) - - def upload(self, vnf_pkg_id, remote_file): - logger.info('Start to upload VNF package(%s)...' % vnf_pkg_id) - vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnf_pkg_id) - # if vnf_pkg[0].onboardingState != PKG_STATUS.CREATED: - # logger.error("VNF package(%s) is not CREATED" % vnf_pkg_id) - # raise GenericparserException("VNF package(%s) is not CREATED" % vnf_pkg_id) - vnf_pkg.update(onboardingState=PKG_STATUS.UPLOADING) - - local_file_name = save(remote_file, vnf_pkg_id) - logger.info('VNF package(%s) has been uploaded.' % vnf_pkg_id) - return local_file_name - - def download(self, vnf_pkg_id, file_range): - logger.info('Start to download VNF package(%s)...' % vnf_pkg_id) - nf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnf_pkg_id) - if not nf_pkg.exists(): - logger.error('VNF package(%s) does not exist.' % vnf_pkg_id) - raise ResourceNotFoundException('VNF package(%s) does not exist.' % vnf_pkg_id) - if nf_pkg[0].onboardingState != PKG_STATUS.ONBOARDED: - raise GenericparserException("VNF package (%s) is not on-boarded" % vnf_pkg_id) - - local_file_path = nf_pkg[0].localFilePath - start, end = parse_file_range(local_file_path, file_range) - logger.info('VNF package (%s) has been downloaded.' % vnf_pkg_id) - return read(local_file_path, start, end) - - -class VnfPkgUploadThread(threading.Thread): - def __init__(self, data, vnf_pkg_id): - threading.Thread.__init__(self) - self.vnf_pkg_id = vnf_pkg_id - self.data = data - self.upload_file_name = None - - def run(self): - try: - self.upload_vnf_pkg_from_uri() - parse_vnfd_and_save(self.vnf_pkg_id, self.upload_file_name) - except GenericparserException as e: - logger.error(e.args[0]) - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - logger.error(str(sys.exc_info())) - - def upload_vnf_pkg_from_uri(self): - logger.info("Start to upload VNF packge(%s) from URI..." % self.vnf_pkg_id) - vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=self.vnf_pkg_id) - if vnf_pkg[0].onboardingState != PKG_STATUS.CREATED: - logger.error("VNF package(%s) is not CREATED" % self.vnf_pkg_id) - raise GenericparserException("VNF package (%s) is not created" % self.vnf_pkg_id) - vnf_pkg.update(onboardingState=PKG_STATUS.UPLOADING) - - uri = ignore_case_get(self.data, "addressInformation") - response = urllib.request.urlopen(uri) - - local_file_dir = os.path.join(GENERICPARSER_ROOT_PATH, self.vnf_pkg_id) - self.upload_file_name = os.path.join(local_file_dir, os.path.basename(uri)) - if not os.path.exists(local_file_dir): - fileutil.make_dirs(local_file_dir) - with open(self.upload_file_name, "wt") as local_file: - local_file.write(response.read()) - response.close() - logger.info('VNF packge(%s) has been uploaded.' % self.vnf_pkg_id) - - -def fill_response_data(nf_pkg): - pkg_info = {} - pkg_info["id"] = nf_pkg.vnfPackageId - pkg_info["vnfdId"] = nf_pkg.vnfdId - pkg_info["vnfProductName"] = nf_pkg.vnfdProductName - pkg_info["vnfSoftwareVersion"] = nf_pkg.vnfSoftwareVersion - pkg_info["vnfdVersion"] = nf_pkg.vnfdVersion - if nf_pkg.checksum: - pkg_info["checksum"] = json.JSONDecoder().decode(nf_pkg.checksum) - pkg_info["softwareImages"] = None # TODO - pkg_info["additionalArtifacts"] = None # TODO - pkg_info["onboardingState"] = nf_pkg.onboardingState - pkg_info["operationalState"] = nf_pkg.operationalState - pkg_info["usageState"] = nf_pkg.usageState - if nf_pkg.userDefinedData: - pkg_info["userDefinedData"] = json.JSONDecoder().decode(nf_pkg.userDefinedData) - pkg_info["_links"] = None # TODO - return pkg_info - - -def parse_vnfd_and_save(vnf_pkg_id, vnf_pkg_path): - logger.info('Start to process VNF package(%s)...' % vnf_pkg_id) - vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnf_pkg_id) - vnf_pkg.update(onboardingState=PKG_STATUS.PROCESSING) - vnfd_json = toscaparsers.parse_vnfd(vnf_pkg_path) - vnfd = json.JSONDecoder().decode(vnfd_json) - - if vnfd.get("vnf", "") != "": - vnfd_id = vnfd["vnf"]["properties"].get("descriptor_id", "") - other_pkg = VnfPackageModel.objects.filter(vnfdId=vnfd_id) - if other_pkg and other_pkg[0].vnfPackageId != vnf_pkg_id: - logger.error("VNF package(%s,%s) already exists.", other_pkg[0].vnfPackageId, vnfd_id) - raise GenericparserException("VNF package(%s) already exists." % vnfd_id) - vnf_provider = vnfd["vnf"]["properties"].get("provider", "") - vnfd_ver = vnfd["vnf"]["properties"].get("descriptor_version", "") - vnf_software_version = vnfd["vnf"]["properties"].get("software_version", "") - vnfd_product_name = vnfd["vnf"]["properties"].get("product_name", "") - vnf_pkg.update( - vnfPackageId=vnf_pkg_id, - vnfdId=vnfd_id, - vnfdProductName=vnfd_product_name, - vnfVendor=vnf_provider, - vnfdVersion=vnfd_ver, - vnfSoftwareVersion=vnf_software_version, - vnfdModel=vnfd_json, - onboardingState=PKG_STATUS.ONBOARDED, - operationalState=PKG_STATUS.ENABLED, - usageState=PKG_STATUS.NOT_IN_USE, - localFilePath=vnf_pkg_path, - vnfPackageUri=os.path.split(vnf_pkg_path)[-1] - ) - else: - raise GenericparserException("VNF propeties and metadata in VNF Package(id=%s) are empty." % vnf_pkg_id) - logger.info('VNF package(%s) has been processed(done).' % vnf_pkg_id) - - -def handle_upload_failed(vnf_pkg_id): - vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnf_pkg_id) - vnf_pkg.update(onboardingState=PKG_STATUS.CREATED) diff --git a/genericparser/packages/biz/vnf_pkg_artifacts.py b/genericparser/packages/biz/vnf_pkg_artifacts.py deleted file mode 100644 index 0cec274..0000000 --- a/genericparser/packages/biz/vnf_pkg_artifacts.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 logging - -from genericparser.pub.database.models import VnfPackageModel -from genericparser.pub.exceptions import ResourceNotFoundException, ArtifactNotFoundException -from genericparser.pub.utils import fileutil - -logger = logging.getLogger(__name__) - - -class FetchVnfPkgArtifact(object): - def fetch(self, vnfPkgId, artifactPath): - logger.debug("FetchVnfPkgArtifact--get--single--artifact--biz::>" - "ID: %s path: %s" % (vnfPkgId, artifactPath)) - vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=vnfPkgId) - if not vnf_pkg.exists(): - err_msg = "NF Package (%s) doesn't exists." % vnfPkgId - raise ResourceNotFoundException(err_msg) - vnf_pkg = vnf_pkg.get() - local_path = vnf_pkg.localFilePath - if local_path.endswith(".csar") or local_path.endswith(".zip"): - vnf_extract_path = fileutil.unzip_csar_to_tmp(local_path) - artifact_path = fileutil.get_artifact_path(vnf_extract_path, artifactPath) - if not artifact_path: - raise ArtifactNotFoundException("Couldn't artifact %s" % artifactPath) - with open(artifact_path, 'rt') as f: - file_content = f.read() - else: - raise ArtifactNotFoundException("NF Package format is not csar or zip") - return file_content diff --git a/genericparser/packages/biz/vnf_pkg_subscription.py b/genericparser/packages/biz/vnf_pkg_subscription.py deleted file mode 100644 index 8da82ad..0000000 --- a/genericparser/packages/biz/vnf_pkg_subscription.py +++ /dev/null @@ -1,190 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 ast -import json -import logging -import os -import requests -import uuid - -from collections import Counter -from rest_framework import status - -from genericparser.packages import const -from genericparser.pub.database.models import VnfPkgSubscriptionModel -from genericparser.pub.exceptions import VnfPkgSubscriptionException,\ - VnfPkgDuplicateSubscriptionException, SubscriptionDoesNotExistsException -from genericparser.pub.utils.values import ignore_case_get - - -logger = logging.getLogger(__name__) - -ROOT_FILTERS = { - "notificationTypes": "notification_types", - "vnfdId": "vnfd_id", - "vnfPkgId": "vnf_pkg_id", - "operationalState": "operation_states", - "usageState": "usage_states" -} - - -def is_filter_type_equal(new_filter, existing_filter): - return Counter(new_filter) == Counter(existing_filter) - - -class CreateSubscription(object): - - def __init__(self, data): - self.data = data - self.filter = ignore_case_get(self.data, "filters", {}) - self.callback_uri = ignore_case_get(self.data, "callbackUri") - self.authentication = ignore_case_get(self.data, "authentication", {}) - self.notification_types = ignore_case_get(self.filter, "notificationTypes", []) - self.operation_states = ignore_case_get(self.filter, "operationalState", []) - self.usage_states = ignore_case_get(self.filter, "usageState", []) - self.vnfd_id = ignore_case_get(self.filter, "vnfdId", []) - self.vnf_pkg_id = ignore_case_get(self.filter, "vnfPkgId", []) - self.vnf_products_from_provider = \ - ignore_case_get(self.filter, "vnfProductsFromProviders", {}) - - def check_callbackuri_connection(self): - logger.debug("SubscribeNotification-post::> Sending GET request " - "to %s" % self.callback_uri) - 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 - ) - ) - except Exception: - raise VnfPkgSubscriptionException( - "callbackUri %s didn't return 204 status code." % self.callback_uri - ) - - def do_biz(self): - self.subscription_id = str(uuid.uuid4()) - self.check_callbackuri_connection() - self.check_valid_auth_info() - self.check_valid() - self.save_db() - subscription = VnfPkgSubscriptionModel.objects.get( - subscription_id=self.subscription_id - ) - if subscription: - return subscription.toDict() - - def check_valid_auth_info(self): - logger.debug("SubscribeNotification--post::> Validating Auth " - "details if provided") - if self.authentication.get("paramsBasic", {}) and \ - const.BASIC not in self.authentication.get("authType"): - raise VnfPkgSubscriptionException('Auth type should be ' + const.BASIC) - if self.authentication.get("paramsOauth2ClientCredentials", {}) and \ - const.OAUTH2_CLIENT_CREDENTIALS not in self.authentication.get("authType"): - raise VnfPkgSubscriptionException('Auth type should be ' + const.OAUTH2_CLIENT_CREDENTIALS) - - def check_filter_exists(self, sub): - # Check the usage states, operationStates - for filter_type in ["operation_states", "usage_states"]: - if not is_filter_type_equal(getattr(self, filter_type), - ast.literal_eval(getattr(sub, filter_type))): - return False - # If all the above types are same then check id filters - for id_filter in ["vnfd_id", "vnf_pkg_id"]: - if not is_filter_type_equal(getattr(self, id_filter), - ast.literal_eval(getattr(sub, id_filter))): - return False - return True - - def check_valid(self): - logger.debug("SubscribeNotification--post::> Checking DB if " - "callbackUri already exists") - subscriptions = VnfPkgSubscriptionModel.objects.filter(callback_uri=self.callback_uri) - if not subscriptions.exists(): - return True - for subscription in subscriptions: - if self.check_filter_exists(subscription): - raise VnfPkgDuplicateSubscriptionException( - "Already Subscription (%s) exists with the " - "same callbackUri and filter" % subscription.subscription_id) - return True - - def save_db(self): - logger.debug("SubscribeNotification--post::> Saving the subscription " - "%s to the database" % self.subscription_id) - links = { - "self": { - "href": os.path.join(const.VNFPKG_SUBSCRIPTION_ROOT_URI, self.subscription_id) - } - } - VnfPkgSubscriptionModel.objects.create( - subscription_id=self.subscription_id, - callback_uri=self.callback_uri, - notification_types=json.dumps(self.notification_types), - auth_info=json.dumps(self.authentication), - usage_states=json.dumps(self.usage_states), - operation_states=json.dumps(self.operation_states), - vnf_products_from_provider=json.dumps(self.vnf_products_from_provider), - vnfd_id=json.dumps(self.vnfd_id), - vnf_pkg_id=json.dumps(self.vnf_pkg_id), - links=json.dumps(links)) - logger.debug('Create Subscription[%s] success', self.subscription_id) - - -class QuerySubscription(object): - - def query_multi_subscriptions(self, params): - query_data = {} - logger.debug("QuerySubscription--get--multi--subscriptions--biz::> Check " - "for filters in query params %s" % params) - for query, value in list(params.items()): - if query in ROOT_FILTERS: - query_data[ROOT_FILTERS[query] + '__icontains'] = value - # Query the database with filters if the request has fields in request params, else fetch all records - if query_data: - subscriptions = VnfPkgSubscriptionModel.objects.filter(**query_data) - else: - subscriptions = VnfPkgSubscriptionModel.objects.all() - if not subscriptions.exists(): - return [] - return [subscription.toDict() for subscription in subscriptions] - - def query_single_subscription(self, subscription_id): - logger.debug("QuerySingleSubscriptions--get--single--subscription--biz::> " - "ID: %s" % subscription_id) - - subscription = VnfPkgSubscriptionModel.objects.filter( - subscription_id=subscription_id) - if not subscription.exists(): - raise SubscriptionDoesNotExistsException("Subscription with ID: %s " - "does not exists" % subscription_id) - return subscription[0].toDict() - - -class TerminateSubscription(object): - - def terminate(self, subscription_id): - logger.debug("TerminateSubscriptions--delete--biz::> " - "ID: %s" % subscription_id) - - subscription = VnfPkgSubscriptionModel.objects.filter( - subscription_id=subscription_id) - if not subscription.exists(): - raise SubscriptionDoesNotExistsException("Subscription with ID: %s " - "does not exists" % subscription_id) - subscription[0].delete() diff --git a/genericparser/packages/const.py b/genericparser/packages/const.py deleted file mode 100644 index 2b8778b..0000000 --- a/genericparser/packages/const.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright 2018 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.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" -) - -AUTH_TYPES = [ - "BASIC", - "OAUTH2_CLIENT_CREDENTIALS", - "TLS_CERT" -] - -BASIC = "BASIC" - -OAUTH2_CLIENT_CREDENTIALS = "OAUTH2_CLIENT_CREDENTIALS" - -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" -] diff --git a/genericparser/packages/serializers/__init__.py b/genericparser/packages/serializers/__init__.py deleted file mode 100644 index 342c2a8..0000000 --- a/genericparser/packages/serializers/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2018 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. diff --git a/genericparser/packages/serializers/checksum.py b/genericparser/packages/serializers/checksum.py deleted file mode 100644 index 1296626..0000000 --- a/genericparser/packages/serializers/checksum.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers - - -class ChecksumSerializer(serializers.Serializer): - algorithm = serializers.CharField( - help_text="Name of the algorithm used to generate the checksum.", - required=True, - allow_null=False, - allow_blank=False - ) - hash = serializers.CharField( - help_text="The hexadecimal value of the checksum.", - required=True, - allow_null=True, - allow_blank=False - ) diff --git a/genericparser/packages/serializers/create_nsd_info_request.py b/genericparser/packages/serializers/create_nsd_info_request.py deleted file mode 100644 index 24fe3b7..0000000 --- a/genericparser/packages/serializers/create_nsd_info_request.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers - - -class CreateNsdInfoRequestSerializer(serializers.Serializer): - userDefinedData = serializers.DictField( - help_text="User-defined data for the NS descriptor resource to be created." - "It shall be present when the user defined data is set for the individual NS " - "descriptor resource to be created.", - child=serializers.CharField( - help_text='Key Value Pairs', - allow_blank=True - ), - required=False, - allow_null=True - ) diff --git a/genericparser/packages/serializers/create_pnfd_info_request.py b/genericparser/packages/serializers/create_pnfd_info_request.py deleted file mode 100644 index 01d8229..0000000 --- a/genericparser/packages/serializers/create_pnfd_info_request.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers - - -class CreatePnfdInfoRequestSerializer(serializers.Serializer): - userDefinedData = serializers.DictField( - help_text="User-defined data for the PNF descriptor resource to be created." - "It shall be present when the user defined data is set for the individual " - "PNF descriptor resource to be created.", - child=serializers.CharField( - help_text='Key Value Pairs', - allow_blank=True - ), - required=False, - allow_null=True - ) diff --git a/genericparser/packages/serializers/create_vnf_pkg_info_req.py b/genericparser/packages/serializers/create_vnf_pkg_info_req.py deleted file mode 100644 index 6da281d..0000000 --- a/genericparser/packages/serializers/create_vnf_pkg_info_req.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers - - -class CreateVnfPkgInfoRequestSerializer(serializers.Serializer): - userDefinedData = serializers.DictField( - help_text="User defined data for the VNF package.", - child=serializers.CharField( - help_text="KeyValue Pairs", - allow_blank=True - ), - required=False, - allow_null=True - ) diff --git a/genericparser/packages/serializers/genericparser_serializers.py b/genericparser/packages/serializers/genericparser_serializers.py deleted file mode 100644 index 7bcb9ef..0000000 --- a/genericparser/packages/serializers/genericparser_serializers.py +++ /dev/null @@ -1,442 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers - -from genericparser.pub.utils.toscaparsers.nsdmodel import EtsiNsdInfoModel -from genericparser.pub.utils.toscaparsers.vnfdmodel import EtsiVnfdInfoModel - - -class PostJobRequestSerializer(serializers.Serializer): - progress = serializers.CharField( - help_text="Job Progress", - required=False - ) - desc = serializers.CharField( - help_text="Description", - required=False - ) - errcode = serializers.CharField( - help_text="Error Code", - required=False - ) - - -class JobResponseHistoryListSerializer(serializers.Serializer): - status = serializers.CharField( - help_text="Status", - required=False - ) - progress = serializers.CharField( - help_text="Job Progress", - required=False - ) - statusDescription = serializers.CharField( - help_text="Status Description", - required=False - ) - errorCode = serializers.CharField( - help_text="Error Code", - required=False, - allow_null=True - ) - responseId = serializers.CharField( - help_text="Response Id", - required=False - ) - - -class JobResponseDescriptorSerializer(serializers.Serializer): - status = serializers.CharField( - help_text="Status", - required=False - ) - progress = serializers.CharField( - help_text="Job Progress", - required=False - ) - statusDescription = serializers.CharField( - help_text="Status Description", - required=False - ) - errorCode = serializers.CharField( - help_text="Error Code", - required=False, - allow_null=True - ) - responseId = serializers.CharField( - help_text="Response Id", - required=False - ) - responseHistoryList = JobResponseHistoryListSerializer( - help_text="Response History List", - many=True, - required=False - ) - - -class GetJobResponseSerializer(serializers.Serializer): - jobId = serializers.CharField( - help_text="Job Id", - required=False - ) - responseDescriptor = JobResponseDescriptorSerializer( - help_text="Job Response Descriptor", - required=False - ) - - -class PostJobResponseResultSerializer(serializers.Serializer): - result = serializers.CharField( - help_text="Result", - required=True - ) - msg = serializers.CharField( - help_text="Message", - required=False - ) - - -class InternalErrorRequestSerializer(serializers.Serializer): - error = serializers.CharField( - help_text="Error", - required=True - ) - errorMessage = serializers.CharField( - help_text="Error Message", - required=False - ) - - -class NsPackageDistributeRequestSerializer(serializers.Serializer): - csarId = serializers.CharField( - help_text="csarId", - required=True - ) - - -class NsPackageDistributeResponseSerializer(serializers.Serializer): - status = serializers.CharField( - help_text="status", - required=True - ) - statusDescription = serializers.CharField( - help_text="statusDescription", - required=True - ) - errorCode = serializers.CharField( - help_text="errorCode", - required=True, - allow_null=True - ) - - -class NsPackageInfoSerializer(serializers.Serializer): - nsdId = serializers.CharField( - help_text="NSD ID", - required=False, - allow_null=True - ) - nsPackageId = serializers.CharField( - help_text="NS Package ID", - allow_blank=True, - required=False, - allow_null=True - ) - nsdProvider = serializers.CharField( - help_text="NSD Provider", - allow_blank=True, - required=False, - allow_null=True - ) - nsdVersion = serializers.CharField( - help_text="NSD Version", - allow_blank=True, - required=False, - allow_null=True - ) - csarName = serializers.CharField( - help_text="CSAR name", - allow_blank=True, - required=False, - allow_null=True - ) - nsdModel = serializers.CharField( - help_text="NSD Model", - allow_blank=True, - required=False, - allow_null=True - ) - downloadUrl = serializers.CharField( - help_text="URL to download NSD Model", - required=False, - allow_null=True - ) - - -class NsPackageSerializer(serializers.Serializer): - csarId = serializers.CharField( - help_text="CSAR ID", - required=False, - allow_null=True - ) - packageInfo = NsPackageInfoSerializer( - help_text="NS Package Info", - required=False, - allow_null=True - ) - - -class NsPackagesSerializer(serializers.ListSerializer): - child = NsPackageSerializer() - - -class ServicePackageDistributeRequestSerializer(serializers.Serializer): - csarId = serializers.CharField( - help_text="csarId", - required=True - ) - - -class ServicePackageInfoSerializer(serializers.Serializer): - servicedId = serializers.CharField( - help_text="ServiceD ID", - required=False, - allow_null=True - ) - servicePackageId = serializers.CharField( - help_text="Service Package ID", - allow_blank=True, - required=False, - allow_null=True - ) - servicedProvider = serializers.CharField( - help_text="ServiceD Provider", - allow_blank=True, - required=False, - allow_null=True - ) - servicedVersion = serializers.CharField( - help_text="ServiceD Version", - allow_blank=True, - required=False, - allow_null=True - ) - csarName = serializers.CharField( - help_text="CSAR name", - allow_blank=True, - required=False, - allow_null=True - ) - servicedModel = serializers.CharField( - help_text="ServiceD Model", - allow_blank=True, - required=False, - allow_null=True - ) - downloadUrl = serializers.CharField( - help_text="URL to download ServiceD Model", - required=False, - allow_null=True - ) - - -class ServicePackageSerializer(serializers.Serializer): - csarId = serializers.CharField( - help_text="CSAR ID", - required=False, - allow_null=True - ) - packageInfo = ServicePackageInfoSerializer( - help_text="Service Package Info", - required=False, - allow_null=True - ) - - -class ServicePackagesSerializer(serializers.ListSerializer): - child = ServicePackageSerializer() - - -class NfPackageDistributeRequestSerializer(serializers.Serializer): - csarId = serializers.CharField( - help_text="CSAR ID", - required=True - ) - vimIds = serializers.ListField( - help_text="A string for vimIds", - child=serializers.CharField(), - required=False - ) - labVimId = serializers.CharField( - help_text="A list of VIM IDs.", - allow_blank=True, - required=False - ) - - -class NfPackageInfoSerializer(serializers.Serializer): - vnfdId = serializers.CharField( - help_text="VNFD ID", - required=False, - allow_null=True, - allow_blank=True - ) - vnfPackageId = serializers.CharField( - help_text="VNF Package ID", - required=True - ) - vnfdProvider = serializers.CharField( - help_text="VNFD Provider", - required=False, - allow_null=True, - allow_blank=True - ) - vnfdVersion = serializers.CharField( - help_text="VNFD Version", - required=False, - allow_null=True, - allow_blank=True - ) - vnfVersion = serializers.CharField( - help_text="VNF Version", - required=False, - allow_null=True, - allow_blank=True - ) - csarName = serializers.CharField( - help_text="CSAR Name", - required=False, - allow_null=True, - allow_blank=True - ) - vnfdModel = serializers.CharField( - help_text="VNFD Model", - required=False, - allow_null=True, - allow_blank=True - ) - downloadUrl = serializers.CharField( - help_text="URL to download VNFD Model", - required=False, - allow_null=True, - allow_blank=True - ) - - -class NfImageInfoSerializer(serializers.Serializer): - index = serializers.CharField( - help_text="Index of VNF Image", - required=True - ) - fileName = serializers.CharField( - help_text="Image file name", - required=True - ) - imageId = serializers.CharField( - help_text="Image ID", - required=True - ) - vimId = serializers.CharField( - help_text="VIM ID", - required=True - ) - vimUser = serializers.CharField( - help_text="User of VIM", - required=True - ) - tenant = serializers.CharField( - help_text="Tenant", - required=True - ) - status = serializers.CharField( - help_text="Status", - required=True - ) - - -class NfPackageSerializer(serializers.Serializer): - csarId = serializers.CharField( - help_text="CSAR ID", - required=True - ) - packageInfo = NfPackageInfoSerializer( - help_text="VNF Package Info", - required=True - ) - imageInfo = NfImageInfoSerializer( - help_text="Image Info", - required=False, - many=True, - allow_null=True - ) - - -class NfPackagesSerializer(serializers.ListSerializer): - child = NfPackageSerializer() - - -class PostJobResponseSerializer(serializers.Serializer): - jobId = serializers.CharField( - help_text="jobId", - required=True - ) - - -class ParseModelRequestSerializer(serializers.Serializer): - csarId = serializers.CharField( - help_text="CSAR ID", - required=True - ) - packageType = serializers.CharField( - help_text="Package type: VNF, PNF, NS, Service", - required=False - ) - inputs = serializers.JSONField( - help_text="Inputs", - required=False - ) - - -class ParseModelResponseSerializer(serializers.Serializer): - model = serializers.JSONField( - help_text="Model", - required=True - ) - - -class EtsiNsdInfoModelSerializer(serializers.ModelSerializer): - - class Meta: - model = EtsiNsdInfoModel - - -class EtsiVnfdInfoModelSerializer(serializers.ModelSerializer): - - class Meta: - model = EtsiVnfdInfoModel - - -class ParseNSPackageResponseSerializer(serializers.Serializer): - model = EtsiNsdInfoModelSerializer( - help_text="NSD Model", - required=True - ) - - -class ParseNfPackageResponseSerializer(serializers.Serializer): - model = EtsiVnfdInfoModelSerializer( - help_text="VNFD Model", - required=True - ) diff --git a/genericparser/packages/serializers/link.py b/genericparser/packages/serializers/link.py deleted file mode 100644 index a6a503c..0000000 --- a/genericparser/packages/serializers/link.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers - - -class LinkSerializer(serializers.Serializer): - href = serializers.CharField( - help_text='URI of the referenced resource', - required=True, - allow_null=False, - allow_blank=False - ) diff --git a/genericparser/packages/serializers/nsd_info.py b/genericparser/packages/serializers/nsd_info.py deleted file mode 100644 index 9450582..0000000 --- a/genericparser/packages/serializers/nsd_info.py +++ /dev/null @@ -1,161 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers -from .problem_details import ProblemDetailsSerializer -from .link import LinkSerializer - - -class _LinkSerializer(serializers.Serializer): - self = LinkSerializer( - help_text="URI of this resource.", - required=True, - allow_null=False - ) - nsd_content = LinkSerializer( - help_text="Link to the NSD content resource.", - required=True, - allow_null=False - ) - - class Meta: - ref_name = "NSD_LinkSerializer" - - -class NsdInfoSerializer(serializers.Serializer): - id = serializers.CharField( - help_text="Identifier of the onboarded individual NS descriptor resource." - "This identifier is allocated by the NFVO.", - required=True, - allow_null=False, - allow_blank=False - ) - nsdId = serializers.CharField( - help_text="This identifier, which is allocated by the NSD designer," - "identifies the NSD in a globally unique way." - "It is copied from the NSD content and shall be present after the " - "NSD content is on-boarded.", - required=False, - allow_null=True, - allow_blank=True - ) - nsdName = serializers.CharField( - help_text="Name of the onboarded NSD." - "This information is copied from the NSD content and shall be present " - "after the NSD content is on-boarded.", - required=False, - allow_null=True, - allow_blank=True - ) - nsdVersion = serializers.CharField( # TODO: data type is version - help_text="Version of the on-boarded NSD." - "This information is copied from the NSD content and shall be " - "present after the NSD content is on-boarded.", - required=False, - allow_null=True, - allow_blank=True - ) - nsdDesigner = serializers.CharField( - help_text="Designer of the on-boarded NSD." - "This information is copied from the NSD content and shall be " - "present after the NSD content is on-boarded.", - required=False, - allow_null=True, - allow_blank=True - ) - nsdInvariantId = serializers.CharField( - help_text="This identifier, which is allocated by the NSD designer," - "identifies an NSD in a version independent manner." - "This information is copied from the NSD content and shall be " - "present after the NSD content is on-boarded.", - required=False, - allow_null=True, - allow_blank=True - ) - vnfPkgIds = serializers.ListSerializer( - help_text="Identifies the VNF package for the VNFD referenced " - "by the on-boarded NS descriptor resource.", - child=serializers.CharField( - help_text="Identifier of the VNF package", - allow_blank=True - ), - required=False, - allow_null=True, - allow_empty=True - ) - pnfdInfoIds = serializers.ListSerializer( - help_text="Identifies the PnfdInfo element for the PNFD referenced " - "by the on-boarded NS descriptor resource.", - child=serializers.CharField( - help_text="Identifier of the PnfdInfo element", - allow_blank=True - ), - required=False, - allow_null=True, - allow_empty=True - ) - nestedNsdInfoIds = serializers.ListSerializer( - help_text="Identifies the NsdInfo element for the nested NSD referenced " - "by the on-boarded NS descriptor resource.", - child=serializers.CharField( - help_text="Identifier of the NsdInfo element", - allow_blank=True - ), - required=False, - allow_null=True, - allow_empty=True - ) - nsdOnboardingState = serializers.ChoiceField( - help_text="Onboarding state of the individual NS descriptor resource.", - choices=["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"], - required=True, - allow_null=False, - allow_blank=False - ) - onboardingFailureDetails = ProblemDetailsSerializer( - help_text="Failure details of current onboarding procedure." - "It shall be present when the nsdOnboardingState attribute is CREATED " - "and the uploading or processing fails in NFVO.", - required=False, - allow_null=True, - ) - nsdOperationalState = serializers.ChoiceField( - help_text="Operational state of the individual NS descriptor resource." - "This attribute can be modified with the PATCH method.", - choices=["ENABLED", "DISABLED"], - required=True, - allow_null=False, - allow_blank=False - ) - nsdUsageState = serializers.ChoiceField( - help_text="Usage state of the individual NS descriptor resource.", - choices=["IN_USE", "NOT_IN_USE"], - required=True, - allow_null=False, - ) - userDefinedData = serializers.DictField( - help_text="User defined data for the individual NS descriptor resource." - "This attribute can be modified with the PATCH method.", - child=serializers.CharField( - help_text="Key Value Pairs", - allow_blank=True - ), - required=False, - allow_null=True - ) - _links = _LinkSerializer( - help_text="Links to resources related to this resource.", - required=True, - allow_null=True # TODO: supposed to be False - ) diff --git a/genericparser/packages/serializers/nsd_infos.py b/genericparser/packages/serializers/nsd_infos.py deleted file mode 100644 index d63c332..0000000 --- a/genericparser/packages/serializers/nsd_infos.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers -from .nsd_info import NsdInfoSerializer - - -class NsdInfosSerializer(serializers.ListSerializer): - child = NsdInfoSerializer() diff --git a/genericparser/packages/serializers/nsdm_filter_data.py b/genericparser/packages/serializers/nsdm_filter_data.py deleted file mode 100644 index 43213e0..0000000 --- a/genericparser/packages/serializers/nsdm_filter_data.py +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 rest_framework import serializers - -from genericparser.packages.const import NSDM_NOTIFICATION_TYPES - - -class NsdmNotificationsFilter(serializers.Serializer): - notificationTypes = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=NSDM_NOTIFICATION_TYPES - ), - help_text="Match particular notification types", - allow_null=False, - required=False - ) - nsdInfoId = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match NS packages with particular nsdInfoIds", - allow_null=False, - required=False - ) - nsdId = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match NS Packages with particular nsdIds", - allow_null=False, - required=False - ) - nsdName = serializers.ListField( - child=serializers.CharField( - max_length=255, - required=True - ), - help_text="Match NS Packages with particular nsdNames", - allow_null=False, - required=False - ) - nsdVersion = serializers.ListField( - child=serializers.CharField( - max_length=255, - required=True - ), - help_text="match NS packages that belong to certain nsdversion", - required=False, - allow_null=False - ) - nsdInvariantId = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match NS Packages with particular nsdInvariantIds", - allow_null=False, - required=False - ) - vnfPkgIds = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match NS Packages that has VNF PackageIds", - allow_null=False, - required=False - ) - nestedNsdInfoIds = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match NS Packages with particular nsdInvariantIds", - allow_null=False, - required=False - ) - nsdOnboardingState = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=[ - 'CREATED', - 'UPLOADING', - 'PROCESSING', - 'ONBOARDED' - ] - ), - help_text="Match NS Packages with particular NS Onboarding State", - allow_null=False, - required=False - ) - nsdOperationalState = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=['ENABLED', 'DISABLED'] - ), - help_text="Match NS Packages with particular NS Operational State", - allow_null=False, - required=False - ) - nsdUsageState = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=['IN_USE', 'NOT_IN_USE'] - ), - help_text="Match NS Packages with particular NS Usage State", - allow_null=False, - required=False - ) - pnfdInfoIds = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match PF packages with particular pnfdInfoIds", - allow_null=False, - required=False - ) - pnfdId = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match PF packages with particular pnfdInfoIds", - allow_null=False, - required=False - ) - pnfdName = serializers.ListField( - child=serializers.CharField( - max_length=255, - required=True - ), - help_text="Match PF Packages with particular pnfdNames", - allow_null=False, - required=False - ) - pnfdVersion = serializers.ListField( - child=serializers.CharField( - max_length=255, - required=True - ), - help_text="match PF packages that belong to certain pnfd version", - required=False, - allow_null=False - ) - pnfdProvider = serializers.ListField( - child=serializers.CharField( - max_length=255, - required=True - ), - help_text="Match PF Packages with particular pnfdProvider", - allow_null=False, - required=False - ) - pnfdInvariantId = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match PF Packages with particular pnfdInvariantIds", - allow_null=False, - required=False - ) - pnfdOnboardingState = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=[ - 'CREATED', - 'UPLOADING', - 'PROCESSING', - 'ONBOARDED' - ] - ), - help_text="Match PF Packages with particular PNF Onboarding State ", - allow_null=False, - required=False - ) - pnfdUsageState = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=['IN_USE', 'NOT_IN_USE'] - ), - help_text="Match PF Packages with particular PNF usage State", - allow_null=False, - required=False - ) diff --git a/genericparser/packages/serializers/nsdm_subscription.py b/genericparser/packages/serializers/nsdm_subscription.py deleted file mode 100644 index 87aa48d..0000000 --- a/genericparser/packages/serializers/nsdm_subscription.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 rest_framework import serializers - -from .link import LinkSerializer -from .subscription_auth_data import SubscriptionAuthenticationSerializer -from .nsdm_filter_data import NsdmNotificationsFilter - - -class NsdmSubscriptionLinkSerializer(serializers.Serializer): - self = LinkSerializer( - help_text="Links to resources related to this resource.", - required=True - ) - - -class NsdmSubscriptionSerializer(serializers.Serializer): - id = serializers.CharField( - help_text="Identifier of this subscription resource.", - max_length=255, - required=True, - allow_null=False - ) - callbackUri = serializers.CharField( - help_text="The URI of the endpoint to send the notification to.", - max_length=255, - required=True, - allow_null=False - ) - filter = NsdmNotificationsFilter( - help_text="Filter settings for this subscription, to define the " - "of all notifications this subscription relates to.", - required=False - ) - _links = NsdmSubscriptionLinkSerializer( - help_text="Links to resources related to this resource.", - required=True - ) - - -class NsdmSubscriptionsSerializer(serializers.ListSerializer): - child = NsdmSubscriptionSerializer() - - -class NsdmSubscriptionIdSerializer(serializers.Serializer): - subscription_id = serializers.UUIDField( - help_text="Identifier of this subscription resource.", - required=True, - allow_null=False - ) - - -class NsdmSubscriptionRequestSerializer(serializers.Serializer): - callbackUri = serializers.CharField( - help_text="The URI of the endpoint to send the notification to.", - required=True, - allow_null=False - ) - filter = NsdmNotificationsFilter( - help_text="Filter settings for the subscription," - " to define the subset of all " - "notifications this subscription relates to.", - required=False, - allow_null=True - ) - authentication = SubscriptionAuthenticationSerializer( - help_text="Authentication parameters to configure" - " the use of Authorization when sending " - "notifications corresponding to this subscription.", - required=False, - allow_null=True - ) diff --git a/genericparser/packages/serializers/pnfd_info.py b/genericparser/packages/serializers/pnfd_info.py deleted file mode 100644 index f9f4b6b..0000000 --- a/genericparser/packages/serializers/pnfd_info.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers -from .problem_details import ProblemDetailsSerializer -from .link import LinkSerializer - - -class _LinkSerializer(serializers.Serializer): - self = LinkSerializer( - help_text='URI of this resource.', - required=True, - allow_null=False - ) - pnfd_content = LinkSerializer( - help_text='Link to the PNFD content resource.', - required=True, - allow_null=False - ) - - -class PnfdInfoSerializer(serializers.Serializer): - id = serializers.CharField( - help_text='Identifier of the onboarded individual PNF descriptor resource. \ - This identifier is allocated by the NFVO.', - required=True, - allow_null=False, - allow_blank=False - ) - pnfdId = serializers.CharField( - help_text='This identifier, which is allocated by the PNFD designer, \ - identifies the PNFD in a globally unique way. \ - It is copied from the PNFD content and shall be present after the PNFD content is on-boarded.', - required=False, - allow_null=True, - allow_blank=True - ) - pnfdName = serializers.CharField( - help_text='Name of the onboarded PNFD. \ - This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.', - required=False, - allow_null=True, - allow_blank=True - ) - pnfdVersion = serializers.CharField( # TODO: data type is version - help_text='Version of the on-boarded PNFD. \ - This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.', - required=False, - allow_null=True, - allow_blank=True - ) - pnfdProvider = serializers.CharField( - help_text='Provider of the on-boarded PNFD. \ - This information is copied from the PNFD content and shall be present after the PNFD content is on-boarded.', - required=False, - allow_null=True, - allow_blank=True - ) - pnfdInvariantId = serializers.CharField( - help_text='Identifies a PNFD in a version independent manner. \ - This attribute is invariant across versions of PNFD.', - required=False, - allow_null=True, - allow_blank=True - ) - pnfdOnboardingState = serializers.ChoiceField( - help_text='Onboarding state of the individual PNF descriptor resource.', - choices=['CREATED', 'UPLOADING', 'PROCESSING', 'ONBOARDED'], - required=True, - allow_null=False, - allow_blank=False - ) - onboardingFailureDetails = ProblemDetailsSerializer( - help_text='Failure details of current onboarding procedure. \ - It shall be present when the "pnfdOnboardingState" attribute is CREATED and the uploading or processing fails in NFVO.', - required=False, - allow_null=True, - ) - pnfdUsageState = serializers.ChoiceField( - help_text='Usage state of the individual PNF descriptor resource.', - choices=['IN_USE', 'NOT_IN_USE'], - required=True, - allow_null=False, - ) - userDefinedData = serializers.DictField( - help_text='User defined data for the individual PNF descriptor resource. \ - This attribute can be modified with the PATCH method.', - child=serializers.CharField(help_text='Key Value Pairs', allow_blank=True), - required=False, - allow_null=True - ) - _links = _LinkSerializer( - help_text='Links to resources related to this resource.', - required=True, - allow_null=True # TODO: supposed to be False - ) diff --git a/genericparser/packages/serializers/pnfd_infos.py b/genericparser/packages/serializers/pnfd_infos.py deleted file mode 100644 index 0874c9e..0000000 --- a/genericparser/packages/serializers/pnfd_infos.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers -from .pnfd_info import PnfdInfoSerializer - - -class PnfdInfosSerializer(serializers.ListSerializer): - child = PnfdInfoSerializer() diff --git a/genericparser/packages/serializers/problem_details.py b/genericparser/packages/serializers/problem_details.py deleted file mode 100644 index 68d4500..0000000 --- a/genericparser/packages/serializers/problem_details.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers - - -class ProblemDetailsSerializer(serializers.Serializer): - type = serializers.CharField( - help_text='A URI reference according to IETF RFC 3986 [10] that identifies the problem type. \ - It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. \ - When this member is not present, its value is assumed to be "about:blank".', - required=False, - allow_null=True, - allow_blank=True - ) - title = serializers.CharField( - help_text='A short, human-readable summary of the problem type. \ - It should not change from occurrence to occurrence of the problem, except for purposes of localization. \ - If type is given and other than "about:blank", this attribute shall also be provided.', - required=False, - allow_null=True, - allow_blank=True - ) - title = serializers.IntegerField( - help_text='The HTTP status code for this occurrence of the problem.', - required=True, - allow_null=False - ) - detail = serializers.CharField( - help_text='A human-readable explanation specific to this occurrence of the problem.', - required=True, - allow_null=False, - allow_blank=False - ) - instance = serializers.CharField( - help_text='A URI reference that identifies the specific occurrence of the problem. \ - It may yield further information if dereferenced.', - required=False, - allow_null=True, - allow_blank=True - ) - additional_attributes = serializers.DictField( - help_text='Any number of additional attributes, as defined in a specification or by an implementation.', - child=serializers.CharField(help_text='Additional attribute', allow_blank=True), - required=False, - allow_null=True, - ) diff --git a/genericparser/packages/serializers/response.py b/genericparser/packages/serializers/response.py deleted file mode 100644 index e2cca92..0000000 --- a/genericparser/packages/serializers/response.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved. -# -# 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 rest_framework import serializers - - -class ProblemDetailsSerializer(serializers.Serializer): - type = serializers.CharField( - help_text="Type", - required=False, - allow_null=True - ) - title = serializers.CharField( - help_text="Title", - required=False, - allow_null=True - ) - status = serializers.IntegerField( - help_text="Status", - required=True - ) - detail = serializers.CharField( - help_text="Detail", - required=True, - allow_null=True - ) - instance = serializers.CharField( - help_text="Instance", - required=False, - allow_null=True - ) - additional_details = serializers.ListField( - help_text="Any number of additional attributes, as defined in a " - "specification or by an implementation.", - required=False, - allow_null=True - ) - - class Meta: - ref_name = 'SUBSCRIPTION_ProblemDetailsSerializer' diff --git a/genericparser/packages/serializers/subscription_auth_data.py b/genericparser/packages/serializers/subscription_auth_data.py deleted file mode 100644 index 9248fb1..0000000 --- a/genericparser/packages/serializers/subscription_auth_data.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 rest_framework import serializers - -from genericparser.packages import const - - -class OAuthCredentialsSerializer(serializers.Serializer): - clientId = serializers.CharField( - help_text="Client identifier to be used in the access token " - "request of the OAuth 2.0 client credentials grant type.", - required=False, - max_length=255, - allow_null=False - ) - clientPassword = serializers.CharField( - help_text="Client password to be used in the access token " - "request of the OAuth 2.0 client credentials grant type.", - required=False, - max_length=255, - allow_null=False - ) - tokenEndpoint = serializers.CharField( - help_text="The token endpoint from which the access token can " - "be obtained.", - required=False, - max_length=255, - allow_null=False - ) - - -class BasicAuthSerializer(serializers.Serializer): - userName = serializers.CharField( - help_text="Username to be used in HTTP Basic authentication.", - max_length=255, - required=False, - allow_null=False - ) - password = serializers.CharField( - help_text="Password to be used in HTTP Basic authentication.", - max_length=255, - required=False, - allow_null=False - ) - - -class SubscriptionAuthenticationSerializer(serializers.Serializer): - authType = serializers.ListField( - child=serializers.ChoiceField(required=True, choices=const.AUTH_TYPES), - help_text="Defines the types of Authentication / Authorization " - "which the API consumer is willing to accept when " - "receiving a notification.", - required=True - ) - paramsBasic = BasicAuthSerializer( - help_text="Parameters for authentication/authorization using BASIC.", - required=False, - allow_null=False - ) - paramsOauth2ClientCredentials = OAuthCredentialsSerializer( - help_text="Parameters for authentication/authorization using " - "OAUTH2_CLIENT_CREDENTIALS.", - required=False, - allow_null=False - ) diff --git a/genericparser/packages/serializers/upload_vnf_pkg_from_uri_req.py b/genericparser/packages/serializers/upload_vnf_pkg_from_uri_req.py deleted file mode 100644 index b847484..0000000 --- a/genericparser/packages/serializers/upload_vnf_pkg_from_uri_req.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers - - -class UploadVnfPackageFromUriRequestSerializer(serializers.Serializer): - addressInformation = serializers.CharField( - help_text="Address information of the VNF package content.", - required=True, - allow_null=False, - allow_blank=False - ) - userName = serializers.CharField( - help_text="User name to be used for authentication.", - required=False, - allow_null=False, - allow_blank=False - ) - password = serializers.CharField( - help_text="Password to be used for authentication.", - required=False, - allow_null=False, - allow_blank=False - ) diff --git a/genericparser/packages/serializers/vnf_pkg_artifact_info.py b/genericparser/packages/serializers/vnf_pkg_artifact_info.py deleted file mode 100644 index c63b3c2..0000000 --- a/genericparser/packages/serializers/vnf_pkg_artifact_info.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers -from .checksum import ChecksumSerializer - - -class VnfPackageArtifactInfoSerializer(serializers.Serializer): - artifactPath = serializers.CharField( - help_text="Path in the VNF package.", - required=True, - allow_null=False, - allow_blank=False - ) - checksum = ChecksumSerializer( - help_text="Checksum of the artifact file.", - required=True, - allow_null=False - ) - metadata = serializers.DictField( - help_text="The metadata of the artifact that are available in the VNF package", - child=serializers.CharField( - help_text="KeyValue Pairs", - allow_blank=True - ), - required=False, - allow_null=True - ) diff --git a/genericparser/packages/serializers/vnf_pkg_info.py b/genericparser/packages/serializers/vnf_pkg_info.py deleted file mode 100644 index 3fa4b17..0000000 --- a/genericparser/packages/serializers/vnf_pkg_info.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers -from .checksum import ChecksumSerializer -from .vnf_pkg_software_image_info import VnfPackageSoftwareImageInfoSerializer -from .vnf_pkg_artifact_info import VnfPackageArtifactInfoSerializer -from .link import LinkSerializer - - -class _LinkSerializer(serializers.Serializer): - self = LinkSerializer( - help_text='URI of this resource.', - required=True, - allow_null=False - ) - vnfd = LinkSerializer( - help_text='Link to the VNFD resource.', - required=False, - allow_null=False - ) - packageContent = LinkSerializer( - help_text='Link to the "VNF package content resource.', - required=True, - allow_null=False - ) - - class Meta: - ref_name = 'VNF_PKGM_Link_Serializer' - - -class VnfPkgInfoSerializer(serializers.Serializer): - id = serializers.CharField( - help_text="Identifier of the on-boarded VNF package.", - required=True, - allow_null=False, - allow_blank=False - ) - vnfdId = serializers.CharField( - help_text="This identifier, which is managed by the VNF provider, " - "identifies the VNF package and the VNFD in a globally unique way.", - required=False, - allow_null=True, - allow_blank=True - ) - vnfProvider = serializers.CharField( - help_text="Provider of the VNF package and the VNFD.", - required=False, - allow_null=True, - allow_blank=True - ) - vnfProductName = serializers.CharField( - help_text="Name to identify the VNF product.", - required=False, - allow_null=True, - allow_blank=True - ) - vnfSoftwareVersion = serializers.CharField( - help_text="Software version of the VNF.", - required=False, - allow_null=True, - allow_blank=True - ) - vnfdVersion = serializers.CharField( - help_text="The version of the VNvFD.", - required=False, - allow_null=True, - allow_blank=True - ) - checksum = ChecksumSerializer( - help_text="Checksum of the on-boarded VNF package.", - required=False, - allow_null=True - ) - softwareImages = VnfPackageSoftwareImageInfoSerializer( - help_text="Information about VNF package artifacts that are software images.", - required=False, - allow_null=True, - many=True - ) - additionalArtifacts = VnfPackageArtifactInfoSerializer( - help_text="Information about VNF package artifacts contained in " - "the VNF package that are not software images.", - required=False, - allow_null=True, - many=True - ) - onboardingState = serializers.ChoiceField( - help_text="On-boarding state of the VNF package.", - choices=["CREATED", "UPLOADING", "PROCESSING", "ONBOARDED"], - required=True, - allow_null=True - ) - operationalState = serializers.ChoiceField( - help_text="Operational state of the VNF package.", - choices=["ENABLED", "DISABLED"], - required=True, - allow_null=True - ) - usageState = serializers.ChoiceField( - help_text="Usage state of the VNF package.", - choices=["IN_USE", "NOT_IN_USE"], - required=True, - allow_null=True - ) - userDefinedData = serializers.DictField( - help_text="User defined data for the VNF package.", - child=serializers.CharField(help_text="KeyValue Pairs", allow_blank=True), - required=False, - allow_null=True - ) - _links = _LinkSerializer( - help_text='Links to resources related to this resource.', - required=True, - allow_null=True # TODO supposed to be False - ) diff --git a/genericparser/packages/serializers/vnf_pkg_infos.py b/genericparser/packages/serializers/vnf_pkg_infos.py deleted file mode 100644 index 9ffd6f0..0000000 --- a/genericparser/packages/serializers/vnf_pkg_infos.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers -from .vnf_pkg_info import VnfPkgInfoSerializer - - -class VnfPkgInfosSerializer(serializers.ListSerializer): - child = VnfPkgInfoSerializer() diff --git a/genericparser/packages/serializers/vnf_pkg_notifications.py b/genericparser/packages/serializers/vnf_pkg_notifications.py deleted file mode 100644 index 4bfdf84..0000000 --- a/genericparser/packages/serializers/vnf_pkg_notifications.py +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 rest_framework import serializers - -from genericparser.packages.const import NOTIFICATION_TYPES - -PackageOperationalStateType = ["ENABLED", "DISABLED"] -PackageUsageStateType = ["IN_USE", "NOT_IN_USE"] - - -class VersionSerializer(serializers.Serializer): - vnfSoftwareVersion = serializers.CharField( - help_text="VNF software version to match.", - max_length=255, - required=True, - allow_null=False - ) - vnfdVersions = serializers.ListField( - child=serializers.CharField(), - help_text="Match VNF packages that contain " - "VNF products with certain VNFD versions", - required=False, - allow_null=False - ) - - -class vnfProductsSerializer(serializers.Serializer): - vnfProductName = serializers.CharField( - help_text="Name of the VNF product to match.", - max_length=255, - required=True, - allow_null=False - ) - versions = VersionSerializer( - help_text="match VNF packages that contain " - "VNF products with certain versions", - required=False, - allow_null=False - ) - - -class vnfProductsProvidersSerializer(serializers.Serializer): - vnfProvider = serializers.CharField( - help_text="Name of the VNFprovider to match.", - max_length=255, - required=True, - allow_null=False - ) - vnfProducts = vnfProductsSerializer( - help_text="match VNF packages that contain " - "VNF products with certain product names, " - "from one particular provider", - required=False, - allow_null=False - ) - - -class PkgmNotificationsFilter(serializers.Serializer): - notificationTypes = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=NOTIFICATION_TYPES - ), - help_text="Match particular notification types", - allow_null=False, - required=False - ) - vnfProductsFromProviders = vnfProductsProvidersSerializer( - help_text="Match VNF packages that contain " - "VNF products from certain providers.", - allow_null=False, - required=False - ) - vnfdId = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match VNF packages with a VNFD identifier" - "listed in the attribute", - required=False, - allow_null=False - ) - vnfPkgId = serializers.ListField( - child=serializers.UUIDField(), - help_text="Match VNF packages with a VNFD identifier" - "listed in the attribute", - required=False, - allow_null=False - ) - operationalState = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=PackageOperationalStateType - ), - help_text="Operational state of the VNF package.", - allow_null=False, - required=False - ) - usageState = serializers.ListField( - child=serializers.ChoiceField( - required=True, - choices=PackageUsageStateType - ), - help_text="Operational state of the VNF package.", - allow_null=False, - required=False - ) diff --git a/genericparser/packages/serializers/vnf_pkg_software_image_info.py b/genericparser/packages/serializers/vnf_pkg_software_image_info.py deleted file mode 100644 index 790c61e..0000000 --- a/genericparser/packages/serializers/vnf_pkg_software_image_info.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2018 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 rest_framework import serializers -from .checksum import ChecksumSerializer - - -class VnfPackageSoftwareImageInfoSerializer(serializers.Serializer): - id = serializers.CharField( - help_text="Identifier of the software image.", - required=True, - allow_null=False, - allow_blank=False - ) - name = serializers.CharField( - help_text="Name of the software image.", - required=True, - allow_null=True, - allow_blank=False - ) - provider = serializers.CharField( - help_text="Provider of the software image.", - required=True, - allow_null=True, - allow_blank=False - ) - version = serializers.CharField( - help_text="Version of the software image.", - required=True, - allow_null=True, - allow_blank=False - ) - checksum = ChecksumSerializer( - help_text="Checksum of the software image file.", - required=True, - allow_null=False - ) - containerFormat = serializers.ChoiceField( - help_text="terminationType: Indicates whether forceful or graceful termination is requested.", - choices=["AKI", "AMI", "ARI", "BARE", "DOCKER", "OVA", "OVF"], - required=True, - allow_null=True - ) - diskFormat = serializers.ChoiceField( - help_text="Disk format of a software image is the format of the underlying disk image.", - choices=["AKI", "AMI", "ARI", "ISO", "QCOW2", "RAW", "VDI", "VHD", "VHDX", "VMDK"], - required=True, - allow_null=True - ) - createdAt = serializers.DateTimeField( - help_text="Time when this software image was created.", - required=True, - format=None, - input_formats=None - ) - minDisk = serializers.IntegerField( - help_text="The minimal disk for this software image in bytes.", - required=True, - allow_null=True - ) - minRam = serializers.IntegerField( - help_text="The minimal RAM for this software image in bytes.", - required=True, - allow_null=True - ) - size = serializers.IntegerField( - help_text="Size of this software image in bytes.", - required=True, - allow_null=True - ) - userMetadata = serializers.DictField( - help_text="User-defined data.", - child=serializers.CharField( - help_text="KeyValue Pairs", - allow_blank=True - ), - required=False, - allow_null=True - ) - imagePath = serializers.CharField( - help_text="Path in the VNF package.", - required=True, - allow_null=True, - allow_blank=False - ) diff --git a/genericparser/packages/serializers/vnf_pkg_subscription.py b/genericparser/packages/serializers/vnf_pkg_subscription.py deleted file mode 100644 index b5a0bc4..0000000 --- a/genericparser/packages/serializers/vnf_pkg_subscription.py +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 rest_framework import serializers - -from genericparser.packages.serializers import subscription_auth_data -from genericparser.packages.serializers import vnf_pkg_notifications - - -class LinkSerializer(serializers.Serializer): - href = serializers.CharField( - help_text="URI of the referenced resource.", - required=True, - allow_null=False, - allow_blank=False - ) - - class Meta: - ref_name = 'VNF_SUBSCRIPTION_LINKSERIALIZER' - - -class LinkSelfSerializer(serializers.Serializer): - self = LinkSerializer( - help_text="URI of this resource.", - required=True, - allow_null=False - ) - - -class PkgmSubscriptionRequestSerializer(serializers.Serializer): - filters = vnf_pkg_notifications.PkgmNotificationsFilter( - help_text="Filter settings for this subscription, " - "to define the subset of all notifications" - " this subscription relates to", - required=False, - allow_null=False - ) - callbackUri = serializers.URLField( - help_text="Callback URI to send" - "the notification", - required=True, - allow_null=False - ) - authentication = subscription_auth_data.SubscriptionAuthenticationSerializer( - help_text="Authentication parameters to configure the use of " - "authorization when sending notifications corresponding to" - "this subscription", - required=False, - allow_null=False - ) - - -class PkgmSubscriptionSerializer(serializers.Serializer): - id = serializers.UUIDField( - help_text="Identifier of this subscription resource.", - required=True, - allow_null=False - ) - callbackUri = serializers.URLField( - help_text="The URI of the endpoint to send the notification to.", - required=True, - allow_null=False - ) - - _links = LinkSelfSerializer( - help_text="Links to resources related to this resource.", - required=True, - allow_null=False - ) - - filter = vnf_pkg_notifications.PkgmNotificationsFilter( - help_text="Filter settings for this subscription, " - "to define the subset of all notifications" - " this subscription relates to", - required=False, - allow_null=False - ) - - -class PkgmSubscriptionsSerializer(serializers.ListSerializer): - child = PkgmSubscriptionSerializer() - allow_empty = True diff --git a/genericparser/packages/tests/__init__.py b/genericparser/packages/tests/__init__.py deleted file mode 100644 index c7b6818..0000000 --- a/genericparser/packages/tests/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2017 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. diff --git a/genericparser/packages/tests/const.py b/genericparser/packages/tests/const.py deleted file mode 100644 index 991c87c..0000000 --- a/genericparser/packages/tests/const.py +++ /dev/null @@ -1,596 +0,0 @@ -# Copyright 2018 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. - -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_version": "1.0.0", - "software_version": "1.0.0", - "provider": "zte" - }, - "metadata": { - } - } -} - -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" - } -} -} - -pnfd_data = { - "metadata": { - "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_health_check.py b/genericparser/packages/tests/test_health_check.py deleted file mode 100644 index e074bba..0000000 --- a/genericparser/packages/tests/test_health_check.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2019, CMCC Technologies Co., Ltd. - -# 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 json - -from django.test import TestCase, Client -from rest_framework import status - - -class TestHealthCheck(TestCase): - def setUp(self): - self.client = Client() - - def tearDown(self): - pass - - def test_vnfpkgm_health_check(self): - response = self.client.get("/api/vnfpkgm/v1/health_check") - self.assertEqual(status.HTTP_200_OK, response.status_code, response.content) - resp_data = json.loads(response.content) - self.assertEqual({"status": "active"}, resp_data) - - def test_nsd_health_check(self): - response = self.client.get("/api/nsd/v1/health_check") - self.assertEqual(status.HTTP_200_OK, response.status_code, response.content) - resp_data = json.loads(response.content) - self.assertEqual({"status": "active"}, resp_data) - - def test_parser_health_check(self): - response = self.client.get("/api/parser/v1/health_check") - self.assertEqual(status.HTTP_200_OK, response.status_code, response.content) - resp_data = json.loads(response.content) - self.assertEqual({"status": "active"}, resp_data) diff --git a/genericparser/packages/tests/test_ns_descriptor.py b/genericparser/packages/tests/test_ns_descriptor.py deleted file mode 100644 index 36933ac..0000000 --- a/genericparser/packages/tests/test_ns_descriptor.py +++ /dev/null @@ -1,302 +0,0 @@ -# Copyright 2018 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 copy -import json -import mock -import os - -from django.test import TestCase -from rest_framework import status -from rest_framework.test import APIClient -from genericparser.packages.biz.ns_descriptor import NsDescriptor -from genericparser.packages.const import PKG_STATUS -from genericparser.packages.tests.const import nsd_data -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH -from genericparser.pub.database.models import NSPackageModel, VnfPackageModel, PnfPackageModel -from genericparser.pub.utils import toscaparsers - - -class TestNsDescriptor(TestCase): - def setUp(self): - self.client = APIClient() - self.user_defined_data = { - 'key1': 'value1', - 'key2': 'value2', - 'key3': 'value3', - } - self.expected_nsd_info = { - 'id': None, - 'nsdId': None, - 'nsdName': None, - 'nsdVersion': None, - 'nsdDesigner': None, - 'nsdInvariantId': None, - 'vnfPkgIds': [], - 'pnfdInfoIds': [], - 'nestedNsdInfoIds': [], - 'nsdOnboardingState': 'CREATED', - 'onboardingFailureDetails': None, - 'nsdOperationalState': 'DISABLED', - 'nsdUsageState': 'NOT_IN_USE', - 'userDefinedData': self.user_defined_data, - '_links': None - } - self.nsdModel = { - "pnfs": [{"properties": {"id": "m6000_s"}}], - "vnfs": [{"properties": {"id": "123"}}] - } - - def tearDown(self): - pass - - def test_nsd_create_normal(self): - reqest_data = {'userDefinedData': self.user_defined_data} - expected_reponse_data = { - 'nsdOnboardingState': 'CREATED', - 'nsdOperationalState': 'DISABLED', - 'nsdUsageState': 'NOT_IN_USE', - 'userDefinedData': self.user_defined_data, - '_links': None - } - - response = self.client.post( - '/api/nsd/v1/ns_descriptors', - data=reqest_data, - format='json' - ) - response.data.pop('id') - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - # self.assertEqual(expected_reponse_data, response.data) - for key, value in expected_reponse_data.items(): - self.assertEqual(response.data[key], value) - - def test_query_multiple_nsds_normal(self): - expected_reponse_data = [ - copy.deepcopy(self.expected_nsd_info), - copy.deepcopy(self.expected_nsd_info) - ] - expected_reponse_data[0]['id'] = '0' - expected_reponse_data[0]['nsdId'] = '0' - expected_reponse_data[1]['id'] = '1' - expected_reponse_data[1]['nsdId'] = '1' - - user_defined_data = json.JSONEncoder().encode(self.user_defined_data) - for i in range(2): - NSPackageModel( - nsPackageId=str(i), - onboardingState='CREATED', - operationalState='DISABLED', - usageState='NOT_IN_USE', - userDefinedData=user_defined_data, - nsdId=str(i) - ).save() - - response = self.client.get('/api/nsd/v1/ns_descriptors', format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(expected_reponse_data, response.data) - - expected_reponse_data = [ - copy.deepcopy(self.expected_nsd_info) - ] - expected_reponse_data[0]['id'] = '1' - expected_reponse_data[0]['nsdId'] = '1' - response = self.client.get('/api/nsd/v1/ns_descriptors?nsdId=1', format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(expected_reponse_data, response.data) - - def test_query_single_nsd_normal(self): - expected_reponse_data = copy.deepcopy(self.expected_nsd_info) - expected_reponse_data['id'] = '22' - - user_defined_data = json.JSONEncoder().encode(self.user_defined_data) - NSPackageModel( - nsPackageId='22', - onboardingState='CREATED', - operationalState='DISABLED', - usageState='NOT_IN_USE', - userDefinedData=user_defined_data, - nsdModel=json.JSONEncoder().encode(self.nsdModel) - ).save() - - response = self.client.get('/api/nsd/v1/ns_descriptors/22', format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(expected_reponse_data, response.data) - - def test_query_single_when_ns_not_exist(self): - response = self.client.get('/api/nsd/v1/ns_descriptors/22', format='json') - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_delete_single_nsd_normal(self): - user_defined_data = json.JSONEncoder().encode(self.user_defined_data) - NSPackageModel( - nsPackageId='21', - operationalState='DISABLED', - usageState='NOT_IN_USE', - userDefinedData=user_defined_data, - nsdModel='test' - ).save() - - response = self.client.delete("/api/nsd/v1/ns_descriptors/21", format='json') - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(None, response.data) - - def test_delete_when_ns_not_exist(self): - response = self.client.delete("/api/nsd/v1/ns_descriptors/21", format='json') - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - - @mock.patch.object(toscaparsers, 'parse_nsd') - def test_nsd_content_upload_normal(self, mock_parse_nsd): - user_defined_data_json = json.JSONEncoder().encode(self.user_defined_data) - mock_parse_nsd.return_value = json.JSONEncoder().encode(nsd_data) - VnfPackageModel( - vnfPackageId="111", - vnfdId="vcpe_vfw_zte_1_0" - ).save() - - PnfPackageModel( - pnfPackageId="112", - pnfdId="m6000_s" - ).save() - - NSPackageModel( - nsPackageId='22', - operationalState='DISABLED', - usageState='NOT_IN_USE', - userDefinedData=user_defined_data_json, - ).save() - - with open('nsd_content.txt', 'wt') as fp: - fp.write('test') - with open('nsd_content.txt', 'rt') as fp: - resp = self.client.put( - "/api/nsd/v1/ns_descriptors/22/nsd_content", - {'file': fp}, - ) - file_content = '' - with open(os.path.join(GENERICPARSER_ROOT_PATH, '22/nsd_content.txt')) as fp: - data = fp.read() - file_content = '%s%s' % (file_content, data) - ns_pkg = NSPackageModel.objects.filter(nsPackageId="22") - self.assertEqual("VCPE_NS", ns_pkg[0].nsdId) - self.assertEqual(PKG_STATUS.ONBOARDED, ns_pkg[0].onboardingState) - self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(None, resp.data) - self.assertEqual(file_content, 'test') - os.remove('nsd_content.txt') - - def test_nsd_content_upload_failure(self): - with open('nsd_content.txt', 'wt') as fp: - fp.write('test') - with open('nsd_content.txt', 'rt') as fp: - response = self.client.put( - "/api/nsd/v1/ns_descriptors/22/nsd_content", - {'file': fp}, - ) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - def test_nsd_content_download_normal(self): - with open('nsd_content.txt', 'wt') as fp: - fp.writelines('test1') - fp.writelines('test2') - NSPackageModel.objects.create( - nsPackageId='23', - onboardingState='ONBOARDED', - localFilePath='nsd_content.txt' - ) - response = self.client.get( - "/api/nsd/v1/ns_descriptors/23/nsd_content", format='json' - ) - file_content = "" - for data in response.streaming_content: - file_content = '%s%s' % (file_content, data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual("b'test1test2'", file_content) - os.remove('nsd_content.txt') - - def test_nsd_content_download_when_ns_not_exist(self): - response = self.client.get("/api/nsd/v1/ns_descriptors/23/nsd_content", format='json') - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_nsd_content_download_failed(self): - NSPackageModel.objects.create( - nsPackageId='23', - onboardingState='CREATED', - localFilePath='nsd_content.txt' - ) - response = self.client.get("/api/nsd/v1/ns_descriptors/23/nsd_content", format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - def test_nsd_content_partial_download_normal(self): - with open('nsd_content.txt', 'wt') as fp: - fp.writelines('test1') - fp.writelines('test2') - NSPackageModel( - nsPackageId='23', - onboardingState='ONBOARDED', - localFilePath='nsd_content.txt' - ).save() - - response = self.client.get( - "/api/nsd/v1/ns_descriptors/23/nsd_content", - HTTP_RANGE='5-10', - format='json' - ) - partial_file_content = '' - for data in response.streaming_content: - partial_file_content = '%s%s' % (partial_file_content, data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual("b'test2'", partial_file_content) - os.remove('nsd_content.txt') - - @mock.patch.object(NsDescriptor, 'create') - def test_nsd_create_when_catch_exception(self, mock_create): - reqest_data = {'userDefinedData': self.user_defined_data} - mock_create.side_effect = TypeError("integer type") - response = self.client.post('/api/nsd/v1/ns_descriptors', data=reqest_data, format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(NsDescriptor, 'query_single') - def test_query_single_when_catch_exception(self, mock_query_single): - mock_query_single.side_effect = TypeError("integer type") - response = self.client.get('/api/nsd/v1/ns_descriptors/22', format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(NsDescriptor, 'query_multiple') - def test_query_multiple_when_catch_exception(self, mock_query_multipe): - mock_query_multipe.side_effect = TypeError("integer type") - response = self.client.get('/api/nsd/v1/ns_descriptors', format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(NsDescriptor, 'delete_single') - def test_delete_when_catch_exception(self, mock_delete_single): - mock_delete_single.side_effect = TypeError("integer type") - response = self.client.delete("/api/nsd/v1/ns_descriptors/21", format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(NsDescriptor, 'upload') - def test_upload_when_catch_exception(self, mock_upload): - mock_upload.side_effect = TypeError("integer type") - with open('nsd_content.txt', 'wt') as fp: - fp.write('test') - with open('nsd_content.txt', 'rt') as fp: - response = self.client.put("/api/nsd/v1/ns_descriptors/22/nsd_content", {'file': fp}) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - os.remove('nsd_content.txt') - - @mock.patch.object(NsDescriptor, 'download') - def test_download_when_catch_exception(self, mock_download): - mock_download.side_effect = TypeError("integer type") - response = self.client.get("/api/nsd/v1/ns_descriptors/23/nsd_content", format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/genericparser/packages/tests/test_nsdm_subscription.py b/genericparser/packages/tests/test_nsdm_subscription.py deleted file mode 100644 index c6c194e..0000000 --- a/genericparser/packages/tests/test_nsdm_subscription.py +++ /dev/null @@ -1,521 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 json -import mock -import uuid -from django.test import TestCase -from rest_framework.test import APIClient -from rest_framework import status - -from genericparser.packages.biz.nsdm_subscription import NsdmSubscription -from genericparser.pub.database.models import NsdmSubscriptionModel - - -class TestNsdmSubscription(TestCase): - - def setUp(self): - self.client = APIClient() - NsdmSubscriptionModel.objects.all().delete() - self.subscription_id = str(uuid.uuid4()) - self.subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["BASIC"], - "paramsBasic": { - "userName": "username", - "password": "password" - } - }, - "filter": { - "nsdId": ["b632bddc-abcd-4180-bd8d-4e8a9578eff7"], - } - } - self.links = { - "self": { - "href": "/api/v1/subscriptions/" + self.subscription_id - } - } - self.test_subscription = { - "callbackUri": "http://callbackuri.com", - "id": self.subscription_id, - "filter": { - "notificationTypes": [ - "NsdOnBoardingNotification" - ], - "nsdInfoId": [], - "nsdId": [], - "nsdName": [], - "nsdVersion": [], - "nsdInvariantId": [], - "vnfPkgIds": [], - "nestedNsdInfoIds": [], - "nsdOnboardingState": [], - "nsdOperationalState": [], - "nsdUsageState": [], - "pnfdInfoIds": [], - "pnfdId": [], - "pnfdName": [], - "pnfdVersion": [], - "pnfdProvider": [], - "pnfdInvariantId": [], - "pnfdOnboardingState": [], - "pnfdUsageState": [] - }, - "_links": self.links, - } - - def tearDown(self): - pass - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_nsdm_subscribe_notification(self, mock_uuid4, mock_requests): - temp_uuid = str(uuid.uuid4()) - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - mock_uuid4.return_value = temp_uuid - response = self.client.post("/api/nsd/v1/subscriptions", - data=self.subscription, format='json') - self.assertEqual(201, response.status_code) - self.assertEqual(self.subscription["callbackUri"], - response.data["callbackUri"]) - self.assertEqual(temp_uuid, response.data["id"]) - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_nsdm_subscribe_callbackFailure(self, mock_uuid4, mock_requests): - temp_uuid = str(uuid.uuid4()) - mock_requests.return_value.status_code = 500 - mock_requests.get.return_value.status_code = 500 - mock_uuid4.return_value = temp_uuid - expected_data = { - 'status': 500, - 'detail': "callbackUri http://callbackuri.com didn't" - " return 204 statuscode." - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=self.subscription, format='json') - self.assertEqual(500, response.status_code) - self.assertEqual(expected_data, response.data) - - @mock.patch("requests.get") - def test_nsdm_second_subscription(self, mock_requests): - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - response = self.client.post("/api/nsd/v1/subscriptions", - data=self.subscription, format='json') - self.assertEqual(201, response.status_code) - self.assertEqual(self.subscription["callbackUri"], - response.data["callbackUri"]) - dummy_subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["BASIC"], - "paramsBasic": { - "userName": "username", - "password": "password" - } - }, - "filter": { - "nsdId": ["b632bddc-bccd-4180-bd8d-4e8a9578eff7"], - } - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=dummy_subscription, format='json') - self.assertEqual(201, response.status_code) - self.assertEqual(dummy_subscription["callbackUri"], - response.data["callbackUri"]) - - @mock.patch("requests.get") - def test_nsdm_duplicate_subscription(self, mock_requests): - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - response = self.client.post("/api/nsd/v1/subscriptions", - data=self.subscription, format='json') - self.assertEqual(201, response.status_code) - self.assertEqual(self.subscription["callbackUri"], - response.data["callbackUri"]) - expected_data = { - 'status': 303, - 'detail': 'Already Subscription exists with' - ' the same callbackUri and filter', - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=self.subscription, format='json') - self.assertEqual(303, response.status_code) - self.assertEqual(expected_data, response.data) - - @mock.patch("requests.get") - def test_nsdm_bad_request(self, mock_requests): - dummy_subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["BASIC"], - "paramsBasic": { - "userName": "username", - "password": "password" - } - }, - "filter": { - "nsdId": "b632bddc-bccd-4180-bd8d-4e8a9578eff7", - } - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=dummy_subscription, format='json') - self.assertEqual(400, response.status_code) - - @mock.patch("requests.get") - def test_nsdm_invalid_authtype_subscription(self, mock_requests): - dummy_subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["OAUTH2_CLIENT_CREDENTIALS"], - "paramsBasic": { - "userName": "username", - "password": "password" - } - } - } - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - expected_data = { - 'status': 400, - 'detail': 'Auth type should be BASIC', - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=dummy_subscription, format='json') - self.assertEqual(400, response.status_code) - self.assertEqual(expected_data, response.data) - - @mock.patch("requests.get") - def test_nsdm_invalid_authtype_oauthclient_subscription( - self, mock_requests): - dummy_subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["BASIC"], - "paramsOauth2ClientCredentials": { - "clientId": "clientId", - "clientPassword": "password", - "tokenEndpoint": "http://tokenEndpoint" - } - } - } - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - expected_data = { - 'status': 400, - 'detail': 'Auth type should be OAUTH2_CLIENT_CREDENTIALS', - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=dummy_subscription, format='json') - self.assertEqual(400, response.status_code) - self.assertEqual(expected_data, response.data) - - @mock.patch("requests.get") - def test_nsdm_invalid_authparams_subscription(self, mock_requests): - dummy_subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["BASIC"], - "paramsBasic": { - "userName": "username" - } - } - } - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - expected_data = { - 'status': 400, - 'detail': 'userName and password needed for BASIC', - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=dummy_subscription, format='json') - self.assertEqual(400, response.status_code) - self.assertEqual(expected_data, response.data) - - @mock.patch("requests.get") - def test_nsdm_invalid_authparams_oauthclient_subscription( - self, mock_requests): - dummy_subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["OAUTH2_CLIENT_CREDENTIALS"], - "paramsOauth2ClientCredentials": { - "clientPassword": "password", - "tokenEndpoint": "http://tokenEndpoint" - } - } - } - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - expected_data = { - 'status': 400, - 'detail': 'clientId, clientPassword and tokenEndpoint' - ' required for OAUTH2_CLIENT_CREDENTIALS', - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=dummy_subscription, format='json') - self.assertEqual(400, response.status_code) - self.assertEqual(expected_data, response.data) - - @mock.patch("requests.get") - def test_nsdm_invalid_filter_subscription(self, mock_requests): - dummy_subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["BASIC"], - "paramsBasic": { - "userName": "username", - "password": "password" - } - }, - "filter": { - "nsdId": ["b632bddc-bccd-4180-bd8d-4e8a9578eff7"], - "nsdInfoId": ["d0ea5ec3-0b98-438a-9bea-488230cff174"] - } - } - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - expected_data = { - 'status': 400, - 'detail': 'Notification Filter should contain' - ' either nsdId or nsdInfoId', - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=dummy_subscription, format='json') - self.assertEqual(400, response.status_code) - self.assertEqual(expected_data, response.data) - - @mock.patch("requests.get") - def test_nsdm_invalid_filter_pnfd_subscription(self, mock_requests): - dummy_subscription = { - "callbackUri": "http://callbackuri.com", - "authentication": { - "authType": ["BASIC"], - "paramsBasic": { - "userName": "username", - "password": "password" - } - }, - "filter": { - "pnfdId": ["b632bddc-bccd-4180-bd8d-4e8a9578eff7"], - "pnfdInfoIds": ["d0ea5ec3-0b98-438a-9bea-488230cff174"] - } - } - mock_requests.return_value.status_code = 204 - mock_requests.get.return_value.status_code = 204 - expected_data = { - 'status': 400, - 'detail': 'Notification Filter should contain' - ' either pnfdId or pnfdInfoIds', - } - response = self.client.post("/api/nsd/v1/subscriptions", - data=dummy_subscription, format='json') - self.assertEqual(400, response.status_code) - self.assertEqual(expected_data, response.data) - - @mock.patch.object(NsdmSubscription, 'create') - def test_nsdmsubscription_create_when_catch_exception(self, mock_create): - mock_create.side_effect = TypeError("Unicode type") - response = self.client.post('/api/nsd/v1/subscriptions', - data=self.subscription, format='json') - self.assertEqual(response.status_code, - status.HTTP_500_INTERNAL_SERVER_ERROR) - - def test_nsdm_get_subscriptions(self): - NsdmSubscriptionModel(subscriptionid=self.subscription_id, - callback_uri="http://callbackuri.com", - auth_info={}, - notificationTypes=json.dumps( - ["NsdOnBoardingNotification"]), - nsdId=[], nsdVersion=[], - nsdInfoId=[], nsdDesigner=[], - nsdName=[], nsdInvariantId=[], - vnfPkgIds=[], pnfdInfoIds=[], - nestedNsdInfoIds=[], nsdOnboardingState=[], - nsdOperationalState=[], nsdUsageState=[], - pnfdId=[], pnfdVersion=[], pnfdProvider=[], - pnfdName=[], pnfdInvariantId=[], - pnfdOnboardingState=[], pnfdUsageState=[], - links=json.dumps(self.links)).save() - response = self.client.get("/api/nsd/v1/subscriptions", - format='json') - self.assertEqual(status.HTTP_200_OK, response.status_code) - self.assertEqual([self.test_subscription], response.data) - - def test_nsdm_get_subscriptions_filter(self): - NsdmSubscriptionModel(subscriptionid=self.subscription_id, - callback_uri="http://callbackuri.com", - auth_info={}, - notificationTypes=json.dumps( - ["NsdOnBoardingNotification"]), - nsdId=[], nsdVersion=[], - nsdInfoId=[], nsdDesigner=[], - nsdName=[], nsdInvariantId=[], - vnfPkgIds=[], pnfdInfoIds=[], - nestedNsdInfoIds=[], nsdOnboardingState=[], - nsdOperationalState=[], nsdUsageState=[], - pnfdId=[], pnfdVersion=[], pnfdProvider=[], - pnfdName=[], pnfdInvariantId=[], - pnfdOnboardingState=[], pnfdUsageState=[], - links=json.dumps(self.links)).save() - response = self.client.get("/api/nsd/v1/subscriptions" - "?notificationTypes" - "=NsdOnBoardingNotification", - format='json') - self.assertEqual(status.HTTP_200_OK, response.status_code) - self.assertEqual([self.test_subscription], response.data) - - def test_nsdm_get_subscriptions_filter_failure(self): - NsdmSubscriptionModel(subscriptionid=self.subscription_id, - callback_uri="http://callbackuri.com", - auth_info={}, - notificationTypes=json.dumps( - ["NsdOnBoardingNotification"]), - nsdId=[], nsdVersion=[], - nsdInfoId=[], nsdDesigner=[], - nsdName=[], nsdInvariantId=[], - vnfPkgIds=[], pnfdInfoIds=[], - nestedNsdInfoIds=[], nsdOnboardingState=[], - nsdOperationalState=[], nsdUsageState=[], - pnfdId=[], pnfdVersion=[], pnfdProvider=[], - pnfdName=[], pnfdInvariantId=[], - pnfdOnboardingState=[], pnfdUsageState=[], - links=json.dumps(self.links)).save() - response = self.client.get("/api/nsd/v1/subscriptions" - "?notificationTypes=" - "PnfdOnBoardingFailureNotification", - format='json') - self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code) - - def test_nsdm_get_subscriptions_invalid_filter(self): - NsdmSubscriptionModel(subscriptionid=self.subscription_id, - callback_uri="http://callbackuri.com", - auth_info={}, - notificationTypes=json.dumps( - ["NsdOnBoardingNotification"]), - nsdId=[], nsdVersion=[], - nsdInfoId=[], nsdDesigner=[], - nsdName=[], nsdInvariantId=[], - vnfPkgIds=[], pnfdInfoIds=[], - nestedNsdInfoIds=[], nsdOnboardingState=[], - nsdOperationalState=[], nsdUsageState=[], - pnfdId=[], pnfdVersion=[], pnfdProvider=[], - pnfdName=[], pnfdInvariantId=[], - pnfdOnboardingState=[], pnfdUsageState=[], - links=json.dumps(self.links)).save() - response = self.client.get("/api/nsd/v1/subscriptions" - "?notificationTypes=" - "PnfdOnBoardingFailureNotificati", - format='json') - self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) - - @mock.patch.object(NsdmSubscription, 'query_multi_subscriptions') - def test_nsdmsubscription_get_when_catch_exception(self, mock_create): - mock_create.side_effect = TypeError("Unicode type") - response = self.client.get('/api/nsd/v1/subscriptions', format='json') - self.assertEqual(response.status_code, - status.HTTP_500_INTERNAL_SERVER_ERROR) - - def test_nsdm_get_subscription(self): - NsdmSubscriptionModel(subscriptionid=self.subscription_id, - callback_uri="http://callbackuri.com", - auth_info={}, - notificationTypes=json.dumps( - ["NsdOnBoardingNotification"]), - nsdId=[], nsdVersion=[], - nsdInfoId=[], nsdDesigner=[], - nsdName=[], nsdInvariantId=[], - vnfPkgIds=[], pnfdInfoIds=[], - nestedNsdInfoIds=[], nsdOnboardingState=[], - nsdOperationalState=[], nsdUsageState=[], - pnfdId=[], pnfdVersion=[], pnfdProvider=[], - pnfdName=[], pnfdInvariantId=[], - pnfdOnboardingState=[], pnfdUsageState=[], - links=json.dumps(self.links)).save() - response = self.client.get('/api/nsd/v1/' - 'subscriptions/' + self.subscription_id, - format='json') - self.assertEqual(status.HTTP_200_OK, response.status_code) - self.assertEqual(self.test_subscription, response.data) - - def test_nsdm_get_subscription_failure(self): - expected_data = { - "status": 404, - "detail": "Subscription(" + self.subscription_id + ") " - "doesn't exists" - } - response = self.client.get('/api/nsd/v1/' - 'subscriptions/' + self.subscription_id, - format='json') - self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code) - self.assertEqual(expected_data, response.data) - - def test_nsdm_get_subscription_failure_bad_request(self): - response = self.client.get("/api/nsd/v1/subscriptions/123", - format='json') - self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) - - @mock.patch.object(NsdmSubscription, 'query_single_subscription') - def test_nsdmsubscription_getsingle_when_catch_exception( - self, mock_create): - mock_create.side_effect = TypeError("Unicode type") - response = self.client.get('/api/nsd/v1/' - 'subscriptions/' + self.subscription_id, - format='json') - self.assertEqual(response.status_code, - status.HTTP_500_INTERNAL_SERVER_ERROR) - - def test_ndsm_delete_subscription(self): - NsdmSubscriptionModel(subscriptionid=self.subscription_id, - callback_uri="http://callbackuri.com", - auth_info={}, - notificationTypes=json.dumps( - ["NsdOnBoardingNotification"]), - nsdId=[], nsdVersion=[], - nsdInfoId=[], nsdDesigner=[], - nsdName=[], nsdInvariantId=[], - vnfPkgIds=[], pnfdInfoIds=[], - nestedNsdInfoIds=[], nsdOnboardingState=[], - nsdOperationalState=[], nsdUsageState=[], - pnfdId=[], pnfdVersion=[], pnfdProvider=[], - pnfdName=[], pnfdInvariantId=[], - pnfdOnboardingState=[], pnfdUsageState=[], - links=json.dumps(self.links)).save() - response = self.client.delete('/api/nsd/v1/' - 'subscriptions/' + self.subscription_id, - format='json') - self.assertEqual(status.HTTP_204_NO_CONTENT, response.status_code) - - def test_ndsm_delete_subscription_failure(self): - response = self.client.delete('/api/nsd/v1/' - 'subscriptions/' + self.subscription_id, - format='json') - self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code) - - def test_nsdm_delete_subscription_failure_bad_request(self): - response = self.client.delete("/api/nsd/v1/subscriptions/123", - format='json') - self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) - - @mock.patch.object(NsdmSubscription, 'delete_single_subscription') - def test_nsdmsubscription_delete_when_catch_exception(self, mock_create): - mock_create.side_effect = TypeError("Unicode type") - response = self.client.delete('/api/nsd/v1/' - 'subscriptions/' + self.subscription_id, - format='json') - self.assertEqual(response.status_code, - status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/genericparser/packages/tests/test_nspackage.py b/genericparser/packages/tests/test_nspackage.py deleted file mode 100644 index 393e0f7..0000000 --- a/genericparser/packages/tests/test_nspackage.py +++ /dev/null @@ -1,246 +0,0 @@ -# Copyright 2017 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 json -import mock -from rest_framework import status -from django.test import TestCase -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): - def setUp(self): - self.client = Client() - NSPackageModel.objects.filter().delete() - VnfPackageModel.objects.filter().delete() - self.nsd_data = nsd_data - - def tearDown(self): - pass - - def test_ns_pkg_distribute_when_ns_exists(self): - NSPackageModel(nsPackageId="1", nsdId="2").save() - resp = self.client.post( - "/api/parser/v1/nspackages", {"csarId": "1"}, format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual("failed", resp.data["status"]) - self.assertEqual( - "NS CSAR(1) already exists.", - resp.data["statusDescription"]) - - @mock.patch.object(restcall, 'call_req') - def test_ns_pkg_distribute_when_csar_not_exist(self, mock_call_req): - mock_call_req.return_value = [0, "[]", '200'] - resp = self.client.post( - "/api/parser/v1/nspackages", {"csarId": "1"}, format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual("failed", resp.data["status"]) - self.assertEqual( - "Failed to query artifact(services,1) from sdc.", - resp.data["statusDescription"]) - - @mock.patch.object(restcall, 'call_req') - @mock.patch.object(sdc, 'download_artifacts') - @mock.patch.object(toscaparsers, 'parse_nsd') - def test_ns_pkg_distribute_when_nsd_already_exists( - self, mock_parse_nsd, mock_download_artifacts, mock_call_req): - mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data) - mock_download_artifacts.return_value = "/home/vcpe.csar" - mock_call_req.return_value = [0, json.JSONEncoder().encode([{ - "uuid": "1", - "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar", - "distributionStatus": "DISTRIBUTED" - }]), '200'] - NSPackageModel(nsPackageId="2", nsdId="VCPE_NS").save() - resp = self.client.post( - "/api/parser/v1/nspackages", {"csarId": "1"}, format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual("failed", resp.data["status"]) - self.assertEqual( - "NSD(VCPE_NS) already exists.", - resp.data["statusDescription"]) - - @mock.patch.object(restcall, 'call_req') - @mock.patch.object(sdc, 'download_artifacts') - @mock.patch.object(toscaparsers, 'parse_nsd') - def test_ns_pkg_distribute_when_nf_not_distributed( - self, mock_parse_nsd, mock_download_artifacts, mock_call_req): - mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data) - mock_download_artifacts.return_value = "/home/vcpe.csar" - mock_call_req.return_value = [0, json.JSONEncoder().encode([{ - "uuid": "1", - "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar", - "distributionStatus": "DISTRIBUTED", - }]), '200'] - resp = self.client.post( - "/api/parser/v1/nspackages", {"csarId": "1"}, format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual("failed", resp.data["status"]) - self.assertEqual( - "VNF package(vcpe_vfw_zte_1_0) is not distributed.", - resp.data["statusDescription"]) - - @mock.patch.object(restcall, 'call_req') - @mock.patch.object(sdc, 'download_artifacts') - @mock.patch.object(toscaparsers, 'parse_nsd') - def test_ns_pkg_distribute_when_successfully( - self, mock_parse_nsd, mock_download_artifacts, mock_call_req): - mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data) - mock_download_artifacts.return_value = "/home/vcpe.csar" - mock_call_req.return_value = [0, json.JSONEncoder().encode([{ - "uuid": "1", - "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar", - "distributionStatus": "DISTRIBUTED" - }]), '200'] - VnfPackageModel(vnfPackageId="1", vnfdId="vcpe_vfw_zte_1_0").save() - PnfPackageModel(pnfPackageId="1", pnfdId="m6000_s").save() - resp = self.client.post( - "/api/parser/v1/nspackages", {"csarId": "1"}, format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual("success", resp.data["status"]) - self.assertEqual( - "CSAR(1) distributed successfully.", - resp.data["statusDescription"]) - - @mock.patch.object(sdc, 'get_artifacts') - def test_ns_when_not_distributed_by_sdc(self, mock_get_artifacts): - mock_get_artifacts.return_value = [{ - "uuid": "1", - "invariantUUID": "63eaec39-ffbe-411c-a838-448f2c73f7eb", - "name": "underlayvpn", - "version": "2.0", - "toscaModelURL": "/sdc/v1/genericparser/resources/c94490a0-f7ef-48be-b3f8-8d8662a37236/toscaModel", - "category": "Volte", - "subCategory": "VolteVNF", - "resourceType": "VF", - "lifecycleState": "CERTIFIED", - "distributionStatus": "DISTRIBUTION_APPROVED", - "lastUpdaterUserId": "jh0003" - }] - resp = self.client.post( - "/api/parser/v1/nspackages", {"csarId": "1"}, format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual("failed", resp.data["status"]) - self.assertEqual( - "The artifact (services,1) is not distributed from sdc.", - resp.data["statusDescription"]) - - ########################################################################## - - def test_ns_pkg_normal_delete(self): - NSPackageModel(nsPackageId="8", nsdId="2").save() - resp = self.client.delete("/api/parser/v1/nspackages/8") - self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual("success", resp.data["status"]) - self.assertEqual( - "Delete CSAR(8) successfully.", - resp.data["statusDescription"]) - - def test_ns_pkg_get_all(self): - NSPackageModel( - nsPackageId="13", - nsdId="2", - nsdDesginer="2", - nsdVersion="2", - nsPackageUri="13.csar", - nsdModel="").save() - NSPackageModel( - nsPackageId="14", - nsdId="3", - nsdDesginer="3", - nsdVersion="3", - nsPackageUri="14.csar", - nsdModel="").save() - resp = self.client.get("/api/parser/v1/nspackages") - self.assertEqual(resp.status_code, status.HTTP_200_OK) - expect_data = [{"csarId": "13", - "packageInfo": {"csarName": "13.csar", - "nsdProvider": "2", - "nsdId": "2", - "nsPackageId": "13", - "downloadUrl": "http://127.0.0.1:8806/static/genericparser/13/13.csar", - "nsdModel": "", - "nsdVersion": "2", - "nsdInvariantId": None - }}, - {"csarId": "14", - "packageInfo": {"csarName": "14.csar", - "nsdProvider": "3", - "nsdId": "3", - "nsPackageId": "14", - "downloadUrl": "http://127.0.0.1:8806/static/genericparser/14/14.csar", - "nsdModel": "", - "nsdVersion": "3", - "nsdInvariantId": None}}] - self.assertEqual(expect_data, resp.data) - - def test_ns_pkg_get_one(self): - NSPackageModel( - nsPackageId="14", - nsdId="2", - nsdDesginer="3", - nsdVersion="4", - nsPackageUri="14.csar", - nsdModel="").save() - resp = self.client.get("/api/parser/v1/nspackages/14") - self.assertEqual(resp.status_code, status.HTTP_200_OK) - expect_data = { - "csarId": "14", - "packageInfo": { - "nsdId": "2", - "nsPackageId": "14", - "nsdProvider": "3", - "nsdVersion": "4", - "csarName": "14.csar", - "nsdModel": "", - "downloadUrl": "http://127.0.0.1:8806/static/genericparser/14/14.csar", - "nsdInvariantId": None}} - self.assertEqual(expect_data, resp.data) - - def test_ns_pkg_get_one_not_found(self): - resp = self.client.get("/api/parser/v1/nspackages/22") - self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - self.assertEqual( - {"error": "Ns package[22] not Found."}, - resp.data) - - ########################################################################## - - @mock.patch.object(toscaparsers, 'parse_nsd') - def test_nsd_parse_normal(self, mock_parse_nsd): - NSPackageModel(nsPackageId="18", nsdId="12").save() - mock_parse_nsd.return_value = json.JSONEncoder().encode({"a": "b"}) - req_data = {"csarId": "18", "inputs": []} - resp = self.client.post( - "/api/parser/v1/parsernsd", - req_data, - format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual({"model": '{"a": "b"}'}, resp.data) - - def test_nsd_parse_when_csar_not_exist(self): - req_data = {"csarId": "1", "inputs": []} - resp = self.client.post( - "/api/parser/v1/parsernsd", - req_data, - format='json') - self.assertEqual( - resp.status_code, - status.HTTP_500_INTERNAL_SERVER_ERROR) - self.assertEqual(resp.data, {"error": "NS CSAR(1) does not exist."}) diff --git a/genericparser/packages/tests/test_pnf_descriptor.py b/genericparser/packages/tests/test_pnf_descriptor.py deleted file mode 100644 index 770d74b..0000000 --- a/genericparser/packages/tests/test_pnf_descriptor.py +++ /dev/null @@ -1,287 +0,0 @@ -# Copyright 2018 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 copy -import json -import mock -import os -import shutil - -from django.test import TestCase -from rest_framework import status -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 - - -class TestPnfDescriptor(TestCase): - def setUp(self): - self.client = APIClient() - self.user_defined_data = { - 'key1': 'value1', - 'key2': 'value2', - 'key3': 'value3', - } - self.expected_pnfd_info = { - 'id': None, - 'pnfdId': None, - 'pnfdName': None, - 'pnfdVersion': None, - 'pnfdProvider': None, - 'pnfdInvariantId': None, - 'pnfdOnboardingState': 'CREATED', - 'onboardingFailureDetails': None, - 'pnfdUsageState': 'NOT_IN_USE', - 'userDefinedData': self.user_defined_data, - '_links': None - } - self.nsdModel = { - "pnfs": [{"properties": {"id": "m6000_s"}}] - } - - def tearDown(self): - 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} - expected_reponse_data = { - 'pnfdOnboardingState': 'CREATED', - 'pnfdUsageState': 'NOT_IN_USE', - 'userDefinedData': self.user_defined_data, - '_links': None - } - - response = self.client.post( - '/api/nsd/v1/pnf_descriptors', - data=request_data, - format='json' - ) - response.data.pop('id') - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - # self.assertEqual(expected_reponse_data, response.data) - for key, value in expected_reponse_data.items(): - self.assertEqual(response.data[key], value) - - def test_query_multiple_pnfds_normal(self): - expected_reponse_data = [ - copy.deepcopy(self.expected_pnfd_info), - copy.deepcopy(self.expected_pnfd_info) - ] - expected_reponse_data[0]['id'] = '0' - expected_reponse_data[1]['id'] = '1' - - user_defined_data = json.JSONEncoder().encode(self.user_defined_data) - for i in range(2): - PnfPackageModel( - pnfPackageId=str(i), - onboardingState='CREATED', - usageState='NOT_IN_USE', - userDefinedData=user_defined_data - ).save() - response = self.client.get('/api/nsd/v1/pnf_descriptors', format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(expected_reponse_data, response.data) - - def test_query_single_pnfd_normal(self): - expected_reponse_data = copy.deepcopy(self.expected_pnfd_info) - expected_reponse_data['id'] = '22' - - user_defined_data = json.JSONEncoder().encode(self.user_defined_data) - PnfPackageModel( - pnfPackageId='22', - onboardingState='CREATED', - usageState='NOT_IN_USE', - userDefinedData=user_defined_data - ).save() - - response = self.client.get('/api/nsd/v1/pnf_descriptors/22', format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(expected_reponse_data, response.data) - - def test_query_single_pnfd_failed(self): - response = self.client.get('/api/nsd/v1/pnf_descriptors/22', format='json') - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_delete_single_pnfd_normal(self): - user_defined_data = json.JSONEncoder().encode(self.user_defined_data) - PnfPackageModel( - pnfPackageId='22', - usageState=PKG_STATUS.NOT_IN_USE, - userDefinedData=user_defined_data, - pnfdModel='test' - ).save() - NSPackageModel.objects.create( - nsPackageId="111", - nsdModel=json.JSONEncoder().encode(self.nsdModel) - ) - resp = self.client.delete("/api/nsd/v1/pnf_descriptors/22", format='json') - self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(None, resp.data) - - def test_delete_single_pnfd_when_not_exist(self): - resp = self.client.delete("/api/nsd/v1/pnf_descriptors/22", format='json') - self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(None, resp.data) - - @mock.patch.object(toscaparsers, "parse_pnfd") - def test_pnfd_content_upload_normal(self, mock_parse_pnfd): - user_defined_data_json = json.JSONEncoder().encode(self.user_defined_data) - PnfPackageModel( - pnfPackageId='22', - usageState=PKG_STATUS.NOT_IN_USE, - userDefinedData=user_defined_data_json, - ).save() - mock_parse_pnfd.return_value = json.JSONEncoder().encode(pnfd_data) - with open('pnfd_content.txt', 'wt') as fp: - fp.write('test') - - with open('pnfd_content.txt', 'rt') as fp: - resp = self.client.put( - "/api/nsd/v1/pnf_descriptors/22/pnfd_content", - {'file': fp}, - ) - pnf_pkg = PnfPackageModel.objects.filter(pnfPackageId="22") - self.assertEqual(pnf_pkg[0].pnfdId, "zte-1.0") - self.assertEqual(pnf_pkg[0].onboardingState, PKG_STATUS.ONBOARDED) - self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(None, resp.data) - os.remove('pnfd_content.txt') - - def test_pnfd_content_upload_when_pnf_not_exist(self): - with open('pnfd_content.txt', 'wt') as fp: - fp.write('test') - - with open('pnfd_content.txt', 'rt') as fp: - resp = self.client.put( - "/api/nsd/v1/pnf_descriptors/22/pnfd_content", - {'file': fp}, - ) - self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(toscaparsers, "parse_pnfd") - def test_pnfd_content_upload_when_pnfd_exist(self, mock_parse_pnfd): - with open('pnfd_content.txt', 'wt') as fp: - fp.write('test') - PnfPackageModel( - pnfPackageId='22', - usageState=PKG_STATUS.NOT_IN_USE, - pnfdId="zte-1.1" - ).save() - PnfPackageModel( - pnfPackageId='23', - usageState=PKG_STATUS.NOT_IN_USE, - pnfdId="zte-1.0" - ).save() - mock_parse_pnfd.return_value = json.JSONEncoder().encode(pnfd_data) - with open('pnfd_content.txt', 'rt') as fp: - resp = self.client.put( - "/api/nsd/v1/pnf_descriptors/22/pnfd_content", - {'file': fp}, - ) - self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - def test_pnfd_download_normal(self): - with open('pnfd_content.txt', 'wt') as fp: - fp.writelines('test1') - fp.writelines('test2') - user_defined_data = json.JSONEncoder().encode(self.user_defined_data) - PnfPackageModel( - pnfPackageId='22', - usageState=PKG_STATUS.NOT_IN_USE, - onboardingState=PKG_STATUS.ONBOARDED, - userDefinedData=user_defined_data, - localFilePath="pnfd_content.txt", - pnfdModel='test' - ).save() - resp = self.client.get("/api/nsd/v1/pnf_descriptors/22/pnfd_content") - file_content = "" - for data in resp.streaming_content: - file_content = '%s%s' % (file_content, data) - self.assertEqual(resp.status_code, status.HTTP_200_OK) - self.assertEqual("b'test1test2'", file_content) - os.remove('pnfd_content.txt') - - def test_pnfd_download_failed(self): - response = self.client.get("/api/nsd/v1/pnf_descriptors/22/pnfd_content") - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_pnfd_download_when_not_on_boarded(self): - with open('pnfd_content.txt', 'wt') as fp: - fp.writelines('test1') - fp.writelines('test2') - user_defined_data = json.JSONEncoder().encode(self.user_defined_data) - PnfPackageModel( - pnfPackageId='22', - usageState=PKG_STATUS.NOT_IN_USE, - onboardingState=PKG_STATUS.CREATED, - userDefinedData=user_defined_data, - localFilePath="pnfd_content.txt", - pnfdModel='test' - ).save() - response = self.client.get("/api/nsd/v1/pnf_descriptors/22/pnfd_content") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - os.remove('pnfd_content.txt') - - @mock.patch.object(PnfDescriptor, "create") - def test_pnfd_create_when_catch_exception(self, mock_create): - request_data = {'userDefinedData': self.user_defined_data} - mock_create.side_effect = TypeError('integer type') - response = self.client.post('/api/nsd/v1/pnf_descriptors', data=request_data, format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(PnfDescriptor, "delete_single") - def test_delete_single_when_catch_exception(self, mock_delete_single): - mock_delete_single.side_effect = TypeError("integer type") - response = self.client.delete("/api/nsd/v1/pnf_descriptors/22", format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(PnfDescriptor, "query_single") - def test_query_single_when_catch_exception(self, mock_query_single): - mock_query_single.side_effect = TypeError("integer type") - response = self.client.get('/api/nsd/v1/pnf_descriptors/22', format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(PnfDescriptor, "query_multiple") - def test_query_multiple_when_catch_exception(self, mock_query_muitiple): - mock_query_muitiple.side_effect = TypeError("integer type") - response = self.client.get('/api/nsd/v1/pnf_descriptors', format='json') - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(PnfDescriptor, "upload") - def test_upload_when_catch_exception(self, mock_upload): - mock_upload.side_effect = TypeError("integer type") - response = self.client.put("/api/nsd/v1/pnf_descriptors/22/pnfd_content") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(PnfDescriptor, "download") - def test_download_when_catch_exception(self, mock_download): - mock_download.side_effect = TypeError("integer type") - response = self.client.get("/api/nsd/v1/pnf_descriptors/22/pnfd_content") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(toscaparsers, 'parse_pnfd') - def test_pnfd_parse_normal(self, mock_parse_pnfd): - PnfPackageModel(pnfPackageId="8", pnfdId="10").save() - mock_parse_pnfd.return_value = json.JSONEncoder().encode({"c": "d"}) - req_data = {"csarId": "8", "inputs": []} - resp = self.client.post("/api/parser/v1/parserpnfd", req_data, format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual({"model": '{"c": "d"}'}, resp.data) diff --git a/genericparser/packages/tests/test_service_descriptor.py b/genericparser/packages/tests/test_service_descriptor.py deleted file mode 100644 index 59bffa8..0000000 --- a/genericparser/packages/tests/test_service_descriptor.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (c) 2019, CMCC Technologies. Co., Ltd. -# -# 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 json -import logging - -from django.test import TestCase -from mock import mock - -from genericparser.packages.biz.service_descriptor import ServiceDescriptor -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__) - - -class TestServiceDescription(TestCase): - - def setUp(self): - self.user_defined_data = { - 'key1': 'value1', - 'key2': 'value2', - 'key3': 'value3', - } - self.data = { - 'userDefinedData': self.user_defined_data, - } - self.sd_data = sd_data - ServicePackageModel.objects.filter().delete() - - def tearDown(self): - pass - - def test_create(self): - result_data = ServiceDescriptor().create(self.data) - self.assertIsNotNone(result_data['id']) - service_package = ServicePackageModel.objects.filter(servicePackageId=result_data['id'])[0] - self.assertIsNotNone(service_package) - self.assertEqual(PKG_STATUS.DISABLED, service_package.operationalState) - self.assertEqual(PKG_STATUS.CREATED, service_package.onboardingState) - self.assertEqual(PKG_STATUS.NOT_IN_USE, service_package.usageState) - - def test_create_with_csarid(self): - csar_id = '0b667470-e6b3-4ee8-8f08-186317a04dc2' - result_data = ServiceDescriptor().create(self.data, csar_id) - self.assertEqual(csar_id, result_data['id']) - service_package = ServicePackageModel.objects.filter(servicePackageId=csar_id)[0] - self.assertIsNotNone(service_package) - self.assertEqual(PKG_STATUS.DISABLED, service_package.operationalState) - self.assertEqual(PKG_STATUS.CREATED, service_package.onboardingState) - self.assertEqual(PKG_STATUS.NOT_IN_USE, service_package.usageState) - - @mock.patch.object(toscaparsers, 'parse_sd') - def test_parse_serviced_and_save(self, mock_parse_sd): - mock_parse_sd.return_value = json.JSONEncoder().encode(self.sd_data) - servcie_desc = ServiceDescriptor() - csar_id = '0b667470-e6b3-4ee8-8f08-186317a04dc2' - servcie_desc.create(self.data, csar_id) - VnfPackageModel(vnfPackageId="1", vnfdId="cd557883-ac4b-462d-aa01-421b5fa606b1").save() - PnfPackageModel(pnfPackageId="1", pnfdId="m6000_s").save() - local_file_name = "/test.csar" - servcie_desc.parse_serviced_and_save(csar_id, local_file_name) - - service_package = ServicePackageModel.objects.filter(servicePackageId=csar_id)[0] - self.assertIsNotNone(service_package) - - def test_delete_single(self): - servcie_desc = ServiceDescriptor() - csar_id = '0b667470-e6b3-4ee8-8f08-186317a04dc2' - servcie_desc.create(self.data, csar_id) - - servcie_desc.delete_single(csar_id) - self.assertTrue(len(ServicePackageModel.objects.filter(servicePackageId=csar_id)) == 0) - self.assertFalse(ServicePackageModel.objects.filter(servicePackageId=csar_id).exists()) - - def test_delete_single_not_exists(self): - csar_id = "8000" - try: - ServiceDescriptor().delete_single(csar_id) - except Exception as e: - self.assertTrue(isinstance(e, PackageNotFoundException)) - self.assertEqual("Service package[8000] not Found.", e.args[0]) diff --git a/genericparser/packages/tests/test_servicepackage.py b/genericparser/packages/tests/test_servicepackage.py deleted file mode 100644 index 786e34c..0000000 --- a/genericparser/packages/tests/test_servicepackage.py +++ /dev/null @@ -1,481 +0,0 @@ -# Copyright (c) 2019, CMCC Technologies. Co., Ltd. -# -# 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 json - -from django.test import TestCase, Client -from mock import mock -from rest_framework import status - -from genericparser.packages.biz.sdc_service_package import ServicePackage -from genericparser.packages.const import PKG_STATUS -from genericparser.pub.database.models import ServicePackageModel, VnfPackageModel, PnfPackageModel -from genericparser.pub.exceptions import PackageNotFoundException, PackageHasExistsException, GenericparserException -from genericparser.pub.msapi import sdc -from genericparser.pub.utils import toscaparsers - -PARSER_BASE_URL = "/api/parser/v1" - - -class TestServicePackage(TestCase): - """ Test case for Service Package operations""" - - def setUp(self): - self.client = Client() - ServicePackageModel.objects.filter().delete() - self.sd_data = { - "inputs": { - "sdwanvpnresource_list": [ - { - "sdwanvpn_topology": "", - "required": True, - "type": "string" - }, - { - "sdwansitelan_list": [ - { - "deviceName": "", - "required": True, - "type": "string", - "description": "The device name in the site" - } - ] - } - ], - "sdwansiteresource_list": [ - { - "sdwansite_controlPoint": "", - "required": False, - "type": "string", - "description": "The control point of the site,only for sd-wan-edge" - }, - { - "sdwandevice_list": [ - { - "systemIp": "", - "required": False, - "type": "string", - "description": "The system ip of the device" - } - ] - } - ] - }, - "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": "", - "graph": { - "sdwansiteresource": [ - "sdwanvpnresource" - ], - "sdwanvpnresource": [] - }, - "basepath": "c:\\users\\cmcc\\appdata\\local\\temp\\tmpn79jwc\\Definitions", - "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": "" - }, - "dependencies": [], - "networks": [], - "metadata": { - "category": "Configuration", - "subcategory": "Configuration", - "UUID": "cd557883-ac4b-462d-aa01-421b5fa606b1", - "invariantUUID": "c83b621e-e267-4910-a75a-a2a5957296e4", - "name": "sdwansiteresource", - "customizationUUID": "673dd6b3-3a06-4ef0-8ad0-8c26224b08f7", - "resourceVendorRelease": "1.0", - "version": "1.0", - "resourceVendor": "onap", - "resourceVendorModelNumber": "", - "type": "VF", - "description": "sdwansiteresource" - } - } - ], - "vls": [], - "service": { - "type": "org.openecomp.service.EnhanceService", - "requirements": { - "sdwanvpnresource.sdwanvpn.dependency": [ - "sdwanvpnresource", - "sdwanvpn.dependency" - ], - "sdwansiteresource.sdwansitewan.dependency": [ - "sdwansiteresource", - "sdwansitewan.dependency" - ], - "sdwansiteresource.sdwandevice.dependency": [ - "sdwansiteresource", - "sdwandevice.dependency" - ], - "sdwanvpnresource.sdwansitelan.dependency": [ - "sdwanvpnresource", - "sdwansitelan.dependency" - ], - "sdwanvpnresource.sdwanvpn.device": [ - "sdwanvpnresource", - "sdwanvpn.device" - ], - "sdwansiteresource.sdwansite.device": [ - "sdwansiteresource", - "sdwansite.device" - ], - "sdwansiteresource.sdwansite.dependency": [ - "sdwansiteresource", - "sdwansite.dependency" - ], - "sdwanvpnresource.sdwansitelan.device": [ - "sdwanvpnresource", - "sdwansitelan.device" - ], - "sdwansiteresource.sdwansitewan.device": [ - "sdwansiteresource", - "sdwansitewan.device" - ], - "sdwansiteresource.sdwandevice.device": [ - "sdwansiteresource", - "sdwandevice.device" - ] - }, - "properties": { - "descriptor_id": "49ee73f4-1e31-4054-b871-eb9b1c29999b", - "designer": "", - "invariant_id": "5de07996-7ff0-4ec1-b93c-e3a00bb3f207", - "name": "Enhance_Service", - "verison": "" - }, - "capabilities": { - "sdwansiteresource.sdwandevice.feature": [ - "sdwansiteresource", - "sdwandevice.feature" - ], - "sdwanvpnresource.sdwanvpn.feature": [ - "sdwanvpnresource", - "sdwanvpn.feature" - ], - "sdwanvpnresource.sdwanvpn.link": [ - "sdwanvpnresource", - "sdwanvpn.link" - ], - "sdwansiteresource.sdwansite.feature": [ - "sdwansiteresource", - "sdwansite.feature" - ], - "sdwansiteresource.sdwansitewan.feature": [ - "sdwansiteresource", - "sdwansitewan.feature" - ], - "sdwanvpnresource.sdwansitelan.feature": [ - "sdwanvpnresource", - "sdwansitelan.feature" - ] - }, - "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.asset_data = { - "uuid": "1", - "invariantUUID": "63eaec39-ffbe-411c-a838-448f2c73f7eb", - "name": "underlayvpn", - "version": "2.0", - "toscaModelURL": "/sdc/v1/catalog/resources/c94490a0-f7ef-48be-b3f8-8d8662a37236/toscaModel", - "category": "Volte", - "subCategory": "VolteVNF", - "resourceType": "VF", - "lifecycleState": "CERTIFIED", - "distributionStatus": "DISTRIBUTION_APPROVED", - "lastUpdaterUserId": "jh0003", - "resources": [ - { - "resourceInstanceName": "contrailV2VLANSubInterface 0", - "resourceName": "contrailV2VLANSubInterface", - "resourceInvariantUUID": "4d31b775-af63-491d-89f1-254e218e7140", - "resourceVersion": "1.0", - "resoucreType": "CP", - "resourceUUID": "cd557883-ac4b-462d-aa01-421b5fa606b1" - }, - { - "resourceInstanceName": "Network 0", - "resourceName": "Network", - "resourceInvariantUUID": "f90f567e-7d7d-4216-af38-6bca0637c59f", - "resourceVersion": "1.0", - "resoucreType": "VL", - "resourceUUID": "m6000_s" - } - ] - } - - def tearDown(self): - pass - - ############################################################### - - def test_service_pkg_distribute_when_pkg_exists(self): - ServicePackageModel(servicePackageId="1", servicedId="2").save() - csar_id = "1" - try: - ServicePackage().on_distribute(csar_id) - except PackageHasExistsException as e: - self.assertEqual("Service CSAR(1) already exists.", e.args[0]) - - @mock.patch.object(sdc, 'get_asset') - def test_service_pkg_distribute_when_fail_get_artifacts(self, mock_get_asset): - mock_get_asset.side_effect = GenericparserException("Failed to query artifact(services,1) from sdc.") - csar_id = "1" - try: - ServicePackage().on_distribute(csar_id) - except Exception as e: - self.assertTrue(isinstance(e, GenericparserException)) - self.assertEqual("Failed to query artifact(services,1) from sdc.", e.args[0]) - - @mock.patch.object(sdc, 'get_asset') - def test_service_pkg_distribute_when_resource_not_distribute(self, mock_get_asset): - mock_get_asset.return_value = self.asset_data - csar_id = "1" - try: - ServicePackage().on_distribute(csar_id) - except Exception as e: - self.assertTrue(isinstance(e, GenericparserException)) - self.assertEqual("Resource (cd557883-ac4b-462d-aa01-421b5fa606b1) is not distributed.", e.args[0]) - - @mock.patch.object(sdc, 'get_asset') - @mock.patch.object(sdc, 'download_artifacts') - def test_service_pkg_distribute_when_fail_download_artifacts(self, mock_get_asset, mock_download_artifacts): - mock_get_asset.return_value = self.asset_data - mock_download_artifacts.side_effect = GenericparserException("Failed to download 1 from sdc.") - csar_id = "1" - VnfPackageModel(vnfPackageId="cd557883-ac4b-462d-aa01-421b5fa606b1", - vnfdId="cd557883-ac4b-462d-aa01-421b5fa606b1").save() - PnfPackageModel(pnfPackageId="m6000_s", pnfdId="m6000_s").save() - - try: - ServicePackage().on_distribute(csar_id) - except Exception as e: - self.assertTrue(isinstance(e, GenericparserException)) - self.assertEqual("Failed to download 1 from sdc.", e.args[0]) - - @mock.patch.object(sdc, 'get_asset') - @mock.patch.object(sdc, 'download_artifacts') - @mock.patch.object(toscaparsers, 'parse_sd') - def test_service_pkg_distribute(self, mock_parse_sd, mock_download_artifacts, mock_get_asset): - mock_parse_sd.return_value = json.JSONEncoder().encode(self.sd_data) - mock_download_artifacts.return_value = "/test.csar" - mock_get_asset.return_value = self.asset_data - VnfPackageModel(vnfPackageId="cd557883-ac4b-462d-aa01-421b5fa606b1", - vnfdId="cd557883-ac4b-462d-aa01-421b5fa606b1").save() - PnfPackageModel(pnfPackageId="m6000_s", pnfdId="m6000_s").save() - ServicePackage().on_distribute(csar_id="1") - - service_package = ServicePackageModel.objects.filter(servicePackageId="1").first() - self.assertEqual("5de07996-7ff0-4ec1-b93c-e3a00bb3f207", service_package.invariantId) - self.assertEqual("Enhance_Service", service_package.servicedName) - self.assertEqual(PKG_STATUS.ONBOARDED, service_package.onboardingState) - self.assertEqual(PKG_STATUS.ENABLED, service_package.operationalState) - self.assertEqual(PKG_STATUS.NOT_IN_USE, service_package.usageState) - - def test_api_service_pkg_distribute_when_pkg_exists(self): - ServicePackageModel(servicePackageId="1", servicedId="2").save() - resp = self.client.post( - PARSER_BASE_URL + "/service_packages", {"csarId": "1"}, format='json') - self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual("Service CSAR(1) already exists.", resp.data["errorMessage"]) - - ############################################################### - - def test_service_pkg_get_all(self): - ServicePackageModel( - servicePackageId="13", - servicedId="2", - servicedDesigner="2", - servicedVersion="2", - servicePackageUri="13.csar", - servicedModel="").save() - ServicePackageModel( - servicePackageId="14", - servicedId="3", - servicedDesigner="3", - servicedVersion="3", - servicePackageUri="14.csar", - servicedModel="").save() - csars = ServicePackage().get_csars() - self.assertEqual(2, len(csars)) - - def test_api_service_pkg_get_all(self): - ServicePackageModel( - servicePackageId="13", - servicedId="2", - servicedDesigner="2", - servicedVersion="2", - servicePackageUri="13.csar", - servicedModel="").save() - ServicePackageModel( - servicePackageId="14", - servicedId="3", - servicedDesigner="3", - servicedVersion="3", - servicePackageUri="14.csar", - servicedModel="").save() - resp = self.client.get(PARSER_BASE_URL + "/service_packages") - self.assertEqual(resp.status_code, status.HTTP_200_OK) - - ############################################################### - - def test_service_pkg_get_one(self): - ServicePackageModel( - servicePackageId="14", - servicedId="2", - servicedDesigner="3", - servicedVersion="4", - servicePackageUri="14.csar", - servicedModel="").save() - csar = ServicePackage().get_csar(14) - self.assertEqual(14, csar['csarId']) - - def test_service_pkg_get_one_not_found(self): - try: - ServicePackage().get_csar(1000) - except PackageNotFoundException as e: - self.assertEqual("Service package[1000] not Found.", e.args[0]) - - def test_api_service_pkg_get_one(self): - ServicePackageModel( - servicePackageId="14", - servicedId="2", - servicedDesigner="3", - servicedVersion="4", - servicePackageUri="14.csar", - servicedModel="").save() - resp = self.client.get(PARSER_BASE_URL + "/service_packages/14") - self.assertEqual(resp.status_code, status.HTTP_200_OK) - - def test_api_service_pkg_get_one_not_found(self): - resp = self.client.get(PARSER_BASE_URL + "/service_packages/22") - self.assertEqual(resp.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual( - {"errorMessage": "Service package[22] not Found.", 'error': 404}, - resp.data) - - ############################################################### - - def test_service_pkg_normal_delete(self): - ServicePackageModel(servicePackageId="8", servicedId="2").save() - sp = ServicePackageModel.objects.filter(servicePackageId=8) - self.assertEqual(1, len(sp)) - ServicePackage().delete_csar("8") - sp = ServicePackageModel.objects.filter(servicePackageId=8) - self.assertEqual(0, len(sp)) - - def test_service_pkg_normal_delete_not_found(self): - try: - ServicePackage().delete_csar("8000") - except PackageNotFoundException as e: - self.assertEqual("Service package[8000] not Found.", e.args[0]) - - def test_api_service_pkg_normal_delete(self): - ServicePackageModel(servicePackageId="8", servicedId="2").save() - resp = self.client.delete(PARSER_BASE_URL + "/service_packages/8") - self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) - - ############################################################### - - @mock.patch.object(toscaparsers, 'parse_sd') - def test_service_pkg_parser(self, mock_parse_sd): - ServicePackageModel(servicePackageId="8", servicedId="2").save() - mock_parse_sd.return_value = json.JSONEncoder().encode({"a": "b"}) - - inputs = [] - ret = ServicePackage().parse_serviced("8", inputs) - self.assertTrue({"model": '{"c": "d"}'}, ret) - - def test_service_pkg_parser_not_found(self): - try: - csar_id = "8000" - inputs = [] - ServicePackage().parse_serviced(csar_id, inputs) - except PackageNotFoundException as e: - self.assertEqual("Service CSAR(8000) does not exist.", e.args[0]) - - def test_api_service_pkg_parser_not_found(self): - query_data = { - "csarId": "1", - "packageType": "Service", - "inputs": "string" - } - resp = self.client.post(PARSER_BASE_URL + "/parser", query_data, format='json') - self.assertEqual(resp.status_code, status.HTTP_404_NOT_FOUND) diff --git a/genericparser/packages/tests/test_vnf_package.py b/genericparser/packages/tests/test_vnf_package.py deleted file mode 100644 index 9b8d7fe..0000000 --- a/genericparser/packages/tests/test_vnf_package.py +++ /dev/null @@ -1,391 +0,0 @@ -# Copyright 2018 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 json -import os -import urllib -import mock -import shutil - -from django.test import TestCase -from rest_framework import status -from rest_framework.test import APIClient - -from genericparser.packages.biz.vnf_package import VnfPackage, VnfPkgUploadThread -from genericparser.packages.const import PKG_STATUS -from genericparser.packages.tests.const import vnfd_data -from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH -from genericparser.pub.database.models import VnfPackageModel -from genericparser.pub.utils import toscaparsers - - -class MockReq(): - def read(self): - return "1" - - def close(self): - pass - - -class TestVnfPackage(TestCase): - def setUp(self): - self.client = APIClient() - - def tearDown(self): - 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): - data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "empty.txt"), "rt")} - VnfPackageModel.objects.create( - vnfPackageId="222", - onboardingState="CREATED" - ) - mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) - vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId="222") - self.assertEqual("zte-hss-1.0", vnf_pkg[0].vnfdId) - self.assertEqual(PKG_STATUS.ONBOARDED, vnf_pkg[0].onboardingState) - self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) - - def test_upload_vnf_pkg_failed(self): - data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "empty.txt"), "rb")} - VnfPackageModel.objects.create( - vnfPackageId="222", - ) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(toscaparsers, 'parse_vnfd') - @mock.patch.object(urllib.request, 'urlopen') - def test_upload_nf_pkg_from_uri(self, mock_urlopen, mock_parse_vnfd): - vnf_pkg = VnfPackageModel.objects.create( - vnfPackageId="222", - onboardingState="CREATED" - ) - mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - req_data = {"addressInformation": "https://127.0.0.1:1234/sdc/v1/hss.csar"} - mock_urlopen.return_value = MockReq() - vnf_pkg_id = vnf_pkg.vnfPackageId - VnfPkgUploadThread(req_data, vnf_pkg_id).run() - vnf_pkg1 = VnfPackageModel.objects.filter(vnfPackageId="222") - self.assertEqual("zte-hss-1.0", vnf_pkg1[0].vnfdId) - - def test_upload_from_uri_failed(self): - req_data = {"username": "123"} - response = self.client.post("/api/vnfpkgm/v1/vnf_packages/111/package_content/upload_from_uri", data=req_data) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - def test_create_vnf_pkg(self): - req_data = { - "userDefinedData": {"a": "A"} - } - response = self.client.post("/api/vnfpkgm/v1/vnf_packages", data=req_data, format="json") - resp_data = json.loads(response.content) - expect_resp_data = { - "id": resp_data.get("id"), - "onboardingState": "CREATED", - "operationalState": "DISABLED", - "usageState": "NOT_IN_USE", - "userDefinedData": {"a": "A"}, - "_links": None # TODO - } - # self.assertEqual(expect_resp_data, resp_data) - for key, value in expect_resp_data.items(): - self.assertEqual(resp_data[key], value) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - def test_query_single_vnf(self): - VnfPackageModel.objects.create( - vnfPackageId="222", - vnfdId="zte-hss-1.0", - vnfVendor="zte", - vnfdProductName="hss", - vnfSoftwareVersion="1.0.0", - vnfdVersion="1.0.0", - checksum='{"algorithm":"111", "hash": "11"}', - onboardingState="CREATED", - operationalState="DISABLED", - usageState="NOT_IN_USE", - userDefinedData='{"a": "A"}' - ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222") - expect_data = { - "id": "222", - "vnfdId": "zte-hss-1.0", - "vnfProductName": "hss", - "vnfSoftwareVersion": "1.0.0", - "vnfdVersion": "1.0.0", - "checksum": {"algorithm": "111", "hash": "11"}, - "softwareImages": None, - "additionalArtifacts": None, - "onboardingState": "CREATED", - "operationalState": "DISABLED", - "usageState": "NOT_IN_USE", - "userDefinedData": {"a": "A"}, - "_links": None - } - for key, value in expect_data.items(): - self.assertEqual(response.data[key], value) - # self.assertEqual(response.data, expect_data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_query_single_vnf_failed(self): - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222") - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_query_multiple_vnf(self): - VnfPackageModel.objects.create( - vnfPackageId="111", - vnfdId="zte-hss-1.0", - vnfVendor="zte", - vnfdProductName="hss", - vnfSoftwareVersion="1.0.0", - vnfdVersion="1.0.0", - checksum='{"algorithm":"111", "hash": "11"}', - onboardingState="CREATED", - operationalState="DISABLED", - usageState="NOT_IN_USE", - userDefinedData='{"a": "A"}' - ) - VnfPackageModel.objects.create( - vnfPackageId="222", - vnfdId="zte-hss-1.0", - vnfVendor="zte", - vnfdProductName="hss", - vnfSoftwareVersion="1.0.0", - vnfdVersion="1.0.0", - checksum='{"algorithm":"111", "hash": "11"}', - onboardingState="CREATED", - operationalState="DISABLED", - usageState="NOT_IN_USE", - userDefinedData='{"a": "A"}' - ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages") - expect_data = [ - { - "id": "111", - "vnfdId": "zte-hss-1.0", - "vnfProductName": "hss", - "vnfSoftwareVersion": "1.0.0", - "vnfdVersion": "1.0.0", - "checksum": {"algorithm": "111", "hash": "11"}, - "softwareImages": None, - "additionalArtifacts": None, - "onboardingState": "CREATED", - "operationalState": "DISABLED", - "usageState": "NOT_IN_USE", - "userDefinedData": {"a": "A"}, - "_links": None - }, - { - "id": "222", - "vnfdId": "zte-hss-1.0", - "vnfProductName": "hss", - "vnfSoftwareVersion": "1.0.0", - "vnfdVersion": "1.0.0", - "checksum": {"algorithm": "111", "hash": "11"}, - "softwareImages": None, - "additionalArtifacts": None, - "onboardingState": "CREATED", - "operationalState": "DISABLED", - "usageState": "NOT_IN_USE", - "userDefinedData": {"a": "A"}, - "_links": None - } - ] - # self.assertEqual(response.data, expect_data) - self.assertEqual(len(response.data), len(expect_data)) - for i in range(0, len(expect_data)): - for key, value in expect_data[i].items(): - self.assertEqual(response.data[i][key], value) - - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_delete_single_vnf_pkg(self): - VnfPackageModel.objects.create( - vnfPackageId="222", - vnfdId="zte-hss-1.0", - vnfVendor="zte", - vnfdProductName="hss", - vnfSoftwareVersion="1.0.0", - vnfdVersion="1.0.0", - checksum='{"algorithm":"111", "hash": "11"}', - onboardingState="CREATED", - operationalState="DISABLED", - usageState="NOT_IN_USE", - userDefinedData='{"a": "A"}' - ) - response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222") - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(response.data, None) - - def test_delete_when_vnf_pkg_not_exist(self): - response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222") - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(response.data, None) - - def test_fetch_vnf_pkg(self): - with open("vnfPackage.csar", "wt") 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") - file_content = '' - for data in response.streaming_content: - file_content = file_content + data.decode() - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual('AAAABBBBCCCCDDDD', file_content) - os.remove("vnfPackage.csar") - - def test_fetch_partical_vnf_pkg(self): - with open("vnfPackage.csar", "wt") 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-7") - partial_file_content = '' - for data in response.streaming_content: - partial_file_content = partial_file_content.encode() + data - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(b'BBB', partial_file_content) - os.remove("vnfPackage.csar") - - def test_fetch_last_partical_vnf_pkg(self): - with open("vnfPackage.csar", "wt") 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.encode() + data - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(b'BBBBCCCCDDDD', partial_file_content) - os.remove("vnfPackage.csar") - - def test_fetch_vnf_pkg_when_pkg_not_exist(self): - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content") - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_fetch_vnf_pkg_when_catch_cataloge_exception(self): - VnfPackageModel.objects.create( - vnfPackageId="222", - onboardingState="CREATED", - localFilePath="vnfPackage.csar" - ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(VnfPackage, "create_vnf_pkg") - def test_create_vnf_pkg_when_catch_exception(self, mock_create_vnf_pkg): - mock_create_vnf_pkg.side_effect = TypeError('integer type') - req_data = { - "userDefinedData": {"a": "A"} - } - response = self.client.post("/api/vnfpkgm/v1/vnf_packages", data=req_data, format="json") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(VnfPackage, "delete_vnf_pkg") - def test_delete_single_when_catch_exception(self, mock_delete_vnf_pkg): - mock_delete_vnf_pkg.side_effect = TypeError("integer type") - response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(VnfPackage, "query_single") - def test_query_single_when_catch_exception(self, mock_query_single): - mock_query_single.side_effect = TypeError("integer type") - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(VnfPackage, "query_multiple") - def test_query_multiple_when_catch_exception(self, mock_query_muitiple): - mock_query_muitiple.side_effect = TypeError("integer type") - response = self.client.get("/api/vnfpkgm/v1/vnf_packages") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(toscaparsers, 'parse_vnfd') - def test_upload_when_catch_exception(self, mock_parse_vnfd): - data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "empty.txt"), "rb")} - VnfPackageModel.objects.create( - vnfPackageId="222", - onboardingState="CREATED" - ) - mock_parse_vnfd.side_effect = TypeError("integer type") - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(VnfPkgUploadThread, 'start') - def test_upload_from_uri_when_catch_exception(self, mock_start): - req_data = {"addressInformation": "https://127.0.0.1:1234/sdc/v1/hss.csar"} - mock_start.side_effect = TypeError("integer type") - response = self.client.post("/api/vnfpkgm/v1/vnf_packages/111/package_content/upload_from_uri", data=req_data) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(VnfPackage, 'download') - def test_fetch_vnf_pkg_when_catch_exception(self, mock_download): - mock_download.side_effect = TypeError("integer type") - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content") - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - @mock.patch.object(toscaparsers, 'parse_vnfd') - def test_fetch_vnf_artifact(self, mock_parse_vnfd): - data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "resource_test.csar"), "rb")} - VnfPackageModel.objects.create( - vnfPackageId="222", - onboardingState="CREATED" - ) - mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) - self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/artifacts/image") - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.getvalue(), b"ubuntu_16.04\n") - - @mock.patch.object(toscaparsers, 'parse_vnfd') - def test_fetch_vnf_artifact_not_exists(self, mock_parse_vnfd): - data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "resource_test.csar"), "rb")} - VnfPackageModel.objects.create( - vnfPackageId="222", - onboardingState="CREATED" - ) - mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) - self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/1451/artifacts/image") - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - @mock.patch.object(toscaparsers, 'parse_vnfd') - def test_fetch_vnf_artifact_vnf_not_exists(self, mock_parse_vnfd): - data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "resource_test.csar"), "rb")} - VnfPackageModel.objects.create( - vnfPackageId="222", - onboardingState="CREATED" - ) - mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) - self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/artifacts/image1") - 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 deleted file mode 100644 index e35f195..0000000 --- a/genericparser/packages/tests/test_vnf_pkg_subscription.py +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 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 = vnf_subscription_data - - def tearDown(self): - pass - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_create_vnf_subscription(self, mock_uuid4, mock_requests): - temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13" - 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' - ) - self.assertEqual(201, response.status_code) - self.assertEqual( - self.vnf_subscription_data["callbackUri"], - response.data["callbackUri"] - ) - self.assertEqual(temp_uuid, response.data["id"]) - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_duplicate_subscriptions(self, mock_uuid4, mock_requests): - temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13" - temp1_uuid = "00342b18-a5c7-11e8-998c-bf1755941f12" - 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' - ) - self.assertEqual(201, response.status_code) - 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' - ) - self.assertEqual(303, response.status_code) - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_get_subscriptions(self, mock_uuid4, mock_requests): - temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13" - 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.assertEqual(200, response.status_code) - self.assertEqual(1, len(response.data)) - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_get_subscriptions_with_invalid_params(self, mock_uuid4, mock_requests): - temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13" - 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.assertEqual(400, response.status_code) - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_get_subscription_with_id(self, mock_uuid4, mock_requests): - temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13" - 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/%s" % temp_uuid, - format='json' - ) - self.assertEqual(200, response.status_code) - self.assertEqual(temp_uuid, response.data["id"]) - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_get_subscription_with_id_not_exists(self, mock_uuid4, mock_requests): - temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13" - dummy_uuid = str(uuid.uuid4()) - 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/%s" % dummy_uuid, - format='json' - ) - self.assertEqual(404, response.status_code) - - @mock.patch("requests.get") - @mock.patch.object(uuid, 'uuid4') - def test_delete_subscription_with_id(self, mock_uuid4, mock_requests): - temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13" - dummy_uuid = str(uuid.uuid4()) - 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/%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/%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 deleted file mode 100644 index 70f7021..0000000 --- a/genericparser/packages/tests/test_vnfpackage.py +++ /dev/null @@ -1,231 +0,0 @@ -# Copyright 2017 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 json -import mock -from rest_framework.test import APIClient -from django.test import TestCase -from rest_framework import status -from genericparser.packages.biz.sdc_vnf_package import NfDistributeThread, NfPkgDeleteThread -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): - def setUp(self): - self.client = APIClient() - VnfPackageModel.objects.filter().delete() - JobModel.objects.filter().delete() - JobStatusModel.objects.filter().delete() - self.vnfd_data = vnfd_data - - def tearDown(self): - pass - - def assert_job_result(self, job_id, job_progress, job_detail): - jobs = JobStatusModel.objects.filter( - jobid=job_id, - progress=job_progress, - descp=job_detail) - self.assertEqual(1, len(jobs)) - - @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' - ) - 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() - 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.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() - NfDistributeThread(csar_id="1", - vim_ids=["1"], - lab_vim_id="", - job_id="2").run() - self.assert_job_result("2", 255, "VNF package(zte-hss-1.0) 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_successfully(self, - 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'] - NfDistributeThread(csar_id="1", - vim_ids=["1"], - lab_vim_id="", - job_id="4").run() - self.assert_job_result("4", 100, "CSAR(1) distribute successfully.") - - ############################################################################################################### - - @mock.patch.object(NfPkgDeleteThread, 'run') - def test_nf_pkg_delete_normal(self, mock_run): - resp = self.client.delete("/api/parser/v1/vnfpackages/1") - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - - def test_nf_pkg_normal_delete(self): - VnfPackageModel(vnfPackageId="2", vnfdId="vcpe_vfw_zte_1_0").save() - NfPkgDeleteThread(csar_id="2", job_id="2").run() - 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() - resp = self.client.get("/api/parser/v1/vnfpackages") - self.assertEqual(resp.status_code, status.HTTP_200_OK) - expect_data = [ - { - "imageInfo": [], - "csarId": "3", - "packageInfo": { - "csarName": "", - "vnfdModel": "", - "vnfdProvider": "3", - "vnfdId": "3", - "downloadUrl": "http://127.0.0.1:8806/static/genericparser/3/", - "vnfVersion": "", - "vnfdVersion": "3", - "vnfPackageId": "3" - } - }, - { - "imageInfo": [], - "csarId": "4", - "packageInfo": { - "csarName": "", - "vnfdModel": "", - "vnfdProvider": "4", - "vnfdId": "4", - "downloadUrl": "http://127.0.0.1:8806/static/genericparser/4/", - "vnfVersion": "", - "vnfdVersion": "4", - "vnfPackageId": "4" - } - } - ] - 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() - - resp = self.client.get("/api/parser/v1/vnfpackages/4") - self.assertEqual(resp.status_code, status.HTTP_200_OK) - expect_data = { - "imageInfo": [], - "csarId": "4", - "packageInfo": { - "csarName": "", - "vnfdModel": "", - "vnfdProvider": "4", - "vnfdId": "4", - "downloadUrl": "http://127.0.0.1:8806/static/genericparser/4/", - "vnfVersion": "", - "vnfdVersion": "4", - "vnfPackageId": "4" - } - } - 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() - - resp = self.client.get("/api/parser/v1/vnfpackages/2") - self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - self.assertEqual({'error': 'Vnf package[2] not Found.'}, resp.data) - - ############################################################################################################### - - @mock.patch.object(toscaparsers, 'parse_vnfd') - def test_vnfd_parse_normal(self, mock_parse_vnfd): - VnfPackageModel(vnfPackageId="8", vnfdId="10").save() - mock_parse_vnfd.return_value = json.JSONEncoder().encode({"c": "d"}) - req_data = {"csarId": "8", "inputs": []} - resp = self.client.post("/api/parser/v1/parservnfd", req_data, format='json') - self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) - self.assertEqual({"model": '{"c": "d"}'}, resp.data) - - def test_vnfd_parse_when_csar_not_exist(self): - req_data = {"csarId": "1", "inputs": []} - resp = self.client.post("/api/parser/v1/parservnfd", req_data, format='json') - self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - self.assertEqual(resp.data, {"error": "VNF CSAR(1) does not exist."}) diff --git a/genericparser/packages/urls.py b/genericparser/packages/urls.py deleted file mode 100644 index 49199ac..0000000 --- a/genericparser/packages/urls.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright 2017-2018 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.conf.urls import url - -from genericparser.packages.views import vnf_package_views -from genericparser.packages.views.vnf_package_subscription_views import CreateQuerySubscriptionView,\ - QueryTerminateSubscriptionView -from genericparser.packages.views.vnf_package_artifact_views import FetchVnfPkgmArtifactsView -from genericparser.packages.views import catalog_views, ns_descriptor_views, pnf_descriptor_views, nsdm_subscription_views -from genericparser.packages.views.health_check_views import HealthCheckView - - -urlpatterns = [ - - # Sync package from SDC - url(r'^api/parser/v1/nspackages$', catalog_views.nspackages_rc, name='nspackages_rc'), - url(r'^api/parser/v1/nspackages/(?P[0-9a-zA-Z\-\_]+)$', catalog_views.ns_rd_csar, name='nspackage_rd'), - url(r'^api/parser/v1/vnfpackages$', catalog_views.nfpackages_rc, name='nfpackages_rc'), - url(r'^api/parser/v1/vnfpackages/(?P[0-9a-zA-Z\-\_]+)$', catalog_views.nf_rd_csar, name='nfpackage_rd'), - url(r'^api/parser/v1/service_packages$', catalog_views.servicepackages_rc, name='servicepackages_rc'), - url(r'^api/parser/v1/service_packages/(?P[0-9a-zA-Z\-\_]+)$', catalog_views.service_rd_csar, name='servicepackage_rd'), - - # NFV Model Parser - url(r'^api/parser/v1/parser$', catalog_views.model_parser, name='modelparser_rc'), - url(r'^api/parser/v1/parsernsd$', catalog_views.ns_model_parser, name='nsmodelparser_rc'), - url(r'^api/parser/v1/parservnfd$', catalog_views.vnf_model_parser, name='vnfmodelparser_rc'), - url(r'^api/parser/v1/parserpnfd$', pnf_descriptor_views.pnf_model_parser, name='pnfmodelparser_rc'), - - # ETSI SOL005 NSD API - url(r'^api/nsd/v1/ns_descriptors$', ns_descriptor_views.ns_descriptors_rc, name='ns_descriptors_rc'), - url(r'^api/nsd/v1/ns_descriptors/(?P[0-9a-zA-Z\-\_]+)$', ns_descriptor_views.ns_info_rd, name='ns_info_rd'), - url(r'^api/nsd/v1/ns_descriptors/(?P[0-9a-zA-Z\-\_]+)/nsd_content$', ns_descriptor_views.nsd_content_ru, name='nsd_content_ru'), - url(r'^api/nsd/v1/subscriptions$', nsdm_subscription_views.nsd_subscription_rc, name='nsd_subscription_rc'), - url(r'^api/nsd/v1/subscriptions/(?P[0-9a-zA-Z\-\_]+)$', nsdm_subscription_views.nsd_subscription_rd, name='nsd_subscription_rd'), - - # ETSI SOL005 PNFD - url(r'^api/nsd/v1/pnf_descriptors$', pnf_descriptor_views.pnf_descriptors_rc, name='pnf_descriptors_rc'), - url(r'^api/nsd/v1/pnf_descriptors/(?P[0-9a-zA-Z\-\_]+)$', pnf_descriptor_views.pnfd_info_rd, name='pnfd_info_rd'), - url(r'^api/nsd/v1/pnf_descriptors/(?P[0-9a-zA-Z\-\_]+)/pnfd_content$', pnf_descriptor_views.pnfd_content_ru, name='pnfd_content_ru'), - - # ETSI SOL005&SOL003 VNF Package - url(r'^api/vnfpkgm/v1/vnf_packages$', vnf_package_views.vnf_packages_rc, name='vnf_packages_rc'), - url(r'^api/vnfpkgm/v1/vnf_packages/(?P[0-9a-zA-Z\-\_]+)$', vnf_package_views.vnf_package_rd, name='vnf_package_rd'), - url(r'^api/vnfpkgm/v1/vnf_packages/(?P[0-9a-zA-Z\-\_]+)/package_content$', vnf_package_views.package_content_ru, name='package_content_ru'), - url(r'^api/vnfpkgm/v1/vnf_packages/(?P[0-9a-zA-Z\-\_]+)/package_content/upload_from_uri$', vnf_package_views.upload_from_uri_c, name='upload_from_uri_c'), - - # ETSI SOL 005 VNF Package Management Subscription APIs - url(r'^api/vnfpkgm/v1/subscriptions$', CreateQuerySubscriptionView.as_view(), name='subscriptions_create_query'), - url(r'^api/vnfpkgm/v1/subscriptions/(?P[0-9a-zA-Z\-\_]+)$', QueryTerminateSubscriptionView.as_view(), name='subscriptions_query_terminate'), - url(r'^api/vnfpkgm/v1/vnf_packages/(?P[0-9a-zA-Z\-\_]+)/artifacts/(?P[0-9a-zA-Z\-\_]+)$', FetchVnfPkgmArtifactsView.as_view(), name="fetch_vnf_artifacts"), - # url(r'^api/vnfpkgm/v1/subscriptions/(?P[0-9a-zA-Z\-\_]+)$', vnf_package_subscription_views.vnf_package_subscriptions_rc, name='subscriptions_rc'), - # url(r'^api/vnfpkgm/v1/vnf_packages/(?P[0-9a-zA-Z\-\_]+)/vnfd$', vnfd.as_view(), name='vnfd_r'),# url(r'^api/vnfpkgm/v1/vnf_packages/(?P[0-9a-zA-Z\-\_]+)/artifacts/artifactPath$', artifacts.as_view(), name='artifacts_r'), - - # url(r'^api/vnfpkgm/v1/subscriptions/(?P[0-9a-zA-Z\-\_]+)$', vnfpkg_subscription.as_view(), name='subscription_rd'), - - # health check - url(r'^api/vnfpkgm/v1/health_check$', HealthCheckView.as_view()), - url(r'^api/nsd/v1/health_check$', HealthCheckView.as_view()), - url(r'^api/parser/v1/health_check$', HealthCheckView.as_view()), -] diff --git a/genericparser/packages/views/__init__.py b/genericparser/packages/views/__init__.py deleted file mode 100644 index 342c2a8..0000000 --- a/genericparser/packages/views/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2018 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. diff --git a/genericparser/packages/views/catalog_views.py b/genericparser/packages/views/catalog_views.py deleted file mode 100644 index df3dfca..0000000 --- a/genericparser/packages/views/catalog_views.py +++ /dev/null @@ -1,535 +0,0 @@ -# Copyright 2017 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 logging -import uuid - -from drf_yasg import openapi -from drf_yasg.utils import no_body, swagger_auto_schema -from rest_framework import status -from rest_framework.decorators import api_view -from rest_framework.response import Response -from genericparser.packages.biz import sdc_vnf_package, sdc_ns_package -from genericparser.packages.biz.pnf_descriptor import PnfDescriptor -from genericparser.packages.biz.sdc_service_package import ServicePackage -from genericparser.packages.serializers.genericparser_serializers import InternalErrorRequestSerializer, \ - ServicePackageDistributeRequestSerializer, ServicePackagesSerializer, ServicePackageSerializer -from genericparser.packages.serializers.genericparser_serializers import NfPackageDistributeRequestSerializer -from genericparser.packages.serializers.genericparser_serializers import NfPackageSerializer -from genericparser.packages.serializers.genericparser_serializers import NfPackagesSerializer -from genericparser.packages.serializers.genericparser_serializers import NsPackageDistributeRequestSerializer -from genericparser.packages.serializers.genericparser_serializers import NsPackageDistributeResponseSerializer -from genericparser.packages.serializers.genericparser_serializers import NsPackageSerializer -from genericparser.packages.serializers.genericparser_serializers import NsPackagesSerializer -from genericparser.packages.serializers.genericparser_serializers import ParseModelRequestSerializer -from genericparser.packages.serializers.genericparser_serializers import ParseModelResponseSerializer -from genericparser.packages.serializers.genericparser_serializers import PostJobResponseSerializer -from genericparser.packages.views.common import fmt_error_rsp -from genericparser.pub.exceptions import PackageNotFoundException, PackageHasExistsException -from genericparser.pub.utils.syscomm import fun_name -from genericparser.pub.utils.values import ignore_case_get - -logger = logging.getLogger(__name__) - - -@swagger_auto_schema( - method='POST', - operation_description="On distribute NS package", - request_body=NsPackageDistributeRequestSerializer, - responses={ - status.HTTP_202_ACCEPTED: NsPackageDistributeResponseSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@swagger_auto_schema( - method='GET', - operation_description="Query NS packages", - request_body=no_body, - responses={ - status.HTTP_200_OK: NsPackagesSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@api_view(http_method_names=['POST', 'GET']) -def nspackages_rc(request, *args, **kwargs): - logger.debug("Enter %s, method is %s", fun_name(), request.method) - ret, normal_status, response_serializer, validation_error = None, None, None, None - - if request.method == 'GET': - # Gets ns package list - ret = sdc_ns_package.ns_get_csars() - normal_status = status.HTTP_200_OK - - if ret[0] == 0: - response_serializer = NsPackagesSerializer(data=ret[1]) - validation_error = handleValidatonError( - response_serializer, False) - if validation_error: - return validation_error - elif request.method == 'POST': - # Distributes the package accroding to the given csarId - request_serializer = NsPackageDistributeRequestSerializer(data=request.data) - validation_error = handleValidatonError(request_serializer, True) - if validation_error: - return validation_error - - csar_id = ignore_case_get(request.data, "csarId") - logger.debug("csar_id is %s", csar_id) - ret = sdc_ns_package.ns_on_distribute(csar_id) - normal_status = status.HTTP_202_ACCEPTED - - logger.debug("Leave %s, Return value is %s", fun_name(), ret) - if ret[0] != 0: - return Response( - data={ - 'error': ret[1]}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - return Response(data=ret[1], status=normal_status) - - -@swagger_auto_schema( - method='POST', - operation_description="On distribute Nf package", - request_body=NfPackageDistributeRequestSerializer(), - responses={ - status.HTTP_202_ACCEPTED: PostJobResponseSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@swagger_auto_schema( - method='GET', - operation_description="Query Nf packages", - request_body=no_body, - responses={ - status.HTTP_200_OK: NfPackagesSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@api_view(http_method_names=['POST', 'GET']) -def nfpackages_rc(request, *args, **kwargs): - logger.debug( - "Enter %s%s, method is %s", - fun_name(), - request.data, - request.method) - ret, normal_status, response_serializer, validation_error = None, None, None, None - if request.method == 'GET': - ret = sdc_vnf_package.nf_get_csars() - normal_status = status.HTTP_200_OK - response_serializer = NfPackagesSerializer(data=ret[1]) - elif request.method == 'POST': - request_serivalizer = NfPackageDistributeRequestSerializer( - data=request.data) - validation_error = handleValidatonError( - request_serivalizer, True) - if validation_error: - return validation_error - - csar_id = ignore_case_get(request_serivalizer.data, "csarId") - vim_ids = ignore_case_get(request_serivalizer.data, "vimIds") - lab_vim_id = ignore_case_get(request_serivalizer.data, "labVimId") - job_id = str(uuid.uuid4()) - sdc_vnf_package.NfDistributeThread( - csar_id, vim_ids, lab_vim_id, job_id).start() - ret = [0, {"jobId": job_id}] - normal_status = status.HTTP_202_ACCEPTED - - response_serializer = PostJobResponseSerializer(data=ret[1]) - logger.debug("Leave %s, Return value is %s", fun_name(), ret) - - if ret[0] != 0: - return Response( - data={ - 'error': ret[1]}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - validation_error = handleValidatonError( - response_serializer, False) - if validation_error: - return validation_error - - return Response(data=response_serializer.data, status=normal_status) - - -@swagger_auto_schema( - method='DELETE', - operation_description="Delete one NS package", - request_body=no_body, - manual_parameters=[ - openapi.Parameter( - 'csarId', - openapi.IN_QUERY, - "csarId", - type=openapi.TYPE_STRING)], - responses={ - status.HTTP_200_OK: NsPackageDistributeResponseSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response( - 'error message', - openapi.Schema( - type=openapi.TYPE_STRING))}) -@swagger_auto_schema( - method='GET', - operation_description="Query one NS package", - request_body=no_body, - manual_parameters=[ - openapi.Parameter( - 'csarId', - openapi.IN_QUERY, - "csarId", - type=openapi.TYPE_STRING)], - responses={ - status.HTTP_200_OK: NsPackageSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response( - 'error message', - openapi.Schema( - type=openapi.TYPE_STRING))}) -@api_view(http_method_names=['DELETE', 'GET']) -def ns_rd_csar(request, *args, **kwargs): - csar_id = ignore_case_get(kwargs, "csarId") - logger.info("Enter %s, method is %s, csar_id is %s", - fun_name(), request.method, csar_id) - ret, normal_status, response_serializer, validation_error = None, None, None, None - if request.method == 'GET': - ret = sdc_ns_package.ns_get_csar(csar_id) - normal_status = status.HTTP_200_OK - if ret[0] == 0: - response_serializer = NsPackageSerializer(data=ret[1]) - validation_error = handleValidatonError(response_serializer, False) - if validation_error: - return validation_error - elif request.method == 'DELETE': - ret = sdc_ns_package.ns_delete_csar(csar_id) - normal_status = status.HTTP_200_OK - logger.info("Leave %s, Return value is %s", fun_name(), ret) - if ret[0] != 0: - return Response( - data={ - 'error': ret[1]}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR) - return Response(data=ret[1], status=normal_status) - - -@swagger_auto_schema( - method='POST', - operation_description="On distribute Service package", - request_body=ServicePackageDistributeRequestSerializer, - responses={ - status.HTTP_202_ACCEPTED: "", - status.HTTP_400_BAD_REQUEST: InternalErrorRequestSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@swagger_auto_schema( - method='GET', - operation_description="Query Service packages", - request_body=no_body, - responses={ - status.HTTP_200_OK: ServicePackagesSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@api_view(http_method_names=['POST', 'GET']) -def servicepackages_rc(request, *args, **kwargs): - logger.debug("Enter %s, method is %s", fun_name(), request.method) - - if request.method == 'GET': - # Gets service package list - try: - csar_list = ServicePackage().get_csars() - response_serializer = ServicePackagesSerializer(data=csar_list) - validation_error = handleValidatonError(response_serializer, False) - if validation_error: - return validation_error - return Response(data=csar_list, status=status.HTTP_200_OK) - except Exception as e: - error_status = status.HTTP_500_INTERNAL_SERVER_ERROR - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - elif request.method == 'POST': - # Distributes the package according to the given csarId - request_serializer = ServicePackageDistributeRequestSerializer(data=request.data) - validation_error = handleValidatonError(request_serializer, True) - if validation_error: - return validation_error - - csar_id = ignore_case_get(request.data, "csarId") - logger.debug("csar_id is %s", csar_id) - try: - ServicePackage().on_distribute(csar_id) - return Response(status=status.HTTP_202_ACCEPTED) - except PackageHasExistsException as e: - error_status = status.HTTP_400_BAD_REQUEST - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - except Exception as e: - error_status = status.HTTP_500_INTERNAL_SERVER_ERROR - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - - -@swagger_auto_schema( - method='DELETE', - operation_description="Delete one Service package", - request_body=no_body, - manual_parameters=[ - openapi.Parameter( - 'csarId', - openapi.IN_QUERY, - "csarId", - type=openapi.TYPE_STRING)], - responses={ - status.HTTP_204_NO_CONTENT: "", - status.HTTP_404_NOT_FOUND: InternalErrorRequestSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@swagger_auto_schema( - method='GET', - operation_description="Query one Service package", - request_body=no_body, - manual_parameters=[ - openapi.Parameter( - 'csarId', - openapi.IN_QUERY, - "csarId", - type=openapi.TYPE_STRING)], - responses={ - status.HTTP_200_OK: ServicePackageSerializer, - status.HTTP_404_NOT_FOUND: InternalErrorRequestSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@api_view(http_method_names=['DELETE', 'GET']) -def service_rd_csar(request, *args, **kwargs): - csar_id = ignore_case_get(kwargs, "csarId") - logger.info("Enter %s, method is %s, csar_id is %s", fun_name(), request.method, csar_id) - - if request.method == 'GET': - try: - ret = ServicePackage().get_csar(csar_id) - response_serializer = ServicePackageSerializer(data=ret) - validation_error = handleValidatonError(response_serializer, False) - if validation_error: - return validation_error - return Response(data=ret, status=status.HTTP_200_OK) - except PackageNotFoundException as e: - error_status = status.HTTP_404_NOT_FOUND - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - except Exception as e: - error_status = status.HTTP_500_INTERNAL_SERVER_ERROR - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - - elif request.method == 'DELETE': - try: - ServicePackage().delete_csar(csar_id) - return Response(status=status.HTTP_204_NO_CONTENT) - except PackageNotFoundException as e: - error_status = status.HTTP_404_NOT_FOUND - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - except Exception as e: - error_status = status.HTTP_500_INTERNAL_SERVER_ERROR - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - - -@swagger_auto_schema( - method='DELETE', - operation_description="Delete one Nf package", - request_body=no_body, - manual_parameters=[ - openapi.Parameter( - 'csarId', - openapi.IN_QUERY, - "csarId", - type=openapi.TYPE_STRING)], - responses={ - status.HTTP_202_ACCEPTED: PostJobResponseSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response( - 'error message', - openapi.Schema( - type=openapi.TYPE_STRING))}) -@swagger_auto_schema( - method='GET', - operation_description="Query one Nf package", - request_body=no_body, - manual_parameters=[ - openapi.Parameter( - 'csarId', - openapi.IN_QUERY, - "csarId", - type=openapi.TYPE_STRING)], - responses={ - status.HTTP_200_OK: NfPackageSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response( - 'error message', - openapi.Schema( - type=openapi.TYPE_STRING))}) -@api_view(http_method_names=['DELETE', 'GET']) -def nf_rd_csar(request, *args, **kwargs): - csar_id = ignore_case_get(kwargs, "csarId") - logger.info("Enter %s, method is %s, csar_id is %s", - fun_name(), request.method, csar_id) - ret, normal_status, response_serializer, validation_error = None, None, None, None - - if request.method == 'GET': - ret = sdc_vnf_package.nf_get_csar(csar_id) - normal_status = status.HTTP_200_OK - response_serializer = NfPackageSerializer(data=ret[1]) - - elif request.method == 'DELETE': - job_id = str(uuid.uuid4()) - sdc_vnf_package.NfPkgDeleteThread(csar_id, job_id).start() - ret = [0, {"jobId": job_id}] - normal_status = status.HTTP_202_ACCEPTED - response_serializer = PostJobResponseSerializer(data=ret[1]) - - logger.info("Leave %s, Return value is %s", fun_name(), ret) - if ret[0] != 0: - return Response( - data={ - 'error': ret[1]}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - validation_error = handleValidatonError( - response_serializer, False) - if validation_error: - return validation_error - - return Response(data=response_serializer.data, status=normal_status) - - -@swagger_auto_schema( - method='POST', - operation_description="Parse model(NS, Service, VNF, PNF)", - request_body=ParseModelRequestSerializer, - responses={ - status.HTTP_202_ACCEPTED: ParseModelResponseSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@api_view(http_method_names=['POST']) -def model_parser(request, *args, **kwargs): - csar_id = ignore_case_get(request.data, "csarId") - package_type = ignore_case_get(request.data, "packageType") - inputs = ignore_case_get(request.data, "inputs") - logger.debug( - "Enter %s, csar_id=%s, package_type=%s, inputs=%s", - fun_name(), - csar_id, - package_type, - inputs) - - if package_type.lower().__eq__("service"): - try: - ret = ServicePackage().parse_serviced(csar_id, inputs) - response_serializer = ParseModelResponseSerializer(data=ret) - validation_error = handleValidatonError( - response_serializer, False) - if validation_error: - return validation_error - return Response(data=response_serializer.data, status=status.HTTP_202_ACCEPTED) - except PackageNotFoundException as e: - error_status = status.HTTP_404_NOT_FOUND - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - except Exception as e: - error_status = status.HTTP_500_INTERNAL_SERVER_ERROR - return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status) - elif package_type.lower().__eq__("ns"): - ret = sdc_ns_package.parse_nsd(csar_id, inputs) - elif package_type.lower().__eq__("vnf"): - ret = sdc_vnf_package.parse_vnfd(csar_id, inputs) - elif package_type.lower().__eq__("pnf"): - ret = PnfDescriptor().parse_pnfd(csar_id, inputs) - else: - error_status = status.HTTP_400_BAD_REQUEST - error_message = "Invalid package type, it should be one of [VNF, PNF, NS, Service]" - return Response(data=fmt_error_rsp(error_message, error_status), status=error_status) - - if ret[0] != 0: - return Response( - data={ - 'error': ret[1]}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - response_serializer = ParseModelResponseSerializer(data=ret[1]) - validation_error = handleValidatonError( - response_serializer, False) - if validation_error: - return validation_error - - return Response(data=response_serializer.data, status=status.HTTP_202_ACCEPTED) - - -@swagger_auto_schema( - method='POST', - operation_description="Parse NS model", - request_body=ParseModelRequestSerializer, - responses={ - status.HTTP_202_ACCEPTED: ParseModelResponseSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@api_view(http_method_names=['POST']) -def ns_model_parser(request, *args, **kwargs): - csar_id = ignore_case_get(request.data, "csarId") - inputs = ignore_case_get(request.data, "inputs") - logger.debug( - "Enter %s, csar_id=%s, inputs=%s", - fun_name(), - csar_id, - inputs) - ret = sdc_ns_package.parse_nsd(csar_id, inputs) - logger.info("Leave %s, Return value is %s", fun_name(), ret) - if ret[0] != 0: - return Response( - data={ - 'error': ret[1]}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - response_serializer = ParseModelResponseSerializer(data=ret[1]) - validation_error = handleValidatonError( - response_serializer, False) - if validation_error: - return validation_error - - return Response(data=response_serializer.data, status=status.HTTP_202_ACCEPTED) - - -@swagger_auto_schema( - method='POST', - operation_description="Parse NF model", - request_body=ParseModelRequestSerializer, - responses={ - status.HTTP_202_ACCEPTED: ParseModelResponseSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@api_view(http_method_names=['POST']) -def vnf_model_parser(request, *args, **kwargs): - csar_id = ignore_case_get(request.data, "csarId") - inputs = ignore_case_get(request.data, "inputs") - logger.debug( - "Enter %s, csar_id=%s, inputs=%s", - fun_name(), - csar_id, - inputs) - ret = sdc_vnf_package.parse_vnfd(csar_id, inputs) - logger.info("Leave %s, Return value is %s", fun_name(), ret) - if ret[0] != 0: - return Response( - data={ - 'error': ret[1]}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - response_serializer = ParseModelResponseSerializer(data=ret[1]) - validation_error = handleValidatonError( - response_serializer, False) - if validation_error: - return validation_error - - return Response(data=response_serializer.data, status=status.HTTP_202_ACCEPTED) - - -def handleValidatonError(base_serializer, is_request): - response = None - - if not base_serializer.is_valid(): - errormessage = base_serializer.errors - logger.error(errormessage) - - if is_request: - message = 'Invalid request' - else: - message = 'Invalid response' - logger.error(message) - response = Response( - data={'error': errormessage}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - return response diff --git a/genericparser/packages/views/common.py b/genericparser/packages/views/common.py deleted file mode 100644 index efd045b..0000000 --- a/genericparser/packages/views/common.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright 2018 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 traceback -import logging - -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__) - - -def validate_data(data, serializer): - serialized_data = serializer(data=data) - if not serialized_data.is_valid(): - logger.error('Data validation failed.') - raise GenericparserException(serialized_data.errors) - return serialized_data - - -def fmt_error_rsp(error_message, status): - return {"errorMessage": error_message, "error": status} - - -def make_error_resp(status, detail): - return Response( - data={ - 'status': status, - 'detail': detail - }, - status=status - ) - - -def view_safe_call_with_log(logger): - def view_safe_call(func): - def wrapper(*args, **kwargs): - try: - return func(*args, **kwargs) - except NsdmDuplicateSubscriptionException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_303_SEE_OTHER - ) - except VnfPkgDuplicateSubscriptionException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_303_SEE_OTHER - ) - except PackageNotFoundException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_404_NOT_FOUND - ) - except ResourceNotFoundException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_404_NOT_FOUND - ) - except ArtifactNotFoundException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_404_NOT_FOUND - ) - except BadRequestException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_400_BAD_REQUEST - ) - except NsdmBadRequestException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_400_BAD_REQUEST - ) - except VnfPkgSubscriptionException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_500_INTERNAL_SERVER_ERROR - ) - except GenericparserException as e: - logger.error(e.args[0]) - return make_error_resp( - detail=e.args[0], - status=status.HTTP_500_INTERNAL_SERVER_ERROR - ) - except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - return make_error_resp( - detail='Unexpected exception', - status=status.HTTP_500_INTERNAL_SERVER_ERROR - ) - return wrapper - return view_safe_call diff --git a/genericparser/packages/views/health_check_views.py b/genericparser/packages/views/health_check_views.py deleted file mode 100644 index cc1a379..0000000 --- a/genericparser/packages/views/health_check_views.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (c) 2019, CMCC Technologies Co., Ltd. - -# 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 logging - -from drf_yasg.utils import swagger_auto_schema -from rest_framework import status -from rest_framework.response import Response -from rest_framework.views import APIView - -logger = logging.getLogger(__name__) - - -class HealthCheckView(APIView): - @swagger_auto_schema( - responses={ - status.HTTP_200_OK: 'Active'}) - def get(self, request, format=None): - logger.debug("Health check.") - return Response({"status": "active"}) diff --git a/genericparser/packages/views/ns_descriptor_views.py b/genericparser/packages/views/ns_descriptor_views.py deleted file mode 100644 index bbe51ea..0000000 --- a/genericparser/packages/views/ns_descriptor_views.py +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright 2018 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 logging - -from django.http import StreamingHttpResponse -from drf_yasg.utils import no_body, swagger_auto_schema -from rest_framework import status -from rest_framework.decorators import api_view -from rest_framework.response import Response - -from genericparser.packages.biz.ns_descriptor import NsDescriptor -from genericparser.packages.serializers.create_nsd_info_request import CreateNsdInfoRequestSerializer -from genericparser.packages.serializers.nsd_info import NsdInfoSerializer -from genericparser.packages.serializers.nsd_infos import NsdInfosSerializer -from genericparser.packages.views.common import validate_data -from genericparser.pub.exceptions import GenericparserException -from .common import view_safe_call_with_log - -logger = logging.getLogger(__name__) - - -@swagger_auto_schema( - method='GET', - operation_description="Query a NSD", - request_body=no_body, - responses={ - status.HTTP_200_OK: NsdInfoSerializer(), - status.HTTP_404_NOT_FOUND: 'NSDs do not exist', - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@swagger_auto_schema( - method='DELETE', - operation_description="Delete a NSD", - request_body=no_body, - responses={ - status.HTTP_204_NO_CONTENT: "No content", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@api_view(http_method_names=['GET', 'DELETE']) -@view_safe_call_with_log(logger=logger) -def ns_info_rd(request, **kwargs): - nsd_info_id = kwargs.get("nsdInfoId") - if request.method == 'GET': - data = NsDescriptor().query_single(nsd_info_id) - nsd_info = validate_data(data, NsdInfoSerializer) - return Response(data=nsd_info.data, status=status.HTTP_200_OK) - if request.method == 'DELETE': - NsDescriptor().delete_single(nsd_info_id) - return Response(status=status.HTTP_204_NO_CONTENT) - - -@swagger_auto_schema( - method='POST', - operation_description="Create a NSD", - request_body=CreateNsdInfoRequestSerializer(), - responses={ - status.HTTP_201_CREATED: NsdInfoSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@swagger_auto_schema( - method='GET', - operation_description="Query multiple NSDs", - request_body=no_body, - responses={ - status.HTTP_200_OK: NsdInfosSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@api_view(http_method_names=['POST', 'GET']) -@view_safe_call_with_log(logger=logger) -def ns_descriptors_rc(request): - if request.method == 'POST': - create_nsd_info_request = validate_data(request.data, CreateNsdInfoRequestSerializer) - data = NsDescriptor().create(create_nsd_info_request.data) - nsd_info = validate_data(data, NsdInfoSerializer) - return Response(data=nsd_info.data, status=status.HTTP_201_CREATED) - - if request.method == 'GET': - nsdId = request.query_params.get("nsdId", None) - data = NsDescriptor().query_multiple(nsdId) - nsd_infos = validate_data(data, NsdInfosSerializer) - return Response(data=nsd_infos.data, status=status.HTTP_200_OK) - - -@swagger_auto_schema( - method='PUT', - operation_description="Upload NSD content", - request_body=no_body, - responses={ - status.HTTP_204_NO_CONTENT: 'PNFD file', - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@swagger_auto_schema( - method='GET', - operation_description="Download NSD content", - request_body=no_body, - responses={ - status.HTTP_204_NO_CONTENT: "No content", - status.HTTP_404_NOT_FOUND: 'NSD does not exist.', - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@api_view(http_method_names=['PUT', 'GET']) -@view_safe_call_with_log(logger=logger) -def nsd_content_ru(request, **kwargs): - nsd_info_id = kwargs.get("nsdInfoId") - if request.method == 'PUT': - files = request.FILES.getlist('file') - try: - local_file_name = NsDescriptor().upload(nsd_info_id, files[0]) - NsDescriptor().parse_nsd_and_save(nsd_info_id, local_file_name) - return Response(data=None, status=status.HTTP_204_NO_CONTENT) - except GenericparserException as e: - NsDescriptor().handle_upload_failed(nsd_info_id) - raise e - except Exception as e: - NsDescriptor().handle_upload_failed(nsd_info_id) - raise e - - if request.method == 'GET': - 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 deleted file mode 100644 index e0576c3..0000000 --- a/genericparser/packages/views/nsdm_subscription_views.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 logging - -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 -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__) - - -def validate_data(data, serializer): - serialized_data = serializer(data=data) - if not serialized_data.is_valid(): - logger.error('Data validation failed.') - raise NsdmBadRequestException(serialized_data.errors) - return serialized_data - - -@swagger_auto_schema( - method='POST', - operation_description="Create Subscription for NSD Management", - request_body=NsdmSubscriptionRequestSerializer(), - responses={ - status.HTTP_201_CREATED: NsdmSubscriptionSerializer, - status.HTTP_303_SEE_OTHER: ProblemDetailsSerializer(), - status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@swagger_auto_schema( - method='GET', - operation_description="Query subscriptions for Nsd Management", - request_body=no_body, - responses={ - status.HTTP_200_OK: NsdmSubscriptionsSerializer(), - status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(), - status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer(), - } -) -@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) - nsdm_subscription_request = \ - validate_data(request.data, - NsdmSubscriptionRequestSerializer) - subscription = NsdmSubscription().create( - nsdm_subscription_request.data) - validate_data(subscription, NsdmSubscriptionSerializer) - return Response(data=subscription, status=status.HTTP_201_CREATED) - - if request.method == 'GET': - logger.debug("Subscription Notification GET %s" % request.query_params) - 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( - method='GET', - operation_description="Query subscriptions for Nsd Management", - request_body=no_body, - responses={ - status.HTTP_200_OK: NsdmSubscriptionSerializer(), - status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(), - status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@swagger_auto_schema( - method='DELETE', - operation_description="Delete subscription for Nsd Management", - request_body=no_body, - responses={ - status.HTTP_204_NO_CONTENT: 'No_Content', - status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(), - status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@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': - 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': - 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 deleted file mode 100644 index 7abd8ad..0000000 --- a/genericparser/packages/views/pnf_descriptor_views.py +++ /dev/null @@ -1,166 +0,0 @@ -# Copyright 2018 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 logging - -from django.http import StreamingHttpResponse -from drf_yasg.utils import no_body, swagger_auto_schema -from rest_framework import status -from rest_framework.decorators import api_view -from rest_framework.response import Response - -from genericparser.packages.biz.pnf_descriptor import PnfDescriptor -from genericparser.packages.serializers.create_pnfd_info_request import CreatePnfdInfoRequestSerializer -from genericparser.packages.serializers.pnfd_info import PnfdInfoSerializer -from genericparser.packages.serializers.pnfd_infos import PnfdInfosSerializer -from genericparser.packages.views.common import validate_data -from genericparser.packages.serializers.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 - -logger = logging.getLogger(__name__) - - -@swagger_auto_schema( - method='GET', - operation_description="Query a PNFD", - request_body=no_body, - responses={ - status.HTTP_200_OK: PnfdInfoSerializer(), - status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@swagger_auto_schema( - method='DELETE', - operation_description="Delete a PNFD", - request_body=no_body, - responses={ - status.HTTP_204_NO_CONTENT: "No content", - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@api_view(http_method_names=['GET', 'DELETE']) -@view_safe_call_with_log(logger=logger) -def pnfd_info_rd(request, **kwargs): # TODO - pnfd_info_id = kwargs.get('pnfdInfoId') - if request.method == 'GET': - logger.debug("Query an individual PNF descriptor> %s" % request.data) - data = PnfDescriptor().query_single(pnfd_info_id) - pnfd_info = validate_data(data, PnfdInfoSerializer) - return Response(data=pnfd_info.data, status=status.HTTP_200_OK) - - if request.method == 'DELETE': - logger.debug("Delete an individual PNFD resource> %s" % request.data) - PnfDescriptor().delete_single(pnfd_info_id) - return Response(data=None, status=status.HTTP_204_NO_CONTENT) - - -@swagger_auto_schema( - method='POST', - operation_description="Create a PNFD", - request_body=CreatePnfdInfoRequestSerializer(), - responses={ - status.HTTP_201_CREATED: PnfdInfoSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@swagger_auto_schema( - method='GET', - operation_description="Query multiple PNFDs", - request_body=no_body, - responses={ - status.HTTP_200_OK: PnfdInfosSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@api_view(http_method_names=['POST', 'GET']) -@view_safe_call_with_log(logger=logger) -def pnf_descriptors_rc(request): - if request.method == 'POST': - create_pnfd_info_request = validate_data(request.data, CreatePnfdInfoRequestSerializer) - data = PnfDescriptor().create(create_pnfd_info_request.data) - pnfd_info = validate_data(data, PnfdInfoSerializer) - return Response(data=pnfd_info.data, status=status.HTTP_201_CREATED) - - if request.method == 'GET': - data = PnfDescriptor().query_multiple(request) - pnfd_infos = validate_data(data, PnfdInfosSerializer) - return Response(data=pnfd_infos.data, status=status.HTTP_200_OK) - - -@swagger_auto_schema( - method='PUT', - operation_description="Upload PNFD content", - request_body=no_body, - responses={ - status.HTTP_204_NO_CONTENT: "No content", - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@swagger_auto_schema( - method='GET', - operation_description="Fetch PNFD content", - request_body=no_body, - responses={ - status.HTTP_204_NO_CONTENT: 'PNFD file', - status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } -) -@api_view(http_method_names=['PUT', 'GET']) -@view_safe_call_with_log(logger=logger) -def pnfd_content_ru(request, **kwargs): - pnfd_info_id = kwargs.get("pnfdInfoId") - if request.method == 'PUT': - files = request.FILES.getlist('file') - try: - 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 Exception as e: - PnfDescriptor().handle_upload_failed(pnfd_info_id) - raise e - - if request.method == 'GET': - file_iterator = PnfDescriptor().download(pnfd_info_id) - return StreamingHttpResponse(file_iterator, status=status.HTTP_200_OK) - - -@swagger_auto_schema( - method='POST', - operation_description="Parse PNF model", - request_body=ParseModelRequestSerializer, - responses={ - status.HTTP_202_ACCEPTED: ParseModelResponseSerializer, - status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer}) -@api_view(http_method_names=['POST']) -def pnf_model_parser(request, *args, **kwargs): - csar_id = ignore_case_get(request.data, "csarId") - inputs = ignore_case_get(request.data, "inputs") - logger.debug( - "Enter %s, csar_id=%s, inputs=%s", - fun_name(), - csar_id, - inputs) - ret = PnfDescriptor().parse_pnfd(csar_id, inputs) - logger.info("Leave %s, Return value is %s", fun_name(), ret) - if ret[0] != 0: - return Response(data={'error': ret[1]}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) - response = validate_data(ret[1], ParseModelResponseSerializer) - return Response(data=response.data, status=status.HTTP_202_ACCEPTED) diff --git a/genericparser/packages/views/vnf_package_artifact_views.py b/genericparser/packages/views/vnf_package_artifact_views.py deleted file mode 100644 index 164db6c..0000000 --- a/genericparser/packages/views/vnf_package_artifact_views.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 logging - -from drf_yasg.utils import swagger_auto_schema -from rest_framework import status -from rest_framework.views import APIView -from django.http import FileResponse - -from genericparser.packages.serializers.response import ProblemDetailsSerializer -from genericparser.packages.biz.vnf_pkg_artifacts import FetchVnfPkgArtifact -from .common import view_safe_call_with_log - -logger = logging.getLogger(__name__) - -VALID_FILTERS = [ - "callbackUri", - "notificationTypes", - "vnfdId", - "vnfPkgId", - "operationalState", - "usageState" -] - - -class FetchVnfPkgmArtifactsView(APIView): - - @swagger_auto_schema( - responses={ - status.HTTP_200_OK: "HTTP_200_OK", - status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } - ) - @view_safe_call_with_log(logger=logger) - def get(self, request, vnfPkgId, artifactPath): - logger.debug("FetchVnfPkgmArtifactsView--get::> ") - - resp_data = FetchVnfPkgArtifact().fetch(vnfPkgId, artifactPath) - response = FileResponse(resp_data) - - return response diff --git a/genericparser/packages/views/vnf_package_subscription_views.py b/genericparser/packages/views/vnf_package_subscription_views.py deleted file mode 100644 index 135b625..0000000 --- a/genericparser/packages/views/vnf_package_subscription_views.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (C) 2019 Verizon. All Rights Reserved -# -# 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 logging - -from drf_yasg.utils import swagger_auto_schema -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 -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 -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 VnfPkgSubscriptionException -from genericparser.pub.exceptions import BadRequestException - -from .common import view_safe_call_with_log - -logger = logging.getLogger(__name__) - -VALID_FILTERS = [ - "callbackUri", - "notificationTypes", - "vnfdId", - "vnfPkgId", - "operationalState", - "usageState" -] - - -class CreateQuerySubscriptionView(APIView): - - @swagger_auto_schema( - request_body=PkgmSubscriptionRequestSerializer, - responses={ - status.HTTP_201_CREATED: PkgmSubscriptionSerializer(), - 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) - - 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={ - status.HTTP_200_OK: PkgmSubscriptionSerializer(), - status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } - ) - @view_safe_call_with_log(logger=logger) - def get(self, request): - logger.debug("SubscribeNotification--get::> %s" % request.query_params) - - 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) - - subscriptions_serializer = PkgmSubscriptionsSerializer(data=resp_data) - if not subscriptions_serializer.is_valid(): - raise VnfPkgSubscriptionException(subscriptions_serializer.errors) - - return Response(data=subscriptions_serializer.data, status=status.HTTP_200_OK) - - -class QueryTerminateSubscriptionView(APIView): - - @swagger_auto_schema( - responses={ - status.HTTP_200_OK: PkgmSubscriptionSerializer(), - status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } - ) - @view_safe_call_with_log(logger=logger) - def get(self, request, subscriptionId): - logger.debug("SubscribeNotification--get::> %s" % subscriptionId) - - 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={ - status.HTTP_204_NO_CONTENT: "", - status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() - } - ) - @view_safe_call_with_log(logger=logger) - def delete(self, request, subscriptionId): - logger.debug("SubscribeNotification--get::> %s" % subscriptionId) - - 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 deleted file mode 100644 index bfb1224..0000000 --- a/genericparser/packages/views/vnf_package_views.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright 2018 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 logging - -from django.http import StreamingHttpResponse -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.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 -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__) - - -@swagger_auto_schema( - method="GET", - operation_description="Query multiple VNF package resource", - request_body=no_body, - responses={ - status.HTTP_200_OK: VnfPkgInfosSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@swagger_auto_schema( - method="POST", - operation_description="Create an individual VNF package resource", - request_body=CreateVnfPkgInfoRequestSerializer, - responses={ - status.HTTP_201_CREATED: VnfPkgInfoSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@api_view(http_method_names=["GET", "POST"]) -@view_safe_call_with_log(logger=logger) -def vnf_packages_rc(request): - if request.method == 'GET': - logger.debug("Query VNF packages> %s" % request.data) - data = VnfPackage().query_multiple() - vnf_pkg_infos = validate_data(data, VnfPkgInfosSerializer) - return Response(data=vnf_pkg_infos.data, status=status.HTTP_200_OK) - - if request.method == 'POST': - logger.debug("Create VNF package> %s" % request.data) - 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) - - -@swagger_auto_schema( - method='PUT', - operation_description="Upload VNF package content", - request_body=no_body, - responses={ - status.HTTP_202_ACCEPTED: "Successfully", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@swagger_auto_schema( - method="GET", - operation_description="Fetch VNF package content", - request_body=no_body, - responses={ - status.HTTP_200_OK: VnfPkgInfosSerializer(), - status.HTTP_404_NOT_FOUND: "VNF package does not exist", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@api_view(http_method_names=["PUT", "GET"]) -@view_safe_call_with_log(logger=logger) -def package_content_ru(request, **kwargs): - vnf_pkg_id = kwargs.get("vnfPkgId") - if request.method == "PUT": - logger.debug("Upload VNF package %s" % vnf_pkg_id) - files = request.FILES.getlist('file') - try: - 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 Exception as e: - handle_upload_failed(vnf_pkg_id) - raise e - - if request.method == "GET": - 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) - - -@swagger_auto_schema( - method='POST', - operation_description="Upload VNF package content from uri", - request_body=UploadVnfPackageFromUriRequestSerializer, - responses={ - status.HTTP_202_ACCEPTED: "Successfully", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@api_view(http_method_names=['POST']) -@view_safe_call_with_log(logger=logger) -def upload_from_uri_c(request, **kwargs): - vnf_pkg_id = kwargs.get("vnfPkgId") - try: - 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 Exception as e: - handle_upload_failed(vnf_pkg_id) - raise e - - -@swagger_auto_schema( - method='GET', - operation_description="Query an individual VNF package resource", - request_body=no_body, - responses={ - status.HTTP_200_OK: VnfPkgInfoSerializer(), - status.HTTP_404_NOT_FOUND: "VNF package does not exist", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@swagger_auto_schema( - method='DELETE', - operation_description="Delete an individual VNF package resource", - request_body=no_body, - responses={ - status.HTTP_204_NO_CONTENT: "No content", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" - } -) -@api_view(http_method_names=['GET', 'DELETE']) -@view_safe_call_with_log(logger=logger) -def vnf_package_rd(request, **kwargs): - vnf_pkg_id = kwargs.get("vnfPkgId") - if request.method == 'GET': - logger.debug("Query an individual VNF package> %s" % request.data) - data = VnfPackage().query_single(vnf_pkg_id) - vnf_pkg_info = validate_data(data, VnfPkgInfoSerializer) - return Response(data=vnf_pkg_info.data, status=status.HTTP_200_OK) - - if request.method == 'DELETE': - logger.debug("Delete an individual VNF package> %s" % request.data) - VnfPackage().delete_vnf_pkg(vnf_pkg_id) - return Response(data=None, status=status.HTTP_204_NO_CONTENT) -- cgit 1.2.3-korg