Skip to content

Commit 851312f

Browse files
NOS-6657..NOS-6670: fboss2 config/delete protocol bgp policy prefix-list
Adds `config protocol bgp policy prefix-list <name> [entry <seq-num>] [<attribute> <value> ...]` and `delete protocol bgp policy prefix-list <name> [entry <seq-num>]` — the third BGP policy object-type command family, beneath the `policy` grouping node alongside as-path-list and community-list. - prefix-list dispatcher with a two-level key (list name + entry seq-num) writing bgp_policy.BgpPolicies.prefix_lists[] through the typed ConfigSession. List level: boolean-operator, compare-operator (EQ|GE|LE|NE|GT|LT), description, and ip-version <v4|v6> (stored as the numeric routing_policy.PrefixList.version, the field the sheet documents). Entry level (routing_policy.PrefixListEntry keyed by seq_num in prefixes[]): base-prefix (validated as <prefix/len>, an explicit /len is required), communities (accumulates into the optional set), description, match-logic, max-allowed-subnet-count (-> max_allowed_golden_prefix_subnet_count), regex, and the prefix-len-range compare-operator|value pair targeting the single CompareNumericValue the CLI maintains at prefix_len_ranges[0] (compare-operator additionally accepts RG; value is bounded 0-128). - delete mirrors community-list's two levels: the whole list by name, or a single entry by `entry <seq-num>`. - new intAttr factory in the shared BgpCliAttrHandlers.h (bounded int32, valueDesc taken by value like enumAttr's), used by the two numeric entry attributes. - unit tests (30) + commit-path integration tests mirroring ConfigBgpPolicyCommunityListTest, run on a DUT (all 4 pass). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 72e754a commit 851312f

16 files changed

Lines changed: 1231 additions & 1 deletion

cmake/CliFboss2.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,9 @@ add_library(fboss2_config_lib
892892
fboss/cli/fboss2/commands/config/protocol/bgp/policy/community-list/CmdConfigProtocolBgpPolicyCommunityList.h
893893
fboss/cli/fboss2/commands/config/protocol/bgp/policy/community-list/community/CmdConfigProtocolBgpPolicyCommunityListCommunity.cpp
894894
fboss/cli/fboss2/commands/config/protocol/bgp/policy/community-list/community/CmdConfigProtocolBgpPolicyCommunityListCommunity.h
895+
fboss/cli/fboss2/commands/config/protocol/bgp/policy/prefix-list/BgpPrefixListCliUtils.h
896+
fboss/cli/fboss2/commands/config/protocol/bgp/policy/prefix-list/CmdConfigProtocolBgpPolicyPrefixList.cpp
897+
fboss/cli/fboss2/commands/config/protocol/bgp/policy/prefix-list/CmdConfigProtocolBgpPolicyPrefixList.h
895898
fboss/cli/fboss2/commands/config/ptp/CmdConfigPtp.cpp
896899
fboss/cli/fboss2/commands/config/ptp/CmdConfigPtp.h
897900
fboss/cli/fboss2/commands/config/ptp/transparent_clock/CmdConfigPtpTransparentClock.cpp
@@ -996,6 +999,8 @@ add_library(fboss2_config_lib
996999
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/as-path-list/CmdDeleteProtocolBgpPolicyAsPathList.h
9971000
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/community-list/CmdDeleteProtocolBgpPolicyCommunityList.cpp
9981001
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/community-list/CmdDeleteProtocolBgpPolicyCommunityList.h
1002+
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.cpp
1003+
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.h
9991004
fboss/cli/fboss2/commands/delete/protocol/CmdDeleteProtocol.h
10001005
fboss/cli/fboss2/commands/delete/protocol/static/CmdDeleteProtocolStatic.cpp
10011006
fboss/cli/fboss2/commands/delete/protocol/static/CmdDeleteProtocolStatic.h

cmake/CliFboss2TestConfig.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ add_executable(fboss2_cmd_config_test
1313
fboss/cli/fboss2/test/config/CmdConfigBgpPeerGroupTest.cpp
1414
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyAsPathListTest.cpp
1515
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyCommunityListTest.cpp
16+
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyPrefixListTest.cpp
1617
fboss/cli/fboss2/test/config/CmdConfigCoppTest.cpp
1718
fboss/cli/fboss2/test/config/CmdConfigDhcpTest.cpp
1819
fboss/cli/fboss2/test/config/CmdConfigHostnameTest.cpp
@@ -46,6 +47,7 @@ add_executable(fboss2_cmd_config_test
4647
fboss/cli/fboss2/test/config/CmdDeleteBgpPeerGroupTest.cpp
4748
fboss/cli/fboss2/test/config/CmdDeleteBgpPolicyAsPathListTest.cpp
4849
fboss/cli/fboss2/test/config/CmdDeleteBgpPolicyCommunityListTest.cpp
50+
fboss/cli/fboss2/test/config/CmdDeleteBgpPolicyPrefixListTest.cpp
4951
fboss/cli/fboss2/test/config/CmdDeleteConfigInterfaceTest.cpp
5052
fboss/cli/fboss2/test/config/CmdDeleteDhcpTest.cpp
5153
fboss/cli/fboss2/test/config/CmdDeleteInterfaceIpv6NdpTest.cpp

cmake/CliFboss2TestIntegrationTest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ add_executable(fboss2_integration_test
1515
fboss/cli/fboss2/test/integration_test/ConfigBgpNeighborTest.cpp
1616
fboss/cli/fboss2/test/integration_test/ConfigBgpPeerGroupTest.cpp
1717
fboss/cli/fboss2/test/integration_test/ConfigBgpPolicyCommunityListTest.cpp
18+
fboss/cli/fboss2/test/integration_test/ConfigBgpPolicyPrefixListTest.cpp
1819
fboss/cli/fboss2/test/integration_test/ConfigBgpSessionTest.cpp
1920
fboss/cli/fboss2/test/integration_test/ConfigConcurrentSessionsTest.cpp
2021
fboss/cli/fboss2/test/integration_test/ConfigHostnameTest.cpp

fboss/cli/fboss2/BUCK

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,7 @@ cpp_library(
11051105
"commands/config/protocol/bgp/policy/as-path-list/entry/CmdConfigProtocolBgpPolicyAsPathListEntry.cpp",
11061106
"commands/config/protocol/bgp/policy/community-list/CmdConfigProtocolBgpPolicyCommunityList.cpp",
11071107
"commands/config/protocol/bgp/policy/community-list/community/CmdConfigProtocolBgpPolicyCommunityListCommunity.cpp",
1108+
"commands/config/protocol/bgp/policy/prefix-list/CmdConfigProtocolBgpPolicyPrefixList.cpp",
11081109
"commands/config/protocol/static/CmdConfigProtocolStatic.cpp",
11091110
"commands/config/protocol/static/route/add/CmdConfigProtocolStaticRouteAdd.cpp",
11101111
"commands/config/ptp/CmdConfigPtp.cpp",
@@ -1157,6 +1158,7 @@ cpp_library(
11571158
"commands/delete/protocol/bgp/policy/CmdDeleteProtocolBgpPolicy.cpp",
11581159
"commands/delete/protocol/bgp/policy/as-path-list/CmdDeleteProtocolBgpPolicyAsPathList.cpp",
11591160
"commands/delete/protocol/bgp/policy/community-list/CmdDeleteProtocolBgpPolicyCommunityList.cpp",
1161+
"commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.cpp",
11601162
"commands/delete/protocol/static/CmdDeleteProtocolStatic.cpp",
11611163
"commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.cpp",
11621164
"commands/delete/qos/CmdDeleteQos.cpp",
@@ -1222,6 +1224,8 @@ cpp_library(
12221224
"commands/config/protocol/bgp/policy/community-list/BgpCommunityListCliUtils.h",
12231225
"commands/config/protocol/bgp/policy/community-list/CmdConfigProtocolBgpPolicyCommunityList.h",
12241226
"commands/config/protocol/bgp/policy/community-list/community/CmdConfigProtocolBgpPolicyCommunityListCommunity.h",
1227+
"commands/config/protocol/bgp/policy/prefix-list/BgpPrefixListCliUtils.h",
1228+
"commands/config/protocol/bgp/policy/prefix-list/CmdConfigProtocolBgpPolicyPrefixList.h",
12251229
"commands/config/protocol/static/CmdConfigProtocolStatic.h",
12261230
"commands/config/protocol/static/route/StaticRouteUtils.h",
12271231
"commands/config/protocol/static/route/add/CmdConfigProtocolStaticRouteAdd.h",
@@ -1275,6 +1279,7 @@ cpp_library(
12751279
"commands/delete/protocol/bgp/policy/CmdDeleteProtocolBgpPolicy.h",
12761280
"commands/delete/protocol/bgp/policy/as-path-list/CmdDeleteProtocolBgpPolicyAsPathList.h",
12771281
"commands/delete/protocol/bgp/policy/community-list/CmdDeleteProtocolBgpPolicyCommunityList.h",
1282+
"commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.h",
12781283
"commands/delete/protocol/static/CmdDeleteProtocolStatic.h",
12791284
"commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.h",
12801285
"commands/delete/qos/CmdDeleteQos.h",

fboss/cli/fboss2/CmdListConfig.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/as-path-list/entry/CmdConfigProtocolBgpPolicyAsPathListEntry.h"
4646
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/community-list/CmdConfigProtocolBgpPolicyCommunityList.h"
4747
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/community-list/community/CmdConfigProtocolBgpPolicyCommunityListCommunity.h"
48+
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/prefix-list/CmdConfigProtocolBgpPolicyPrefixList.h"
4849
#include "fboss/cli/fboss2/commands/config/protocol/static/CmdConfigProtocolStatic.h"
4950
#include "fboss/cli/fboss2/commands/config/protocol/static/route/add/CmdConfigProtocolStaticRouteAdd.h"
5051
#include "fboss/cli/fboss2/commands/config/ptp/CmdConfigPtp.h"
@@ -95,6 +96,7 @@
9596
#include "fboss/cli/fboss2/commands/delete/protocol/bgp/policy/CmdDeleteProtocolBgpPolicy.h"
9697
#include "fboss/cli/fboss2/commands/delete/protocol/bgp/policy/as-path-list/CmdDeleteProtocolBgpPolicyAsPathList.h"
9798
#include "fboss/cli/fboss2/commands/delete/protocol/bgp/policy/community-list/CmdDeleteProtocolBgpPolicyCommunityList.h"
99+
#include "fboss/cli/fboss2/commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.h"
98100
#include "fboss/cli/fboss2/commands/delete/protocol/static/CmdDeleteProtocolStatic.h"
99101
#include "fboss/cli/fboss2/commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.h"
100102
#include "fboss/cli/fboss2/commands/delete/qos/CmdDeleteQos.h"
@@ -429,6 +431,17 @@ const CommandTree& kConfigCommandTree() {
429431
argRegistrar<
430432
CmdConfigProtocolBgpPolicyCommunityListCommunityTraits>,
431433
}},
434+
},
435+
{
436+
"prefix-list",
437+
"Configure BGP prefix-list: <name> "
438+
"[<attribute> <value> ...] "
439+
"(boolean-operator, compare-operator, "
440+
"description, ip-version)",
441+
commandHandler<
442+
CmdConfigProtocolBgpPolicyPrefixList>,
443+
argRegistrar<
444+
CmdConfigProtocolBgpPolicyPrefixListTraits>,
432445
}},
433446
},
434447
},
@@ -747,6 +760,14 @@ const CommandTree& kConfigCommandTree() {
747760
CmdDeleteProtocolBgpPolicyCommunityList>,
748761
argRegistrar<
749762
CmdDeleteProtocolBgpPolicyCommunityListTraits>,
763+
},
764+
{
765+
"prefix-list",
766+
"Delete a BGP prefix-list: <name> "
767+
"[entry <seq-num>]",
768+
commandHandler<CmdDeleteProtocolBgpPolicyPrefixList>,
769+
argRegistrar<
770+
CmdDeleteProtocolBgpPolicyPrefixListTraits>,
750771
}},
751772
}},
752773
},

fboss/cli/fboss2/commands/config/protocol/bgp/policy/CmdConfigProtocolBgpPolicy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace facebook::fboss {
2020

2121
// Grouping node for `config protocol bgp policy <object-type> ...`. Holds no
2222
// state of its own; the per-object-type dispatchers (as-path-list,
23-
// community-list, and later prefix-list/routing-policy) are its subcommands.
23+
// community-list, prefix-list, and later routing-policy) are its subcommands.
2424
// Mirrors CmdConfigProtocolBgp.
2525
struct CmdConfigProtocolBgpPolicyTraits : public WriteCommandTraits {
2626
using ParentCmd = CmdConfigProtocolBgp;
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* Copyright (c) 2004-present, Facebook, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree. An additional grant
7+
* of patent rights can be found in the PATENTS file in the same directory.
8+
*
9+
*/
10+
11+
#pragma once
12+
13+
#include <neteng/fboss/bgp/public_tld/configerator/structs/neteng/fboss/bgp/gen-cpp2/bgp_config_types.h>
14+
#include <algorithm>
15+
#include <cstdint>
16+
#include <string>
17+
#include "configerator/structs/neteng/bgp_policy/thrift/gen-cpp2/routing_policy_types.h"
18+
19+
/**
20+
* Lookup/create helpers for the prefix-list CLI family, shared between the
21+
* list-level dispatcher (CmdConfigProtocolBgpPolicyPrefixList), the entry
22+
* subcommand (CmdConfigProtocolBgpPolicyPrefixListEntry), and the delete
23+
* counterparts. A PrefixList is keyed by name; a PrefixListEntry (in
24+
* prefixes[]) is keyed by seq_num.
25+
*/
26+
namespace facebook::fboss::bgpcli {
27+
28+
inline bool prefixListExists(
29+
const bgp::thrift::BgpConfig& cfg,
30+
const std::string& name) {
31+
if (!cfg.policies().has_value()) {
32+
return false;
33+
}
34+
const auto& lists = *cfg.policies()->prefix_lists();
35+
return std::any_of(lists.begin(), lists.end(), [&](const auto& list) {
36+
return *list.name() == name;
37+
});
38+
}
39+
40+
// Find the prefix-list keyed by name, creating it if absent. Setting an
41+
// attribute on a not-yet-created list implicitly creates it, so command
42+
// ordering stays forgiving; a bare `prefix-list <name>` creates one
43+
// explicitly. PrefixList's only key field is `name`.
44+
inline bgp::routing_policy::PrefixList& findOrCreatePrefixList(
45+
bgp::thrift::BgpConfig& cfg,
46+
const std::string& name) {
47+
auto& lists = *cfg.policies().ensure().prefix_lists();
48+
for (auto& list : lists) {
49+
if (*list.name() == name) {
50+
return list;
51+
}
52+
}
53+
lists.emplace_back();
54+
auto& list = lists.back();
55+
list.name() = name;
56+
return list;
57+
}
58+
59+
inline bool prefixListEntryExists(
60+
const bgp::routing_policy::PrefixList& list,
61+
int32_t seqNum) {
62+
const auto& entries = *list.prefixes();
63+
return std::any_of(entries.begin(), entries.end(), [&](const auto& entry) {
64+
return entry.seq_num().has_value() && *entry.seq_num() == seqNum;
65+
});
66+
}
67+
68+
// Find the entry keyed by seq_num within a list's prefixes[], creating it if
69+
// absent. seq_num is the entry's identity.
70+
inline bgp::routing_policy::PrefixListEntry& findOrCreatePrefixListEntry(
71+
bgp::routing_policy::PrefixList& list,
72+
int32_t seqNum) {
73+
auto& entries = *list.prefixes();
74+
for (auto& entry : entries) {
75+
if (entry.seq_num().has_value() && *entry.seq_num() == seqNum) {
76+
return entry;
77+
}
78+
}
79+
entries.emplace_back();
80+
auto& entry = entries.back();
81+
entry.seq_num() = seqNum;
82+
return entry;
83+
}
84+
85+
} // namespace facebook::fboss::bgpcli

0 commit comments

Comments
 (0)