diff --git a/tests/dvslib/dvs_database.py b/tests/dvslib/dvs_database.py index 553c0d7710..6724698289 100644 --- a/tests/dvslib/dvs_database.py +++ b/tests/dvslib/dvs_database.py @@ -109,7 +109,19 @@ def delete_field(self, table_name: str, key: str, field: str) -> None: """ table = swsscommon.Table(self.db_connection, table_name) table.hdel(key, field) - + + def set_field(self, table_name: str, key: str, field: str, value: str) -> None: + """Add/Update a field in an entry stored at `key` in the specified table. + + Args: + table_name: The name of the table where the entry is being removed. + key: The key that maps to the entry being added/updated. + field: The field that needs to be added/updated. + value: The value that is set for the field. + """ + table = swsscommon.Table(self.db_connection, table_name) + table.hset(key, field, value) + def get_keys(self, table_name: str) -> List[str]: """Get all of the keys stored in the specified table. diff --git a/tests/test_fabric_switch_id.py b/tests/test_fabric_switch_id.py new file mode 100644 index 0000000000..2705c7a999 --- /dev/null +++ b/tests/test_fabric_switch_id.py @@ -0,0 +1,47 @@ +from dvslib.dvs_common import wait_for_result, PollingConfig +import pytest + +class TestFabricSwitchId(object): + def check_syslog(self, dvs, marker, log, expected_cnt=1): + def do_check_syslog(): + (ec, out) = dvs.runcmd(['sh', '-c', "awk \'/%s/,ENDFILE {print;}\' /var/log/syslog | grep \'%s\' | wc -l" %(marker, log)]) + return (out.strip() == str(expected_cnt), None) + max_poll = PollingConfig(polling_interval=5, timeout=600, strict=True) + wait_for_result(do_check_syslog, polling_config=max_poll) + + def test_invalid_fabric_switch_id(self, vst): + # Find supervisor dvs. + dvs = None + config_db = None + for name in vst.dvss.keys(): + dvs = dvss[name] + config_db = dvs.get_config_db() + metatbl = config_db.get_entry("DEVICE_METADATA", "localhost") + cfg_switch_type = metatbl.get("switch_type") + if cfg_switch_type == "fabric": + break + assert dvs and config_db + + # Verify orchagent's handling of invalid fabric switch_id in following cases: + # - Invalid fabric switch_id, e.g, -1, is set. + # - fabric switch_id is missing in ConfigDb. + for invalid_switch_id in (-1, None): + if invalid_switch_id is None: + config_db.delete_field("DEVICE_METADATA", "localhost", "switch_id") + expected_log = "Fabric switch id is not configured" + else: + config_db.set_field("DEVICE_METADATA", "localhost", "switch_id", str( invalid_switch_id)) + expected_log = f"Invalid fabric switch id {invalid_switch_id} configured" + + # Restart orchagent and verify orchagent behavior by checking syslog. + dvs.stop_swss() + marker = dvs.add_log_marker() + dvs.start_swss() + self.check_syslog(dvs, marker , expected_log) + + +# Add Dummy always-pass test at end as workaroud +# for issue when Flaky fail on final test it invokes module tear-down before retrying +def test_nonflaky_dummy(): + pass +