1212import syslog # noqa: E402
1313import time # noqa: E402
1414import traceback # noqa: E402
15- from swsscommon .swsscommon import ConfigDBConnector # noqa: E402
15+ from pyroute2 import netns # noqa: E402
16+ from swsscommon .swsscommon import ConfigDBConnector , SonicDBConfig # noqa: E402
17+ from sonic_py_common import multi_asic # noqa: E402
1618
1719SYSLOG_ID = 'lag_keepalive'
1820SLOW_PROTOCOL_MAC_ADDRESS = "01:80:c2:00:00:02"
1921LACP_ETHERTYPE = 0x8809
2022
21-
2223def log_info (msg ):
2324 syslog .openlog (SYSLOG_ID )
2425 syslog .syslog (syslog .LOG_INFO , msg )
@@ -36,8 +37,11 @@ def getCmdOutput(cmd):
3637 return proc .communicate ()[0 ], proc .returncode
3738
3839
39- def get_port_channel_config (portChannelName ):
40- (processStdout , _ ) = getCmdOutput (["teamdctl" , portChannelName , "state" , "dump" ])
40+ def get_port_channel_config (portChannelName , namespace = "" ):
41+ teamdctl_command = ["teamdctl" ]
42+ if namespace :
43+ teamdctl_command += ["-n" , namespace .removeprefix ("asic" )]
44+ (processStdout , _ ) = getCmdOutput (teamdctl_command + [portChannelName , "state" , "dump" ])
4145 return json .loads (processStdout )
4246
4347
@@ -65,8 +69,8 @@ def craft_lacp_packet(portChannelConfig, portName):
6569 return packet
6670
6771
68- def get_lacpdu_per_lag_member ():
69- appDB = ConfigDBConnector ()
72+ def get_lacpdu_per_lag_member (namespace ):
73+ appDB = ConfigDBConnector (namespace = namespace )
7074 appDB .db_connect ('APPL_DB' )
7175 appDB_lag_info = appDB .get_keys ('LAG_MEMBER_TABLE' )
7276 active_lag_members = list ()
@@ -79,7 +83,7 @@ def get_lacpdu_per_lag_member():
7983 lag_member = str (lag_entry [1 ])
8084 active_lag_members .append (lag_member )
8185 # craft lacpdu packets for each lag member based on config
82- port_channel_config = get_port_channel_config (lag_name )
86+ port_channel_config = get_port_channel_config (lag_name , namespace )
8387 packet = craft_lacp_packet (port_channel_config , lag_member )
8488 socket = conf .L2socket (iface = lag_member )
8589 lag_member_to_packet [lag_member ] = (socket , packet )
@@ -108,11 +112,20 @@ def lag_keepalive(lag_member_to_packet):
108112def main ():
109113 parser = argparse .ArgumentParser ()
110114 parser .add_argument ('--fork-into-background' , action = 'store_true' )
115+ parser .add_argument ('-n' , '--namespace' , default = "" , type = str , help = 'namespace to use' )
111116 args = parser .parse_args ()
112117
118+ if multi_asic .is_multi_asic ():
119+ SonicDBConfig .initializeGlobalConfig ()
120+
121+ if args .namespace :
122+ netns .setns (args .namespace )
123+ global SYSLOG_ID
124+ SYSLOG_ID = f"{ SYSLOG_ID } _{ args .namespace } "
125+
113126 while True :
114127 try :
115- active_lag_members , lag_member_to_packet = get_lacpdu_per_lag_member ()
128+ active_lag_members , lag_member_to_packet = get_lacpdu_per_lag_member (args . namespace )
116129 if len (active_lag_members ) != len (lag_member_to_packet .keys ()):
117130 log_error ("Failed to craft LACPDU packets for some lag members. " +
118131 "Active lag members: {}. LACPDUs crafted for: {}" .format (
0 commit comments