Add Query All NsdManagementSubscription API 98/81998/3
authorSirisha Gopigiri <sirisha.gopigiri@verizon.com>
Tue, 12 Mar 2019 04:26:32 +0000 (09:56 +0530)
committerSirisha Gopigiri <sirisha.gopigiri@verizon.com>
Tue, 12 Mar 2019 06:27:46 +0000 (11:57 +0530)
Add SOL 005 Query All NsdManagementSubscription API

Change-Id: I6023a35f98b5ca60bad70aa146743a3fe759b0b9
Issue-ID: VFC-1218
Signed-off-by: Sirisha Gopigiri <sirisha.gopigiri@verizon.com>
catalog/packages/biz/nsdm_subscription.py
catalog/packages/tests/test_nsdm_subscription.py
catalog/packages/views/nsdm_subscription_views.py

index 19df46e..6c5372f 100644 (file)
@@ -25,6 +25,7 @@ from rest_framework import status
 from catalog.packages import const
 from catalog.pub.database.models import NsdmSubscriptionModel
 from catalog.pub.exceptions import CatalogException, \
+    ResourceNotFoundException, \
     NsdmBadRequestException, NsdmDuplicateSubscriptionException
 from catalog.pub.utils.values import ignore_case_get
 
@@ -45,6 +46,25 @@ class NsdmSubscription:
     def __init__(self):
         pass
 
+    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 self.params.iteritems():
+            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)
index fb35555..b31a4b4 100644 (file)
@@ -12,6 +12,7 @@
 # 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
@@ -338,3 +339,98 @@ class TestNsdmSubscription(TestCase):
                                     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)
index 6869d78..9b4abe5 100644 (file)
 import logging
 import traceback
 
-from drf_yasg.utils import swagger_auto_schema
+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 catalog.packages.serializers.nsdm_filter_data \
+    import NsdmNotificationsFilter
 from catalog.packages.serializers.nsdm_subscription import \
+    NsdmSubscriptionsSerializer, \
     NsdmSubscriptionSerializer, \
     NsdmSubscriptionRequestSerializer
 from catalog.packages.serializers.response \
     import ProblemDetailsSerializer
 from catalog.pub.exceptions import \
+    ResourceNotFoundException, \
     NsdmBadRequestException, NsdmDuplicateSubscriptionException
 from catalog.packages.biz.nsdm_subscription import NsdmSubscription
 
@@ -63,7 +67,18 @@ def get_problem_details_serializer(title, status_code, error_message):
         status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
     }
 )
-@api_view(http_method_names=['POST'])
+@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'])
 def nsd_subscription_rc(request):
     if request.method == 'POST':
         logger.debug("SubscribeNotification--post::> %s" % request.data)
@@ -103,3 +118,42 @@ def nsd_subscription_rc(request):
                     e.message)
             return Response(data=problem_details_serializer.data,
                             status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+    if request.method == 'GET':
+        logger.debug("Subscription Notification GET %s" % request.query_params)
+        try:
+            title = 'Query Subscription Failed!'
+            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)
+        except NsdmBadRequestException as e:
+            logger.error(e.message)
+            problem_details_serializer = \
+                get_problem_details_serializer(title,
+                                               status.HTTP_400_BAD_REQUEST,
+                                               e.message)
+            return Response(data=problem_details_serializer.data,
+                            status=status.HTTP_400_BAD_REQUEST)
+        except ResourceNotFoundException as e:
+            problem_details_serializer = \
+                get_problem_details_serializer(title,
+                                               status.HTTP_404_NOT_FOUND,
+                                               e.message)
+            return Response(data=problem_details_serializer.data,
+                            status=status.HTTP_404_NOT_FOUND)
+        except Exception as e:
+            logger.error(e.message)
+            problem_details_serializer = \
+                get_problem_details_serializer(
+                    title,
+                    status.HTTP_500_INTERNAL_SERVER_ERROR,
+                    traceback.format_exc())
+            return Response(data=problem_details_serializer.data,
+                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)