16
16
17
17
import asyncio
18
18
import os
19
+ import signal
19
20
20
21
import grpc
21
22
from grpc_reflection .v1alpha import reflection
25
26
import crossplane .function .proto .v1beta1 .run_function_pb2 as fnv1beta1
26
27
import crossplane .function .proto .v1beta1 .run_function_pb2_grpc as grpcv1beta1
27
28
29
+ GRACE_PERIOD = 5
28
30
SERVICE_NAMES = (
29
31
reflection .SERVICE_NAME ,
30
32
fnv1 .DESCRIPTOR .services_by_name ["FunctionRunnerService" ].full_name ,
@@ -63,6 +65,8 @@ def load_credentials(tls_certs_dir: str) -> grpc.ServerCredentials:
63
65
require_client_auth = True ,
64
66
)
65
67
68
+ async def stop (server , timeout ):
69
+ await server .stop (grace = timeout )
66
70
67
71
def serve (
68
72
function : grpcv1 .FunctionRunnerService ,
@@ -90,6 +94,11 @@ def serve(
90
94
91
95
server = grpc .aio .server ()
92
96
97
+ loop .add_signal_handler (
98
+ signal .SIGTERM ,
99
+ lambda : asyncio .create_task (stop (server , timeout = GRACE_PERIOD ))
100
+ )
101
+
93
102
grpcv1 .add_FunctionRunnerServiceServicer_to_server (function , server )
94
103
grpcv1beta1 .add_FunctionRunnerServiceServicer_to_server (
95
104
BetaFunctionRunner (wrapped = function ), server
@@ -116,7 +125,7 @@ async def start():
116
125
try :
117
126
loop .run_until_complete (start ())
118
127
finally :
119
- loop .run_until_complete (server .stop (grace = 5 ))
128
+ loop .run_until_complete (server .stop (grace = GRACE_PERIOD ))
120
129
loop .close ()
121
130
122
131
0 commit comments