23
23
PORT , VPORT , VLAN , SX_ENTRY_NOT_FOUND
24
24
from packet_scheme import PACKET_SCHEME
25
25
from port_utils import sx_get_ports_map , is_lag
26
+ from swsscommon .swsscommon import ConfigDBConnector , DBConnector , Table
26
27
27
28
IP_VERSION_IPV4 = 1
28
29
IP_VERSION_IPV6 = 2
29
- PORT_CHANNEL_IDX = 1
30
+ PORT_CHANNEL_IDX = 0
30
31
VRF_NAME_IDX = 1
31
32
IP_VERSION_MAX_MASK_LEN = {IP_VERSION_IPV4 : 32 , IP_VERSION_IPV6 : 128 }
32
33
34
+ APPL_DB_NAME = 'APPL_DB'
33
35
INTF_TABLE = 'INTF_TABLE'
36
+ VRF_TABLE = 'VRF_TABLE'
37
+ LAG_MEMBER_TABLE = 'LAG_MEMBER_TABLE'
34
38
HASH_CALC_PATH = '/usr/bin/sx_hash_calculator'
35
39
HASH_CALC_INPUT_FILE = "/tmp/hash_calculator_input.json"
36
40
HASH_CALC_OUTPUT_FILE = "/tmp/hash_calculator_output.json"
@@ -113,6 +117,8 @@ def __init__(self):
113
117
self .egress_ports = []
114
118
self .debug = False
115
119
120
+ self .config_db = ConfigDBConnector ()
121
+ self .appl_db = DBConnector (APPL_DB_NAME , 0 )
116
122
self .open_sdk_connection ()
117
123
self .init_ports_map ()
118
124
self .get_active_vrids ()
@@ -137,7 +143,7 @@ def debug_print(self, *args, **kwargs):
137
143
print (* args , ** kwargs )
138
144
139
145
def init_ports_map (self ):
140
- self .ports_map = sx_get_ports_map (self .handle )
146
+ self .ports_map = sx_get_ports_map (self .handle , self . config_db )
141
147
142
148
def validate_ingress_port (self , interface ):
143
149
if interface not in self .ports_map .values ():
@@ -156,16 +162,12 @@ def validate_args(self, interface, packet, vrf, debug):
156
162
if not self .validate_vrf ():
157
163
raise ValueError ("VRF validation failed: VRF {} does not exist" .format (self .user_vrf ))
158
164
159
- def validate_vrf (self ):
160
- query_output = exec_cmd (['/usr/bin/redis-cli' , '-n' , '0' , 'keys' ,'*VRF*' ]).strip ()
161
- if not query_output :
162
- return False
165
+ def validate_vrf (self ):
166
+ vrf_table = Table (self .appl_db , VRF_TABLE )
167
+ vrf_table_keys = vrf_table .getKeys ()
163
168
164
- vrf_entries = query_output .split ('\n ' )
165
- for entry in vrf_entries :
166
- vrf = entry .split (':' )[VRF_NAME_IDX ]
167
- if vrf == self .user_vrf :
168
- return True
169
+ if self .user_vrf in vrf_table_keys :
170
+ return True
169
171
170
172
return False
171
173
@@ -289,26 +291,30 @@ def print_egress_port(self):
289
291
def is_port_bind_to_user_vrf (self , port_type , port , vlan_id = 0 ):
290
292
if port_type == PORT :
291
293
# INTF_TABLE:Ethernet0
292
- entry = '{}:{} ' .format (INTF_TABLE , port )
294
+ entry = '{}' .format (port )
293
295
elif port_type == VPORT :
294
296
# INTF_TABLE:Ethernet0.300
295
- entry = '{}:{} .{}' .format (INTF_TABLE , port , vlan_id )
297
+ entry = '{}.{}' .format (port , vlan_id )
296
298
elif port_type == VLAN :
297
299
# INTF_TABLE:Vlan300
298
- entry = '{}:Vlan{}' .format (INTF_TABLE , vlan_id )
300
+ entry = 'Vlan{}' .format (vlan_id )
301
+
302
+ vrf_table = Table (self .appl_db , INTF_TABLE )
303
+ (_ , port_vrf ) = vrf_table .hget (entry , 'vrf_name' )
299
304
300
- port_vrf = exec_cmd (['/usr/bin/redis-cli' , '-n' , '0' , 'hget' , entry , 'vrf_name' ])
301
305
if self .user_vrf == port_vrf .strip ():
302
306
return True
303
307
304
308
return False
305
309
306
310
# Get port-channel name for given port-channel member port
307
- def get_port_channel_name (self , port ):
308
- query_output = exec_cmd (['/usr/bin/redis-cli' , '-n' , '0' , 'keys' ,'*LAG_MEMBER_TABLE*' ])
309
- for line in query_output .split ('\n ' ):
310
- if str (port ) in line :
311
- port_channel = line .split (':' )[PORT_CHANNEL_IDX ]
311
+ def get_port_channel_name (self , port ):
312
+ lag_member_table = Table (self .appl_db , LAG_MEMBER_TABLE )
313
+ lag_member_table_keys = lag_member_table .getKeys ()
314
+
315
+ for key in lag_member_table_keys :
316
+ if port in key :
317
+ port_channel = key .split (':' )[PORT_CHANNEL_IDX ]
312
318
return port_channel
313
319
314
320
raise KeyError ("Failed to get port-channel name for interface {}" .format (port ))
@@ -368,7 +374,7 @@ def get_lag_member(self, logical, flood_case = False):
368
374
member_index = self .get_lag_member_index (len (lag_members ), flood_case )
369
375
lag_member = lag_members [member_index ]
370
376
371
- self .debug_print ("Lag member from which trafic will egress: {}" .format (lag_member ))
377
+ self .debug_print ("Lag members: {} \n Lag member from which trafic will egress: {}" .format (lag_members , lag_member ))
372
378
return lag_member
373
379
374
380
def call_hash_calculator (self , input_dict ):
0 commit comments