From cf7d0f40e9b3e16c303cb7e292760d66090f9108 Mon Sep 17 00:00:00 2001 From: Bharath Thiruveedula Date: Tue, 12 Mar 2019 13:26:11 +0530 Subject: Add VNFPKGM Query Subscription API Issue-ID: VFC-1223 Change-Id: Ieca1591d1db27f0edb9948a11dec4affbe500cdc Signed-off-by: Bharath Thiruveedula --- catalog/packages/biz/vnf_pkg_subscription.py | 13 +++++++- .../packages/tests/test_vnf_pkg_subscription.py | 28 ++++++++++++++++ catalog/packages/urls.py | 3 +- .../views/vnf_package_subscription_views.py | 37 +++++++++++++++++++++- catalog/pub/exceptions.py | 4 +++ 5 files changed, 82 insertions(+), 3 deletions(-) diff --git a/catalog/packages/biz/vnf_pkg_subscription.py b/catalog/packages/biz/vnf_pkg_subscription.py index e4772e5e..9d4acb98 100755 --- a/catalog/packages/biz/vnf_pkg_subscription.py +++ b/catalog/packages/biz/vnf_pkg_subscription.py @@ -25,7 +25,7 @@ from rest_framework import status from catalog.packages import const from catalog.pub.database.models import VnfPkgSubscriptionModel from catalog.pub.exceptions import VnfPkgSubscriptionException,\ - VnfPkgDuplicateSubscriptionException + VnfPkgDuplicateSubscriptionException, SubscriptionDoesNotExistsException from catalog.pub.utils.values import ignore_case_get @@ -156,3 +156,14 @@ class QuerySubscription(object): 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() diff --git a/catalog/packages/tests/test_vnf_pkg_subscription.py b/catalog/packages/tests/test_vnf_pkg_subscription.py index cd7b13ad..40eb2af3 100644 --- a/catalog/packages/tests/test_vnf_pkg_subscription.py +++ b/catalog/packages/tests/test_vnf_pkg_subscription.py @@ -125,3 +125,31 @@ class TestNfPackageSubscription(TestCase): 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/" + 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/" + dummy_uuid, + format='json') + self.assertEqual(404, response.status_code) diff --git a/catalog/packages/urls.py b/catalog/packages/urls.py index a4e3010b..3de7361b 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 CreateQuerySubscriptionView +from catalog.packages.views.vnf_package_subscription_views import CreateQuerySubscriptionView, QueryTerminateSubscriptionView from catalog.packages.views import catalog_views, ns_descriptor_views, pnf_descriptor_views, nsdm_subscription_views @@ -52,6 +52,7 @@ urlpatterns = [ # 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/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 546382e7..24bcd4e4 100755 --- a/catalog/packages/views/vnf_package_subscription_views.py +++ b/catalog/packages/views/vnf_package_subscription_views.py @@ -26,7 +26,8 @@ from catalog.packages.serializers.vnf_pkg_subscription import PkgmSubscriptionRe from catalog.packages.serializers.response import ProblemDetailsSerializer from catalog.packages.biz.vnf_pkg_subscription import CreateSubscription, QuerySubscription from catalog.packages.views.common import validate_data -from catalog.pub.exceptions import VnfPkgDuplicateSubscriptionException, VnfPkgSubscriptionException +from catalog.pub.exceptions import VnfPkgDuplicateSubscriptionException, VnfPkgSubscriptionException, \ + SubscriptionDoesNotExistsException logger = logging.getLogger(__name__) VALID_FILTERS = ["callbackUri", "notificationTypes", "vnfdId", "vnfPkgId", "operationalState", "usageState"] @@ -99,3 +100,37 @@ class CreateQuerySubscriptionView(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) + + +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() + } + ) + def get(self, request, subscriptionId): + logger.debug("SubscribeNotification--get::> %s" % subscriptionId) + try: + + resp_data = QuerySubscription().query_single_subscription(subscriptionId) + + subscription_serializer = PkgmSubscriptionSerializer(data=resp_data) + if not subscription_serializer.is_valid(): + raise VnfPkgSubscriptionException(subscription_serializer.errors) + + return Response(data=subscription_serializer.data, status=status.HTTP_200_OK) + except SubscriptionDoesNotExistsException as e: + logger.error(e.message) + logger.error(traceback.format_exc()) + problem_details_serializer = get_problem_details_serializer(status.HTTP_404_NOT_FOUND, + traceback.format_exc()) + return Response(data=problem_details_serializer.data, status=status.HTTP_404_NOT_FOUND) + except Exception as e: + logger.error(e.message) + logger.error(traceback.format_exc()) + problem_details_serializer = get_problem_details_serializer(status.HTTP_500_INTERNAL_SERVER_ERROR, + traceback.format_exc()) + return Response(data=problem_details_serializer.data, status=status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/catalog/pub/exceptions.py b/catalog/pub/exceptions.py index 81379d7b..96c2fd95 100644 --- a/catalog/pub/exceptions.py +++ b/catalog/pub/exceptions.py @@ -29,6 +29,10 @@ class VnfPkgDuplicateSubscriptionException(CatalogException): pass +class SubscriptionDoesNotExistsException(CatalogException): + pass + + class NsdmBadRequestException(CatalogException): pass -- cgit 1.2.3-korg