Add log and comment
[modeling/etsicatalog.git] / catalog / packages / views / nsdm_subscription_views.py
1 # Copyright (C) 2019 Verizon. All Rights Reserved
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 import logging
16
17 from drf_yasg.utils import swagger_auto_schema, no_body
18 from rest_framework import status
19 from rest_framework.decorators import api_view
20 from rest_framework.response import Response
21
22 from catalog.packages.biz.nsdm_subscription import NsdmSubscription
23 from catalog.packages.const import TAG_NSD_API
24 from catalog.packages.serializers.nsdm_filter_data import NsdmNotificationsFilter
25 from catalog.packages.serializers.nsdm_subscription import NsdmSubscriptionIdSerializer
26 from catalog.packages.serializers.nsdm_subscription import NsdmSubscriptionRequestSerializer
27 from catalog.packages.serializers.nsdm_subscription import NsdmSubscriptionSerializer
28 from catalog.packages.serializers.nsdm_subscription import NsdmSubscriptionsSerializer
29 from catalog.packages.serializers.response import ProblemDetailsSerializer
30 from catalog.pub.exceptions import NsdmBadRequestException
31 from .common import view_safe_call_with_log
32
33 logger = logging.getLogger(__name__)
34
35
36 def validate_data(data, serializer):
37     serialized_data = serializer(data=data)
38     if not serialized_data.is_valid():
39         logger.error('Data validation failed.')
40         raise NsdmBadRequestException(serialized_data.errors)
41     return serialized_data
42
43
44 @swagger_auto_schema(
45     method='POST',
46     operation_description="Create Subscription for NSD Management",
47     tags=[TAG_NSD_API],
48     request_body=NsdmSubscriptionRequestSerializer(),
49     responses={
50         status.HTTP_201_CREATED: NsdmSubscriptionSerializer,
51         status.HTTP_303_SEE_OTHER: ProblemDetailsSerializer(),
52         status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(),
53         status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
54     }
55 )
56 @swagger_auto_schema(
57     method='GET',
58     operation_description="Query subscriptions for Nsd Management",
59     tags=[TAG_NSD_API],
60     request_body=no_body,
61     responses={
62         status.HTTP_200_OK: NsdmSubscriptionsSerializer(),
63         status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(),
64         status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
65         status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer(),
66     }
67 )
68 @api_view(http_method_names=['POST', 'GET'])
69 @view_safe_call_with_log(logger=logger)
70 def nsd_subscription_rc(request):
71     if request.method == 'POST':
72         # Subscribe to NSD and PNFD change notifications.
73         logger.debug("SubscribeNotification--post::> %s" % request.data)
74         nsdm_subscription_request = \
75             validate_data(request.data,
76                           NsdmSubscriptionRequestSerializer)
77         subscription = NsdmSubscription().create(
78             nsdm_subscription_request.data)
79         validate_data(subscription, NsdmSubscriptionSerializer)
80         return Response(data=subscription, status=status.HTTP_201_CREATED)
81
82     if request.method == 'GET':
83         # Query multiple subscriptions.
84         logger.debug("Subscription Notification GET %s" % request.query_params)
85         request_query_params = {}
86         if request.query_params:
87             request_query_params = \
88                 validate_data(request.query_params,
89                               NsdmNotificationsFilter).data
90         subscription_data = \
91             NsdmSubscription().query_multi_subscriptions(
92                 request_query_params)
93         subscriptions = validate_data(subscription_data,
94                                       NsdmSubscriptionsSerializer)
95         return Response(data=subscriptions.data, status=status.HTTP_200_OK)
96
97
98 @swagger_auto_schema(
99     method='GET',
100     operation_description="Query subscriptions for Nsd Management",
101     tags=[TAG_NSD_API],
102     request_body=no_body,
103     responses={
104         status.HTTP_200_OK: NsdmSubscriptionSerializer(),
105         status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(),
106         status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
107         status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
108     }
109 )
110 @swagger_auto_schema(
111     method='DELETE',
112     operation_description="Delete subscription for Nsd Management",
113     tags=[TAG_NSD_API],
114     request_body=no_body,
115     responses={
116         status.HTTP_204_NO_CONTENT: 'No_Content',
117         status.HTTP_400_BAD_REQUEST: ProblemDetailsSerializer(),
118         status.HTTP_404_NOT_FOUND: ProblemDetailsSerializer(),
119         status.HTTP_500_INTERNAL_SERVER_ERROR: ProblemDetailsSerializer()
120     }
121 )
122 @api_view(http_method_names=['GET', 'DELETE'])
123 @view_safe_call_with_log(logger=logger)
124 def nsd_subscription_rd(request, **kwargs):
125     """
126     Individual subscription
127     :param request:
128     :param kwargs:
129     :return:
130     """
131     subscription_id = kwargs.get("subscriptionId")
132     validate_data({'subscription_id': subscription_id}, NsdmSubscriptionIdSerializer)
133     if request.method == 'GET':
134         # Read an individual subscription resource
135         subscription_data = NsdmSubscription().query_single_subscription(subscription_id)
136         subscription = validate_data(subscription_data, NsdmSubscriptionSerializer)
137         return Response(data=subscription.data, status=status.HTTP_200_OK)
138     elif request.method == 'DELETE':
139         # Terminate a subscription
140         subscription_data = NsdmSubscription().delete_single_subscription(subscription_id)
141         return Response(status=status.HTTP_204_NO_CONTENT)