diff options
| -rw-r--r-- | mgmtd/mgmt.h | 12 | ||||
| -rw-r--r-- | mgmtd/mgmt_ds.h | 3 | ||||
| -rw-r--r-- | mgmtd/mgmt_fe_adapter.c | 4 | ||||
| -rw-r--r-- | mgmtd/mgmt_history.c | 54 | ||||
| -rw-r--r-- | mgmtd/mgmt_history.h | 38 | ||||
| -rw-r--r-- | tests/topotests/ospf_metric_propagation/r1/frr.conf | 6 | ||||
| -rw-r--r-- | tests/topotests/ospf_metric_propagation/r2/frr.conf | 6 | ||||
| -rw-r--r-- | tests/topotests/ospf_metric_propagation/r3/frr.conf | 6 | ||||
| -rw-r--r-- | tests/topotests/ospf_metric_propagation/r4/frr.conf | 6 | ||||
| -rw-r--r-- | tests/topotests/ospf_metric_propagation/ra/frr.conf | 6 | ||||
| -rw-r--r-- | tests/topotests/ospf_metric_propagation/rb/frr.conf | 6 | ||||
| -rw-r--r-- | tests/topotests/ospf_metric_propagation/rc/frr.conf | 4 | ||||
| -rw-r--r-- | tests/topotests/ospf_metric_propagation/test_ospf_metric_propagation.py | 39 |
13 files changed, 108 insertions, 82 deletions
diff --git a/mgmtd/mgmt.h b/mgmtd/mgmt.h index 83353e8171..603296bb38 100644 --- a/mgmtd/mgmt.h +++ b/mgmtd/mgmt.h @@ -108,16 +108,4 @@ extern void mgmt_master_init(struct event_loop *master, const int buffer_size); extern void mgmt_init(void); extern void mgmt_vty_init(void); -static inline char *mgmt_realtime_to_string(struct timeval *tv, char *buf, - size_t sz) -{ - struct tm tm; - size_t n; - - localtime_r((const time_t *)&tv->tv_sec, &tm); - n = strftime(buf, sz, "%Y-%m-%dT%H:%M:%S", &tm); - snprintf(&buf[n], sz - n, ",%06u000", (unsigned int)tv->tv_usec); - return buf; -} - #endif /* _FRR_MGMTD_H */ diff --git a/mgmtd/mgmt_ds.h b/mgmtd/mgmt_ds.h index 8d01f3d5b1..2a32eb641a 100644 --- a/mgmtd/mgmt_ds.h +++ b/mgmtd/mgmt_ds.h @@ -28,12 +28,9 @@ for ((id) = MGMTD_DS_NONE; (id) < MGMTD_DS_MAX_ID; (id)++) #define MGMTD_MAX_COMMIT_LIST 10 -#define MGMTD_MD5_HASH_LEN 16 -#define MGMTD_MD5_HASH_STR_HEX_LEN 33 #define MGMTD_COMMIT_FILE_PATH DAEMON_DB_DIR "/commit-%s.json" #define MGMTD_COMMIT_INDEX_FILE_NAME DAEMON_DB_DIR "/commit-index.dat" -#define MGMTD_COMMIT_TIME_STR_LEN 100 extern struct nb_config *running_config; diff --git a/mgmtd/mgmt_fe_adapter.c b/mgmtd/mgmt_fe_adapter.c index abf1f954da..262741b665 100644 --- a/mgmtd/mgmt_fe_adapter.c +++ b/mgmtd/mgmt_fe_adapter.c @@ -1714,7 +1714,7 @@ static void mgmt_fe_adapter_cmt_stats_write(struct vty *vty, struct mgmt_fe_client_adapter *adapter) { - char buf[100] = {0}; + char buf[MGMT_LONG_TIME_MAX_LEN]; if (!mm->perf_stats_en) return; @@ -1795,7 +1795,7 @@ static void mgmt_fe_adapter_setcfg_stats_write(struct vty *vty, struct mgmt_fe_client_adapter *adapter) { - char buf[100] = {0}; + char buf[MGMT_LONG_TIME_MAX_LEN]; if (!mm->perf_stats_en) return; diff --git a/mgmtd/mgmt_history.c b/mgmtd/mgmt_history.c index 2251c49f1c..a49718a490 100644 --- a/mgmtd/mgmt_history.c +++ b/mgmtd/mgmt_history.c @@ -18,8 +18,8 @@ struct mgmt_cmt_info_t { struct mgmt_cmt_infos_item cmts; - char cmtid_str[MGMTD_MD5_HASH_STR_HEX_LEN]; - char time_str[MGMTD_COMMIT_TIME_STR_LEN]; + char cmtid_str[MGMT_SHORT_TIME_MAX_LEN]; + char time_str[MGMT_LONG_TIME_MAX_LEN]; char cmt_json_file[PATH_MAX]; }; @@ -54,36 +54,30 @@ static void mgmt_history_remove_file(char *name) zlog_err("Old commit info deletion failed"); } -static void mgmt_history_hash(const char *input_str, char *hash) +static struct mgmt_cmt_info_t *mgmt_history_new_cmt_info(void) { - int i; - unsigned char digest[MGMTD_MD5_HASH_LEN]; - MD5_CTX ctx; - - memset(&ctx, 0, sizeof(ctx)); - MD5Init(&ctx); - MD5Update(&ctx, input_str, strlen(input_str)); - MD5Final(digest, &ctx); - - for (i = 0; i < MGMTD_MD5_HASH_LEN; i++) - snprintf(&hash[i * 2], MGMTD_MD5_HASH_STR_HEX_LEN, "%02x", - (unsigned int)digest[i]); + struct mgmt_cmt_info_t *new; + struct timespec tv; + struct tm tm; + + new = XCALLOC(MTYPE_MGMTD_CMT_INFO, sizeof(struct mgmt_cmt_info_t)); + + clock_gettime(CLOCK_REALTIME, &tv); + localtime_r(&tv.tv_sec, &tm); + + mgmt_time_to_string(&tv, true, new->time_str, sizeof(new->time_str)); + mgmt_time_to_string(&tv, false, new->cmtid_str, sizeof(new->cmtid_str)); + snprintf(new->cmt_json_file, sizeof(new->cmt_json_file), + MGMTD_COMMIT_FILE_PATH, new->cmtid_str); + + return new; } static struct mgmt_cmt_info_t *mgmt_history_create_cmt_rec(void) { - struct mgmt_cmt_info_t *new; + struct mgmt_cmt_info_t *new = mgmt_history_new_cmt_info(); struct mgmt_cmt_info_t *cmt_info; struct mgmt_cmt_info_t *last_cmt_info = NULL; - struct timeval cmt_recd_tv; - - new = XCALLOC(MTYPE_MGMTD_CMT_INFO, sizeof(struct mgmt_cmt_info_t)); - gettimeofday(&cmt_recd_tv, NULL); - mgmt_realtime_to_string(&cmt_recd_tv, new->time_str, - sizeof(new->time_str)); - mgmt_history_hash(new->time_str, new->cmtid_str); - snprintf(new->cmt_json_file, sizeof(new->cmt_json_file) - 1, - MGMTD_COMMIT_FILE_PATH, new->cmtid_str); if (mgmt_cmt_infos_count(&mm->cmts) == MGMTD_MAX_COMMIT_LIST) { FOREACH_CMT_REC (mm, cmt_info) @@ -106,8 +100,7 @@ mgmt_history_find_cmt_record(const char *cmtid_str) struct mgmt_cmt_info_t *cmt_info; FOREACH_CMT_REC (mm, cmt_info) { - if (strncmp(cmt_info->cmtid_str, cmtid_str, - MGMTD_MD5_HASH_STR_HEX_LEN) == 0) + if (strcmp(cmt_info->cmtid_str, cmtid_str) == 0) return cmt_info; } @@ -282,8 +275,7 @@ int mgmt_history_rollback_by_id(struct vty *vty, const char *cmtid_str) } FOREACH_CMT_REC (mm, cmt_info) { - if (strncmp(cmt_info->cmtid_str, cmtid_str, - MGMTD_MD5_HASH_STR_HEX_LEN) == 0) { + if (strcmp(cmt_info->cmtid_str, cmtid_str) == 0) { ret = mgmt_history_rollback_to_cmt(vty, cmt_info, false); return ret; @@ -349,9 +341,9 @@ void show_mgmt_cmt_history(struct vty *vty) int slno = 0; vty_out(vty, "Last 10 commit history:\n"); - vty_out(vty, " Sl.No\tCommit-ID(HEX)\t\t\t Commit-Record-Time\n"); + vty_out(vty, "Slot Commit-ID Commit-Record-Time\n"); FOREACH_CMT_REC (mm, cmt_info) { - vty_out(vty, " %d\t%s %s\n", slno, cmt_info->cmtid_str, + vty_out(vty, "%4d %23s %s\n", slno, cmt_info->cmtid_str, cmt_info->time_str); slno++; } diff --git a/mgmtd/mgmt_history.h b/mgmtd/mgmt_history.h index 5f96cf90e1..d3f7958952 100644 --- a/mgmtd/mgmt_history.h +++ b/mgmtd/mgmt_history.h @@ -54,4 +54,42 @@ extern void mgmt_history_new_record(struct mgmt_ds_ctx *ds_ctx); extern void mgmt_history_destroy(void); extern void mgmt_history_init(void); +/* + * 012345678901234567890123456789 + * 2023-12-31T12:12:12,012345678 + * 20231231121212012345678 + */ +#define MGMT_LONG_TIME_FMT "%Y-%m-%dT%H:%M:%S" +#define MGMT_LONG_TIME_MAX_LEN 30 +#define MGMT_SHORT_TIME_FMT "%Y%m%d%H%M%S" +#define MGMT_SHORT_TIME_MAX_LEN 24 + +static inline const char * +mgmt_time_to_string(struct timespec *tv, bool long_fmt, char *buffer, size_t sz) +{ + struct tm tm; + size_t n; + + localtime_r(&tv->tv_sec, &tm); + + if (long_fmt) { + n = strftime(buffer, sz, MGMT_LONG_TIME_FMT, &tm); + snprintf(&buffer[n], sz - n, ",%09lu", tv->tv_nsec); + } else { + n = strftime(buffer, sz, MGMT_SHORT_TIME_FMT, &tm); + snprintf(&buffer[n], sz - n, "%09lu", tv->tv_nsec); + } + + return buffer; +} + +static inline const char *mgmt_realtime_to_string(struct timeval *tv, char *buf, + size_t sz) +{ + struct timespec ts = {.tv_sec = tv->tv_sec, + .tv_nsec = tv->tv_usec * 1000}; + + return mgmt_time_to_string(&ts, true, buf, sz); +} + #endif /* _FRR_MGMTD_HISTORY_H_ */ diff --git a/tests/topotests/ospf_metric_propagation/r1/frr.conf b/tests/topotests/ospf_metric_propagation/r1/frr.conf index 9f388dbd0f..85230494dd 100644 --- a/tests/topotests/ospf_metric_propagation/r1/frr.conf +++ b/tests/topotests/ospf_metric_propagation/r1/frr.conf @@ -8,18 +8,18 @@ interface r1-eth0 ip address 10.0.1.1/24 ip ospf cost 100 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface r1-eth1 vrf blue ip address 10.0.10.1/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! ! interface r1-eth2 vrf green ip address 10.0.91.1/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! ! router ospf diff --git a/tests/topotests/ospf_metric_propagation/r2/frr.conf b/tests/topotests/ospf_metric_propagation/r2/frr.conf index 469ae5da88..e67a374ff5 100644 --- a/tests/topotests/ospf_metric_propagation/r2/frr.conf +++ b/tests/topotests/ospf_metric_propagation/r2/frr.conf @@ -8,18 +8,18 @@ interface r2-eth0 ip address 10.0.1.2/24 ip ospf cost 100 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface r2-eth1 vrf blue ip address 10.0.20.2/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface r2-eth2 vrf green ip address 10.0.70.2/24 ip ospf cost 1000 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! router ospf ospf router-id 10.0.255.2 diff --git a/tests/topotests/ospf_metric_propagation/r3/frr.conf b/tests/topotests/ospf_metric_propagation/r3/frr.conf index 8dbbaf0fc4..175851d427 100644 --- a/tests/topotests/ospf_metric_propagation/r3/frr.conf +++ b/tests/topotests/ospf_metric_propagation/r3/frr.conf @@ -8,18 +8,18 @@ interface r3-eth0 ip address 10.0.3.3/24 ip ospf cost 100 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface r3-eth1 vrf blue ip address 10.0.30.3/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface r3-eth2 vrf green ip address 10.0.80.3/24 ip ospf cost 1000 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! router ospf ospf router-id 10.0.255.3 diff --git a/tests/topotests/ospf_metric_propagation/r4/frr.conf b/tests/topotests/ospf_metric_propagation/r4/frr.conf index af1005063b..70a47e34fa 100644 --- a/tests/topotests/ospf_metric_propagation/r4/frr.conf +++ b/tests/topotests/ospf_metric_propagation/r4/frr.conf @@ -8,17 +8,17 @@ interface r4-eth0 ip address 10.0.3.4/24 ip ospf cost 100 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface r4-eth1 vrf blue ip address 10.0.40.4/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface r4-eth2 vrf green ip address 10.0.94.4/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! router ospf ospf router-id 10.0.255.4 diff --git a/tests/topotests/ospf_metric_propagation/ra/frr.conf b/tests/topotests/ospf_metric_propagation/ra/frr.conf index 0bc2ec5679..7be9e5c33e 100644 --- a/tests/topotests/ospf_metric_propagation/ra/frr.conf +++ b/tests/topotests/ospf_metric_propagation/ra/frr.conf @@ -7,17 +7,17 @@ ip forwarding interface ra-eth0 ip address 10.0.50.5/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface ra-eth1 ip address 10.0.10.5/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface ra-eth2 ip address 10.0.20.5/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! router ospf ospf router-id 10.0.255.5 diff --git a/tests/topotests/ospf_metric_propagation/rb/frr.conf b/tests/topotests/ospf_metric_propagation/rb/frr.conf index 6f540d125e..a7dbf82278 100644 --- a/tests/topotests/ospf_metric_propagation/rb/frr.conf +++ b/tests/topotests/ospf_metric_propagation/rb/frr.conf @@ -7,17 +7,17 @@ ip forwarding interface rb-eth0 ip address 10.0.50.6/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface rb-eth1 ip address 10.0.30.6/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface rb-eth2 ip address 10.0.40.6/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! router ospf ospf router-id 10.0.255.6 diff --git a/tests/topotests/ospf_metric_propagation/rc/frr.conf b/tests/topotests/ospf_metric_propagation/rc/frr.conf index 9fc0ef718f..f5a2ed7c4f 100644 --- a/tests/topotests/ospf_metric_propagation/rc/frr.conf +++ b/tests/topotests/ospf_metric_propagation/rc/frr.conf @@ -7,12 +7,12 @@ ip forwarding interface rc-eth0 ip address 10.0.70.7/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! interface rc-eth1 ip address 10.0.80.7/24 ip ospf hello-interval 1 - ip ospf dead-interval 3 + ip ospf dead-interval 30 ! router ospf ospf router-id 10.0.255.7 diff --git a/tests/topotests/ospf_metric_propagation/test_ospf_metric_propagation.py b/tests/topotests/ospf_metric_propagation/test_ospf_metric_propagation.py index 709e07649b..4d78bd2372 100644 --- a/tests/topotests/ospf_metric_propagation/test_ospf_metric_propagation.py +++ b/tests/topotests/ospf_metric_propagation/test_ospf_metric_propagation.py @@ -71,7 +71,6 @@ def build_topo(tgen): tgen.add_router("h1") tgen.add_router("h2") - # Interconect router 1, 2 switch = tgen.add_switch("s1-2") switch.add_link(tgen.gears["r1"]) @@ -127,6 +126,7 @@ def build_topo(tgen): switch.add_link(tgen.gears["r3"]) switch.add_link(tgen.gears["rc"]) + def setup_module(mod): logger.info("OSPF Metric Propagation:\n {}".format(TOPOLOGY)) @@ -148,8 +148,12 @@ def setup_module(mod): for cmd in vrf_setup_cmds: tgen.net["r{}".format(routern)].cmd(cmd) for routern in range(1, 5): - tgen.net["r{}".format(routern)].cmd("ip link set dev r{}-eth1 vrf blue up".format(routern)) - tgen.net["r{}".format(routern)].cmd("ip link set dev r{}-eth2 vrf green up".format(routern)) + tgen.net["r{}".format(routern)].cmd( + "ip link set dev r{}-eth1 vrf blue up".format(routern) + ) + tgen.net["r{}".format(routern)].cmd( + "ip link set dev r{}-eth2 vrf green up".format(routern) + ) for rname, router in router_list.items(): logger.info("Loading router %s" % rname) @@ -181,7 +185,7 @@ def test_all_links_up(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=40, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg @@ -202,7 +206,7 @@ def test_link_1_down(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=20, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg @@ -216,6 +220,10 @@ def test_link_1_2_down(): pytest.skip("skipped because of router(s) failure") tgen.net["r2"].cmd("ip link set dev r2-eth1 down") + tgen.net["r2"].cmd("ip link set dev r2-eth2 down") + # ospf dead-interval is set to 30 seconds, wait 35 seconds to clear the neighbor + sleep(35) + tgen.net["r2"].cmd("ip link set dev r2-eth2 up") r1 = tgen.gears["r1"] json_file = "{}/r1/show_ip_route-3.json".format(CWD) @@ -223,7 +231,7 @@ def test_link_1_2_down(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=20, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg @@ -238,8 +246,8 @@ def test_link_1_2_3_down(): tgen.net["r3"].cmd("ip link set dev r3-eth0 down") tgen.net["r3"].cmd("ip link set dev r3-eth1 down") - # ospf dead-interval is set to 3 seconds, wait 5 seconds to clear the neighbor - sleep(5) + # ospf dead-interval is set to 30 seconds, wait 35 seconds to clear the neighbor + sleep(35) tgen.net["r3"].cmd("ip link set dev r3-eth0 up") r1 = tgen.gears["r1"] @@ -248,11 +256,12 @@ def test_link_1_2_3_down(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=20, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg + def test_link_1_2_3_4_down(): "Test path R1 -> R2 -> Rc -> R3 -> R4" tgen = get_topogen() @@ -268,11 +277,12 @@ def test_link_1_2_3_4_down(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=20, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg + def test_link_1_2_4_down(): "Test path R1 -> R2 -> Rc -> R3 -> R4" tgen = get_topogen() @@ -289,11 +299,12 @@ def test_link_1_2_4_down(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=20, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg + def test_link_1_4_down(): "Test path R1 -> R2 -> Ra -> Rb -> R3 -> R4" tgen = get_topogen() @@ -310,7 +321,7 @@ def test_link_1_4_down(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=20, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg @@ -332,7 +343,7 @@ def test_link_4_down(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=20, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg @@ -354,7 +365,7 @@ def test_link_1_2_3_4_up(): test_func = partial( topotest.router_json_cmp, r1, "show ip route vrf green 10.0.94.2 json", expected ) - _, result = topotest.run_and_expect(test_func, None, count=20, wait=1) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=1) assertmsg = "r1 JSON output mismatches" assert result is None, assertmsg |
