pbrd: separate set * and no set * commands

Separate out the `set *` and `no set *` commands into
different DEFPYs to make the logic of the code easier to
read.

Further, allow non-exlpicit no commands.

So `no set nexthop`, `no set nexthop-group`, and
`no set vrf` will now work without having to specify
anymore data. Before you had to match what was already
there explicitly.

Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
This commit is contained in:
Stephen Worley 2020-04-07 16:53:52 -04:00
parent f143cffac2
commit bce03323a8

View File

@ -242,8 +242,7 @@ static void pbrms_clear_set_config(struct pbr_map_sequence *pbrms)
}
DEFPY(pbr_map_nexthop_group, pbr_map_nexthop_group_cmd,
"[no] set nexthop-group NHGNAME$name",
NO_STR
"set nexthop-group NHGNAME$name",
"Set for the PBR-MAP\n"
"nexthop-group to use\n"
"The name of the nexthop-group\n")
@ -259,13 +258,6 @@ DEFPY(pbr_map_nexthop_group, pbr_map_nexthop_group_cmd,
"PBR-MAP will not be applied until it is created\n");
}
if (no && pbrms->nhgrp_name && strcmp(name, pbrms->nhgrp_name) != 0) {
vty_out(vty,
"Nexthop Group specified: %s does not exist to remove\n",
name);
return CMD_WARNING_CONFIG_FAILED;
}
if (pbrms->nhgrp_name && strcmp(name, pbrms->nhgrp_name) == 0)
return CMD_SUCCESS;
@ -278,14 +270,27 @@ DEFPY(pbr_map_nexthop_group, pbr_map_nexthop_group_cmd,
return CMD_SUCCESS;
}
DEFPY(no_pbr_map_nexthop_group, no_pbr_map_nexthop_group_cmd,
"no set nexthop-group [NHGNAME$name]",
NO_STR
"Set for the PBR-MAP\n"
"nexthop-group to use\n"
"The name of the nexthop-group\n")
{
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
pbrms_clear_set_config(pbrms);
return CMD_SUCCESS;
}
DEFPY(pbr_map_nexthop, pbr_map_nexthop_cmd,
"[no] set nexthop\
"set nexthop\
<\
<A.B.C.D|X:X::X:X>$addr [INTERFACE$intf]\
|INTERFACE$intf\
>\
[nexthop-vrf NAME$vrf_name]",
NO_STR
"Set for the PBR-MAP\n"
"Specify one of the nexthops in this map\n"
"v4 Address\n"
@ -349,11 +354,6 @@ DEFPY(pbr_map_nexthop, pbr_map_nexthop_cmd,
if (pbrms->nhg)
nh = nexthop_exists(pbrms->nhg, &nhop);
if (no && !nh) {
vty_out(vty, "No nexthops to delete\n");
return CMD_WARNING_CONFIG_FAILED;
}
if (nh) /* Same config re-entered */
goto done;
@ -378,23 +378,39 @@ done:
return CMD_SUCCESS;
}
DEFPY(pbr_map_vrf, pbr_map_vrf_cmd,
"[no] set vrf <NAME$vrf_name|unchanged>",
DEFPY(no_pbr_map_nexthop, no_pbr_map_nexthop_cmd,
"no set nexthop\
[<\
<A.B.C.D|X:X::X:X>$addr [INTERFACE$intf]\
|INTERFACE$intf\
>\
[nexthop-vrf NAME$vrf_name]]",
NO_STR
"Set for the PBR-MAP\n"
"Specify one of the nexthops in this map\n"
"v4 Address\n"
"v6 Address\n"
"Interface to use\n"
"Interface to use\n"
"If the nexthop is in a different vrf tell us\n"
"The nexthop-vrf Name\n")
{
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
pbrms_clear_set_config(pbrms);
return CMD_SUCCESS;
}
DEFPY(pbr_map_vrf, pbr_map_vrf_cmd,
"set vrf <NAME$vrf_name|unchanged>",
"Set for the PBR-MAP\n"
"Specify the VRF for this map\n"
"The VRF Name\n"
"Use the interface's VRF for lookup\n")
{
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
if (no) {
/* Reset all data */
pbrms_clear_set_config(pbrms);
return CMD_SUCCESS;
}
/*
* If an equivalent set vrf * exists, just return success.
*/
@ -404,16 +420,15 @@ DEFPY(pbr_map_vrf, pbr_map_vrf_cmd,
else if (!vrf_name && pbrms->vrf_unchanged) /* Unchanged already set */
return CMD_SUCCESS;
if (vrf_name && !pbr_vrf_lookup_by_name(vrf_name)) {
vty_out(vty, "Specified: %s is non-existent\n", vrf_name);
return CMD_WARNING_CONFIG_FAILED;
}
/* This is new/replacement config */
pbrms_clear_set_config(pbrms);
if (vrf_name) {
if (!pbr_vrf_lookup_by_name(vrf_name)) {
vty_out(vty, "Specified: %s is non-existent\n",
vrf_name);
return CMD_WARNING_CONFIG_FAILED;
}
pbrms->vrf_lookup = true;
strlcpy(pbrms->vrf_name, vrf_name, sizeof(pbrms->vrf_name));
} else
@ -424,6 +439,21 @@ DEFPY(pbr_map_vrf, pbr_map_vrf_cmd,
return CMD_SUCCESS;
}
DEFPY(no_pbr_map_vrf, no_pbr_map_vrf_cmd,
"no set vrf [<NAME$vrf_name|unchanged>]",
NO_STR
"Set for the PBR-MAP\n"
"Specify the VRF for this map\n"
"The VRF Name\n"
"Use the interface's VRF for lookup\n")
{
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
pbrms_clear_set_config(pbrms);
return CMD_SUCCESS;
}
DEFPY (pbr_policy,
pbr_policy_cmd,
"[no] pbr-policy PBRMAP$mapname",
@ -827,8 +857,11 @@ void pbr_vty_init(void)
install_element(PBRMAP_NODE, &pbr_map_match_dst_cmd);
install_element(PBRMAP_NODE, &pbr_map_match_mark_cmd);
install_element(PBRMAP_NODE, &pbr_map_nexthop_group_cmd);
install_element(PBRMAP_NODE, &no_pbr_map_nexthop_group_cmd);
install_element(PBRMAP_NODE, &pbr_map_nexthop_cmd);
install_element(PBRMAP_NODE, &no_pbr_map_nexthop_cmd);
install_element(PBRMAP_NODE, &pbr_map_vrf_cmd);
install_element(PBRMAP_NODE, &no_pbr_map_vrf_cmd);
install_element(VIEW_NODE, &show_pbr_cmd);
install_element(VIEW_NODE, &show_pbr_map_cmd);
install_element(VIEW_NODE, &show_pbr_interface_cmd);