From 24ea7e1390912ba99304085c249e17dce46b047a Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Wed, 27 Nov 2019 17:02:47 +0800 Subject: [PATCH] Swagger issue fixes from the Ericsson team Change-Id: Ia7fa9f7b72a234b627f5d3ffda544ddc116cf5ef Issue-ID: MODELING-288 Signed-off-by: hongyuzhao --- catalog/packages/biz/vnf_package.py | 15 +++++--- catalog/packages/tests/test_vnf_package.py | 17 ++++++++- catalog/packages/views/common.py | 8 ++++ .../packages/views/vnf_package_artifact_views.py | 11 ++++-- catalog/packages/views/vnf_package_views.py | 44 ++++++++++++++-------- 5 files changed, 69 insertions(+), 26 deletions(-) diff --git a/catalog/packages/biz/vnf_package.py b/catalog/packages/biz/vnf_package.py index 5a51e9a..c68de63 100644 --- a/catalog/packages/biz/vnf_package.py +++ b/catalog/packages/biz/vnf_package.py @@ -15,7 +15,7 @@ import json import logging import os -import sys + import threading import traceback import urllib @@ -192,16 +192,21 @@ class VnfPkgUploadThread(threading.Thread): self.data = data self.upload_file_name = None + def vnf_pkg_upload_failed_handle(self, error_msg): + logger.error(error_msg) + logger.error(traceback.format_exc()) + vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=self.vnf_pkg_id) + if vnf_pkg and vnf_pkg[0].onboardingState == const.PKG_STATUS.UPLOADING: + vnf_pkg.update(onboardingState=const.PKG_STATUS.CREATED) + def run(self): try: self.upload_vnf_pkg_from_uri() parse_vnfd_and_save(self.vnf_pkg_id, self.upload_file_name) except CatalogException as e: - logger.error(e.args[0]) + self.vnf_pkg_upload_failed_handle(e.args[0]) except Exception as e: - logger.error(e.args[0]) - logger.error(traceback.format_exc()) - logger.error(str(sys.exc_info())) + self.vnf_pkg_upload_failed_handle(e.args[0]) def upload_vnf_pkg_from_uri(self): logger.info("Start to upload VNF packge(%s) from URI..." % self.vnf_pkg_id) diff --git a/catalog/packages/tests/test_vnf_package.py b/catalog/packages/tests/test_vnf_package.py index c0d6637..246635b 100644 --- a/catalog/packages/tests/test_vnf_package.py +++ b/catalog/packages/tests/test_vnf_package.py @@ -87,10 +87,23 @@ class TestVnfPackage(TestCase): vnf_pkg1 = VnfPackageModel.objects.filter(vnfPackageId="222") self.assertEqual("zte-hss-1.0", vnf_pkg1[0].vnfdId) - def test_upload_from_uri_failed(self): + def test_upload_from_uri_bad_req(self): req_data = {"username": "123"} response = self.client.post("%s/111/package_content/upload_from_uri" % VNF_BASE_URL, data=req_data) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + + @mock.patch.object(urllib.request, 'urlopen') + def test_upload_from_uri_failed(self, mock_urlopen): + vnf_pkg = VnfPackageModel.objects.create( + vnfPackageId="333", + onboardingState="CREATED" + ) + req_data = {"addressInformation": "error"} + mock_urlopen.return_value = Exception('Boom!') + vnf_pkg_id = vnf_pkg.vnfPackageId + VnfPkgUploadThread(req_data, vnf_pkg_id).run() + vnf_pkg1 = VnfPackageModel.objects.filter(vnfPackageId="333") + self.assertEqual("CREATED", vnf_pkg1[0].onboardingState) def test_create_vnf_pkg(self): req_data = { diff --git a/catalog/packages/views/common.py b/catalog/packages/views/common.py index 6285cb9..c074faf 100644 --- a/catalog/packages/views/common.py +++ b/catalog/packages/views/common.py @@ -39,6 +39,14 @@ def validate_data(data, serializer): return serialized_data +def validate_req_data(data, serializer): + serialized_data = serializer(data=data) + if not serialized_data.is_valid(): + logger.error('Data validation failed.') + raise BadRequestException(serialized_data.errors) + return serialized_data + + def fmt_error_rsp(error_message, status): return {"errorMessage": error_message, "error": status} diff --git a/catalog/packages/views/vnf_package_artifact_views.py b/catalog/packages/views/vnf_package_artifact_views.py index 9dd9b57..56f3f2f 100644 --- a/catalog/packages/views/vnf_package_artifact_views.py +++ b/catalog/packages/views/vnf_package_artifact_views.py @@ -16,6 +16,7 @@ import logging from django.http import FileResponse from drf_yasg.utils import swagger_auto_schema +from drf_yasg import openapi from rest_framework import status from rest_framework.views import APIView @@ -40,9 +41,13 @@ class FetchVnfPkgmArtifactsView(APIView): @swagger_auto_schema( tags=[TAG_VNF_PACKAGE_API], responses={ - status.HTTP_200_OK: "Return the artifact file", - status.HTTP_404_NOT_FOUND: "Artifact not found", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + status.HTTP_200_OK: openapi.Response("Return the artifact file", + schema=openapi.Schema(format=openapi.FORMAT_BINARY, + type=openapi.TYPE_STRING)), + status.HTTP_404_NOT_FOUND: openapi.Response("Artifact not found", + schema=openapi.Schema(type=openapi.TYPE_STRING)), + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + schema=openapi.Schema(type=openapi.TYPE_STRING)) } ) @view_safe_call_with_log(logger=logger) diff --git a/catalog/packages/views/vnf_package_views.py b/catalog/packages/views/vnf_package_views.py index 5fca931..2156e7b 100644 --- a/catalog/packages/views/vnf_package_views.py +++ b/catalog/packages/views/vnf_package_views.py @@ -30,7 +30,7 @@ from catalog.packages.serializers.create_vnf_pkg_info_req import CreateVnfPkgInf from catalog.packages.serializers.upload_vnf_pkg_from_uri_req import UploadVnfPackageFromUriRequestSerializer from catalog.packages.serializers.vnf_pkg_info import VnfPkgInfoSerializer from catalog.packages.serializers.vnf_pkg_infos import VnfPkgInfosSerializer -from .common import validate_data +from .common import validate_data, validate_req_data from .common import view_safe_call_with_log logger = logging.getLogger(__name__) @@ -43,7 +43,8 @@ logger = logging.getLogger(__name__) request_body=no_body, responses={ status.HTTP_200_OK: VnfPkgInfosSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + openapi.Schema(type=openapi.TYPE_STRING)) } ) @swagger_auto_schema( @@ -53,7 +54,9 @@ logger = logging.getLogger(__name__) request_body=CreateVnfPkgInfoRequestSerializer, responses={ status.HTTP_201_CREATED: VnfPkgInfoSerializer(), - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + status.HTTP_400_BAD_REQUEST: openapi.Response("Bad Request", schema=openapi.Schema(type=openapi.TYPE_STRING)), + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + schema=openapi.Schema(type=openapi.TYPE_STRING)) } ) @api_view(http_method_names=["GET", "POST"]) @@ -67,8 +70,7 @@ def vnf_packages_rc(request): if request.method == 'POST': logger.debug("Create VNF package> %s" % request.data) - create_vnf_pkg_info_request = validate_data(request.data, - CreateVnfPkgInfoRequestSerializer) + create_vnf_pkg_info_request = validate_req_data(request.data, CreateVnfPkgInfoRequestSerializer) data = VnfPackage().create_vnf_pkg(create_vnf_pkg_info_request.data) validate_data(data, VnfPkgInfoSerializer) return Response(data=data, status=status.HTTP_201_CREATED) @@ -83,8 +85,10 @@ def vnf_packages_rc(request): status.HTTP_200_OK: openapi.Response('VNFD of an on-boarded VNF package', schema=openapi.Schema(format=openapi.FORMAT_BINARY, type=openapi.TYPE_STRING)), - status.HTTP_404_NOT_FOUND: "VNF package does not exist", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + status.HTTP_404_NOT_FOUND: openapi.Response("VNF package does not exist", + schema=openapi.Schema(type=openapi.TYPE_STRING)), + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + schema=openapi.Schema(type=openapi.TYPE_STRING)) }, produces='application/octet-stream', operation_id='VNFD of an on-boarded VNF package' @@ -109,7 +113,8 @@ def vnfd_rd(request, **kwargs): request_body=no_body, responses={ status.HTTP_202_ACCEPTED: "Successfully", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + schema=openapi.Schema(type=openapi.TYPE_STRING)) } ) @swagger_auto_schema( @@ -121,8 +126,10 @@ def vnfd_rd(request, **kwargs): status.HTTP_200_OK: openapi.Response('VNF package file', schema=openapi.Schema(format=openapi.FORMAT_BINARY, type=openapi.TYPE_STRING)), - status.HTTP_404_NOT_FOUND: "VNF package does not exist", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + status.HTTP_404_NOT_FOUND: openapi.Response("VNF package does not exist", + schema=openapi.Schema(type=openapi.TYPE_STRING)), + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + schema=openapi.Schema(type=openapi.TYPE_STRING)) } ) @api_view(http_method_names=["PUT", "GET"]) @@ -153,7 +160,9 @@ def package_content_ru(request, **kwargs): request_body=UploadVnfPackageFromUriRequestSerializer, responses={ status.HTTP_202_ACCEPTED: "Successfully", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + status.HTTP_400_BAD_REQUEST: openapi.Response("Bad Request", schema=openapi.Schema(type=openapi.TYPE_STRING)), + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + schema=openapi.Schema(type=openapi.TYPE_STRING)) } ) @api_view(http_method_names=['POST']) @@ -161,8 +170,8 @@ def package_content_ru(request, **kwargs): def upload_from_uri_c(request, **kwargs): vnf_pkg_id = kwargs.get("vnfPkgId") try: - upload_vnf_from_uri_request = validate_data(request.data, - UploadVnfPackageFromUriRequestSerializer) + upload_vnf_from_uri_request = validate_req_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: @@ -177,8 +186,10 @@ def upload_from_uri_c(request, **kwargs): 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" + status.HTTP_404_NOT_FOUND: openapi.Response("VNF package does not exist", + schema=openapi.Schema(type=openapi.TYPE_STRING)), + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + schema=openapi.Schema(type=openapi.TYPE_STRING)) } ) @swagger_auto_schema( @@ -188,7 +199,8 @@ def upload_from_uri_c(request, **kwargs): request_body=no_body, responses={ status.HTTP_204_NO_CONTENT: "No content", - status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal error" + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response("Internal error", + schema=openapi.Schema(type=openapi.TYPE_STRING)) } ) @api_view(http_method_names=['GET', 'DELETE']) -- 2.16.6