def test_invalid_since_argument(self): """ Scenario: CFG_STATE is enabled. Check if techsupport is invoked and an invalid since argument in identified """ db_wrap = Db() redis_mock = db_wrap.db set_auto_ts_cfg(redis_mock, state="enabled", since_cfg="whatever") set_feature_table_cfg(redis_mock, state="enabled") populate_state_db(redis_mock) with Patcher() as patcher: def mock_cmd(cmd, env): cmd_str = " ".join(cmd) if "show techsupport --since '2 days ago'" in cmd_str: patcher.fs.create_file("/var/dump/sonic_dump_random3.tar.gz") return 0, "", "" elif "date --date='whatever'" in cmd_str: return 1, "", "Invalid Date Format" else: return 1, "", "" cdump_mod.subprocess_exec = mock_cmd patcher.fs.create_file("/var/dump/sonic_dump_random1.tar.gz") patcher.fs.create_file("/var/dump/sonic_dump_random2.tar.gz") patcher.fs.create_file("/var/core/orchagent.12345.123.core.gz") cls = cdump_mod.CriticalProcCoreDumpHandle("orchagent.12345.123.core.gz", "swss", redis_mock) cls.handle_core_dump_creation_event() cdump_mod.handle_coredump_cleanup("orchagent.12345.123.core.gz", redis_mock) assert "sonic_dump_random1.tar.gz" in os.listdir(cdump_mod.TS_DIR) assert "sonic_dump_random2.tar.gz" in os.listdir(cdump_mod.TS_DIR) assert "sonic_dump_random3.tar.gz" in os.listdir(cdump_mod.TS_DIR) expect = ["sonic_dump_random1", "sonic_dump_random2", "sonic_dump_random3"] ts_mp = {"sonic_dump_random3": "swss"} verify_post_exec_state(redis_mock, expect, [], ts_mp)
def test_global_rate_limit_interval(self): """ Scenario: CFG_STATE is enabled. Global rate_limit_interval is not passed yet. Check if techsupport isn't invoked. """ db_wrap = Db() redis_mock = db_wrap.db set_auto_ts_cfg(redis_mock, state="enabled", rate_limit_interval="1") set_feature_table_cfg(redis_mock, state="enabled") populate_state_db(redis_mock) with Patcher() as patcher: def mock_cmd(cmd, env): cmd_str = " ".join(cmd) if "show techsupport" in cmd_str: patcher.fs.create_file("/var/dump/sonic_dump_random3.tar.gz") else: return 1, "", "Command Not Found" return 0, "", "" cdump_mod.subprocess_exec = mock_cmd patcher.fs.create_file("/var/dump/sonic_dump_random1.tar.gz") patcher.fs.create_file("/var/dump/sonic_dump_random2.tar.gz") patcher.fs.create_file("/var/core/orchagent.12345.123.core.gz") cls = cdump_mod.CriticalProcCoreDumpHandle("orchagent.12345.123.core.gz", "swss", redis_mock) cls.handle_core_dump_creation_event() cdump_mod.handle_coredump_cleanup("orchagent.12345.123.core.gz", redis_mock) assert "sonic_dump_random1.tar.gz" in os.listdir(cdump_mod.TS_DIR) assert "sonic_dump_random2.tar.gz" in os.listdir(cdump_mod.TS_DIR) assert "sonic_dump_random3.tar.gz" not in os.listdir(cdump_mod.TS_DIR) cdump_expect = ["sonic_dump_random1", "sonic_dump_random2"] cdump_not_expect = ["sonic_dump_random3"] verify_post_exec_state(redis_mock, cdump_expect, cdump_not_expect)
def test_masic_core_dump(self): """ Scenario: Dump is generated from swss12 container. Config specified for swss shoudl be applied """ db_wrap = Db() redis_mock = db_wrap.db set_auto_ts_cfg(redis_mock, state="enabled") set_feature_table_cfg(redis_mock, state="enabled") populate_state_db(redis_mock) with Patcher() as patcher: def mock_cmd(cmd, env): cmd_str = " ".join(cmd) if "show techsupport" in cmd_str: patcher.fs.create_file("/var/dump/sonic_dump_random3.tar.gz") else: return 1, "", "Command Not Found" return 0, "", "" cdump_mod.subprocess_exec = mock_cmd patcher.fs.create_file("/var/dump/sonic_dump_random1.tar.gz") patcher.fs.create_file("/var/dump/sonic_dump_random2.tar.gz") patcher.fs.create_file("/var/core/orchagent.12345.123.core.gz") cls = cdump_mod.CriticalProcCoreDumpHandle("orchagent.12345.123.core.gz", "swss12", redis_mock) cls.handle_core_dump_creation_event() cdump_mod.handle_coredump_cleanup("orchagent.12345.123.core.gz", redis_mock) assert "sonic_dump_random1.tar.gz" in os.listdir(cdump_mod.TS_DIR) assert "sonic_dump_random2.tar.gz" in os.listdir(cdump_mod.TS_DIR) assert "sonic_dump_random3.tar.gz" in os.listdir(cdump_mod.TS_DIR) cdump_expect = ["sonic_dump_random1", "sonic_dump_random2", "sonic_dump_random3"] verify_post_exec_state(redis_mock, cdump_expect)
def test_feature_table_not_set(self): """ Scenario: CFG_STATE is enabled. The auto-techsupport in Feature table is not enabled for the core-dump generated Check if techsupport is not invoked """ db_wrap = Db() redis_mock = db_wrap.db set_auto_ts_cfg(redis_mock, state="enabled") set_feature_table_cfg(redis_mock, state="disabled", container_name="snmp") populate_state_db(redis_mock, {}) with Patcher() as patcher: def mock_cmd(cmd, env): cmd_str = " ".join(cmd) if "show techsupport" in cmd_str: patcher.fs.create_file("/var/dump/sonic_dump_random3.tar.gz") else: return 1, "", "Command Not Found" return 0, "", "" cdump_mod.subprocess_exec = mock_cmd patcher.fs.create_file("/var/dump/sonic_dump_random1.tar.gz") patcher.fs.create_file("/var/core/python3.12345.123.core.gz") cls = cdump_mod.CriticalProcCoreDumpHandle("python3.12345.123.core.gz", "snmp", redis_mock) cls.handle_core_dump_creation_event() cdump_mod.handle_coredump_cleanup("python3.12345.123.core.gz", redis_mock) assert "sonic_dump_random3.tar.gz" not in os.listdir(cdump_mod.TS_DIR)
def test_max_core_size_limit_not_crossed(self): """ Scenario: CFG_STATE is enabled. core-dump limit is crossed Verify Whether is cleanup is performed """ db_wrap = Db() redis_mock = db_wrap.db set_auto_ts_cfg(redis_mock, state="enabled", max_core_size="5.0") with Patcher() as patcher: def mock_cmd(cmd, env): cmd_str = " ".join(cmd) if "show techsupport" in cmd_str: patcher.fs.create_file( "/var/dump/sonic_dump_random3.tar.gz") return 0, AUTO_TS_STDOUT + ts_dump, "" patcher.fs.set_disk_usage(2000, path="/var/core/") patcher.fs.create_file("/var/core/orchagent.12345.123.core.gz", st_size=25) patcher.fs.create_file("/var/core/lldpmgrd.12345.22.core.gz", st_size=25) patcher.fs.create_file("/var/core/python3.12345.21.core.gz", st_size=25) cdump_mod.handle_coredump_cleanup("python3.12345.21.core.gz", redis_mock) current_fs = os.listdir(cdump_mod.CORE_DUMP_DIR) assert len(current_fs) == 3 assert "orchagent.12345.123.core.gz" in current_fs assert "lldpmgrd.12345.22.core.gz" in current_fs assert "python3.12345.21.core.gz" in current_fs
def test_core_dump_cleanup(self): """ Scenario: CFG_STATE is enabled. core-dump limit is crossed Verify Whether is cleanup is performed """ db_wrap = Db() redis_mock = db_wrap.db set_auto_ts_cfg(redis_mock, state="enabled", max_core_size="6.0") with Patcher() as patcher: patcher.fs.set_disk_usage(1000, path="/var/core/") patcher.fs.create_file("/var/core/orchagent.12345.123.core.gz", st_size=25) patcher.fs.create_file("/var/core/lldpmgrd.12345.22.core.gz", st_size=25) patcher.fs.create_file("/var/core/python3.12345.21.core.gz", st_size=25) cdump_mod.handle_coredump_cleanup("python3.12345.21.core.gz", redis_mock) current_fs = os.listdir(cdump_mod.CORE_DUMP_DIR) assert len(current_fs) == 2 assert "orchagent.12345.123.core.gz" not in current_fs assert "lldpmgrd.12345.22.core.gz" in current_fs assert "python3.12345.21.core.gz" in current_fs
def test_invoc_ts_state_db_update(self): """ Scenario: CFG_STATE is enabled. CFG_CORE_CLEANUP is disabled and no rate_limit_interval is provided Check if techsupport is invoked, file is created and State DB is updated """ db_wrap = Db() redis_mock = db_wrap.db set_auto_ts_cfg(redis_mock, state="enabled") set_feature_table_cfg(redis_mock, state="enabled") populate_state_db(redis_mock) with Patcher() as patcher: def mock_cmd(cmd, env): ts_dump = "/var/dump/sonic_dump_random3.tar.gz" cmd_str = " ".join(cmd) if "show techsupport" in cmd_str: patcher.fs.create_file(ts_dump) else: return 1, "", "Command Not Found" return 0, AUTO_TS_STDOUT + ts_dump, "" ts_helper.subprocess_exec = mock_cmd patcher.fs.create_file("/var/dump/sonic_dump_random1.tar.gz") patcher.fs.create_file("/var/dump/sonic_dump_random2.tar.gz") patcher.fs.create_file("/var/core/orchagent.12345.123.core.gz") cls = cdump_mod.CriticalProcCoreDumpHandle( "orchagent.12345.123.core.gz", "swss", redis_mock) cls.handle_core_dump_creation_event() cdump_mod.handle_coredump_cleanup("orchagent.12345.123.core.gz", redis_mock) assert "sonic_dump_random1.tar.gz" in os.listdir(cdump_mod.TS_DIR) assert "sonic_dump_random2.tar.gz" in os.listdir(cdump_mod.TS_DIR) assert "sonic_dump_random3.tar.gz" in os.listdir(cdump_mod.TS_DIR) cdump_expect = [ "sonic_dump_random1", "sonic_dump_random2", "sonic_dump_random3" ] verify_post_exec_state(redis_mock, cdump_expect)