2
2
import utilities_common .cli as clicommon
3
3
import utilities_common .multi_asic as multi_asic_util
4
4
from sonic_py_common import multi_asic
5
- from swsscommon .swsscommon import SonicV2Connector , ConfigDBConnector
5
+ from swsscommon .swsscommon import SonicV2Connector , ConfigDBConnector , APP_FABRIC_PORT_TABLE_NAME
6
+
7
+ FABRIC_PORT_STATUS_TABLE_PREFIX = APP_FABRIC_PORT_TABLE_NAME + "|"
8
+
6
9
7
10
#
8
11
# 'config fabric ...'
@@ -66,19 +69,13 @@ def isolate(portid, namespace):
66
69
#
67
70
@port .command ()
68
71
@click .argument ('portid' , metavar = '<portid>' , required = True )
72
+ @click .option ('-f' , '--force' , is_flag = True , default = False , help = 'Force to unisolate a link even if it is auto isolated.' )
69
73
@multi_asic_util .multi_asic_click_option_namespace
70
- def unisolate (portid , namespace ):
74
+ def unisolate (portid , namespace , force ):
71
75
"""FABRIC PORT unisolate <portid>"""
72
76
73
77
ctx = click .get_current_context ()
74
78
75
- if not portid .isdigit ():
76
- ctx .fail ("Invalid portid" )
77
-
78
- n_asics = multi_asic .get_num_asics ()
79
- if n_asics > 1 and namespace is None :
80
- ctx .fail ('Must specify asic' )
81
-
82
79
# Connect to config database
83
80
config_db = ConfigDBConnector (use_unix_socket_path = True , namespace = namespace )
84
81
config_db .connect ()
@@ -87,6 +84,37 @@ def unisolate(portid, namespace):
87
84
state_db = SonicV2Connector (use_unix_socket_path = True , namespace = namespace )
88
85
state_db .connect (state_db .STATE_DB , False )
89
86
87
+ n_asics = multi_asic .get_num_asics ()
88
+ if n_asics > 1 and namespace is None :
89
+ ctx .fail ( 'Must specify asic' )
90
+
91
+ # If "all" is specified then unisolate all ports.
92
+ if portid == "all" :
93
+ port_keys = state_db .keys (state_db .STATE_DB , FABRIC_PORT_STATUS_TABLE_PREFIX + '*' )
94
+ for port_key in port_keys :
95
+ port_data = state_db .get_all (state_db .STATE_DB , port_key )
96
+ if "REMOTE_PORT" in port_data :
97
+ port_number = int ( port_key .replace ( "FABRIC_PORT_TABLE|PORT" , "" ) )
98
+
99
+ # Make sure configuration data exists
100
+ portName = f'Fabric{ port_number } '
101
+ portConfigData = config_db .get_all (config_db .CONFIG_DB , "FABRIC_PORT|" + portName )
102
+ if not bool ( portConfigData ):
103
+ ctx .fail ( "Fabric monitor configuration data not present" )
104
+
105
+ # Update entry
106
+ config_db .mod_entry ( "FABRIC_PORT" , portName , {'isolateStatus' : False } )
107
+ if force :
108
+ forceShutCnt = int ( portConfigData ['forceUnisolateStatus' ] )
109
+ forceShutCnt += 1
110
+ config_db .mod_entry ( "FABRIC_PORT" , portName ,
111
+ {'forceUnisolateStatus' : forceShutCnt })
112
+
113
+ return
114
+
115
+ if not portid .isdigit ():
116
+ ctx .fail ( "Invalid portid" )
117
+
90
118
# check if the port is actually in use
91
119
portName = f'PORT{ portid } '
92
120
portStateData = state_db .get_all (state_db .STATE_DB , "FABRIC_PORT_TABLE|" + portName )
@@ -102,6 +130,15 @@ def unisolate(portid, namespace):
102
130
# Update entry
103
131
config_db .mod_entry ("FABRIC_PORT" , portName , {'isolateStatus' : False })
104
132
133
+ if force :
134
+ forceShutCnt = int ( portConfigData ['forceUnisolateStatus' ] )
135
+ forceShutCnt += 1
136
+ config_db .mod_entry ( "FABRIC_PORT" , portName ,
137
+ {'forceUnisolateStatus' : forceShutCnt })
138
+
139
+ click .echo ("Force unisolate the link." )
140
+ click .echo ("It will clear all fabric link monitoring status for this link!" )
141
+
105
142
#
106
143
# 'config fabric port monitor ...'
107
144
#
0 commit comments