Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
b26756f
[Nexthop] fboss2 bgp policy routing-policy term commands
hillol-nexthop Aug 7, 2026
5e8b8ef
Emit routing-policy term commands from bgp_json_to_cli.py
hillol-nexthop Sep 15, 2026
7241ca2
Make BGP routing-policy term delete idempotent
hillol-nexthop Sep 16, 2026
596cb78
Use the canonical Meta copyright header in new files
hillol-nexthop Oct 16, 2026
f87bc4d
Mirror the Meta import amendments from the routing-policy level
hillol-nexthop Oct 23, 2026
ef98e57
[Nexthop] NOS-6672..NOS-6679: fboss2 bgp policy routing-policy term a…
hillol-nexthop Aug 7, 2026
172e74d
Emit term action commands from bgp_json_to_cli.py
hillol-nexthop Sep 15, 2026
5fc8143
Use the canonical Meta copyright header in new files
hillol-nexthop Oct 16, 2026
d1431fb
Map action result to the match action and validate communities
hillol-nexthop Oct 20, 2026
74a0b14
Mirror the Meta import amendments from the routing-policy level
hillol-nexthop Oct 23, 2026
981922a
[Nexthop] fboss2 bgp policy routing-policy term match
hillol-nexthop Aug 7, 2026
e6155c5
Emit term match commands from bgp_json_to_cli.py
hillol-nexthop Sep 15, 2026
e995141
Require `from as-path-list` to name an existing list and carry its op…
hillol-nexthop Sep 15, 2026
f8d74e1
Seed the term-match test's as-path-list with the flat regex attribute
hillol-nexthop Sep 16, 2026
56aac34
Require `from prefix-list` to name an existing list
hillol-nexthop Oct 8, 2026
b2a865d
Use the canonical Meta copyright header in new files
hillol-nexthop Oct 16, 2026
be7a00b
Mirror the Meta import amendments from the routing-policy level
hillol-nexthop Oct 23, 2026
134d9a9
Seed the term-match emitter test's result via a PERMIT action entry
hillol-nexthop Oct 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions cmake/CliFboss2.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -986,6 +986,13 @@ add_library(fboss2_config_lib
fboss/cli/fboss2/commands/config/protocol/bgp/policy/prefix-list/entry/CmdConfigProtocolBgpPolicyPrefixListEntry.h
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/CmdConfigProtocolBgpPolicyRoutingPolicy.cpp
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/CmdConfigProtocolBgpPolicyRoutingPolicy.h
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/BgpRoutingPolicyCliUtils.h
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/CmdConfigProtocolBgpPolicyRoutingPolicyTerm.cpp
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/CmdConfigProtocolBgpPolicyRoutingPolicyTerm.h
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/action/CmdConfigProtocolBgpPolicyRoutingPolicyTermAction.cpp
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/action/CmdConfigProtocolBgpPolicyRoutingPolicyTermAction.h
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/match/CmdConfigProtocolBgpPolicyRoutingPolicyTermMatch.cpp
fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/match/CmdConfigProtocolBgpPolicyRoutingPolicyTermMatch.h
fboss/cli/fboss2/commands/config/ptp/CmdConfigPtp.cpp
fboss/cli/fboss2/commands/config/ptp/CmdConfigPtp.h
fboss/cli/fboss2/commands/config/ptp/transparent_clock/CmdConfigPtpTransparentClock.cpp
Expand Down Expand Up @@ -1132,6 +1139,8 @@ add_library(fboss2_config_lib
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.h
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/routing-policy/CmdDeleteProtocolBgpPolicyRoutingPolicy.cpp
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/routing-policy/CmdDeleteProtocolBgpPolicyRoutingPolicy.h
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/routing-policy/term/CmdDeleteProtocolBgpPolicyRoutingPolicyTerm.cpp
fboss/cli/fboss2/commands/delete/protocol/bgp/policy/routing-policy/term/CmdDeleteProtocolBgpPolicyRoutingPolicyTerm.h
fboss/cli/fboss2/commands/delete/protocol/CmdDeleteProtocol.h
fboss/cli/fboss2/commands/delete/protocol/static/CmdDeleteProtocolStatic.cpp
fboss/cli/fboss2/commands/delete/protocol/static/CmdDeleteProtocolStatic.h
Expand Down
4 changes: 4 additions & 0 deletions cmake/CliFboss2TestConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ add_executable(fboss2_cmd_config_test
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyPrefixListTest.cpp
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyPrefixListEntryTest.cpp
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyRoutingPolicyTest.cpp
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyRoutingPolicyTermTest.cpp
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyRoutingPolicyTermActionTest.cpp
fboss/cli/fboss2/test/config/CmdConfigBgpPolicyRoutingPolicyTermMatchTest.cpp
fboss/cli/fboss2/test/config/CmdConfigCoppTest.cpp
fboss/cli/fboss2/test/config/CmdConfigDataPlaneTrafficPolicyTest.cpp
fboss/cli/fboss2/test/config/CmdConfigDhcpTest.cpp
Expand Down Expand Up @@ -60,6 +63,7 @@ add_executable(fboss2_cmd_config_test
fboss/cli/fboss2/test/config/CmdDeleteBgpPolicyCommunityListTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteBgpPolicyPrefixListTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteBgpPolicyRoutingPolicyTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteBgpPolicyRoutingPolicyTermTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteConfigInterfaceTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteCoppQueueTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteCoppReasonTest.cpp
Expand Down
3 changes: 3 additions & 0 deletions cmake/CliFboss2TestIntegrationTest.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ add_executable(fboss2_integration_test
fboss/cli/fboss2/test/integration_test/ConfigBgpPolicyPrefixListTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigBgpPolicyPrefixListEntryTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigBgpPolicyRoutingPolicyTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigBgpPolicyRoutingPolicyTermTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigBgpPolicyRoutingPolicyTermActionTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigBgpPolicyRoutingPolicyTermMatchTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigBgpSessionTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigConcurrentSessionsTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigHostnameTest.cpp
Expand Down
9 changes: 9 additions & 0 deletions fboss/cli/fboss2/BUCK
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,9 @@ cpp_library(
"commands/config/protocol/bgp/policy/prefix-list/CmdConfigProtocolBgpPolicyPrefixList.cpp",
"commands/config/protocol/bgp/policy/prefix-list/entry/CmdConfigProtocolBgpPolicyPrefixListEntry.cpp",
"commands/config/protocol/bgp/policy/routing-policy/CmdConfigProtocolBgpPolicyRoutingPolicy.cpp",
"commands/config/protocol/bgp/policy/routing-policy/term/CmdConfigProtocolBgpPolicyRoutingPolicyTerm.cpp",
"commands/config/protocol/bgp/policy/routing-policy/term/action/CmdConfigProtocolBgpPolicyRoutingPolicyTermAction.cpp",
"commands/config/protocol/bgp/policy/routing-policy/term/match/CmdConfigProtocolBgpPolicyRoutingPolicyTermMatch.cpp",
"commands/config/protocol/static/CmdConfigProtocolStatic.cpp",
"commands/config/protocol/static/route/add/CmdConfigProtocolStaticRouteAdd.cpp",
"commands/config/ptp/CmdConfigPtp.cpp",
Expand Down Expand Up @@ -1292,6 +1295,7 @@ cpp_library(
"commands/delete/protocol/bgp/policy/community-list/CmdDeleteProtocolBgpPolicyCommunityList.cpp",
"commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.cpp",
"commands/delete/protocol/bgp/policy/routing-policy/CmdDeleteProtocolBgpPolicyRoutingPolicy.cpp",
"commands/delete/protocol/bgp/policy/routing-policy/term/CmdDeleteProtocolBgpPolicyRoutingPolicyTerm.cpp",
"commands/delete/protocol/static/CmdDeleteProtocolStatic.cpp",
"commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.cpp",
"commands/delete/qos/CmdDeleteQos.cpp",
Expand Down Expand Up @@ -1374,6 +1378,10 @@ cpp_library(
"commands/config/protocol/bgp/policy/prefix-list/CmdConfigProtocolBgpPolicyPrefixList.h",
"commands/config/protocol/bgp/policy/prefix-list/entry/CmdConfigProtocolBgpPolicyPrefixListEntry.h",
"commands/config/protocol/bgp/policy/routing-policy/CmdConfigProtocolBgpPolicyRoutingPolicy.h",
"commands/config/protocol/bgp/policy/routing-policy/BgpRoutingPolicyCliUtils.h",
"commands/config/protocol/bgp/policy/routing-policy/term/CmdConfigProtocolBgpPolicyRoutingPolicyTerm.h",
"commands/config/protocol/bgp/policy/routing-policy/term/action/CmdConfigProtocolBgpPolicyRoutingPolicyTermAction.h",
"commands/config/protocol/bgp/policy/routing-policy/term/match/CmdConfigProtocolBgpPolicyRoutingPolicyTermMatch.h",
"commands/config/protocol/static/CmdConfigProtocolStatic.h",
"commands/config/protocol/static/route/StaticRouteUtils.h",
"commands/config/protocol/static/route/add/CmdConfigProtocolStaticRouteAdd.h",
Expand Down Expand Up @@ -1447,6 +1455,7 @@ cpp_library(
"commands/delete/protocol/bgp/policy/community-list/CmdDeleteProtocolBgpPolicyCommunityList.h",
"commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.h",
"commands/delete/protocol/bgp/policy/routing-policy/CmdDeleteProtocolBgpPolicyRoutingPolicy.h",
"commands/delete/protocol/bgp/policy/routing-policy/term/CmdDeleteProtocolBgpPolicyRoutingPolicyTerm.h",
"commands/delete/protocol/static/CmdDeleteProtocolStatic.h",
"commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.h",
"commands/delete/qos/CmdDeleteQos.h",
Expand Down
2 changes: 1 addition & 1 deletion fboss/cli/fboss2/CmdArgsLists.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class CmdArgsLists {
private:
// since we do a lot of work of figuring out argument types at compile time,
// for now we need to know the the theoretical max depth of nested subcommands
static constexpr auto MAX_DEPTH = 5;
static constexpr auto MAX_DEPTH = 6;

std::array<std::vector<std::string>, MAX_DEPTH> data_;
};
Expand Down
56 changes: 56 additions & 0 deletions fboss/cli/fboss2/CmdListConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/prefix-list/CmdConfigProtocolBgpPolicyPrefixList.h"
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/prefix-list/entry/CmdConfigProtocolBgpPolicyPrefixListEntry.h"
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/CmdConfigProtocolBgpPolicyRoutingPolicy.h"
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/CmdConfigProtocolBgpPolicyRoutingPolicyTerm.h"
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/action/CmdConfigProtocolBgpPolicyRoutingPolicyTermAction.h"
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/term/match/CmdConfigProtocolBgpPolicyRoutingPolicyTermMatch.h"
#include "fboss/cli/fboss2/commands/config/protocol/static/CmdConfigProtocolStatic.h"
#include "fboss/cli/fboss2/commands/config/protocol/static/route/add/CmdConfigProtocolStaticRouteAdd.h"
#include "fboss/cli/fboss2/commands/config/ptp/CmdConfigPtp.h"
Expand Down Expand Up @@ -117,6 +120,7 @@
#include "fboss/cli/fboss2/commands/delete/protocol/bgp/policy/community-list/CmdDeleteProtocolBgpPolicyCommunityList.h"
#include "fboss/cli/fboss2/commands/delete/protocol/bgp/policy/prefix-list/CmdDeleteProtocolBgpPolicyPrefixList.h"
#include "fboss/cli/fboss2/commands/delete/protocol/bgp/policy/routing-policy/CmdDeleteProtocolBgpPolicyRoutingPolicy.h"
#include "fboss/cli/fboss2/commands/delete/protocol/bgp/policy/routing-policy/term/CmdDeleteProtocolBgpPolicyRoutingPolicyTerm.h"
#include "fboss/cli/fboss2/commands/delete/protocol/static/CmdDeleteProtocolStatic.h"
#include "fboss/cli/fboss2/commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.h"
#include "fboss/cli/fboss2/commands/delete/qos/CmdDeleteQos.h"
Expand Down Expand Up @@ -482,6 +486,50 @@ const CommandTree& kConfigCommandTree() {
CmdConfigProtocolBgpPolicyRoutingPolicy>,
argRegistrar<
CmdConfigProtocolBgpPolicyRoutingPolicyTraits>,
{{
"term",
"Configure a routing-policy term: "
"<seq-num> [<attribute> <value> ...] "
"(description)",
commandHandler<
CmdConfigProtocolBgpPolicyRoutingPolicyTerm>,
argRegistrar<
CmdConfigProtocolBgpPolicyRoutingPolicyTermTraits>,
{{
"action",
"Configure a term action",
{{
"result",
"Set the term result: "
"<ACCEPT|REJECT|CONTINUE>",
commandHandler<
CmdConfigProtocolBgpPolicyRoutingPolicyTermActionResult>,
argRegistrar<
CmdConfigProtocolBgpPolicyRoutingPolicyTermActionResultTraits>,
},
{
"set",
"Set a route attribute: "
"as-path prepend|community|"
"local-pref|med|next-hop|"
"origin|weight <value> ...",
commandHandler<
CmdConfigProtocolBgpPolicyRoutingPolicyTermActionSet>,
argRegistrar<
CmdConfigProtocolBgpPolicyRoutingPolicyTermActionSetTraits>,
}},
},
{
"match",
"Configure a term match: "
"from as-path-list|origin|"
"prefix-list <value>",
commandHandler<
CmdConfigProtocolBgpPolicyRoutingPolicyTermMatch>,
argRegistrar<
CmdConfigProtocolBgpPolicyRoutingPolicyTermMatchTraits>,
}},
}},
}},
},
},
Expand Down Expand Up @@ -862,6 +910,14 @@ const CommandTree& kConfigCommandTree() {
CmdDeleteProtocolBgpPolicyRoutingPolicy>,
argRegistrar<
CmdDeleteProtocolBgpPolicyRoutingPolicyTraits>,
{{
"term",
"Delete a routing-policy term: <seq-num>",
commandHandler<
CmdDeleteProtocolBgpPolicyRoutingPolicyTerm>,
argRegistrar<
CmdDeleteProtocolBgpPolicyRoutingPolicyTermTraits>,
}},
}},
}},
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/

#pragma once

#include <algorithm>
#include <cstdint>
#include <string>

#ifndef IS_OSS
#include <configerator/structs/neteng/bgp_policy/thrift/gen-cpp2/bgp_policy_types.h>
#include <configerator/structs/neteng/fboss/bgp/gen-cpp2/bgp_config_types.h>
#else
#include <neteng/fboss/bgp/public_tld/configerator/structs/neteng/fboss/bgp/gen-cpp2/bgp_config_types.h>
#endif

/**
* Lookup/create helpers for the routing-policy CLI family, shared between the
* policy-level dispatcher (CmdConfigProtocolBgpPolicyRoutingPolicy), the term
* subcommand (CmdConfigProtocolBgpPolicyRoutingPolicyTerm), and their delete
* counterparts. A routing-policy (BgpPolicyStatement) is keyed by name; a
* term (BgpPolicyTerm in policy_entries[]) is keyed by sequence_number.
*/
namespace facebook::fboss::bgpcli {

inline bool routingPolicyExists(
const bgp::thrift::BgpConfig& cfg,
const std::string& name) {
if (!cfg.policies().has_value()) {
return false;
}
const auto& policies = *cfg.policies()->bgp_policy_statements();
return std::any_of(policies.begin(), policies.end(), [&](const auto& p) {
return *p.name() == name;
});
}

// The routing-policy statement keyed by name, or nullptr. Non-creating;
// used by the delete commands so a typo'd delete can't stage a change.
inline bgp::bgp_policy::BgpPolicyStatement* findRoutingPolicy(
bgp::thrift::BgpConfig& cfg,
const std::string& name) {
if (!cfg.policies().has_value()) {
return nullptr;
}
auto& policies = *cfg.policies()->bgp_policy_statements();
auto it = std::find_if(policies.begin(), policies.end(), [&](const auto& p) {
return *p.name() == name;
});
return it == policies.end() ? nullptr : &*it;
}

// Find the routing-policy statement keyed by name, creating it if absent.
// Setting an attribute on a not-yet-created policy implicitly creates it, so
// command ordering stays forgiving; a bare `routing-policy <name>` creates one
// explicitly. BgpPolicyStatement's only key field is `name`.
inline bgp::bgp_policy::BgpPolicyStatement& findOrCreateRoutingPolicy(
bgp::thrift::BgpConfig& cfg,
const std::string& name) {
auto& policies = *cfg.policies().ensure().bgp_policy_statements();
for (auto& policy : policies) {
if (*policy.name() == name) {
return policy;
}
}
policies.emplace_back();
auto& policy = policies.back();
policy.name() = name;
return policy;
}

inline bool routingPolicyTermExists(
const bgp::bgp_policy::BgpPolicyStatement& policy,
int64_t seqNum) {
const auto& terms = *policy.policy_entries();
return std::any_of(terms.begin(), terms.end(), [&](const auto& t) {
return t.sequence_number().has_value() && *t.sequence_number() == seqNum;
});
}

// Find the term keyed by sequence_number, creating it if absent. The name is
// seeded from the seq-num so every term has a stable, unique identity —
// BgpPolicyAction.next_term_id references terms by name.
inline bgp::bgp_policy::BgpPolicyTerm& findOrCreateRoutingPolicyTerm(
bgp::bgp_policy::BgpPolicyStatement& policy,
int64_t seqNum) {
auto& terms = *policy.policy_entries();
for (auto& term : terms) {
if (term.sequence_number().has_value() &&
*term.sequence_number() == seqNum) {
return term;
}
}
terms.emplace_back();
auto& term = terms.back();
term.sequence_number() = seqNum;
term.name() = std::to_string(seqNum);
return term;
}

} // namespace facebook::fboss::bgpcli
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <vector>
#include "fboss/cli/fboss2/commands/config/protocol/bgp/BgpCliAttrHandlers.h"
#include "fboss/cli/fboss2/commands/config/protocol/bgp/BgpCliValueParsers.h"
#include "fboss/cli/fboss2/commands/config/protocol/bgp/policy/routing-policy/BgpRoutingPolicyCliUtils.h"
#include "fboss/cli/fboss2/session/ConfigSession.h"
#include "fboss/cli/fboss2/utils/CmdUtilsCommon.h"
#include "fboss/cli/fboss2/utils/HostInfo.h"
Expand Down Expand Up @@ -85,37 +86,6 @@ std::string validAttrList() {
return out;
}

// Find the routing-policy statement keyed by name, creating it if absent.
// Setting an attribute on a not-yet-created policy implicitly creates it, so
// command ordering stays forgiving; a bare `routing-policy <name>` creates one
// explicitly. BgpPolicyStatement's only key field is `name`.
BgpPolicyStatement& findOrCreatePolicy(
bgp::thrift::BgpConfig& cfg,
const std::string& name) {
auto& policies = *cfg.policies().ensure().bgp_policy_statements();
for (auto& policy : policies) {
if (*policy.name() == name) {
return policy;
}
}
policies.emplace_back();
auto& policy = policies.back();
policy.name() = name;
return policy;
}

bool policyExists(const bgp::thrift::BgpConfig& cfg, const std::string& name) {
if (!cfg.policies().has_value()) {
return false;
}
for (const auto& policy : *cfg.policies()->bgp_policy_statements()) {
if (*policy.name() == name) {
return true;
}
}
return false;
}

} // namespace

// Parse + validate at construction so queryClient stays a thin dispatch.
Expand Down Expand Up @@ -156,8 +126,9 @@ CmdConfigProtocolBgpPolicyRoutingPolicy::queryClient(
const ObjectArgType& args) {
auto& session = ConfigSession::getInstance();
auto& cfg = session.getBgpConfig();
const bool policyCreated = !policyExists(cfg, args.policyName());
auto& policy = findOrCreatePolicy(cfg, args.policyName());
const bool policyCreated =
!bgpcli::routingPolicyExists(cfg, args.policyName());
auto& policy = bgpcli::findOrCreateRoutingPolicy(cfg, args.policyName());

Result result = args.attr().empty()
? ok(policyCreated
Expand Down
Loading
Loading