@@ -332,7 +332,6 @@ def wrapper(*args, **kwargs):
332
332
333
333
return wrapper
334
334
335
-
336
335
def retry_setup_grpc_channel_for_port (port , asic_index ):
337
336
338
337
global grpc_port_stubs
@@ -409,34 +408,61 @@ def get_grpc_credentials(type, kvp):
409
408
410
409
return credential
411
410
412
- def create_channel ( type , level , kvp , soc_ip ):
411
+ def connect_channel ( channel , stub , port ):
413
412
413
+ channel_ready = grpc .channel_ready_future (channel )
414
414
retries = 3
415
+
415
416
for _ in range (retries ):
417
+ try :
418
+ channel_ready .result (timeout = 2 )
419
+ except grpc .FutureTimeoutError :
420
+ helper_logger .log_warning ("gRPC port {} state changed to SHUTDOWN" .format (port ))
421
+ else :
422
+ break
416
423
417
- if type == "secure" :
418
- credential = get_grpc_credentials (level , kvp )
419
- target_name = kvp .get ("grpc_ssl_credential" , None )
420
- if credential is None or target_name is None :
421
- return (None , None )
424
+ def create_channel (type , level , kvp , soc_ip , port ):
422
425
423
- GRPC_CLIENT_OPTIONS .append (('grpc.ssl_target_name_override' , '{}' .format (target_name )))
424
426
425
- channel = grpc .secure_channel ("{}:{}" .format (soc_ip , GRPC_PORT ), credential , options = GRPC_CLIENT_OPTIONS )
426
- else :
427
- channel = grpc .insecure_channel ("{}:{}" .format (soc_ip , GRPC_PORT ), options = GRPC_CLIENT_OPTIONS )
427
+ #Helper callback to get an channel connectivity state
428
+ def wait_for_state_change (channel_connectivity ):
429
+ if channel_connectivity == grpc .ChannelConnectivity .TRANSIENT_FAILURE :
430
+ helper_logger .log_notice ("gRPC port {} state changed to TRANSIENT_FAILURE" .format (port ))
431
+ if channel_connectivity == grpc .ChannelConnectivity .CONNECTING :
432
+ helper_logger .log_notice ("gRPC port {} state changed to CONNECTING" .format (port ))
433
+ if channel_connectivity == grpc .ChannelConnectivity .READY :
434
+ helper_logger .log_notice ("gRPC port {} state changed to READY" .format (port ))
435
+ if channel_connectivity == grpc .ChannelConnectivity .IDLE :
436
+ helper_logger .log_notice ("gRPC port {} state changed to IDLE" .format (port ))
437
+ if channel_connectivity == grpc .ChannelConnectivity .SHUTDOWN :
438
+ helper_logger .log_notice ("gRPC port {} state changed to SHUTDOWN" .format (port ))
428
439
429
- stub = linkmgr_grpc_driver_pb2_grpc .DualToRActiveStub (channel )
430
440
431
- channel_ready = grpc .channel_ready_future (channel )
441
+ if type == "secure" :
442
+ credential = get_grpc_credentials (level , kvp )
443
+ target_name = kvp .get ("grpc_ssl_credential" , None )
444
+ if credential is None or target_name is None :
445
+ return (None , None )
432
446
433
- try :
434
- channel_ready .result (timeout = 2 )
435
- except grpc .FutureTimeoutError :
436
- channel = None
437
- stub = None
438
- else :
439
- break
447
+ GRPC_CLIENT_OPTIONS .append (('grpc.ssl_target_name_override' , '{}' .format (target_name )))
448
+
449
+ channel = grpc .secure_channel ("{}:{}" .format (soc_ip , GRPC_PORT ), credential , options = GRPC_CLIENT_OPTIONS )
450
+ else :
451
+ channel = grpc .insecure_channel ("{}:{}" .format (soc_ip , GRPC_PORT ), options = GRPC_CLIENT_OPTIONS )
452
+
453
+
454
+ stub = linkmgr_grpc_driver_pb2_grpc .DualToRActiveStub (channel )
455
+
456
+
457
+ if channel is not None :
458
+ channel .subscribe (wait_for_state_change )
459
+
460
+ #connect_channel(channel, stub, port)
461
+ """
462
+ Comment the connect channel call for now, since it is not required for normal gRPC I/O
463
+ and all use cases work without it.
464
+ TODO: check if this subroutine call can be ommitted for all use cases in future enhancements
465
+ """
440
466
441
467
return channel , stub
442
468
@@ -490,12 +516,12 @@ def setup_grpc_channel_for_port(port, soc_ip):
490
516
kvp = dict (fvs )
491
517
492
518
493
- channel , stub = create_channel (type , level , kvp , soc_ip )
519
+ channel , stub = create_channel (type , level , kvp , soc_ip , port )
494
520
495
521
if stub is None :
496
522
helper_logger .log_warning ("stub was not setup for gRPC soc ip {} port {}, no gRPC soc server running ?" .format (soc_ip , port ))
497
523
if channel is None :
498
- helper_logger .log_warning ("channel was not setup for gRPC soc ip {} port {}, no gRPC server running ?" .format (soc_ip , port ))
524
+ helper_logger .log_warning ("channel was not setup for gRPC soc ip {} port {}, no gRPC soc server running ?" .format (soc_ip , port ))
499
525
500
526
return channel , stub
501
527
0 commit comments