From b16b4579ea80bf82fa497e4934b2bb8728845b58 Mon Sep 17 00:00:00 2001 From: dyh Date: Thu, 23 Dec 2021 10:29:51 +0800 Subject: [PATCH] Add log and comment Change-Id: I4c9c253e1ec5a8ade614ceefc4a31c48003a7c5b Issue-ID: MODELING-583 Signed-off-by: dyh --- catalog/packages/biz/sdc_ns_package.py | 5 ++ catalog/packages/const.py | 2 + catalog/packages/views/health_check_views.py | 4 ++ catalog/packages/views/ns_descriptor_views.py | 6 ++ catalog/packages/views/nsdm_subscription_views.py | 10 ++++ .../packages/views/vnf_package_artifact_views.py | 7 +++ .../views/vnf_package_subscription_views.py | 40 +++++++++++++ catalog/packages/views/vnf_package_views.py | 18 ++++++ catalog/pub/utils/fileutil.py | 65 ++++++++++++++++++++++ 9 files changed, 157 insertions(+) diff --git a/catalog/packages/biz/sdc_ns_package.py b/catalog/packages/biz/sdc_ns_package.py index 4f817a3..72d41b1 100644 --- a/catalog/packages/biz/sdc_ns_package.py +++ b/catalog/packages/biz/sdc_ns_package.py @@ -141,6 +141,11 @@ class NsPackage(object): pass def on_distribute(self, csar_id): + """ + Fetch NS package csar from SDC + :param csar_id: + :return: + """ if NSPackageModel.objects.filter(nsPackageId=csar_id): return [1, "NS CSAR(%s) already exists." % csar_id] diff --git a/catalog/packages/const.py b/catalog/packages/const.py index cc7dd2d..a2e20a2 100644 --- a/catalog/packages/const.py +++ b/catalog/packages/const.py @@ -25,6 +25,7 @@ PKG_STATUS = enum( DISABLED="DISABLED" ) +# CREDENTIALS AUTH_TYPES = [ "BASIC", "OAUTH2_CLIENT_CREDENTIALS", @@ -35,6 +36,7 @@ BASIC = "BASIC" OAUTH2_CLIENT_CREDENTIALS = "OAUTH2_CLIENT_CREDENTIALS" +# subscription & notification NOTIFICATION_TYPES = [ "VnfPackageOnboardingNotification", "VnfPackageChangeNotification" diff --git a/catalog/packages/views/health_check_views.py b/catalog/packages/views/health_check_views.py index fc5c25e..a8cea2e 100644 --- a/catalog/packages/views/health_check_views.py +++ b/catalog/packages/views/health_check_views.py @@ -25,6 +25,10 @@ logger = logging.getLogger(__name__) class HealthCheckView(APIView): + """ + APL Health Check + """ + @swagger_auto_schema( tags=[TAG_HEALTH_CHECK], responses={ diff --git a/catalog/packages/views/ns_descriptor_views.py b/catalog/packages/views/ns_descriptor_views.py index 44e06e4..aaba6fd 100644 --- a/catalog/packages/views/ns_descriptor_views.py +++ b/catalog/packages/views/ns_descriptor_views.py @@ -58,10 +58,12 @@ logger = logging.getLogger(__name__) def ns_info_rd(request, **kwargs): nsd_info_id = kwargs.get("nsdInfoId") if request.method == 'GET': + # Read information about an individual NS descriptor resource. 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': + # Delete an individual NS descriptor resource. NsDescriptor().delete_single(nsd_info_id) return Response(status=status.HTTP_204_NO_CONTENT) @@ -90,12 +92,14 @@ def ns_info_rd(request, **kwargs): @view_safe_call_with_log(logger=logger) def ns_descriptors_rc(request): if request.method == 'POST': + # Create a new NS descriptor resource. create_nsd_info_request = validate_data(request.data, CreateNsdInfoRequestSerializer) data = NsDescriptor().create(create_nsd_info_request.data) validate_data(data, NsdInfoSerializer) return Response(data=data, status=status.HTTP_201_CREATED) if request.method == 'GET': + # Query information about multiple NS descriptor resources. nsdId = request.query_params.get("nsdId", None) data = NsDescriptor().query_multiple(nsdId) validate_data(data, NsdInfosSerializer) @@ -128,6 +132,7 @@ def ns_descriptors_rc(request): def nsd_content_ru(request, **kwargs): nsd_info_id = kwargs.get("nsdInfoId") if request.method == 'PUT': + # Upload the content of a NSD. files = request.FILES.getlist('file') try: local_file_name = NsDescriptor().upload(nsd_info_id, files[0]) @@ -141,6 +146,7 @@ def nsd_content_ru(request, **kwargs): raise e if request.method == 'GET': + # Fetch the content of a NSD. 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/catalog/packages/views/nsdm_subscription_views.py b/catalog/packages/views/nsdm_subscription_views.py index 7e1b2f5..e368466 100644 --- a/catalog/packages/views/nsdm_subscription_views.py +++ b/catalog/packages/views/nsdm_subscription_views.py @@ -69,6 +69,7 @@ def validate_data(data, serializer): @view_safe_call_with_log(logger=logger) def nsd_subscription_rc(request): if request.method == 'POST': + # Subscribe to NSD and PNFD change notifications. logger.debug("SubscribeNotification--post::> %s" % request.data) nsdm_subscription_request = \ validate_data(request.data, @@ -79,6 +80,7 @@ def nsd_subscription_rc(request): return Response(data=subscription, status=status.HTTP_201_CREATED) if request.method == 'GET': + # Query multiple subscriptions. logger.debug("Subscription Notification GET %s" % request.query_params) request_query_params = {} if request.query_params: @@ -120,12 +122,20 @@ def nsd_subscription_rc(request): @api_view(http_method_names=['GET', 'DELETE']) @view_safe_call_with_log(logger=logger) def nsd_subscription_rd(request, **kwargs): + """ + Individual subscription + :param request: + :param kwargs: + :return: + """ subscription_id = kwargs.get("subscriptionId") validate_data({'subscription_id': subscription_id}, NsdmSubscriptionIdSerializer) if request.method == 'GET': + # Read an individual subscription resource 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': + # Terminate a subscription subscription_data = NsdmSubscription().delete_single_subscription(subscription_id) return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/catalog/packages/views/vnf_package_artifact_views.py b/catalog/packages/views/vnf_package_artifact_views.py index dde7585..bda3561 100644 --- a/catalog/packages/views/vnf_package_artifact_views.py +++ b/catalog/packages/views/vnf_package_artifact_views.py @@ -54,6 +54,13 @@ class FetchVnfPkgmArtifactsView(APIView): ) @view_safe_call_with_log(logger=logger) def get(self, request, vnfPkgId, artifactPath): + """ + Fetch artifact from vnf package + :param request: + :param vnfPkgId: + :param artifactPath: + :return: + """ logger.debug("FetchVnfPkgmArtifactsView--get::> ") resp_data = FetchVnfPkgArtifact().fetch(vnfPkgId, artifactPath) diff --git a/catalog/packages/views/vnf_package_subscription_views.py b/catalog/packages/views/vnf_package_subscription_views.py index 6698429..b06ad4e 100644 --- a/catalog/packages/views/vnf_package_subscription_views.py +++ b/catalog/packages/views/vnf_package_subscription_views.py @@ -47,6 +47,11 @@ VALID_FILTERS = [ class CreateQuerySubscriptionView(APIView): + """ + This resource represents subscriptions. + The client can use this resource to subscribe to notifications related to NS lifecycle management, + and to query its subscriptions. + """ @swagger_auto_schema( tags=[TAG_VNF_PACKAGE_API], @@ -59,6 +64,11 @@ class CreateQuerySubscriptionView(APIView): ) @view_safe_call_with_log(logger=logger) def post(self, request): + """ + The POST method creates a new subscription + :param request: + :return: + """ logger.debug("Create VNF package Subscription> %s" % request.data) vnf_pkg_subscription_request = validate_req_data(request.data, PkgmSubscriptionRequestSerializer) data = CreateSubscription(vnf_pkg_subscription_request.data).do_biz() @@ -75,6 +85,12 @@ class CreateQuerySubscriptionView(APIView): ) @view_safe_call_with_log(logger=logger) def get(self, request): + """ + The GET method queries the list of active subscriptions of the functional block that invokes the method. + It can be used e.g. for resynchronization after error situations. + :param request: + :return: + """ logger.debug("SubscribeNotification--get::> %s" % request.query_params) if request.query_params and not set(request.query_params).issubset(set(VALID_FILTERS)): @@ -90,6 +106,10 @@ class CreateQuerySubscriptionView(APIView): class QueryTerminateSubscriptionView(APIView): + """ + This resource represents an individual subscription. + It can be used by the client to read and to terminate a subscription to Notifications related to NS lifecycle management. + """ @swagger_auto_schema( tags=[TAG_VNF_PACKAGE_API], @@ -101,6 +121,12 @@ class QueryTerminateSubscriptionView(APIView): ) @view_safe_call_with_log(logger=logger) def get(self, request, subscriptionId): + """ + The GET method retrieves information about a subscription by reading an individual subscription resource. + :param request: + :param subscriptionId: + :return: + """ logger.debug("SubscribeNotification--get::> %s" % subscriptionId) resp_data = QuerySubscription().query_single_subscription(subscriptionId) @@ -121,6 +147,12 @@ class QueryTerminateSubscriptionView(APIView): ) @view_safe_call_with_log(logger=logger) def delete(self, request, subscriptionId): + """ + The DELETE method terminates an individual subscription. + :param request: + :param subscriptionId: + :return: + """ logger.debug("SubscribeNotification--get::> %s" % subscriptionId) TerminateSubscription().terminate(subscriptionId) @@ -128,6 +160,10 @@ class QueryTerminateSubscriptionView(APIView): class PkgOnboardingNotificationView(APIView): + """ + This resource represents a notification endpoint about package onboarding + """ + @swagger_auto_schema( tags=[TAG_VNF_PACKAGE_API], request_body=PkgOnboardingNotificationSerializer, @@ -150,6 +186,10 @@ class PkgOnboardingNotificationView(APIView): class PkgChangeNotificationView(APIView): + """ + This resource represents a notification endpoint about package change + """ + @swagger_auto_schema( tags=[TAG_VNF_PACKAGE_API], request_body=PkgChangeNotificationSerializer, diff --git a/catalog/packages/views/vnf_package_views.py b/catalog/packages/views/vnf_package_views.py index 6ff4f9f..088559a 100644 --- a/catalog/packages/views/vnf_package_views.py +++ b/catalog/packages/views/vnf_package_views.py @@ -64,12 +64,14 @@ logger = logging.getLogger(__name__) @view_safe_call_with_log(logger=logger) def vnf_packages_rc(request): if request.method == 'GET': + # Query VNF packages information logger.debug("Query VNF packages> %s" % request.data) data = VnfPackage().query_multiple() validate_data(data, VnfPkgInfosSerializer) return Response(data=data, status=status.HTTP_200_OK) if request.method == 'POST': + # Create a new individual VNF package resource logger.debug("Create VNF package> %s" % request.data) create_vnf_pkg_info_request = validate_req_data(request.data, CreateVnfPkgInfoRequestSerializer) data = VnfPackage().create_vnf_pkg(create_vnf_pkg_info_request.data) @@ -97,6 +99,12 @@ def vnf_packages_rc(request): @api_view(http_method_names=["GET"]) @view_safe_call_with_log(logger=logger) def vnfd_rd(request, **kwargs): + """ + Get the VNFD by VNF package id + :param request: + :param kwargs: + :return: + """ vnf_pkg_id = kwargs.get("vnfPkgId") logger.debug("Read VNFD for VNF package %s" % vnf_pkg_id) try: @@ -139,6 +147,7 @@ def vnfd_rd(request, **kwargs): def package_content_ru(request, **kwargs): vnf_pkg_id = kwargs.get("vnfPkgId") if request.method == "PUT": + # Upload a VNF package by providing the content of the VNF package logger.debug("Upload VNF package %s" % vnf_pkg_id) files = request.FILES.getlist('file') try: @@ -150,6 +159,7 @@ def package_content_ru(request, **kwargs): raise e if request.method == "GET": + # Fetch an on-boarded VNF package 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) @@ -170,6 +180,12 @@ def package_content_ru(request, **kwargs): @api_view(http_method_names=['POST']) @view_safe_call_with_log(logger=logger) def upload_from_uri_c(request, **kwargs): + """ + Upload a VNF package by providing the address information of the VNF package + :param request: + :param kwargs: + :return: + """ vnf_pkg_id = kwargs.get("vnfPkgId") try: upload_vnf_from_uri_request = validate_req_data(request.data, @@ -210,12 +226,14 @@ def upload_from_uri_c(request, **kwargs): def vnf_package_rd(request, **kwargs): vnf_pkg_id = kwargs.get("vnfPkgId") if request.method == 'GET': + # Read information about an individual VNF package logger.debug("Query an individual VNF package> %s" % request.data) data = VnfPackage().query_single(vnf_pkg_id) validate_data(data, VnfPkgInfoSerializer) return Response(data=data, status=status.HTTP_200_OK) if request.method == 'DELETE': + # Delete an individual VNF package 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) diff --git a/catalog/pub/utils/fileutil.py b/catalog/pub/utils/fileutil.py index e6eb6f2..ce2a0a3 100644 --- a/catalog/pub/utils/fileutil.py +++ b/catalog/pub/utils/fileutil.py @@ -23,11 +23,21 @@ logger = logging.getLogger(__name__) def make_dirs(path): + """ + Make directories + :param path: + :return: + """ if not os.path.exists(path): os.makedirs(path, 0o777) def delete_dirs(path): + """ + Delete directories + :param path: + :return: + """ try: if os.path.exists(path): shutil.rmtree(path) @@ -37,6 +47,13 @@ def delete_dirs(path): def download_file_from_http(url, local_dir, file_name): + """ + Download file from http and save to local dir + :param url: + :param local_dir: + :param file_name: + :return: + """ local_file_name = os.path.join(local_dir, file_name) is_download_ok = False try: @@ -54,6 +71,13 @@ def download_file_from_http(url, local_dir, file_name): def unzip_file(zip_src, dst_dir, csar_path): + """ + Unzip the zip file to given path + :param zip_src: + :param dst_dir: + :param csar_path: + :return: + """ logger.debug("unzip_file %s to %s.", zip_src, dst_dir) if os.path.exists(zip_src): logger.debug("unzip_file %s.", zip_src) @@ -66,6 +90,12 @@ def unzip_file(zip_src, dst_dir, csar_path): def unzip_csar(zip_src, dst_dir): + """ + Unzip csar package + :param zip_src: + :param dst_dir: + :return: + """ if os.path.exists(zip_src): fz = zipfile.ZipFile(zip_src, 'r') for file in fz.namelist(): @@ -77,6 +107,11 @@ def unzip_csar(zip_src, dst_dir): def unzip_csar_to_tmp(zip_src): + """ + Unzip csar package to temp path + :param zip_src: + :return: + """ dirpath = tempfile.mkdtemp() zip_ref = zipfile.ZipFile(zip_src, 'r') zip_ref.extractall(dirpath) @@ -84,6 +119,12 @@ def unzip_csar_to_tmp(zip_src): def get_artifact_path(vnf_path, artifact_file): + """ + Get the path of artifact file + :param vnf_path: + :param artifact_file: + :return: + """ for root, dirs, files in os.walk(vnf_path): if artifact_file in files: return os.path.join(root, artifact_file) @@ -91,6 +132,12 @@ def get_artifact_path(vnf_path, artifact_file): def end_with(_s_in, *suffix): + """ + Check if end with given suffix + :param _s_in: + :param suffix: + :return: + """ array = map(_s_in.endswith, suffix) if True in array: return True @@ -98,6 +145,12 @@ def end_with(_s_in, *suffix): def filter_files(search_path, suffix): + """ + Filter file by given suffix + :param search_path: + :param suffix: + :return: + """ f_find = [] file_list = os.listdir(search_path) for file_item in file_list: @@ -107,12 +160,24 @@ def filter_files(search_path, suffix): def recreate_dir(path): + """ + Recreate directory + :param path: + :return: + """ if os.path.exists(path): shutil.rmtree(path) os.makedirs(path, mode=0o777) def copy(src_file, dest_dir, new_file_name=None): + """ + Copy file to given dest dir + :param src_file: + :param dest_dir: + :param new_file_name: + :return: + """ if not os.path.exists(dest_dir): os.makedirs(dest_dir) if new_file_name is None: -- 2.16.6