898ee8e437740c1c42c86d3542937ff597713057
[dcaegen2/platform.git] / oti / event-handler / otihandler / dbclient / apis / event_db_access.py
1 # ================================================================================
2 # Copyright (c) 2019-2020 AT&T Intellectual Property. All rights reserved.
3 # ================================================================================
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 #      http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 # ============LICENSE_END=========================================================
16
17 """ DB APIs to interact with application database using sqlAlchemy ORM lib and postgresSql driver"""
18
19 from sqlalchemy import and_
20 from sqlalchemy.orm.exc import NoResultFound
21
22 from .db_access import DbAccess
23 from ..models import Event, EventAck
24
25
26 class EventDbAccess(DbAccess):
27
28     def __init__(self):
29         DbAccess.__init__(self)
30
31     def query_event_item(self, target_type, target_name):
32         try:
33             query = self.session.query(Event).filter(Event.target_type == target_type).\
34                 filter(Event.target_name == target_name)
35             evt = query.one()
36         except NoResultFound:
37             return None
38         else:
39             return evt
40
41     def query_event_data(self, target_type, target_name):
42         try:
43             query = self.session.query(Event).filter(Event.target_type == target_type).\
44                 filter(Event.target_name == target_name)
45             evt = query.one()
46         except NoResultFound:
47             return []
48         else:
49             try:
50                 ack_result = self.session.query(EventAck).filter(EventAck.event == evt).all()
51             except NoResultFound:
52                 return []
53             else:
54                 return ack_result
55
56     def query_event_data_k8s(self, target_type, target_name):
57         try:
58             query = self.session.query(Event).filter(Event.target_type == target_type).\
59                 filter(Event.target_name == target_name)
60             evt = query.one()
61         except NoResultFound:
62             return []
63         else:
64             try:
65                 ack_result = self.session.query(EventAck).filter(EventAck.event == evt).\
66                     filter(EventAck.container_type != 'docker').all()
67             except NoResultFound:
68                 return []
69             else:
70                 return ack_result
71
72     def query_event_info_docker(self, prim_evt, service_component, deployment_id, container_id):
73         try:
74             query = self.session.query(EventAck).filter(EventAck.event == prim_evt).filter(
75                 and_(EventAck.service_component == service_component,
76                      EventAck.deployment_id == deployment_id,
77                      EventAck.container_id == container_id,
78                      EventAck.container_type == 'docker'))
79             evt = query.one()
80         except NoResultFound as nrf:
81             raise nrf
82         else:
83             return evt
84
85     def update_event_item(self, dti_event, target_type, target_name):
86         self.session.query(Event).filter(Event.target_type == target_type). \
87             filter(Event.target_name == target_name).update({Event.event:dti_event})
88         self.session.commit()
89
90     def query_raw_k8_events(self, cluster, pod, namespace):
91         """
92         run an inner JOIN query to dtih_event and dtih_event_ack tables using supplied query predicates
93
94         :param cluster:
95         :param pod:
96         :param namespace:
97         :return:
98             Set of event objects related to k8s pods
99         """
100         try:
101             return self.session.query(Event).filter(Event.dtih_event_id.in_(
102                 self.session.query(EventAck.dtih_event_id).filter(and_(EventAck.k8s_cluster_fqdn == cluster,
103                                                                        EventAck.k8s_pod_id == pod,
104                                                                        EventAck.k8s_namespace == namespace)))).all()
105         except NoResultFound:
106             print("invalid query or no data")
107             return ()
108
109     def query_raw_docker_events(self, target_types, locations):
110         """
111         run a query to dtih_event table using supplied query predicates
112
113         :param target_types: required
114         :param locations: optional
115         :return:
116             set of event objects related to docker container
117         """
118         try:
119             if not locations or (len(locations) == 1 and locations[0] == ''):
120                 return self.session.query(Event).filter(Event.target_type.in_(target_types)).all()
121             else:
122                 return self.session.query(Event).filter(Event.target_type.in_(target_types)).filter(
123                     Event.location_clli.in_(locations)).all()
124         except NoResultFound:
125             print("invalid query or no data")
126             return ()
127
128     def query_pod_info2(self, cluster):
129         try:
130             return self.session.query(EventAck).filter(EventAck.k8s_cluster_fqdn == cluster).all()
131         except NoResultFound:
132             print("invalid query or no data")
133             return ()
134
135     def query_pod_info(self, cluster):
136         try:
137             return self.session.query(EventAck.k8s_pod_id, EventAck.k8s_namespace,
138                                       EventAck.k8s_proxy_fqdn, EventAck.k8s_service_name,
139                                       EventAck.k8s_service_port)\
140                 .filter(EventAck.k8s_cluster_fqdn == cluster) \
141                 .distinct().order_by(EventAck.k8s_cluster_fqdn).all()
142         except NoResultFound:
143             print("invalid query or no data")
144             return ()
145
146     def query_event_data_k8s_pod(self, prim_evt, scn):
147         try:
148             query = self.session.query(EventAck).filter(EventAck.event == prim_evt).filter(
149                 and_(EventAck.service_component == scn))
150             event_info = query.one()
151         except NoResultFound:
152             return None
153         else:
154             return event_info