1
1
import time
2
+ import signal
2
3
3
4
import prometheus_client
4
5
@@ -22,6 +23,7 @@ def __init__(self, name, sleep_time_between_iterations_seconds,
22
23
self .sleep_time_between_iterations_seconds = sleep_time_between_iterations_seconds
23
24
self .run_single_iteration_extra_kwargs = {} if run_single_iteration_extra_kwargs is None else run_single_iteration_extra_kwargs
24
25
self .deployments_manager = deployments_manager if deployments_manager else DeploymentsManager ()
26
+ self .terminate_requested = False
25
27
26
28
def start (self , once = False , with_prometheus = None ):
27
29
if with_prometheus is None :
@@ -41,15 +43,25 @@ def start(self, once=False, with_prometheus=None):
41
43
else :
42
44
self .start_main_loop ()
43
45
46
+ def on_sigterm (self , * args , ** kwargs ):
47
+ logs .debug_info (f"SIGTERM received for daemon { self .name } " )
48
+ self .terminate_requested = True
49
+
44
50
def start_main_loop (self ):
45
- while True :
51
+ signal .signal (signal .SIGTERM , self .on_sigterm )
52
+ while not self .terminate_requested :
46
53
self .run_single_iteration (** self .run_single_iteration_extra_kwargs )
54
+ if self .terminate_requested :
55
+ break
47
56
time .sleep (self .sleep_time_between_iterations_seconds )
57
+ assert self .terminate_requested , f'Unexpected termination of daemon { self .name } '
58
+ logs .debug_info (f"Graceful termination of daemon { self .name } " )
48
59
49
60
def run_single_iteration (self , ** kwargs ):
50
61
self .run_single_iteration_callback (
51
62
domains_config = self .domains_config ,
52
63
metrics = self .metrics ,
53
64
deployments_manager = self .deployments_manager ,
65
+ daemon = self ,
54
66
** kwargs
55
67
)
0 commit comments