mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-11-01 12:47:16 +00:00
isisd: Add expected behavior with set-overload-bit
Signed-off-by: Isabella de Leon <ideleon@microsoft.com>
This commit is contained in:
parent
910dab7c30
commit
4afc783610
@ -85,7 +85,7 @@ writing, *isisd* does not support multiple ISIS processes.
|
||||
|
||||
.. clicmd:: set-overload-bit on-startup (0-86400)
|
||||
|
||||
Set overload bit on startup for the specified duration, in seconds.
|
||||
Set overload bit on startup for the specified duration, in seconds. Reference: :rfc:`3277`
|
||||
|
||||
.. clicmd:: purge-originator
|
||||
|
||||
|
||||
@ -448,7 +448,10 @@ void set_overload_on_start_timer(struct thread *thread)
|
||||
assert(area);
|
||||
|
||||
area->t_overload_on_startup_timer = NULL;
|
||||
isis_area_overload_bit_set(area, false);
|
||||
|
||||
/* Check if set-overload-bit is not currently configured */
|
||||
if (!area->overload_configured)
|
||||
isis_area_overload_bit_set(area, false);
|
||||
}
|
||||
|
||||
static void isis_reset_attach_bit(struct isis_adjacency *adj)
|
||||
|
||||
@ -350,6 +350,8 @@ int isis_instance_overload_enabled_modify(struct nb_cb_modify_args *args)
|
||||
|
||||
area = nb_running_get_entry(args->dnode, NULL, true);
|
||||
overload = yang_dnode_get_bool(args->dnode, NULL);
|
||||
area->overload_configured = overload;
|
||||
|
||||
isis_area_overload_bit_set(area, overload);
|
||||
|
||||
return NB_OK;
|
||||
|
||||
@ -3190,9 +3190,15 @@ void isis_area_overload_bit_set(struct isis_area *area, bool overload_bit)
|
||||
|
||||
if (new_overload_bit != area->overload_bit) {
|
||||
area->overload_bit = new_overload_bit;
|
||||
|
||||
if (new_overload_bit)
|
||||
if (new_overload_bit) {
|
||||
area->overload_counter++;
|
||||
} else {
|
||||
/* Cancel overload on startup timer if it's running */
|
||||
if (area->t_overload_on_startup_timer) {
|
||||
THREAD_OFF(area->t_overload_on_startup_timer);
|
||||
area->t_overload_on_startup_timer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef FABRICD
|
||||
hook_call(isis_hook_db_overload, area);
|
||||
|
||||
@ -181,6 +181,7 @@ struct isis_area {
|
||||
char is_type; /* level-1 level-1-2 or level-2-only */
|
||||
/* are we overloaded? */
|
||||
char overload_bit;
|
||||
bool overload_configured;
|
||||
uint32_t overload_counter;
|
||||
uint32_t overload_on_startup_time;
|
||||
/* L1/L2 router identifier for inter-area traffic */
|
||||
|
||||
@ -368,6 +368,7 @@ def test_isis_database_json():
|
||||
|
||||
def test_isis_overload_on_startup():
|
||||
"Check that overload on startup behaves as expected"
|
||||
|
||||
tgen = get_topogen()
|
||||
net = get_topogen().net
|
||||
overload_time = 120
|
||||
@ -464,6 +465,124 @@ def check_lsp_overload_bit(router, overloaded_router_lsp, att_p_ol_expected):
|
||||
assert assertmsg is True, assertmsg
|
||||
|
||||
|
||||
def test_isis_overload_on_startup_cancel_timer():
|
||||
"Check that overload on startup timer is cancelled when overload bit is set/unset"
|
||||
|
||||
tgen = get_topogen()
|
||||
net = get_topogen().net
|
||||
overload_time = 90
|
||||
|
||||
# Don't run this test if we have any failure.
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Testing overload on startup behavior with set overload bit: cancel timer")
|
||||
|
||||
# Configure set-overload-bit on-startup on r3
|
||||
r3 = tgen.gears["r3"]
|
||||
r3.vtysh_cmd(
|
||||
f"""
|
||||
configure
|
||||
router isis 1
|
||||
set-overload-bit on-startup {overload_time}
|
||||
set-overload-bit
|
||||
"""
|
||||
)
|
||||
# Restart r3
|
||||
logger.info("Stop router")
|
||||
stop_router(tgen, "r3")
|
||||
logger.info("Start router")
|
||||
start_router(tgen, "r3")
|
||||
|
||||
# Check that the overload bit is set in r3's LSP
|
||||
check_lsp_overload_bit("r3", "r3.00-00", "0/0/1")
|
||||
|
||||
# Check that overload timer is running
|
||||
check_overload_timer("r3", True)
|
||||
|
||||
# Unset overload bit while timer is running
|
||||
r3.vtysh_cmd(
|
||||
"""
|
||||
configure
|
||||
router isis 1
|
||||
no set-overload-bit
|
||||
"""
|
||||
)
|
||||
|
||||
# Check that overload timer is cancelled
|
||||
check_overload_timer("r3", False)
|
||||
|
||||
# Check overload bit is unset
|
||||
check_lsp_overload_bit("r3", "r3.00-00", "0/0/0")
|
||||
|
||||
|
||||
def test_isis_overload_on_startup_override_timer():
|
||||
"Check that overload bit remains set after overload timer expires if overload bit is configured"
|
||||
|
||||
tgen = get_topogen()
|
||||
net = get_topogen().net
|
||||
overload_time = 60
|
||||
|
||||
# Don't run this test if we have any failure.
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Testing overload on startup behavior with set overload bit: override timer")
|
||||
|
||||
# Configure set-overload-bit on-startup on r3
|
||||
r3 = tgen.gears["r3"]
|
||||
r3.vtysh_cmd(
|
||||
f"""
|
||||
configure
|
||||
router isis 1
|
||||
set-overload-bit on-startup {overload_time}
|
||||
set-overload-bit
|
||||
"""
|
||||
)
|
||||
# Restart r3
|
||||
logger.info("Stop router")
|
||||
stop_router(tgen, "r3")
|
||||
logger.info("Start router")
|
||||
start_router(tgen, "r3")
|
||||
|
||||
# Check that the overload bit is set in r3's LSP
|
||||
check_lsp_overload_bit("r3", "r3.00-00", "0/0/1")
|
||||
|
||||
# Check that overload timer is running
|
||||
check_overload_timer("r3", True)
|
||||
|
||||
# Check that overload timer expired
|
||||
check_overload_timer("r3", False)
|
||||
|
||||
# Check overload bit is still set
|
||||
check_lsp_overload_bit("r3", "r3.00-00", "0/0/1")
|
||||
|
||||
|
||||
@retry(retry_timeout=200)
|
||||
def _check_overload_timer(router, timer_expected):
|
||||
"Verfiy overload bit in router's LSP"
|
||||
|
||||
tgen = get_topogen()
|
||||
router = tgen.gears[router]
|
||||
thread_output = router.vtysh_cmd(
|
||||
"show thread timers"
|
||||
)
|
||||
|
||||
timer_running = "set_overload_on_start_timer" in thread_output
|
||||
if timer_running == timer_expected:
|
||||
return True
|
||||
return "Expected timer running status: {}".format(timer_expected)
|
||||
|
||||
|
||||
def check_overload_timer(router, timer_expected):
|
||||
"Verfiy overload bit in router's LSP"
|
||||
|
||||
assertmsg = _check_overload_timer(
|
||||
router, timer_expected
|
||||
)
|
||||
assert assertmsg is True, assertmsg
|
||||
|
||||
|
||||
def test_memory_leak():
|
||||
"Run the memory leak test and report results."
|
||||
tgen = get_topogen()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user