1
1
from siridb .connector import SiriDBClient
2
+ from lib .config import Config
3
+ from lib .socketio import SUBSCRIPTION_CHANGE_TYPE_INITIAL
2
4
3
5
4
6
class ServerState :
@@ -7,43 +9,104 @@ class ServerState:
7
9
siridb_data_client = None
8
10
siridb_forecast_client = None
9
11
tasks_last_runs = {}
12
+ siridb_conn_status = {}
10
13
11
14
@classmethod
12
- async def async_setup (cls , sio , siridb_data_username ,
13
- siridb_data_password ,
14
- siridb_data_dbname ,
15
- siridb_data_hostlist ,
16
- siridb_forecast_username ,
17
- siridb_forecast_password ,
18
- siridb_forecast_dbname ,
19
- siridb_forecast_hostlist ):
15
+ async def async_setup (cls , sio ):
20
16
cls .running = True
21
17
cls .sio = sio
22
-
23
- cls .siridb_data_client = SiriDBClient (
24
- username = siridb_data_username ,
25
- password = siridb_data_password ,
26
- dbname = siridb_data_dbname ,
27
- hostlist = siridb_data_hostlist , # Multiple connections are supported
28
- keepalive = True )
29
- await cls .siridb_data_client .connect ()
30
- cls .siridb_forecast_client = SiriDBClient (
31
- username = siridb_forecast_username ,
32
- password = siridb_forecast_password ,
33
- dbname = siridb_forecast_dbname ,
34
- hostlist = siridb_forecast_hostlist , # Multiple connections are supported
35
- keepalive = True )
36
- await cls .siridb_forecast_client .connect ()
37
18
19
+ await cls .setup_siridb_connection ()
38
20
39
21
cls .tasks_last_runs = {
40
22
'watch_series' : None ,
41
23
'save_to_disk' : None ,
42
24
'check_jobs' : None ,
43
- 'cleanup_clients' : None
25
+ 'manage_connections' : None
26
+ }
27
+
28
+ cls .siridb_conn_status = {
29
+ 'data_conn' : False ,
30
+ 'analysis_conn' : False
44
31
}
45
32
33
+ await cls .refresh_siridb_status ()
34
+
35
+ @classmethod
36
+ def _siridb_config_equal (cls , a , b ):
37
+ if a .get ('username' ) != b .get ('username' ):
38
+ return False
39
+ if a .get ('password' ) != b .get ('password' ):
40
+ return False
41
+ if a .get ('dbname' ) != b .get ('dbname' ):
42
+ return False
43
+ if a .get ('hostlist' )[0 ] != b .get ('hostlist' )[0 ]:
44
+ return False
45
+
46
+ return True
47
+
48
+ @classmethod
49
+ async def setup_siridb_connection (cls ):
50
+ siridb_data_config , siridb_forecast_config = Config .get_siridb_settings ()
51
+
52
+ if cls .siridb_data_client is not None :
53
+ cls .stop ()
54
+
55
+ cls .siridb_data_client = SiriDBClient (
56
+ ** siridb_data_config ,
57
+ keepalive = True )
58
+ await cls .siridb_data_client .connect ()
59
+ if not cls ._siridb_config_equal (siridb_data_config , siridb_forecast_config ):
60
+ if cls .siridb_forecast_client is not None :
61
+ cls .siridb_forecast_client .close ()
62
+ cls .siridb_forecast_client = SiriDBClient (
63
+ ** siridb_forecast_config ,
64
+ keepalive = True )
65
+ await cls .siridb_forecast_client .connect ()
66
+ elif cls .siridb_forecast_client is not None :
67
+ cls .siridb_forecast_client .close ()
68
+ cls .siridb_forecast_client = None
69
+
70
+ await cls .refresh_siridb_status ()
71
+
72
+ @classmethod
73
+ def get_siridb_data_conn (cls ):
74
+ return cls .siridb_data_client
75
+
76
+ @classmethod
77
+ def get_siridb_forecast_conn (cls ):
78
+ if cls .siridb_forecast_client is None :
79
+ return cls .siridb_data_client
80
+ return cls .siridb_forecast_client
81
+
82
+
83
+ @classmethod
84
+ def get_siridb_data_conn_status (cls ):
85
+ return cls .siridb_data_client .connected
86
+
87
+ @classmethod
88
+ def get_siridb_forecast_conn_status (cls ):
89
+ if cls .siridb_forecast_client is None :
90
+ return cls .siridb_data_client .connected
91
+ return cls .siridb_forecast_client .connected
92
+
93
+ @classmethod
94
+ async def refresh_siridb_status (cls ):
95
+ status = {}
96
+ status ['data_conn' ] = cls .get_siridb_data_conn_status ()
97
+ status ['analysis_conn' ] = cls .get_siridb_forecast_conn_status ()
98
+
99
+ if status != cls .siridb_conn_status :
100
+ cls .siridb_conn_status = status
101
+ await cls .sio .emit ('update' , {
102
+ 'resource' : 'siridb_status' ,
103
+ 'updateType' : SUBSCRIPTION_CHANGE_TYPE_INITIAL ,
104
+ 'resourceData' : cls .siridb_conn_status
105
+ }, room = 'siridb_status_updates' )
106
+
46
107
@classmethod
47
108
def stop (cls ):
48
- cls .siridb_data_client .close ()
49
- cls .siridb_forecast_client .close ()
109
+ if cls .siridb_data_client is not None :
110
+ cls .siridb_data_client .close ()
111
+ if cls .siridb_forecast_client is not None :
112
+ cls .siridb_forecast_client .close ()
0 commit comments