Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "state" field in CONFIG_DB a toggle of the fabric port monitor feature #2932

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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
jfeng-arista marked this conversation as resolved.
Show resolved Hide resolved
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 @@ -3844,6 +3844,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 @@ -287,5 +287,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"
}
}