add comments
[vfc/nfvo/lcm.git] / lcm / ns / biz / query_subscription.py
1 # Copyright (c) 2019, CMCC Technologies Co., Ltd.
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 ast
16 import json
17 import logging
18
19 from lcm.pub.database.models import SubscriptionModel
20
21 logger = logging.getLogger(__name__)
22 ROOT_FILTERS = {
23     'operationTypes': 'operation_types',
24     'operationStates': 'operation_states',
25     'notificationTypes': 'notification_types',
26     'nsComponentTypes': 'ns_component_types',
27     'lcmOpNameImpactingNsComponent': 'lcm_opname_impacting_nscomponent',
28     'lcmOpOccStatusImpactingNsComponent': 'lcm_opoccstatus_impacting_nscomponent'
29 }
30 NS_INSTANCE_FILTERS = {
31     "nsInstanceId": "ns_instance_filter"
32 }
33
34
35 class QuerySubscription:
36     """
37     Search subscription record
38     """
39
40     def __init__(self, data, subscription_id=''):
41         self.subscription_id = subscription_id
42         self.params = data
43
44     def query_multi_subscriptions(self):
45         """
46         Get multiple subscriptions
47         :return:
48         """
49         query_data = {}
50         logger.debug(
51             "QueryMultiSubscriptions--get--biz::> Check for filters in query params" % self.params)
52         for query, value in list(self.params.items()):
53             if query in ROOT_FILTERS:
54                 query_data[ROOT_FILTERS[query] + '__icontains'] = value
55         for query, value in list(self.params.items()):
56             if query in NS_INSTANCE_FILTERS:
57                 query_data[NS_INSTANCE_FILTERS[query] + '__icontains'] = value
58         # Query the database with filters if the request has fields in request
59         # params, else fetch all records
60         if query_data:
61             subscriptions = SubscriptionModel.objects.filter(**query_data)
62         else:
63             subscriptions = SubscriptionModel.objects.all()
64         return [self.fill_resp_data(subscription) for subscription in subscriptions]
65
66     def fill_resp_data(self, subscription):
67         subscription_filter = {
68             "notificationTypes": ast.literal_eval(subscription.notification_types),
69             "operationTypes": ast.literal_eval(subscription.operation_types),
70             "operationStates": ast.literal_eval(subscription.operation_states),
71             "nsInstanceSubscriptionFilter": json.loads(subscription.ns_instance_filter)
72         }
73         resp_data = {
74             'id': subscription.subscription_id,
75             'callbackUri': subscription.callback_uri,
76             'filter': subscription_filter,
77             '_links': json.loads(subscription.links)
78         }
79         return resp_data