From 646a175ead24421d1bf69e3646ed55520e800d01 Mon Sep 17 00:00:00 2001 From: Bharath Thiruveedula Date: Tue, 12 Mar 2019 12:25:07 +0530 Subject: Add VNFPKGM QueryAll Subscription API Add SOL005 VNFPKGM Queryall Subscriptions API Issue-ID: VFC-1222 Change-Id: I173b58e8ba68c2c79f87a1094e3209318d2deaae Signed-off-by: Bharath Thiruveedula --- catalog/packages/biz/vnf_pkg_subscription.py | 22 ++++++++++++- .../packages/tests/test_vnf_pkg_subscription.py | 29 ++++++++++++++++- catalog/packages/urls.py | 6 ++-- .../views/vnf_package_subscription_views.py | 37 +++++++++++++++++++--- 4 files changed, 86 insertions(+), 8 deletions(-) diff --git a/catalog/packages/biz/vnf_pkg_subscription.py b/catalog/packages/biz/vnf_pkg_subscription.py index 20bd68ed..e4772e5e 100755 --- a/catalog/packages/biz/vnf_pkg_subscription.py +++ b/catalog/packages/biz/vnf_pkg_subscription.py @@ -24,7 +24,8 @@ from rest_framework import status from catalog.packages import const from catalog.pub.database.models import VnfPkgSubscriptionModel -from catalog.pub.exceptions import VnfPkgSubscriptionException, VnfPkgDuplicateSubscriptionException +from catalog.pub.exceptions import VnfPkgSubscriptionException,\ + VnfPkgDuplicateSubscriptionException from catalog.pub.utils.values import ignore_case_get @@ -136,3 +137,22 @@ class CreateSubscription(object): 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 params.iteritems(): + 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] diff --git a/catalog/packages/tests/test_vnf_pkg_subscription.py b/catalog/packages/tests/test_vnf_pkg_subscription.py index 7c8b9f13..cd7b13ad 100644 --- a/catalog/packages/tests/test_vnf_pkg_subscription.py +++ b/catalog/packages/tests/test_vnf_pkg_subscription.py @@ -82,7 +82,7 @@ class TestNfPackageSubscription(TestCase): @mock.patch("requests.get") @mock.patch.object(uuid, 'uuid4') - def test_create_duplicate_subscriptions(self, mock_uuid4, mock_requests): + 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 @@ -98,3 +98,30 @@ class TestNfPackageSubscription(TestCase): 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) diff --git a/catalog/packages/urls.py b/catalog/packages/urls.py index 0add1d53..a4e3010b 100755 --- a/catalog/packages/urls.py +++ b/catalog/packages/urls.py @@ -15,7 +15,7 @@ from django.conf.urls import url from catalog.packages.views import vnf_package_views -from catalog.packages.views.vnf_package_subscription_views import SubscriptionsView +from catalog.packages.views.vnf_package_subscription_views import CreateQuerySubscriptionView from catalog.packages.views import catalog_views, ns_descriptor_views, pnf_descriptor_views, nsdm_subscription_views @@ -49,7 +49,9 @@ urlpatterns = [ 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'), - url(r'^api/vnfpkgm/v1/subscriptions$', SubscriptionsView.as_view(), name='subscriptions_create_query'), + + # 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\-\_]+)$', 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'), diff --git a/catalog/packages/views/vnf_package_subscription_views.py b/catalog/packages/views/vnf_package_subscription_views.py index d7449a89..546382e7 100755 --- a/catalog/packages/views/vnf_package_subscription_views.py +++ b/catalog/packages/views/vnf_package_subscription_views.py @@ -22,11 +22,11 @@ from rest_framework.views import APIView from rest_framework.response import Response from catalog.packages.serializers.vnf_pkg_subscription import PkgmSubscriptionRequestSerializer, \ - PkgmSubscriptionSerializer + PkgmSubscriptionSerializer, PkgmSubscriptionsSerializer from catalog.packages.serializers.response import ProblemDetailsSerializer -from catalog.packages.biz.vnf_pkg_subscription import CreateSubscription +from catalog.packages.biz.vnf_pkg_subscription import CreateSubscription, QuerySubscription from catalog.packages.views.common import validate_data -from catalog.pub.exceptions import VnfPkgDuplicateSubscriptionException +from catalog.pub.exceptions import VnfPkgDuplicateSubscriptionException, VnfPkgSubscriptionException logger = logging.getLogger(__name__) VALID_FILTERS = ["callbackUri", "notificationTypes", "vnfdId", "vnfPkgId", "operationalState", "usageState"] @@ -42,7 +42,7 @@ def get_problem_details_serializer(status_code, error_message): return problem_details_serializer -class SubscriptionsView(APIView): +class CreateQuerySubscriptionView(APIView): @swagger_auto_schema( request_body=PkgmSubscriptionRequestSerializer, @@ -70,3 +70,32 @@ class SubscriptionsView(APIView): problem_details_serializer = get_problem_details_serializer(status.HTTP_500_INTERNAL_SERVER_ERROR, traceback.format_exc()) return Response(data=problem_details_serializer.data, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @swagger_auto_schema( + responses={ + status.HTTP_200_OK: PkgmSubscriptionSerializer(), + status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(), + status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer() + } + ) + def get(self, request): + logger.debug("SubscribeNotification--get::> %s" % request.query_params) + try: + if request.query_params and not set(request.query_params).issubset(set(VALID_FILTERS)): + problem_details_serializer = get_problem_details_serializer(status.HTTP_400_BAD_REQUEST, + "Not a valid filter") + return Response(data=problem_details_serializer.data, status=status.HTTP_400_BAD_REQUEST) + resp_data = QuerySubscription().query_multi_subscriptions(request.query_params) + + subscriptions_serializer = PkgmSubscriptionsSerializer(data=resp_data) + if not subscriptions_serializer.is_valid(): + raise VnfPkgSubscriptionException(subscriptions_serializer.errors) + + return Response(data=subscriptions_serializer.data, status=status.HTTP_200_OK) + + except Exception as e: + logger.error(e.message) + logger.error(traceback.format_exc()) + problem_details_serializer = get_problem_details_serializer(status.HTTP_500_INTERNAL_SERVER_ERROR, + traceback.format_exc()) + return Response(data=problem_details_serializer.data, status=status.HTTP_500_INTERNAL_SERVER_ERROR) -- cgit 1.2.3-korg