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
@@ -92,6 +93,7 @@ class ClientSession:
9293 the coordinator."""
9394
9495 address = attr .ib (validator = attr .validators .instance_of (str ))
96+ credentials = attr .ib (validator = attr .validators .optional (attr .validators .instance_of (grpc .ChannelCredentials )))
9597 loop = attr .ib (validator = attr .validators .instance_of (asyncio .BaseEventLoop ))
9698 env = attr .ib (default = None , validator = attr .validators .optional (attr .validators .instance_of (Environment )))
9799 role = attr .ib (default = None , validator = attr .validators .optional (attr .validators .instance_of (str )))
@@ -120,10 +122,18 @@ def __attrs_post_init__(self):
120122 ("grpc.http2.max_pings_without_data" , 0 ), # no limit
121123 ]
122124
123- self .channel = grpc .aio .insecure_channel (
124- target = self .address ,
125- options = channel_options ,
126- )
125+ if self .credentials :
126+ self .channel = grpc .aio .secure_channel (
127+ target = self .address ,
128+ credentials = self .credentials ,
129+ options = channel_options ,
130+ )
131+ else :
132+ self .channel = grpc .aio .insecure_channel (
133+ target = self .address ,
134+ options = channel_options ,
135+ )
136+
127137 self .stub = labgrid_coordinator_pb2_grpc .CoordinatorStub (self .channel )
128138
129139 self .out_queue = asyncio .Queue ()
@@ -1698,7 +1708,12 @@ def ensure_event_loop(external_loop=None):
16981708
16991709
17001710def start_session (
1701- address : str , * , extra : Dict [str , Any ] = None , debug : bool = False , loop : "asyncio.AbstractEventLoop | None" = None
1711+ address : str ,
1712+ * ,
1713+ extra : Dict [str , Any ] = None ,
1714+ credentials : grpc .ChannelCredentials = None ,
1715+ debug : bool = False ,
1716+ loop : "asyncio.AbstractEventLoop | None" = None ,
17021717):
17031718 """
17041719 Starts a ClientSession.
@@ -1720,7 +1735,7 @@ def start_session(
17201735
17211736 address = proxymanager .get_grpc_address (address , default_port = 20408 )
17221737
1723- session = ClientSession (address , loop , ** extra )
1738+ session = ClientSession (address , credentials , loop , ** extra )
17241739 loop .run_until_complete (session .start ())
17251740 return session
17261741
@@ -1848,6 +1863,13 @@ def get_parser(auto_doc_mode=False) -> "argparse.ArgumentParser | AutoProgramArg
18481863 type = str ,
18491864 help = "coordinator HOST[:PORT] (default: value from env variable LG_COORDINATOR, otherwise 127.0.0.1:20408)" ,
18501865 )
1866+ parser .add_argument (
1867+ "--tls" ,
1868+ action = "store_true" ,
1869+ default = os .environ .get ("LG_COORDINATOR_TLS" ) is not None ,
1870+ help = "enable TLS gRPC channel" ,
1871+ )
1872+ parser .add_argument ("--cert" , type = pathlib .PurePath , help = "path to the server's TLS certificate (in PEM format)" )
18511873 parser .add_argument (
18521874 "-c" ,
18531875 "--config" ,
@@ -2346,7 +2368,9 @@ def main():
23462368 logging .debug ('Starting session with "%s"' , coordinator_address )
23472369 loop = asyncio .new_event_loop ()
23482370 asyncio .set_event_loop (loop )
2349- session = start_session (coordinator_address , extra = extra , debug = args .debug , loop = loop )
2371+ session = start_session (
2372+ coordinator_address , extra = extra , credentials = get_client_credentials (args ), debug = args .debug , loop = loop
2373+ )
23502374 logging .debug ("Started session" )
23512375
23522376 try :
0 commit comments