Skip to content

Commit

Permalink
Add "state" field in CONFIG_DB a toggle of the fabric port monitor fe…
Browse files Browse the repository at this point in the history
…ature (sonic-net#2932)

* Add "state" field in CONFIG_DB fabric_monitor table as a toggle of the
fabric port monitoring feature. The command to set this is "config
fabric port monitor state <enable/disable>"
---------
Signed-off-by: Jie Feng <[email protected]>
  • Loading branch information
jfeng-arista authored Mar 25, 2024
1 parent 3c489ba commit 04a33e1
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 0 deletions.
33 changes: 33 additions & 0 deletions config/fabric.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,39 @@ def error_threshold(crccells, rxcells, namespace):
config_db.mod_entry("FABRIC_MONITOR", "FABRIC_MONITOR_DATA",
{'monErrThreshCrcCells': crccells, 'monErrThreshRxCells': rxcells})

def setFabricPortMonitorState(state, namespace, ctx):
""" set the fabric port monitor state"""
# Connect to config database
config_db = ConfigDBConnector(use_unix_socket_path=True, namespace=namespace)
config_db.connect()

# Make sure configuration data exists
monitorData = config_db.get_all(config_db.CONFIG_DB, "FABRIC_MONITOR|FABRIC_MONITOR_DATA")
if not bool(monitorData):
ctx.fail("Fabric monitor configuration data not present")

# Update entry
config_db.mod_entry("FABRIC_MONITOR", "FABRIC_MONITOR_DATA",
{'monState': state})

#
# 'config fabric port montior state <enable/disable>'
#
@monitor.command()
@click.argument('state', metavar='<state>', required=True)
@multi_asic_util.multi_asic_click_option_namespace
def state(state, namespace):
"""FABRIC PORT MONITOR STATE configuration tasks"""
ctx = click.get_current_context()

n_asics = multi_asic.get_num_asics()
if n_asics > 1 and namespace is None:
ns_list = multi_asic.get_namespace_list()
for namespace in ns_list:
setFabricPortMonitorState(state, namespace, ctx)
else:
setFabricPortMonitorState(state, namespace, ctx)

#
# 'config fabric port monitor poll ...'
#
Expand Down
15 changes: 15 additions & 0 deletions doc/Command-Reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -3846,6 +3846,21 @@ This command sets the number of consecutive polls in which no error is detected
admin@sonic:~$ config fabric port monitor poll threshold recovery 5 -n asic0
```
**config fabric port monitor state <enable/disable>**
This command sets the monitor state in CONFIG_DB to enable/disable the fabric monitor feature.
- Usage:
```
config fabric port monitor state [OPTIONS] <state>
```
- Example:
```
admin@sonic:~$ config fabric port monitor state enable
admin@sonic:~$ config fabric port monitor state disable
```
## Feature
SONiC includes a capability in which Feature state can be enabled/disabled
Expand Down
58 changes: 58 additions & 0 deletions tests/config_fabric_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import os
import pytest
import sys
import importlib

from click.testing import CliRunner
from utilities_common.db import Db
Expand Down Expand Up @@ -93,3 +94,60 @@ def test_config_fabric_monitor_threshold(self, ctx):
result = self.basic_check("port", ["monitor", "poll", "threshold", "recovery", "8"], ctx)
expect_result = 0
assert operator.eq(result.exit_code, expect_result)

def test_config_fabric_monitor_state(self, ctx):
# Issue command "config fabric port monitor state <enable/disable>"
result = self.basic_check("port", ["monitor", "state", "enable"], ctx)
expect_result = 0
assert operator.eq(result.exit_code, expect_result)

result = self.basic_check("port", ["monitor", "state", "disable"], ctx)
expect_result = 0
assert operator.eq(result.exit_code, expect_result)

@classmethod
def teardown_class(cls):
print("TEARDOWN")
os.environ["PATH"] = os.pathsep.join(
os.environ["PATH"].split(os.pathsep)[:-1])
os.environ["UTILITIES_UNIT_TESTING"] = "0"
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = ""

class TestMultiAsicConfigFabric(object):
@classmethod
def setup_class(cls):
print("SETUP")
os.environ["PATH"] += os.pathsep + scripts_path
os.environ["UTILITIES_UNIT_TESTING"] = "2"
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "multi_asic"
# change to multi asic config
from .mock_tables import dbconnector
from .mock_tables import mock_multi_asic
importlib.reload(mock_multi_asic)
dbconnector.load_namespace_config()

def basic_check(self, command_name, para_list, ctx):
# This function issues command of "config fabric xxxx",
# and returns the result of the command.
runner = CliRunner()
result = runner.invoke(config.config.commands["fabric"].commands[command_name], para_list, obj = ctx)
print(result.output)
return result

def test_multi_config_fabric_monitor_state(self, ctx):
result = self.basic_check("port", ["monitor", "state", "disable"], ctx)
expect_result = 0
assert operator.eq(result.exit_code, expect_result)

@classmethod
def teardown_class(cls):
print("TEARDOWN_TEST")
os.environ["PATH"] = os.pathsep.join(
os.environ["PATH"].split(os.pathsep)[:-1])
os.environ["UTILITIES_UNIT_TESTING"] = "0"
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = ""
# change back to single asic config
from .mock_tables import dbconnector
from .mock_tables import mock_single_asic
importlib.reload(mock_single_asic)
dbconnector.load_namespace_config()
7 changes: 7 additions & 0 deletions tests/mock_tables/asic0/config_db.json
Original file line number Diff line number Diff line change
Expand Up @@ -288,5 +288,12 @@
"ports@": "Ethernet124",
"type": "L3",
"stage": "ingress"
},
"FABRIC_MONITOR|FABRIC_MONITOR_DATA": {
"monCapacityThreshWarn": "100",
"monErrThreshCrcCells": "1",
"monErrThreshRxCells": "61035156",
"monPollThreshIsolation": "1",
"monPollThreshRecovery": "8"
}
}
7 changes: 7 additions & 0 deletions tests/mock_tables/asic1/config_db.json
Original file line number Diff line number Diff line change
Expand Up @@ -227,5 +227,12 @@
"holdtime": "10",
"asn": "65200",
"keepalive": "3"
},
"FABRIC_MONITOR|FABRIC_MONITOR_DATA": {
"monCapacityThreshWarn": "100",
"monErrThreshCrcCells": "1",
"monErrThreshRxCells": "61035156",
"monPollThreshIsolation": "1",
"monPollThreshRecovery": "8"
}
}

0 comments on commit 04a33e1

Please sign in to comment.