4141 TAG_KEY ,
4242 TAG_VAL ,
4343 queue_as_aiter ,
44+ get_client_credentials ,
4445)
4546from .. import Environment , Target , target_factory
4647from ..exceptions import NoDriverFoundError , NoResourceFoundError , InvalidConfigError
@@ -93,6 +94,7 @@ class ClientSession:
9394 the coordinator."""
9495
9596 address = attr .ib (validator = attr .validators .instance_of (str ))
97+ credentials = attr .ib (validator = attr .validators .optional (attr .validators .instance_of (grpc .ChannelCredentials )))
9698 loop = attr .ib (validator = attr .validators .instance_of (asyncio .BaseEventLoop ))
9799 env = attr .ib (default = None , validator = attr .validators .optional (attr .validators .instance_of (Environment )))
98100 role = attr .ib (default = None , validator = attr .validators .optional (attr .validators .instance_of (str )))
@@ -121,10 +123,18 @@ def __attrs_post_init__(self):
121123 ("grpc.http2.max_pings_without_data" , 0 ), # no limit
122124 ]
123125
124- self .channel = grpc .aio .insecure_channel (
125- target = self .address ,
126- options = channel_options ,
127- )
126+ if self .credentials :
127+ self .channel = grpc .aio .secure_channel (
128+ target = self .address ,
129+ credentials = self .credentials ,
130+ options = channel_options ,
131+ )
132+ else :
133+ self .channel = grpc .aio .insecure_channel (
134+ target = self .address ,
135+ options = channel_options ,
136+ )
137+
128138 self .stub = labgrid_coordinator_pb2_grpc .CoordinatorStub (self .channel )
129139
130140 self .out_queue = asyncio .Queue ()
@@ -1793,7 +1803,12 @@ def ensure_event_loop(external_loop=None):
17931803
17941804
17951805def start_session (
1796- address : str , * , extra : Dict [str , Any ] = None , debug : bool = False , loop : "asyncio.AbstractEventLoop | None" = None
1806+ address : str ,
1807+ * ,
1808+ extra : Dict [str , Any ] = None ,
1809+ credentials : grpc .ChannelCredentials = None ,
1810+ debug : bool = False ,
1811+ loop : "asyncio.AbstractEventLoop | None" = None ,
17971812):
17981813 """
17991814 Starts a ClientSession.
@@ -1815,7 +1830,7 @@ def start_session(
18151830
18161831 address = proxymanager .get_grpc_address (address , default_port = 20408 )
18171832
1818- session = ClientSession (address , loop , ** extra )
1833+ session = ClientSession (address , credentials , loop , ** extra )
18191834 loop .run_until_complete (session .start ())
18201835 return session
18211836
@@ -1943,6 +1958,13 @@ def get_parser(auto_doc_mode=False) -> "argparse.ArgumentParser | AutoProgramArg
19431958 type = str ,
19441959 help = "coordinator HOST[:PORT] (default: value from env variable LG_COORDINATOR, otherwise 127.0.0.1:20408)" ,
19451960 )
1961+ parser .add_argument (
1962+ "--secure" ,
1963+ action = "store_true" ,
1964+ default = os .environ .get ("LG_COORDINATOR_SECURE" ) is not None ,
1965+ help = "enable TLS gRPC channel" ,
1966+ )
1967+ parser .add_argument ("--cert" , type = pathlib .PurePath , help = "path to the server's TLS certificate (in PEM format)" )
19461968 parser .add_argument (
19471969 "-c" ,
19481970 "--config" ,
@@ -2453,7 +2475,9 @@ def main():
24532475 logging .debug ('Starting session with "%s"' , coordinator_address )
24542476 loop = asyncio .new_event_loop ()
24552477 asyncio .set_event_loop (loop )
2456- session = start_session (coordinator_address , extra = extra , debug = args .debug , loop = loop )
2478+ session = start_session (
2479+ coordinator_address , extra = extra , credentials = get_client_credentials (args ), debug = args .debug , loop = loop
2480+ )
24572481 logging .debug ("Started session" )
24582482
24592483 try :
0 commit comments