diff options
59 files changed, 702 insertions, 535 deletions
diff --git a/babeld/babel_zebra.c b/babeld/babel_zebra.c index d0da93e507..daaa870a64 100644 --- a/babeld/babel_zebra.c +++ b/babeld/babel_zebra.c @@ -225,6 +225,8 @@ DEFUN_NOSH (show_debugging_babel, debug_babel_config_write(vty); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/bfdd/bfdd_vty.c b/bfdd/bfdd_vty.c index 21429f06cf..4a2c5bf662 100644 --- a/bfdd/bfdd_vty.c +++ b/bfdd/bfdd_vty.c @@ -973,6 +973,8 @@ DEFUN_NOSH(show_debugging_bfd, if (bglobal.debug_network) vty_out(vty, " Network layer debugging is on.\n"); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index 4963ea64d0..41ae6ef49c 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -80,14 +80,6 @@ #define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE 1 #define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE_LENGTH 6 -/* SRv6 SID Structure default values */ -#define BGP_PREFIX_SID_SRV6_LOCATOR_BLOCK_LENGTH 40 -#define BGP_PREFIX_SID_SRV6_LOCATOR_NODE_LENGTH 24 -#define BGP_PREFIX_SID_SRV6_FUNCTION_LENGTH 16 -#define BGP_PREFIX_SID_SRV6_ARGUMENT_LENGTH 0 -#define BGP_PREFIX_SID_SRV6_TRANSPOSITION_LENGTH 16 -#define BGP_PREFIX_SID_SRV6_TRANSPOSITION_OFFSET 64 - #define BGP_ATTR_NH_AFI(afi, attr) \ ((afi != AFI_L2VPN) ? afi : \ ((attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4) ? AFI_IP : AFI_IP6)) diff --git a/bgpd/bgp_debug.c b/bgpd/bgp_debug.c index df7262be64..264dd85fbc 100644 --- a/bgpd/bgp_debug.c +++ b/bgpd/bgp_debug.c @@ -2278,6 +2278,8 @@ DEFUN_NOSH (show_debugging_bgp, vty_out(vty, " BGP conditional advertisement debugging is on\n"); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index d7fd4bc77e..08748d2eba 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -524,37 +524,77 @@ static bool sid_exist(struct bgp *bgp, const struct in6_addr *sid) * else: try to allocate as auto-mode */ static uint32_t alloc_new_sid(struct bgp *bgp, uint32_t index, - struct in6_addr *sid_locator, + struct srv6_locator_chunk *sid_locator_chunk, struct in6_addr *sid) { + int debug = BGP_DEBUG(vpn, VPN_LEAK_LABEL); struct listnode *node; struct srv6_locator_chunk *chunk; bool alloced = false; int label = 0; uint8_t offset = 0; - uint8_t len = 0; + uint8_t func_len = 0, shift_len = 0; + uint32_t index_max = 0; - if (!bgp || !sid_locator || !sid) + if (!bgp || !sid_locator_chunk || !sid) return false; for (ALL_LIST_ELEMENTS_RO(bgp->srv6_locator_chunks, node, chunk)) { - *sid_locator = chunk->prefix.prefix; + if (chunk->function_bits_length > + BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH) { + if (debug) + zlog_debug( + "%s: invalid SRv6 Locator chunk (%pFX): Function Length must be less or equal to %d", + __func__, &chunk->prefix, + BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH); + continue; + } + + index_max = (1 << chunk->function_bits_length) - 1; + + if (index > index_max) { + if (debug) + zlog_debug( + "%s: skipped SRv6 Locator chunk (%pFX): Function Length is too short to support specified index (%u)", + __func__, &chunk->prefix, index); + continue; + } + *sid = chunk->prefix.prefix; + *sid_locator_chunk = *chunk; offset = chunk->block_bits_length + chunk->node_bits_length; - len = chunk->function_bits_length ?: 16; + func_len = chunk->function_bits_length; + shift_len = BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH - func_len; if (index != 0) { - label = index << 12; - transpose_sid(sid, label, offset, len); + label = index << shift_len; + if (label < MPLS_LABEL_UNRESERVED_MIN) { + if (debug) + zlog_debug( + "%s: skipped to allocate SRv6 SID (%pFX): Label (%u) is too small to use", + __func__, &chunk->prefix, + label); + continue; + } + + transpose_sid(sid, label, offset, func_len); if (sid_exist(bgp, sid)) - return false; + continue; alloced = true; break; } - for (size_t i = 1; i < 255; i++) { - label = i << 12; - transpose_sid(sid, label, offset, len); + for (uint32_t i = 1; i < index_max; i++) { + label = i << shift_len; + if (label < MPLS_LABEL_UNRESERVED_MIN) { + if (debug) + zlog_debug( + "%s: skipped to allocate SRv6 SID (%pFX): Label (%u) is too small to use", + __func__, &chunk->prefix, + label); + continue; + } + transpose_sid(sid, label, offset, func_len); if (sid_exist(bgp, sid)) continue; alloced = true; @@ -573,7 +613,8 @@ void ensure_vrf_tovpn_sid(struct bgp *bgp_vpn, struct bgp *bgp_vrf, afi_t afi) { int debug = BGP_DEBUG(vpn, VPN_LEAK_FROM_VRF); char buf[256]; - struct in6_addr *tovpn_sid, *tovpn_sid_locator; + struct srv6_locator_chunk *tovpn_sid_locator; + struct in6_addr *tovpn_sid; uint32_t tovpn_sid_index = 0, tovpn_sid_transpose_label; bool tovpn_sid_auto = false; @@ -607,8 +648,7 @@ void ensure_vrf_tovpn_sid(struct bgp *bgp_vpn, struct bgp *bgp_vrf, afi_t afi) return; } - tovpn_sid_locator = - XCALLOC(MTYPE_BGP_SRV6_SID, sizeof(struct in6_addr)); + tovpn_sid_locator = srv6_locator_chunk_alloc(); tovpn_sid = XCALLOC(MTYPE_BGP_SRV6_SID, sizeof(struct in6_addr)); tovpn_sid_transpose_label = alloc_new_sid(bgp_vpn, tovpn_sid_index, @@ -617,7 +657,7 @@ void ensure_vrf_tovpn_sid(struct bgp *bgp_vpn, struct bgp *bgp_vrf, afi_t afi) if (tovpn_sid_transpose_label == 0) { zlog_debug("%s: not allocated new sid for vrf %s: afi %s", __func__, bgp_vrf->name_pretty, afi2str(afi)); - XFREE(MTYPE_BGP_SRV6_SID, tovpn_sid_locator); + srv6_locator_chunk_free(tovpn_sid_locator); XFREE(MTYPE_BGP_SRV6_SID, tovpn_sid); return; } @@ -636,20 +676,30 @@ void ensure_vrf_tovpn_sid(struct bgp *bgp_vpn, struct bgp *bgp_vrf, afi_t afi) } /* - * This function shifts "label" 4 bits to the right and - * embeds it by length "len", starting at offset "offset" - * as seen from the MSB (Most Significant Bit) of "sid". + * This function embeds upper `len` bits of `label` in `sid`, + * starting at offset `offset` as seen from the MSB of `sid`. * - * e.g. if "label" is 0x1000 and "len" is 16, "label" is - * embedded in "sid" as follows: + * e.g. Given that `label` is 0x12345 and `len` is 16, + * then `label` will be embedded in `sid` as follows: * * <---- len -----> - * label: 0000 0001 0000 0000 0000 - * sid: .... 0000 0001 0000 0000 + * label: 0001 0002 0003 0004 0005 + * sid: .... 0001 0002 0003 0004 * <---- len -----> * ^ * | * offset from MSB + * + * e.g. Given that `label` is 0x12345 and `len` is 8, + * `label` will be embedded in `sid` as follows: + * + * <- len -> + * label: 0001 0002 0003 0004 0005 + * sid: .... 0001 0002 0000 0000 + * <- len -> + * ^ + * | + * offset from MSB */ void transpose_sid(struct in6_addr *sid, uint32_t label, uint8_t offset, uint8_t len) @@ -657,7 +707,7 @@ void transpose_sid(struct in6_addr *sid, uint32_t label, uint8_t offset, for (uint8_t idx = 0; idx < len; idx++) { uint8_t tidx = offset + idx; sid->s6_addr[tidx / 8] &= ~(0x1 << (7 - tidx % 8)); - if (label >> (len + 3 - idx) & 0x1) + if (label >> (19 - idx) & 0x1) sid->s6_addr[tidx / 8] |= 0x1 << (7 - tidx % 8); } } @@ -1252,19 +1302,29 @@ void vpn_leak_from_vrf_update(struct bgp *to_bgp, /* to */ static_attr.srv6_l3vpn->sid_flags = 0x00; static_attr.srv6_l3vpn->endpoint_behavior = 0xffff; static_attr.srv6_l3vpn->loc_block_len = - BGP_PREFIX_SID_SRV6_LOCATOR_BLOCK_LENGTH; + from_bgp->vpn_policy[afi] + .tovpn_sid_locator->block_bits_length; static_attr.srv6_l3vpn->loc_node_len = - BGP_PREFIX_SID_SRV6_LOCATOR_NODE_LENGTH; + from_bgp->vpn_policy[afi] + .tovpn_sid_locator->node_bits_length; static_attr.srv6_l3vpn->func_len = - BGP_PREFIX_SID_SRV6_FUNCTION_LENGTH; + from_bgp->vpn_policy[afi] + .tovpn_sid_locator->function_bits_length; static_attr.srv6_l3vpn->arg_len = - BGP_PREFIX_SID_SRV6_ARGUMENT_LENGTH; + from_bgp->vpn_policy[afi] + .tovpn_sid_locator->argument_bits_length; static_attr.srv6_l3vpn->transposition_len = - BGP_PREFIX_SID_SRV6_TRANSPOSITION_LENGTH; + from_bgp->vpn_policy[afi] + .tovpn_sid_locator->function_bits_length; static_attr.srv6_l3vpn->transposition_offset = - BGP_PREFIX_SID_SRV6_TRANSPOSITION_OFFSET; + from_bgp->vpn_policy[afi] + .tovpn_sid_locator->block_bits_length + + from_bgp->vpn_policy[afi] + .tovpn_sid_locator->node_bits_length; + ; memcpy(&static_attr.srv6_l3vpn->sid, - from_bgp->vpn_policy[afi].tovpn_sid_locator, + &from_bgp->vpn_policy[afi] + .tovpn_sid_locator->prefix.prefix, sizeof(struct in6_addr)); } diff --git a/bgpd/bgp_mplsvpn.h b/bgpd/bgp_mplsvpn.h index c5cc7d4294..46607a38c4 100644 --- a/bgpd/bgp_mplsvpn.h +++ b/bgpd/bgp_mplsvpn.h @@ -41,6 +41,8 @@ #define V4_HEADER_OVERLAY \ " Network Next Hop EthTag Overlay Index RouterMac\n" +#define BGP_PREFIX_SID_SRV6_MAX_FUNCTION_LENGTH 20 + extern void bgp_mplsvpn_init(void); extern int bgp_nlri_parse_vpn(struct peer *, struct attr *, struct bgp_nlri *); extern uint32_t decode_label(mpls_label_t *); diff --git a/bgpd/bgp_rpki.c b/bgpd/bgp_rpki.c index e03853d187..cb7afd8967 100644 --- a/bgpd/bgp_rpki.c +++ b/bgpd/bgp_rpki.c @@ -1688,7 +1688,7 @@ DEFUN_YANG (no_match_rpki, const char *xpath = "./match-condition[condition='frr-bgp-route-map:rpki']"; - nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); return nb_cli_apply_changes(vty, NULL); } diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index de810aa195..89010b61bb 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -295,10 +295,9 @@ static int bgp_srv6_locator_unset(struct bgp *bgp) { int ret; struct listnode *node, *nnode; - struct srv6_locator_chunk *chunk; + struct srv6_locator_chunk *chunk, *tovpn_sid_locator; struct bgp_srv6_function *func; struct bgp *bgp_vrf; - struct in6_addr *tovpn_sid; /* release chunk notification via ZAPI */ ret = bgp_zebra_srv6_manager_release_locator_chunk( @@ -324,16 +323,12 @@ static int bgp_srv6_locator_unset(struct bgp *bgp) continue; /* refresh vpnv4 tovpn_sid */ - tovpn_sid = bgp_vrf->vpn_policy[AFI_IP].tovpn_sid; - if (tovpn_sid) - XFREE(MTYPE_BGP_SRV6_SID, - bgp_vrf->vpn_policy[AFI_IP].tovpn_sid); + XFREE(MTYPE_BGP_SRV6_SID, + bgp_vrf->vpn_policy[AFI_IP].tovpn_sid); /* refresh vpnv6 tovpn_sid */ - tovpn_sid = bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid; - if (tovpn_sid) - XFREE(MTYPE_BGP_SRV6_SID, - bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid); + XFREE(MTYPE_BGP_SRV6_SID, + bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid); } /* update vpn bgp processes */ @@ -345,12 +340,20 @@ static int bgp_srv6_locator_unset(struct bgp *bgp) continue; /* refresh vpnv4 tovpn_sid_locator */ - XFREE(MTYPE_BGP_SRV6_SID, - bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator); + tovpn_sid_locator = + bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator; + if (tovpn_sid_locator) { + srv6_locator_chunk_free(tovpn_sid_locator); + bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator = NULL; + } /* refresh vpnv6 tovpn_sid_locator */ - XFREE(MTYPE_BGP_SRV6_SID, - bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator); + tovpn_sid_locator = + bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator; + if (tovpn_sid_locator) { + srv6_locator_chunk_free(tovpn_sid_locator); + bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator = NULL; + } } /* clear locator name */ @@ -8895,7 +8898,7 @@ DEFPY (af_label_vpn_export, DEFPY (af_sid_vpn_export, af_sid_vpn_export_cmd, - "[no] sid vpn export <(1-255)$sid_idx|auto$sid_auto>", + "[no] sid vpn export <(1-1048575)$sid_idx|auto$sid_auto>", NO_STR "sid value for VRF\n" "Between current address-family and vpn\n" diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 57a859c61d..209fe1ace4 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -3255,10 +3255,10 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS) struct srv6_locator loc = {}; struct bgp *bgp = bgp_get_default(); struct listnode *node, *nnode; - struct srv6_locator_chunk *chunk; + struct srv6_locator_chunk *chunk, *tovpn_sid_locator; struct bgp_srv6_function *func; struct bgp *bgp_vrf; - struct in6_addr *tovpn_sid, *tovpn_sid_locator; + struct in6_addr *tovpn_sid; struct prefix_ipv6 tmp_prefi; if (zapi_srv6_locator_decode(zclient->ibuf, &loc) < 0) @@ -3327,10 +3327,13 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS) if (tovpn_sid_locator) { tmp_prefi.family = AF_INET6; tmp_prefi.prefixlen = IPV6_MAX_BITLEN; - tmp_prefi.prefix = *tovpn_sid_locator; + tmp_prefi.prefix = tovpn_sid_locator->prefix.prefix; if (prefix_match((struct prefix *)&loc.prefix, - (struct prefix *)&tmp_prefi)) - XFREE(MTYPE_BGP_SRV6_SID, tovpn_sid_locator); + (struct prefix *)&tmp_prefi)) { + srv6_locator_chunk_free(tovpn_sid_locator); + bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator = + NULL; + } } /* refresh vpnv6 tovpn_sid_locator */ @@ -3339,10 +3342,13 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS) if (tovpn_sid_locator) { tmp_prefi.family = AF_INET6; tmp_prefi.prefixlen = IPV6_MAX_BITLEN; - tmp_prefi.prefix = *tovpn_sid_locator; + tmp_prefi.prefix = tovpn_sid_locator->prefix.prefix; if (prefix_match((struct prefix *)&loc.prefix, - (struct prefix *)&tmp_prefi)) - XFREE(MTYPE_BGP_SRV6_SID, tovpn_sid_locator); + (struct prefix *)&tmp_prefi)) { + srv6_locator_chunk_free(tovpn_sid_locator); + bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator = + NULL; + } } } diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index af46550650..7fc9c5c1ce 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -239,7 +239,7 @@ struct vpn_policy { */ uint32_t tovpn_sid_index; /* unset => set to 0 */ struct in6_addr *tovpn_sid; - struct in6_addr *tovpn_sid_locator; + struct srv6_locator_chunk *tovpn_sid_locator; uint32_t tovpn_sid_transpose_label; struct in6_addr *tovpn_zebra_vrf_sid_last_sent; }; diff --git a/doc/user/zebra.rst b/doc/user/zebra.rst index 05990e2523..01cf5316a3 100644 --- a/doc/user/zebra.rst +++ b/doc/user/zebra.rst @@ -745,7 +745,7 @@ and this section also helps that case. Create a new locator. If the name of an existing locator is specified, move to specified locator's configuration node to change the settings it. -.. clicmd:: prefix X:X::X:X/M [func-bits 32] +.. clicmd:: prefix X:X::X:X/M [func-bits (0-64)] Set the ipv6 prefix block of the locator. SRv6 locator is defined by RFC8986. The actual routing protocol specifies the locator and allocates a diff --git a/eigrpd/eigrp_dump.c b/eigrpd/eigrp_dump.c index e1ad51a9db..b0d34f55e6 100644 --- a/eigrpd/eigrp_dump.c +++ b/eigrpd/eigrp_dump.c @@ -322,6 +322,7 @@ DEFUN_NOSH (show_debugging_eigrp, } } + cmd_show_lib_debugs(vty); return CMD_SUCCESS; } diff --git a/isisd/isisd.c b/isisd/isisd.c index 54e6be5970..0ff31df0f8 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -1700,6 +1700,8 @@ DEFUN_NOSH (show_debugging, if (IS_DEBUG_LFA) print_debug(vty, DEBUG_LFA, 1); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/ldpd/ldp_vty_cmds.c b/ldpd/ldp_vty_cmds.c index 11d6930f06..3795cdaf38 100644 --- a/ldpd/ldp_vty_cmds.c +++ b/ldpd/ldp_vty_cmds.c @@ -774,7 +774,11 @@ DEFPY_NOSH (ldp_show_debugging_mpls_ldp, "MPLS information\n" "Label Distribution Protocol\n") { - return (ldp_vty_show_debugging(vty)); + ldp_vty_show_debugging(vty); + + cmd_show_lib_debugs(vty); + + return CMD_SUCCESS; } static void diff --git a/lib/command.c b/lib/command.c index a23afb1e43..7e171cb309 100644 --- a/lib/command.c +++ b/lib/command.c @@ -48,6 +48,7 @@ #include "lib_errors.h" #include "northbound_cli.h" #include "network.h" +#include "routemap.h" #include "frrscript.h" @@ -2446,6 +2447,11 @@ const char *host_config_get(void) return host.config; } +void cmd_show_lib_debugs(struct vty *vty) +{ + route_map_show_debug(vty); +} + void install_default(enum node_type node) { _install_element(node, &config_exit_cmd); diff --git a/lib/command.h b/lib/command.h index 70e52708a7..ca49efd262 100644 --- a/lib/command.h +++ b/lib/command.h @@ -649,6 +649,12 @@ extern char *cmd_variable_comp2str(vector comps, unsigned short cols); extern void command_setup_early_logging(const char *dest, const char *level); +/* + * Allow a mechanism for `debug XXX` commands that live + * under the lib directory to output their debug status + */ +extern void cmd_show_lib_debugs(struct vty *vty); + #ifdef __cplusplus } #endif diff --git a/lib/routemap.c b/lib/routemap.c index 3cc010c148..3a92799991 100644 --- a/lib/routemap.c +++ b/lib/routemap.c @@ -3174,6 +3174,12 @@ static struct cmd_node rmap_debug_node = { .config_write = rmap_config_write_debug, }; +void route_map_show_debug(struct vty *vty) +{ + if (rmap_debug) + vty_out(vty, "debug route-map\n"); +} + /* Configuration write function. */ static int rmap_config_write_debug(struct vty *vty) { diff --git a/lib/routemap.h b/lib/routemap.h index a365925854..c2e9de6cfb 100644 --- a/lib/routemap.h +++ b/lib/routemap.h @@ -1015,6 +1015,8 @@ extern void route_map_optimization_disabled_show(struct vty *vty, bool show_defaults); extern void route_map_cli_init(void); +extern void route_map_show_debug(struct vty *vty); + #ifdef __cplusplus } #endif diff --git a/nhrpd/nhrp_vty.c b/nhrpd/nhrp_vty.c index 3a8baa2342..53ba9eb12f 100644 --- a/nhrpd/nhrp_vty.c +++ b/nhrpd/nhrp_vty.c @@ -126,6 +126,8 @@ DEFUN_NOSH(show_debugging_nhrp, show_debugging_nhrp_cmd, debug_flags_desc[i].str); } + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/ospf6d/ospf6d.c b/ospf6d/ospf6d.c index a16f4f73eb..fe742b912f 100644 --- a/ospf6d/ospf6d.c +++ b/ospf6d/ospf6d.c @@ -115,6 +115,8 @@ DEFUN_NOSH (show_debugging_ospf6, config_write_ospf6_debug(vty); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/ospfd/ospf_dump.c b/ospfd/ospf_dump.c index 9b347891ec..9f6adf3226 100644 --- a/ospfd/ospf_dump.c +++ b/ospfd/ospf_dump.c @@ -1812,7 +1812,11 @@ DEFUN_NOSH (show_debugging_ospf, DEBUG_STR OSPF_STR) { - return show_debugging_ospf_common(vty); + show_debugging_ospf_common(vty); + + cmd_show_lib_debugs(vty); + + return CMD_SUCCESS; } DEFUN_NOSH (show_debugging_ospf_instance, @@ -1830,7 +1834,11 @@ DEFUN_NOSH (show_debugging_ospf_instance, if (instance != ospf_instance) return CMD_NOT_MY_INSTANCE; - return show_debugging_ospf_common(vty); + show_debugging_ospf_common(vty); + + cmd_show_lib_debugs(vty); + + return CMD_SUCCESS; } static int config_write_debug(struct vty *vty); diff --git a/pathd/path_cli.c b/pathd/path_cli.c index 4775aa36fb..13e52ac86b 100644 --- a/pathd/path_cli.c +++ b/pathd/path_cli.c @@ -1092,6 +1092,8 @@ DEFPY_NOSH(show_debugging_pathd, show_debugging_pathd_cmd, "State of each debugging option\n" "pathd module debugging\n") { + + cmd_show_lib_debugs(vty); /* nothing to do here */ return CMD_SUCCESS; } diff --git a/pbrd/pbr_vty.c b/pbrd/pbr_vty.c index a2b3431b94..6f53adb334 100644 --- a/pbrd/pbr_vty.c +++ b/pbrd/pbr_vty.c @@ -1243,6 +1243,8 @@ DEFUN_NOSH(show_debugging_pbr, pbr_debug_config_write_helper(vty, false); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index 49248798bf..f6b370cee3 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -1558,6 +1558,8 @@ DEFUN_NOSH (show_debugging_pimv6, pim_debug_config_write(vty); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index c2f7396c18..1ac22f38a3 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -963,7 +963,7 @@ static void pim_show_bsm_db(struct pim_instance *pim, struct vty *vty, bool uj) bsm_rpinfo = (struct bsmmsg_rpinfo *)buf; /* unaligned, again */ - memcpy(&rp_addr, &bsm_rpinfo->rpaddr, + memcpy(&rp_addr, &bsm_rpinfo->rpaddr.addr, sizeof(rp_addr)); buf += sizeof(struct bsmmsg_rpinfo); @@ -4906,6 +4906,7 @@ DEFUN_NOSH (show_debugging_pim, pim_debug_config_write(vty); + cmd_show_lib_debugs(vty); return CMD_SUCCESS; } diff --git a/ripd/rip_debug.c b/ripd/rip_debug.c index 871ee8e87e..ded62812a7 100644 --- a/ripd/rip_debug.c +++ b/ripd/rip_debug.c @@ -55,6 +55,8 @@ DEFUN_NOSH (show_debugging_rip, if (IS_RIP_DEBUG_ZEBRA) vty_out(vty, " RIP zebra debugging is on\n"); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/ripngd/ripng_debug.c b/ripngd/ripng_debug.c index 539c01b3ec..d36327cb76 100644 --- a/ripngd/ripng_debug.c +++ b/ripngd/ripng_debug.c @@ -56,6 +56,8 @@ DEFUN_NOSH (show_debugging_ripng, if (IS_RIPNG_DEBUG_ZEBRA) vty_out(vty, " RIPng zebra debugging is on\n"); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/sharpd/sharp_vty.c b/sharpd/sharp_vty.c index 3853df7cb0..9b900fccd2 100644 --- a/sharpd/sharp_vty.c +++ b/sharpd/sharp_vty.c @@ -615,6 +615,8 @@ DEFUN_NOSH (show_debugging_sharpd, { vty_out(vty, "Sharp debugging status:\n"); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/staticd/static_vty.c b/staticd/static_vty.c index c0ace0e258..c0638f4bc4 100644 --- a/staticd/static_vty.c +++ b/staticd/static_vty.c @@ -1301,6 +1301,8 @@ DEFUN_NOSH (show_debugging_static, static_debug_status_write(vty); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/tests/topotests/bgp_basic_functionality_topo1/test_bgp_basic_functionality.py b/tests/topotests/bgp_basic_functionality_topo1/test_bgp_basic_functionality.py index b18e32f6bd..42b9b8adb9 100644 --- a/tests/topotests/bgp_basic_functionality_topo1/test_bgp_basic_functionality.py +++ b/tests/topotests/bgp_basic_functionality_topo1/test_bgp_basic_functionality.py @@ -121,7 +121,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.15") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.15") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) @@ -1148,9 +1148,9 @@ def test_bgp_with_loopback_with_same_subnet_p1(request): tgen, addr_type, dut, input_dict_r1, expected=False ) # pylint: disable=E1123 assert result is not True, ( - "Testcase {} : Failed \n".format(tc_name) - + "Expected behavior: routes should not present in fib \n" - + "Error: {}".format(result) + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) step("Verify Ipv4 and Ipv6 network installed in r3 RIB but not in FIB") @@ -1169,9 +1169,9 @@ def test_bgp_with_loopback_with_same_subnet_p1(request): tgen, addr_type, dut, input_dict_r1, expected=False ) # pylint: disable=E1123 assert result is not True, ( - "Testcase {} : Failed \n".format(tc_name) - + "Expected behavior: routes should not present in fib \n" - + "Error: {}".format(result) + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) write_test_footer(tc_name) diff --git a/tests/topotests/bgp_communities_topo1/test_bgp_communities.py b/tests/topotests/bgp_communities_topo1/test_bgp_communities.py index e4c25ff5cb..1c1a5cdfe4 100644 --- a/tests/topotests/bgp_communities_topo1/test_bgp_communities.py +++ b/tests/topotests/bgp_communities_topo1/test_bgp_communities.py @@ -83,7 +83,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.15") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >= 4.15") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) @@ -317,17 +317,18 @@ def test_bgp_no_advertise_community_p0(request): ) result = verify_bgp_rib(tgen, addr_type, dut, input_dict, expected=False) - assert result is not True, "Testcase {} : Failed \n ".format( - tc_name - ) + " Routes still present in R3 router. Error: {}".format(result) + assert result is not True, ( + "Testcase {} : Failed \n Expected: " + "Routes still present in {} router. Found: {}".format(tc_name, dut, result) + ) result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) assert ( result is not True - ), "Testcase {} : Failed \n Routes still present in R3 router. Error: {}".format( - tc_name, result + ), "Testcase {} : Failed \n Expected: Routes still present in {} router. Found: {}".format( + tc_name, dut, result ) step("Remove and Add no advertise community") diff --git a/tests/topotests/bgp_communities_topo1/test_bgp_communities_topo2.py b/tests/topotests/bgp_communities_topo1/test_bgp_communities_topo2.py index f6ee9ea795..a93061740f 100644 --- a/tests/topotests/bgp_communities_topo1/test_bgp_communities_topo2.py +++ b/tests/topotests/bgp_communities_topo1/test_bgp_communities_topo2.py @@ -87,7 +87,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.14") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >= 4.14") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) @@ -305,8 +305,10 @@ def test_bgp_no_export_local_as_and_internet_communities_p0(request): ], expected=False, ) - assert result is not True, "Testcase {} : Failed \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes are still present in rib of r3 \n " + "Found: {}".format(tc_name, result) ) step("Remove route-map from redistribute static on R1") diff --git a/tests/topotests/bgp_ecmp_topo2/test_ebgp_ecmp_topo2.py b/tests/topotests/bgp_ecmp_topo2/test_ebgp_ecmp_topo2.py index 2784e956fa..8fd0120dd8 100644 --- a/tests/topotests/bgp_ecmp_topo2/test_ebgp_ecmp_topo2.py +++ b/tests/topotests/bgp_ecmp_topo2/test_ebgp_ecmp_topo2.py @@ -90,7 +90,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.15") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.15") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) @@ -436,7 +436,9 @@ def test_ecmp_remove_redistribute_static(request): ) assert ( result is not True - ), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name) + ), "Testcase {} : Failed \n Expected: Routes still present in {} RIB. Found: {}".format( + tc_name, dut, result + ) logger.info("Enable redistribute static") input_dict_2 = { @@ -621,7 +623,9 @@ def test_ecmp_remove_static_route(request): ) assert ( result is not True - ), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name) + ), "Testcase {} : Failed \n Expected: Routes still present in {} RIB. Found: {}".format( + tc_name, dut, result + ) for addr_type in ADDR_TYPES: # Enable static routes @@ -727,7 +731,9 @@ def test_ecmp_remove_nw_advertise(request): ) assert ( result is not True - ), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name) + ), "Testcase {} : Failed \n Expected: Routes still present in {} RIB. Found: {}".format( + tc_name, dut, result + ) static_or_nw(tgen, topo, tc_name, "advertise_nw", "r2") for addr_type in ADDR_TYPES: diff --git a/tests/topotests/bgp_ecmp_topo2/test_ibgp_ecmp_topo2.py b/tests/topotests/bgp_ecmp_topo2/test_ibgp_ecmp_topo2.py index 704e8fdf04..185a086838 100644 --- a/tests/topotests/bgp_ecmp_topo2/test_ibgp_ecmp_topo2.py +++ b/tests/topotests/bgp_ecmp_topo2/test_ibgp_ecmp_topo2.py @@ -90,7 +90,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.15") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.15") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) @@ -437,7 +437,9 @@ def test_ecmp_remove_redistribute_static(request): ) assert ( result is not True - ), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name) + ), "Testcase {} : Failed \n Expected: Routes still present in {} RIB. Found: {}".format( + tc_name, dut, result + ) logger.info("Enable redistribute static") input_dict_2 = { @@ -622,7 +624,9 @@ def test_ecmp_remove_static_route(request): ) assert ( result is not True - ), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name) + ), "Testcase {} : Failed \n Expected: Routes still present in {} RIB. Found: {}".format( + tc_name, dut, result + ) for addr_type in ADDR_TYPES: # Enable static routes @@ -730,7 +734,9 @@ def test_ecmp_remove_nw_advertise(request): ) assert ( result is not True - ), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name) + ), "Testcase {} : Failed \n Expected: Routes still present in {} RIB. Found: {}".format( + tc_name, dut, result + ) static_or_nw(tgen, topo, tc_name, "advertise_nw", "r2") for addr_type in ADDR_TYPES: diff --git a/tests/topotests/bgp_ecmp_topo3/test_ibgp_ecmp_topo3.py b/tests/topotests/bgp_ecmp_topo3/test_ibgp_ecmp_topo3.py index 2a51dc83ef..9b6480c0d3 100644 --- a/tests/topotests/bgp_ecmp_topo3/test_ibgp_ecmp_topo3.py +++ b/tests/topotests/bgp_ecmp_topo3/test_ibgp_ecmp_topo3.py @@ -240,17 +240,18 @@ def test_ecmp_fast_convergence(request, test_type, tgen, topo): logger.info("Ensure BGP has processed the cli") r2 = tgen.gears["r2"] output = r2.vtysh_cmd("show run") - verify = re.search(r"fast-convergence", output ) - assert verify is not None, ( - "r2 does not have the fast convergence command yet") + verify = re.search(r"fast-convergence", output) + assert verify is not None, "r2 does not have the fast convergence command yet" logger.info("Shutdown one link b/w r2 and r3") shutdown_bringup_interface(tgen, "r2", intf1, False) logger.info("Verify bgp neighbors goes down immediately") result = verify_bgp_convergence(tgen, topo, dut="r2", expected=False) - assert result is not True, "Testcase {} : Failed \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: BGP should not be converged for {} \n " + "Found: {}".format(tc_name, "r2", result) ) logger.info("Shutdown second link b/w r2 and r3") @@ -258,8 +259,10 @@ def test_ecmp_fast_convergence(request, test_type, tgen, topo): logger.info("Verify bgp neighbors goes down immediately") result = verify_bgp_convergence(tgen, topo, dut="r2", expected=False) - assert result is not True, "Testcase {} : Failed \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: BGP should not be converged for {} \n " + "Found: {}".format(tc_name, "r2", result) ) write_test_footer(tc_name) diff --git a/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-1.py b/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-1.py index f155325502..deca4bcfd7 100644 --- a/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-1.py +++ b/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-1.py @@ -160,7 +160,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) @@ -1033,11 +1033,9 @@ def test_BGP_GR_TC_4_p0(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes result = verify_rib( @@ -1045,9 +1043,9 @@ def test_BGP_GR_TC_4_p0(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) logger.info("[Phase 5] : R2 is about to come up now ") start_router_daemons(tgen, "r2", ["bgpd"]) @@ -1506,10 +1504,10 @@ def test_BGP_GR_TC_6_1_2_p1(request): result = verify_r_bit( tgen, topo, addr_type, input_dict, dut="r2", peer="r1", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r2: R-bit is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: R-bit should not be set to True in r2\n" + "Found: {}".format(tc_name, result) ) logger.info("Restart BGPd on R2 ") @@ -1528,10 +1526,10 @@ def test_BGP_GR_TC_6_1_2_p1(request): result = verify_r_bit( tgen, topo, addr_type, input_dict, dut="r2", peer="r1", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r2: R-bit is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: R-bit should not be set to True in r2\n" + "Found: {}".format(tc_name, result) ) write_test_footer(tc_name) diff --git a/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-2.py b/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-2.py index dda3bd4b30..a92fde2d0d 100644 --- a/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-2.py +++ b/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-2.py @@ -160,7 +160,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) diff --git a/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-3.py b/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-3.py index e4b533b295..b0166033df 100644 --- a/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-3.py +++ b/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-3.py @@ -160,7 +160,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) @@ -829,11 +829,9 @@ def test_BGP_GR_TC_20_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes result = verify_rib( @@ -841,9 +839,9 @@ def test_BGP_GR_TC_20_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) logger.info("[Phase 5] : R2 is about to come up now ") @@ -1117,7 +1115,8 @@ def test_BGP_GR_TC_31_1_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) logger.info("[Phase 4] : R1 is about to come up now ") @@ -1599,11 +1598,9 @@ def test_BGP_GR_TC_9_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes protocol = "bgp" @@ -1612,9 +1609,9 @@ def test_BGP_GR_TC_9_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) logger.info("[Phase 5] : R2 is about to come up now ") start_router_daemons(tgen, "r2", ["bgpd"]) @@ -1643,10 +1640,10 @@ def test_BGP_GR_TC_9_p1(request): result = verify_f_bit( tgen, topo, addr_type, input_dict, dut="r1", peer="r2", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r1: F-bit is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: F-bit should not be set to True in r1\n" + "Found: {}".format(tc_name, result) ) write_test_footer(tc_name) @@ -1781,11 +1778,9 @@ def test_BGP_GR_TC_17_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes protocol = "bgp" @@ -1794,9 +1789,9 @@ def test_BGP_GR_TC_17_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) logger.info("[Phase 5] : R2 is about to come up now ") start_router_daemons(tgen, "r2", ["bgpd"]) @@ -1817,10 +1812,10 @@ def test_BGP_GR_TC_17_p1(request): result = verify_r_bit( tgen, topo, addr_type, input_dict, dut="r1", peer="r2", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r1: R-bit is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: R-bit should not be set to True in r1\n" + "Found: {}".format(tc_name, result) ) # Verifying BGP RIB routes @@ -2026,10 +2021,10 @@ def test_BGP_GR_TC_43_p1(request): result = verify_rib( tgen, addr_type, dut, input_topo, next_hop, protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} :Failed \n Routes are still present \n Error {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) dut = "r2" @@ -2043,18 +2038,18 @@ def test_BGP_GR_TC_43_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r2: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) + protocol = "bgp" result = verify_rib( tgen, addr_type, dut, input_topo, next_hop, protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} :Failed \n Routes are still present \n Error {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) step( @@ -2353,17 +2348,17 @@ def test_BGP_GR_TC_44_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) + result = verify_rib( tgen, addr_type, dut, input_topo, next_hop, protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} :Failed \n Routes are still present \n Error {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) step("Bring up BGPd on R2 and remove GR related config from R1 in global level") diff --git a/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-4.py b/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-4.py index 835ef41de1..f408ff4854 100644 --- a/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-4.py +++ b/tests/topotests/bgp_gr_functionality_topo1/test_bgp_gr_functionality_topo1-4.py @@ -160,7 +160,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) @@ -1157,7 +1157,8 @@ def test_BGP_GR_TC_48_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) dut = "r2" @@ -1171,16 +1172,17 @@ def test_BGP_GR_TC_48_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r2: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) + result = verify_rib( tgen, addr_type, dut, input_topo, next_hop, protocol, expected=False ) assert result is not True, ( "Testcase {} : Failed \n " - "r2: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) step("Bring up BGP on R1 and remove Peer-level GR config from R1") @@ -1542,16 +1544,17 @@ def BGP_GR_TC_52_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) + result = verify_rib( tgen, addr_type, dut, input_topo, next_hop, protocol, expected=False ) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) step("Bring up BGP on R2 and remove Peer-level GR config from R1") diff --git a/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-1.py b/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-1.py index 3afe38857b..293f3042eb 100644 --- a/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-1.py +++ b/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-1.py @@ -155,7 +155,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") global ADDR_TYPES @@ -528,10 +528,10 @@ def test_BGP_GR_TC_3_p0(request): result = verify_eor( tgen, topo, addr_type, input_dict, dut="r2", peer="r1", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r2: EOR is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: EOR should not be set to True in r2\n" + "Found: {}".format(tc_name, result) ) logger.info( @@ -675,10 +675,10 @@ def test_BGP_GR_TC_11_p0(request): result = verify_eor( tgen, topo, addr_type, input_dict, dut="r1", peer="r3", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r1: EOR is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: EOR should not be set to True in r1\n" + "Found: {}".format(tc_name, result) ) logger.info( @@ -706,10 +706,10 @@ def test_BGP_GR_TC_11_p0(request): result = verify_eor( tgen, topo, addr_type, input_dict, dut="r3", peer="r1", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r3: EOR is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: EOR should not be set to True in r3\n" + "Found: {}".format(tc_name, result) ) write_test_footer(tc_name) @@ -1474,38 +1474,33 @@ def test_BGP_GR_18_p1(request): result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r6: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes before shutting down BGPd daemon result = verify_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r6: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying BGP RIB routes dut = "r2" - result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r2: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes before shutting down BGPd daemon result = verify_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r6: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) write_test_footer(tc_name) diff --git a/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-2.py b/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-2.py index 535f272ef4..fe885372d5 100644 --- a/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-2.py +++ b/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-2.py @@ -155,7 +155,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") global ADDR_TYPES @@ -726,19 +726,17 @@ def test_BGP_GR_chaos_29_p1(request): result = verify_bgp_rib(tgen, addr_type, dut, input_dict, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes before shutting down BGPd daemon result = verify_rib(tgen, addr_type, dut, input_dict, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) logger.info("[Step 4] : Start BGPd daemon on R1..") @@ -981,11 +979,9 @@ def test_BGP_GR_chaos_33_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) if addr_type == "ipv6": if "link_local" in PREFERRED_NEXT_HOP: @@ -998,11 +994,9 @@ def test_BGP_GR_chaos_33_p1(request): ) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in ZEBRA\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) logger.info("[Step 4] : Start BGPd daemon on R1 and R4..") @@ -1182,31 +1176,28 @@ def test_BGP_GR_chaos_34_2_p1(request): result = verify_f_bit( tgen, topo, addr_type, input_dict, "r3", "r1", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r3: F-bit is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: F-bit should not be set to True in r3\n" + "Found: {}".format(tc_name, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying BGP RIB routes after starting BGPd daemon input_dict_1 = {key: topo["routers"][key] for key in ["r1"]} result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes result = verify_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) write_test_footer(tc_name) diff --git a/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-3.py b/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-3.py index e60552ed10..4ff62a9785 100644 --- a/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-3.py +++ b/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-3.py @@ -155,7 +155,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") global ADDR_TYPES @@ -380,12 +380,11 @@ def test_BGP_GR_chaos_34_1_p1(request): result = verify_f_bit( tgen, topo, addr_type, input_dict_2, "r3", "r1", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r3: F-bit is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: F-bit should not be set to True in r3\n" + "Found: {}".format(tc_name, result) ) - logger.info(" Expected behavior: {}".format(result)) logger.info("[Step 3] : Kill BGPd daemon on R1..") @@ -402,19 +401,17 @@ def test_BGP_GR_chaos_34_1_p1(request): result = verify_bgp_rib(tgen, addr_type, dut, input_dict, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes result = verify_rib(tgen, addr_type, dut, input_dict, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Start BGPd daemon on R1 start_router_daemons(tgen, "r1", ["bgpd"]) @@ -587,31 +584,28 @@ def test_BGP_GR_chaos_32_p1(request): result = verify_eor( tgen, topo, addr_type, input_dict_3, dut="r5", peer="r1", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r5: EOR is set to TRUE\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: EOR should not be set to True in r5\n" + "Found: {}".format(tc_name, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying BGP RIB routes after starting BGPd daemon input_dict_1 = {key: topo["routers"][key] for key in ["r5"]} result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes result = verify_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) write_test_footer(tc_name) @@ -716,12 +710,11 @@ def test_BGP_GR_chaos_37_p1(request): result = verify_eor( tgen, topo, addr_type, input_dict, dut="r3", peer="r1", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r3: EOR is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: EOR should not be set to True in r3\n" + "Found: {}".format(tc_name, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying BGP RIB routes after starting BGPd daemon dut = "r1" @@ -783,10 +776,10 @@ def test_BGP_GR_chaos_37_p1(request): result = verify_eor( tgen, topo, addr_type, input_dict_3, dut="r1", peer="r3", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r1: EOR is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: EOR should not be set to True in r1\n" + "Found: {}".format(tc_name, result) ) write_test_footer(tc_name) @@ -941,19 +934,17 @@ def test_BGP_GR_chaos_30_p1(request): result = verify_bgp_rib(tgen, addr_type, dut, input_dict, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes before shutting down BGPd daemon result = verify_rib(tgen, addr_type, dut, input_dict, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) write_test_footer(tc_name) @@ -1356,7 +1347,8 @@ def BGP_GR_TC_7_p1(request): result = verify_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r1: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) write_test_footer(tc_name) diff --git a/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-4.py b/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-4.py index 1df77ebeb2..fd1ef097c4 100644 --- a/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-4.py +++ b/tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-4.py @@ -157,7 +157,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") global ADDR_TYPES @@ -420,10 +420,10 @@ def test_BGP_GR_TC_23_p1(request): result = verify_eor( tgen, topo, addr_type, input_dict, dut="r1", peer="r2", expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n " "r1: EOR is set to True\n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: EOR should not be set to True in r2\n" + "Found: {}".format(tc_name, result) ) # Verifying BGP RIB routes received from router R1 @@ -547,19 +547,17 @@ def test_BGP_GR_20_p1(request): result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in BGP RIB\n Error: {}".format( - tc_name, result - ) + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Verifying RIB routes before shutting down BGPd daemon result = verify_rib(tgen, addr_type, dut, input_dict_1, expected=False) assert result is not True, ( "Testcase {} : Failed \n " - "r3: routes are still present in ZEBRA\n Error: {}".format(tc_name, result) + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info(" Expected behavior: {}".format(result)) # Start BGPd daemon on R1 start_router_daemons(tgen, "r1", ["bgpd"]) diff --git a/tests/topotests/bgp_gr_functionality_topo3/bgp_gr_functionality_topo3.py b/tests/topotests/bgp_gr_functionality_topo3/bgp_gr_functionality_topo3.py index 6bf8b96309..76522206a4 100644 --- a/tests/topotests/bgp_gr_functionality_topo3/bgp_gr_functionality_topo3.py +++ b/tests/topotests/bgp_gr_functionality_topo3/bgp_gr_functionality_topo3.py @@ -56,15 +56,20 @@ from lib.bgp import ( verify_graceful_restart_timers, verify_bgp_convergence_from_running_config, ) + # Import common_config to use commomnly used APIs -from lib.common_config import (create_common_configuration, - InvalidCLIError, retry, - generate_ips, FRRCFG_FILE, - find_interface_with_greater_ip, - check_address_types, - validate_ip_address, - run_frr_cmd, - get_frr_ipv6_linklocal) +from lib.common_config import ( + create_common_configuration, + InvalidCLIError, + retry, + generate_ips, + FRRCFG_FILE, + find_interface_with_greater_ip, + check_address_types, + validate_ip_address, + run_frr_cmd, + get_frr_ipv6_linklocal, +) from lib.common_config import ( write_test_header, @@ -108,8 +113,7 @@ NEXT_HOP_IP = {"ipv4": "Null0", "ipv6": "Null0"} PREFERRED_NEXT_HOP = "link_local" -def configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, - dut, peer): +def configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut, peer): """ result = configure_gr_followed_by_clear(tgen, topo, dut) assert result is True, \ @@ -118,8 +122,7 @@ def configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, """ result = create_router_bgp(tgen, topo, input_dict) - assert result is True, "Testcase {} : Failed \n Error: {}".format( - tc_name, result) + assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) for addr_type in ADDR_TYPES: clear_bgp(tgen, addr_type, dut) @@ -131,6 +134,7 @@ def configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, return True + def verify_stale_routes_list(tgen, addr_type, dut, input_dict): """ This API is use verify Stale routes on refering the network with next hop value @@ -175,8 +179,8 @@ def verify_stale_routes_list(tgen, addr_type, dut, input_dict): command = "show bgp" # Static routes sleep(2) - logger.info('Checking router {} BGP RIB:'.format(dut)) - if 'static_routes' in input_dict[routerInput]: + logger.info("Checking router {} BGP RIB:".format(dut)) + if "static_routes" in input_dict[routerInput]: static_routes = input_dict[routerInput]["static_routes"] for static_route in static_routes: found_routes = [] @@ -185,30 +189,27 @@ def verify_stale_routes_list(tgen, addr_type, dut, input_dict): nh_found = False vrf = static_route.setdefault("vrf", None) community = static_route.setdefault("community", None) - largeCommunity = \ - static_route.setdefault("largeCommunity", None) + largeCommunity = static_route.setdefault("largeCommunity", None) if vrf: - cmd = "{} vrf {} {}".\ - format(command, vrf, addr_type) + cmd = "{} vrf {} {}".format(command, vrf, addr_type) if community: - cmd = "{} community {}".\ - format(cmd, community) + cmd = "{} community {}".format(cmd, community) if largeCommunity: - cmd = "{} large-community {}".\ - format(cmd, largeCommunity) + cmd = "{} large-community {}".format(cmd, largeCommunity) else: - cmd = "{} {}".\ - format(command, addr_type) + cmd = "{} {}".format(command, addr_type) cmd = "{} json".format(cmd) rib_routes_json = run_frr_cmd(rnode, cmd, isjson=True) # Verifying output dictionary rib_routes_json is not empty if bool(rib_routes_json) == False: - errormsg = "[DUT: {}]: No route found in rib of router". \ - format(router) + errormsg = "[DUT: {}]: No route found in rib of router".format( + router + ) return errormsg elif "warning" in rib_routes_json: - errormsg = "[DUT: {}]: {}". \ - format(router, rib_routes_json["warning"]) + errormsg = "[DUT: {}]: {}".format( + router, rib_routes_json["warning"] + ) return errormsg network = static_route["network"] if "no_of_ip" in static_route: @@ -227,15 +228,18 @@ def verify_stale_routes_list(tgen, addr_type, dut, input_dict): st_found = True found_routes.append(st_rt) - for mnh in range(0, len(rib_routes_json[ - 'routes'][st_rt])): - found_hops.append([rib_r[ - "ip"] for rib_r in rib_routes_json[ - 'routes'][st_rt][ - mnh]["nexthops"]]) + for mnh in range(0, len(rib_routes_json["routes"][st_rt])): + found_hops.append( + [ + rib_r["ip"] + for rib_r in rib_routes_json["routes"][st_rt][ + mnh + ]["nexthops"] + ] + ) return found_hops else: - return 'error msg - no hops found' + return "error msg - no hops found" def setup_module(mod): @@ -248,7 +252,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") global ADDR_TYPES @@ -302,6 +306,8 @@ def teardown_module(mod): "Testsuite end time: {}".format(time.asctime(time.localtime(time.time()))) ) logger.info("=" * 40) + + ################################################################################ # # TEST CASES @@ -318,175 +324,160 @@ def test_bgp_gr_stale_routes(request): step("Creating 5 static Routes in Router R3 with NULL0 as Next hop") for addr_type in ADDR_TYPES: - input_dict_1 = { - "r3": { - "static_routes": [{ - "network": [NETWORK1_1[addr_type]] + [NETWORK1_2[addr_type]], - "next_hop": NEXT_HOP_IP[addr_type] - }, - { - "network": [NETWORK2_1[addr_type]] + [NETWORK2_2[addr_type]], - "next_hop": NEXT_HOP_IP[addr_type] - }, - { - "network": [NETWORK3_1[addr_type]] + [NETWORK3_2[addr_type]], - "next_hop": NEXT_HOP_IP[addr_type] - }, - { - "network": [NETWORK4_1[addr_type]] + [NETWORK4_2[addr_type]], - "next_hop": NEXT_HOP_IP[addr_type] - }, - { - "network": [NETWORK5_1[addr_type]] + [NETWORK5_2[addr_type]], - "next_hop": NEXT_HOP_IP[addr_type] - }] - } + input_dict_1 = { + "r3": { + "static_routes": [ + { + "network": [NETWORK1_1[addr_type]] + [NETWORK1_2[addr_type]], + "next_hop": NEXT_HOP_IP[addr_type], + }, + { + "network": [NETWORK2_1[addr_type]] + [NETWORK2_2[addr_type]], + "next_hop": NEXT_HOP_IP[addr_type], + }, + { + "network": [NETWORK3_1[addr_type]] + [NETWORK3_2[addr_type]], + "next_hop": NEXT_HOP_IP[addr_type], + }, + { + "network": [NETWORK4_1[addr_type]] + [NETWORK4_2[addr_type]], + "next_hop": NEXT_HOP_IP[addr_type], + }, + { + "network": [NETWORK5_1[addr_type]] + [NETWORK5_2[addr_type]], + "next_hop": NEXT_HOP_IP[addr_type], + }, + ] } - result = create_static_routes(tgen, input_dict_1) - assert result is True, 'Testcase {} : Failed \n Error: {}'.format( - tc_name, result) + } + result = create_static_routes(tgen, input_dict_1) + assert result is True, "Testcase {} : Failed \n Error: {}".format( + tc_name, result + ) step("verifying Created Route at R3 in VRF default") for addr_type in ADDR_TYPES: - dut = 'r3' - input_dict_1= {'r3': topo['routers']['r3']} + dut = "r3" + input_dict_1 = {"r3": topo["routers"]["r3"]} result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1) - assert result is True, \ - "Testcase {} :Failed \n Error {}". \ - format(tc_name, result) - #done + assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) + # done step("verifying Created Route at R2 in VRF default") for addr_type in ADDR_TYPES: - dut = 'r2' - input_dict_1= {'r2': topo['routers']['r2']} + dut = "r2" + input_dict_1 = {"r2": topo["routers"]["r2"]} result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1) - assert result is True, \ - "Testcase {} :Failed \n Error {}". \ - format(tc_name, result) + assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) step("importing vrf RED on R2 under Address Family") for addr_type in ADDR_TYPES: - input_import_vrf={ + input_import_vrf = { "r2": { "bgp": [ { "local_as": 200, "vrf": "RED", - "address_family": {addr_type: {"unicast": {"import": {"vrf": "default"}}}}, + "address_family": { + addr_type: {"unicast": {"import": {"vrf": "default"}}} + }, } ] } } - result = create_router_bgp(tgen, topo,input_import_vrf) - assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) - #done + result = create_router_bgp(tgen, topo, input_import_vrf) + assert result is True, "Testcase {} : Failed \n Error: {}".format( + tc_name, result + ) + # done step("verifying static Routes at R2 in VRF RED") for addr_type in ADDR_TYPES: - dut = 'r2' - input_dict_1= {'r2': topo['routers']['r2']} + dut = "r2" + input_dict_1 = {"r2": topo["routers"]["r2"]} result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1) - assert result is True, \ - "Testcase {} :Failed \n Error {}". \ - format(tc_name, result) + assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) step("verifying static Routes at R1 in VRF RED") for addr_type in ADDR_TYPES: - dut = 'r1' - input_dict_1= {'r1': topo['routers']['r1']} + dut = "r1" + input_dict_1 = {"r1": topo["routers"]["r1"]} result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1) - assert result is True, \ - "Testcase {} :Failed \n Error {}". \ - format(tc_name, result) + assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) step("Configuring Graceful restart at R2 and R3 ") input_dict = { "r2": { - "bgp": { "local_as": "200", "graceful-restart": { "graceful-restart": True, - } + }, } }, "r3": { - "bgp": { - "local_as": "300", - "graceful-restart": { - "graceful-restart": True - } - } - } + "bgp": {"local_as": "300", "graceful-restart": {"graceful-restart": True}} + }, } - configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name,dut='r2', peer='r3') - - + configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r2", peer="r3") step("verify Graceful restart at R2") for addr_type in ADDR_TYPES: - result = verify_graceful_restart(tgen, topo, addr_type, input_dict, - dut='r2', peer='r3') - assert result is True, \ - "Testcase {} :Failed \n Error {}". \ - format(tc_name, result) + result = verify_graceful_restart( + tgen, topo, addr_type, input_dict, dut="r2", peer="r3" + ) + assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) step("verify Graceful restart at R3") for addr_type in ADDR_TYPES: - result = verify_graceful_restart(tgen, topo, addr_type, input_dict, - dut='r3', peer='r2') - assert result is True, \ - "Testcase {} :Failed \n Error {}". \ - format(tc_name, result) + result = verify_graceful_restart( + tgen, topo, addr_type, input_dict, dut="r3", peer="r2" + ) + assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) step("Configuring Graceful-restart-disable at R3") input_dict = { "r2": { - "bgp": { "local_as": "200", "graceful-restart": { "graceful-restart": False, - } + }, } }, "r3": { - "bgp": { - "local_as": "300", - "graceful-restart": { - "graceful-restart": False - } - } - } + "bgp": {"local_as": "300", "graceful-restart": {"graceful-restart": False}} + }, } - configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name,dut='r3', peer='r2') + configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r3", peer="r2") step("Verify Graceful-restart-disable at R3") for addr_type in ADDR_TYPES: - result = verify_graceful_restart(tgen, topo, addr_type, input_dict, - dut='r3', peer='r2') - assert result is True, \ - "Testcase {} :Failed \n Error {}". \ - format(tc_name, result) + result = verify_graceful_restart( + tgen, topo, addr_type, input_dict, dut="r3", peer="r2" + ) + assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) for iteration in range(5): step("graceful-restart-disable:True at R3") input_dict = { - "r3": { - "bgp": { - "graceful-restart": { - "graceful-restart-disable": True, + "r3": { + "bgp": { + "graceful-restart": { + "graceful-restart-disable": True, + } } } - } } - configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, - dut='r3', peer='r2') + configure_gr_followed_by_clear( + tgen, topo, input_dict, tc_name, dut="r3", peer="r2" + ) step("Verifying Routes at R2 on enabling GRD") - dut = 'r2' + dut = "r2" for addr_type in ADDR_TYPES: - input_dict_1= {'r2': topo['routers']['r2']} + input_dict_1 = {"r2": topo["routers"]["r2"]} result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1) - assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) + assert result is True, "Testcase {} :Failed \n Error {}".format( + tc_name, result + ) step("Verify stale Routes in Router R2 enabling GRD") for addr_type in ADDR_TYPES: @@ -495,39 +486,45 @@ def test_bgp_gr_stale_routes(request): verify_nh_for_static_rtes = { "r3": { "static_routes": [ - { "network": [NETWORK1_1[addr_type]], "no_of_ip": 2, - "vrf": "RED" + "vrf": "RED", } ] } } bgp_rib_next_hops = verify_stale_routes_list( - tgen, addr_type, dut, verify_nh_for_static_rtes) - assert (len(bgp_rib_next_hops)== 1) is True, "Testcase {} : Failed \n Error: {}".format( - tc_name, bgp_rib_next_hops,expected=True) + tgen, addr_type, dut, verify_nh_for_static_rtes + ) + assert ( + len(bgp_rib_next_hops) == 1 + ) is True, "Testcase {} : Failed \n Error: {}".format( + tc_name, bgp_rib_next_hops, expected=True + ) step("graceful-restart-disable:False at R3") input_dict = { - "r3": { - "bgp": { - "graceful-restart": { - "graceful-restart-disable": False, + "r3": { + "bgp": { + "graceful-restart": { + "graceful-restart-disable": False, + } } } - } } - configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, - dut='r3', peer='r2') + configure_gr_followed_by_clear( + tgen, topo, input_dict, tc_name, dut="r3", peer="r2" + ) step("Verifying Routes at R2 on disabling GRD") - dut = 'r2' + dut = "r2" for addr_type in ADDR_TYPES: - input_dict_1= {'r2': topo['routers']['r2']} + input_dict_1 = {"r2": topo["routers"]["r2"]} result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1) - assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) + assert result is True, "Testcase {} :Failed \n Error {}".format( + tc_name, result + ) step("Verify stale Routes in Router R2 on disabling GRD") for addr_type in ADDR_TYPES: @@ -536,19 +533,22 @@ def test_bgp_gr_stale_routes(request): verify_nh_for_static_rtes = { "r3": { "static_routes": [ - { "network": [NETWORK1_1[addr_type]], "no_of_ip": 2, - "vrf": "RED" + "vrf": "RED", } ] } } - bgp_rib_next_hops = verify_stale_routes_list(tgen, addr_type, dut, verify_nh_for_static_rtes) - - stale_route_status=len(bgp_rib_next_hops)== 1 - assert stale_route_status is True, "Testcase {} : Failed \n Error: {}".format( - tc_name, stale_route_status,expected=True) + bgp_rib_next_hops = verify_stale_routes_list( + tgen, addr_type, dut, verify_nh_for_static_rtes + ) + + stale_route_status = len(bgp_rib_next_hops) == 1 + assert ( + stale_route_status is True + ), "Testcase {} : Failed \n Error: {}".format( + tc_name, stale_route_status, expected=True + ) write_test_footer(tc_name) - diff --git a/tests/topotests/bgp_gshut_topo1/test_ebgp_gshut_topo1.py b/tests/topotests/bgp_gshut_topo1/test_ebgp_gshut_topo1.py index 58133c44a9..684d2fcb57 100644 --- a/tests/topotests/bgp_gshut_topo1/test_ebgp_gshut_topo1.py +++ b/tests/topotests/bgp_gshut_topo1/test_ebgp_gshut_topo1.py @@ -92,7 +92,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) diff --git a/tests/topotests/bgp_gshut_topo1/test_ibgp_gshut_topo1.py b/tests/topotests/bgp_gshut_topo1/test_ibgp_gshut_topo1.py index a79ce0e3a0..16572a7967 100644 --- a/tests/topotests/bgp_gshut_topo1/test_ibgp_gshut_topo1.py +++ b/tests/topotests/bgp_gshut_topo1/test_ibgp_gshut_topo1.py @@ -87,7 +87,7 @@ def setup_module(mod): # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.16") if result is not True: - pytest.skip("Kernel requirements are not met") + pytest.skip("Kernel requirements are not met, kernel version should be >=4.16") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) diff --git a/tests/topotests/bgp_prefix_list_topo1/test_prefix_lists.py b/tests/topotests/bgp_prefix_list_topo1/test_prefix_lists.py index 2dc95cee21..5131a89ce8 100644 --- a/tests/topotests/bgp_prefix_list_topo1/test_prefix_lists.py +++ b/tests/topotests/bgp_prefix_list_topo1/test_prefix_lists.py @@ -346,9 +346,12 @@ def test_ip_prefix_lists_out_permit(request): result = verify_rib( tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error: Routes still" " present in RIB".format(tc_name) + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) + ) + write_test_footer(tc_name) @@ -444,9 +447,11 @@ def test_ip_prefix_lists_in_deny_and_permit_any(request): result = verify_rib( tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error: Routes still" " present in RIB".format(tc_name) + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) + ) write_test_footer(tc_name) @@ -644,9 +649,12 @@ def test_ip_prefix_lists_out_deny_and_permit_any(request): result = verify_rib( tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error: Routes still" " present in RIB".format(tc_name) + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) + ) + write_test_footer(tc_name) @@ -778,9 +786,11 @@ def test_modify_prefix_lists_in_permit_to_deny(request): result = verify_rib( tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error: Routes still" " present in RIB".format(tc_name) + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) + ) write_test_footer(tc_name) @@ -882,9 +892,11 @@ def test_modify_prefix_lists_in_deny_to_permit(request): result = verify_rib( tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error: Routes still" " present in RIB".format(tc_name) + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) + ) # Modify ip prefix list input_dict_1 = { @@ -1051,9 +1063,11 @@ def test_modify_prefix_lists_out_permit_to_deny(request): result = verify_rib( tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error: Routes still" " present in RIB".format(tc_name) + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) + ) write_test_footer(tc_name) @@ -1157,9 +1171,11 @@ def test_modify_prefix_lists_out_deny_to_permit(request): result = verify_rib( tgen, "ipv4", dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error: Routes still" " present in RIB".format(tc_name) + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) + ) # Modify ip prefix list input_dict_1 = { @@ -1324,9 +1340,11 @@ def test_ip_prefix_lists_implicit_deny(request): result = verify_rib( tgen, "ipv4", dut, input_dict_1, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error: Routes still" " present in RIB".format(tc_name) + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) + ) write_test_footer(tc_name) diff --git a/tests/topotests/bgp_route_map/test_route_map_topo1.py b/tests/topotests/bgp_route_map/test_route_map_topo1.py index 655a3dc899..77bddbe337 100644 --- a/tests/topotests/bgp_route_map/test_route_map_topo1.py +++ b/tests/topotests/bgp_route_map/test_route_map_topo1.py @@ -444,12 +444,11 @@ def test_route_map_inbound_outbound_same_neighbor_p0(request): result = verify_rib( tgen, adt, dut, input_dict_2, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are not present in rib \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} BGP RIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) # Verifying RIB routes dut = "r4" @@ -467,12 +466,11 @@ def test_route_map_inbound_outbound_same_neighbor_p0(request): result = verify_rib( tgen, adt, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are not present in rib \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) write_test_footer(tc_name) @@ -666,12 +664,11 @@ def test_route_map_with_action_values_combination_of_prefix_action_p0( result = verify_rib( tgen, adt, dut, input_dict_2, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nRoutes are still present \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) else: result = verify_rib(tgen, adt, dut, input_dict_2, protocol=protocol) assert result is True, "Testcase {} : Failed \n Error: {}".format( diff --git a/tests/topotests/bgp_route_map/test_route_map_topo2.py b/tests/topotests/bgp_route_map/test_route_map_topo2.py index 4da7eeb2ff..589482d6a5 100644 --- a/tests/topotests/bgp_route_map/test_route_map_topo2.py +++ b/tests/topotests/bgp_route_map/test_route_map_topo2.py @@ -1022,12 +1022,11 @@ def test_modify_prefix_list_referenced_by_rmap_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are not present \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) # Verifying RIB routes dut = "r4" @@ -1036,10 +1035,10 @@ def test_modify_prefix_list_referenced_by_rmap_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nExpected behaviour: routes are not present \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) write_test_footer(tc_name) @@ -1293,12 +1292,11 @@ def test_remove_prefix_list_referenced_by_rmap_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are not present \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) # Verifying RIB routes dut = "r4" @@ -1307,12 +1305,11 @@ def test_remove_prefix_list_referenced_by_rmap_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are not present \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) write_test_footer(tc_name) @@ -2139,12 +2136,11 @@ def test_add_remove_rmap_to_specific_neighbor_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \n Error Routes are still present: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) # Remove applied rmap from neighbor input_dict_4 = { @@ -2553,12 +2549,11 @@ def test_rmap_without_match_and_set_clause_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are not present \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) write_test_footer(tc_name) # Uncomment next line for debugging @@ -2801,12 +2796,11 @@ def test_set_localpref_weight_to_ebgp_and_med_to_ibgp_peers_p0(): input_dict_3_addr_type[addr_type], expected=False, ) - assert ( - result is not True - ), "Testcase {} : Failed \nAttributes are not set \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: BGP attributes should not be set in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) # Verifying RIB routes dut = "r5" @@ -2835,12 +2829,11 @@ def test_set_localpref_weight_to_ebgp_and_med_to_ibgp_peers_p0(): input_dict_3_addr_type[addr_type], expected=False, ) - assert ( - result is not True - ), "Testcase {} : Failed \nAttributes are not set \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: BGP attributes should not be set in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) write_test_footer(tc_name) @@ -3644,12 +3637,11 @@ def test_create_rmap_match_prefix_list_to_deny_in_and_outbound_prefixes_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are not present \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) # Verifying RIB routes dut = "r4" @@ -3658,12 +3650,11 @@ def test_create_rmap_match_prefix_list_to_deny_in_and_outbound_prefixes_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are not present \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) write_test_footer(tc_name) @@ -3963,12 +3954,11 @@ def test_create_rmap_to_match_tag_deny_outbound_prefixes_p0(): result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) - assert ( - result is not True - ), "Testcase {} : Failed \nroutes are denied \n Error: {}".format( - tc_name, result + assert result is not True, ( + "Testcase {} : Failed \n " + "Expected: Routes should not be present in {} FIB \n " + "Found: {}".format(tc_name, dut, result) ) - logger.info("Expected behaviour: {}".format(result)) write_test_footer(tc_name) diff --git a/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf/r1/zebra.conf b/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf/r1/zebra.conf index 8defa0125a..8ccf7a2a34 100644 --- a/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf/r1/zebra.conf +++ b/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf/r1/zebra.conf @@ -27,7 +27,7 @@ segment-routing srv6 locators locator loc1 - prefix 2001:db8:1:1::/64 + prefix 2001:db8:1:1::/64 func-bits 8 ! ! ! diff --git a/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf/r2/zebra.conf b/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf/r2/zebra.conf index 51d9c92235..839454d8a8 100644 --- a/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf/r2/zebra.conf +++ b/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf/r2/zebra.conf @@ -27,7 +27,7 @@ segment-routing srv6 locators locator loc1 - prefix 2001:db8:2:2::/64 + prefix 2001:db8:2:2::/64 func-bits 8 ! ! ! diff --git a/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf2/r1/zebra.conf b/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf2/r1/zebra.conf index a43cec20ef..a9319a6aed 100644 --- a/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf2/r1/zebra.conf +++ b/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf2/r1/zebra.conf @@ -28,7 +28,7 @@ segment-routing srv6 locators locator loc1 - prefix 2001:db8:1:1::/64 + prefix 2001:db8:1:1::/64 func-bits 8 ! ! ! diff --git a/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf2/r2/zebra.conf b/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf2/r2/zebra.conf index 71ddedf6ff..9e5fa0ac07 100644 --- a/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf2/r2/zebra.conf +++ b/tests/topotests/bgp_srv6l3vpn_to_bgp_vrf2/r2/zebra.conf @@ -27,7 +27,7 @@ segment-routing srv6 locators locator loc1 - prefix 2001:db8:2:2::/64 + prefix 2001:db8:2:2::/64 func-bits 8 ! ! ! diff --git a/tools/frr-reload.py b/tools/frr-reload.py index 32f9a78841..7c5d91d4dc 100755 --- a/tools/frr-reload.py +++ b/tools/frr-reload.py @@ -890,7 +890,7 @@ def bgp_remove_neighbor_cfg(lines_to_del, del_nbr_dict): ): if ctx_keys[0] in del_nbr_dict: for nbr in del_nbr_dict[ctx_keys[0]]: - re_nbr_pg = re.search('neighbor (\S+) .*peer-group (\S+)', line) + re_nbr_pg = re.search("neighbor (\S+) .*peer-group (\S+)", line) nb_exp = "neighbor %s .*" % nbr if not re_nbr_pg: re_nb = re.search(nb_exp, line) @@ -997,7 +997,7 @@ def delete_move_lines(lines_to_add, lines_to_del): # 'no neighbor peer [interface] peer-group <>' is in lines_to_del # copy the neighbor and look for all config removal lines associated # to neighbor and delete them from the lines_to_del - re_nbr_pg = re.search('neighbor (\S+) .*peer-group (\S+)', line) + re_nbr_pg = re.search("neighbor (\S+) .*peer-group (\S+)", line) if re_nbr_pg: if ctx_keys[0] not in del_nbr_dict: del_nbr_dict[ctx_keys[0]] = list() @@ -1376,6 +1376,37 @@ def ignore_delete_re_add_lines(lines_to_add, lines_to_del): lines_to_add.append((add_cmd, None)) lines_to_del_to_del.append((ctx_keys, None)) + # bgp community-list, large-community-list, extcommunity-list can be + # specified without a seq number. However, the running config always + # adds `seq X` (sequence number). So, ignore such lines as well. + # Examples: + # bgp community-list standard clist seq 5 permit 222:213 + # bgp large-community-list standard llist seq 5 permit 65001:65001:1 + # bgp extcommunity-list standard elist seq 5 permit soo 123:123 + re_bgp_lists = re.search( + "^(bgp )(community-list|large-community-list|extcommunity-list)(\s+\S+\s+)(\S+\s+)(seq \d+\s+)(permit|deny)(.*)$", + ctx_keys[0], + ) + if re_bgp_lists: + found = False + tmpline = ( + re_bgp_lists.group(1) + + re_bgp_lists.group(2) + + re_bgp_lists.group(3) + + re_bgp_lists.group(4) + + re_bgp_lists.group(6) + + re_bgp_lists.group(7) + ) + for ctx in lines_to_add: + if ctx[0][0] == tmpline: + lines_to_del_to_del.append((ctx_keys, None)) + lines_to_add_to_del.append(((tmpline,), None)) + found = True + if found is False: + add_cmd = ("no " + ctx_keys[0],) + lines_to_add.append((add_cmd, None)) + lines_to_del_to_del.append((ctx_keys, None)) + if ( len(ctx_keys) == 3 and ctx_keys[0].startswith("router bgp") diff --git a/vrrpd/vrrp_vty.c b/vrrpd/vrrp_vty.c index 634a55dbc3..d2f25f2d40 100644 --- a/vrrpd/vrrp_vty.c +++ b/vrrpd/vrrp_vty.c @@ -710,6 +710,8 @@ DEFUN_NOSH (show_debugging_vrrp, vrrp_debug_status_write(vty); + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/watchfrr/watchfrr_vty.c b/watchfrr/watchfrr_vty.c index 1492ee37b6..e5cc437542 100644 --- a/watchfrr/watchfrr_vty.c +++ b/watchfrr/watchfrr_vty.c @@ -125,6 +125,8 @@ DEFUN_NOSH (show_debugging_watchfrr, DEBUG_STR WATCHFRR_STR) { + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/zebra/debug.c b/zebra/debug.c index 69aaed33ac..25102145d7 100644 --- a/zebra/debug.c +++ b/zebra/debug.c @@ -137,6 +137,9 @@ DEFUN_NOSH (show_debugging_zebra, vty_out(vty, " Zebra PBR debugging is on\n"); hook_call(zebra_debug_show_debugging, vty); + + cmd_show_lib_debugs(vty); + return CMD_SUCCESS; } diff --git a/zebra/zebra_srv6_vty.c b/zebra/zebra_srv6_vty.c index 62ce17326c..daac4cade0 100644 --- a/zebra/zebra_srv6_vty.c +++ b/zebra/zebra_srv6_vty.c @@ -271,7 +271,7 @@ DEFUN (no_srv6_locator, DEFPY (locator_prefix, locator_prefix_cmd, - "prefix X:X::X:X/M$prefix [func-bits (16-64)$func_bit_len]", + "prefix X:X::X:X/M$prefix [func-bits (0-64)$func_bit_len]", "Configure SRv6 locator prefix\n" "Specify SRv6 locator prefix\n" "Configure SRv6 locator function length in bits\n" @@ -281,7 +281,14 @@ DEFPY (locator_prefix, struct srv6_locator_chunk *chunk = NULL; struct listnode *node = NULL; + if (prefix->prefixlen != 64) { + vty_out(vty, + "%% Invalid argument: Unsupported locator format\n"); + return CMD_WARNING_CONFIG_FAILED; + } + locator->prefix = *prefix; + func_bit_len = func_bit_len ?: ZEBRA_SRV6_FUNCTION_LENGTH; /* * TODO(slankdev): please support variable node-bit-length. @@ -298,8 +305,8 @@ DEFPY (locator_prefix, * user should use a pattern of zeros as a filler. * (3) The Node Id portion (LSBs) cannot exceed 24 bits. */ - locator->block_bits_length = prefix->prefixlen - 24; - locator->node_bits_length = 24; + locator->block_bits_length = ZEBRA_SRV6_LOCATOR_BLOCK_LENGTH; + locator->node_bits_length = ZEBRA_SRV6_LOCATOR_NODE_LENGTH; locator->function_bits_length = func_bit_len; locator->argument_bits_length = 0; diff --git a/zebra/zebra_srv6_vty.h b/zebra/zebra_srv6_vty.h index 42d6aefa9a..2f8b5048d5 100644 --- a/zebra/zebra_srv6_vty.h +++ b/zebra/zebra_srv6_vty.h @@ -20,6 +20,10 @@ #ifndef _ZEBRA_SRV6_VTY_H #define _ZEBRA_SRV6_VTY_H +#define ZEBRA_SRV6_LOCATOR_BLOCK_LENGTH 40 +#define ZEBRA_SRV6_LOCATOR_NODE_LENGTH 24 +#define ZEBRA_SRV6_FUNCTION_LENGTH 16 + extern void zebra_srv6_vty_init(void); #endif /* _ZEBRA_SRV6_VTY_H */ |
