Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions cmake/CliFboss2.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -1074,6 +1074,8 @@ add_library(fboss2_config_lib
fboss/cli/fboss2/commands/delete/interface/ipv6/CmdDeleteInterfaceIpv6.h
fboss/cli/fboss2/commands/delete/interface/ipv6/ndp/CmdDeleteInterfaceIpv6Ndp.cpp
fboss/cli/fboss2/commands/delete/interface/ipv6/ndp/CmdDeleteInterfaceIpv6Ndp.h
fboss/cli/fboss2/commands/delete/load_balancing/CmdDeleteLoadBalancing.cpp
fboss/cli/fboss2/commands/delete/load_balancing/CmdDeleteLoadBalancing.h
fboss/cli/fboss2/commands/delete/protocol/CmdDeleteProtocol.cpp
fboss/cli/fboss2/commands/delete/protocol/CmdDeleteProtocol.h
fboss/cli/fboss2/commands/delete/protocol/static/CmdDeleteProtocolStatic.cpp
Expand Down
1 change: 1 addition & 0 deletions cmake/CliFboss2TestConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ add_executable(fboss2_cmd_config_test
fboss/cli/fboss2/test/config/CmdDeleteDhcpTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteInterfaceIpv6NdpTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteInterfaceTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteLoadBalancingTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteQosQueueConfigTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteTunnelIpInIpTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteVlanTest.cpp
Expand Down
1 change: 1 addition & 0 deletions cmake/CliFboss2TestIntegrationTest.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ add_executable(fboss2_integration_test
fboss/cli/fboss2/test/integration_test/DeleteArpTest.cpp
fboss/cli/fboss2/test/integration_test/DeleteDhcpSourceOverrideTest.cpp
fboss/cli/fboss2/test/integration_test/DeleteInterfaceIpv6NdpTest.cpp
fboss/cli/fboss2/test/integration_test/DeleteLoadBalancingTest.cpp
fboss/cli/fboss2/test/integration_test/DeleteVlanTest.cpp
fboss/cli/fboss2/test/integration_test/TunnelIpInIpTest.cpp
fboss/cli/fboss2/utils/CmdInitUtils.cpp
Expand Down
2 changes: 2 additions & 0 deletions fboss/cli/fboss2/BUCK
Original file line number Diff line number Diff line change
Expand Up @@ -1198,6 +1198,7 @@ cpp_library(
"commands/delete/interface/CmdDeleteInterface.cpp",
"commands/delete/interface/ipv6/CmdDeleteInterfaceIpv6.cpp",
"commands/delete/interface/ipv6/ndp/CmdDeleteInterfaceIpv6Ndp.cpp",
"commands/delete/load_balancing/CmdDeleteLoadBalancing.cpp",
"commands/delete/protocol/CmdDeleteProtocol.cpp",
"commands/delete/protocol/static/CmdDeleteProtocolStatic.cpp",
"commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.cpp",
Expand Down Expand Up @@ -1336,6 +1337,7 @@ cpp_library(
"commands/delete/interface/CmdDeleteInterface.h",
"commands/delete/interface/ipv6/CmdDeleteInterfaceIpv6.h",
"commands/delete/interface/ipv6/ndp/CmdDeleteInterfaceIpv6Ndp.h",
"commands/delete/load_balancing/CmdDeleteLoadBalancing.h",
"commands/delete/protocol/CmdDeleteProtocol.h",
"commands/delete/protocol/static/CmdDeleteProtocolStatic.h",
"commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.h",
Expand Down
21 changes: 21 additions & 0 deletions fboss/cli/fboss2/CmdListConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@
#include "fboss/cli/fboss2/commands/delete/interface/CmdDeleteInterface.h"
#include "fboss/cli/fboss2/commands/delete/interface/ipv6/CmdDeleteInterfaceIpv6.h"
#include "fboss/cli/fboss2/commands/delete/interface/ipv6/ndp/CmdDeleteInterfaceIpv6Ndp.h"
#include "fboss/cli/fboss2/commands/delete/load_balancing/CmdDeleteLoadBalancing.h"
#include "fboss/cli/fboss2/commands/delete/protocol/CmdDeleteProtocol.h"
#include "fboss/cli/fboss2/commands/delete/protocol/static/CmdDeleteProtocolStatic.h"
#include "fboss/cli/fboss2/commands/delete/protocol/static/route/CmdDeleteProtocolStaticRoute.h"
Expand Down Expand Up @@ -1176,6 +1177,26 @@ const CommandTree& kConfigCommandTree() {
}},
},

{
"delete",
"load-balancing",
"Delete load-balancing (ECMP/LAG) configuration",
commandHandler<CmdDeleteLoadBalancing>,
argRegistrar<CmdDeleteLoadBalancingTraits>,
{{
"ecmp",
"Delete the ECMP load-balancer configuration",
commandHandler<CmdDeleteLoadBalancingEcmp>,
argRegistrar<CmdDeleteLoadBalancingEcmpTraits>,
},
{
"lag",
"Delete the LAG load-balancer configuration",
commandHandler<CmdDeleteLoadBalancingLag>,
argRegistrar<CmdDeleteLoadBalancingLagTraits>,
}},
},

{"delete",
"tunnel",
"Delete (reset to default) tunnel settings",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include "fboss/cli/fboss2/commands/config/load_balancing/CmdConfigLoadBalancing.h"

#include "fboss/agent/gen-cpp2/switch_config_types.h"
#include "fboss/cli/fboss2/CmdHandler.cpp"

#include <fmt/format.h>
Expand All @@ -21,10 +22,12 @@
#include <set>
#include <stdexcept>
#include <string>
#include <string_view>
#include <utility>
#include <vector>
#include "fboss/cli/fboss2/gen-cpp2/cli_metadata_types.h"
#include "fboss/cli/fboss2/session/ConfigSession.h"
#include "fboss/cli/fboss2/utils/HostInfo.h"

namespace facebook::fboss {

Expand Down Expand Up @@ -87,16 +90,6 @@ const std::set<std::string_view> kValidAlgorithms = {
kAlgoCrc,
};

std::string lbIdToString(cfg::LoadBalancerID id) {
switch (id) {
case cfg::LoadBalancerID::ECMP:
return std::string(kLbIdEcmp);
case cfg::LoadBalancerID::AGGREGATE_PORT:
return std::string(kLbIdLag);
}
folly::assume_unreachable();
}

std::string algorithmToString(cfg::HashingAlgorithm a) {
switch (a) {
case cfg::HashingAlgorithm::CRC16_CCITT:
Expand Down Expand Up @@ -267,6 +260,16 @@ cfg::LoadBalancer& findOrCreateLoadBalancer(

} // namespace

std::string lbIdToString(cfg::LoadBalancerID id) {
switch (id) {
case cfg::LoadBalancerID::ECMP:
return std::string(kLbIdEcmp);
case cfg::LoadBalancerID::AGGREGATE_PORT:
return std::string(kLbIdLag);
}
folly::assume_unreachable();
}

LoadBalancingConfigArgs::LoadBalancingConfigArgs(std::vector<std::string> v) {
if (v.size() != 2) {
throw std::invalid_argument(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ class LoadBalancingConfigArgs : public utils::BaseObjectArgType<std::string> {
std::string value_;
};

// CLI display name ("ecmp"/"lag") for a LoadBalancerID, shared by the
// config and delete load-balancing command trees.
std::string lbIdToString(cfg::LoadBalancerID id);

// Mutate `swConfig`'s load-balancer entry matching `id` to apply
// `<attr> <value>`, inserting a new entry if none exists. Throws
// std::invalid_argument for unknown attrs or malformed values.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright (c) 2004-present, Facebook, Inc.
* 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.
*
*/

#include "fboss/cli/fboss2/commands/delete/load_balancing/CmdDeleteLoadBalancing.h"

#include "fboss/agent/gen-cpp2/switch_config_types.h"
#include "fboss/cli/fboss2/CmdHandler.cpp"

#include <fmt/format.h>
#include <algorithm>
#include <iostream>
#include <stdexcept>
#include <string>
#include "fboss/cli/fboss2/commands/config/load_balancing/CmdConfigLoadBalancing.h"
#include "fboss/cli/fboss2/gen-cpp2/cli_metadata_types.h"
#include "fboss/cli/fboss2/session/ConfigSession.h"
#include "fboss/cli/fboss2/utils/HostInfo.h"

namespace facebook::fboss {

namespace {

// Shared implementation for both ECMP and LAG handlers. Removing a
// load-balancer is applied hitlessly by the SAI layer: SaiSwitch dispatches
// LoadBalancersDelta removals to SaiSwitchManager::removeLoadBalancer
// without any *ChangeProhibited guard, the same delta path the config
// subcommands rely on.
std::string runLoadBalancerDelete(cfg::LoadBalancerID id) {
auto& session = ConfigSession::getInstance();
auto msg = removeLoadBalancer(*session.getAgentConfig().sw(), id);
session.saveConfig(cli::ServiceType::AGENT, cli::ConfigActionLevel::HITLESS);
return msg;
}

} // namespace

std::string removeLoadBalancer(
cfg::SwitchConfig& swConfig,
cfg::LoadBalancerID id) {
auto& loadBalancers = *swConfig.loadBalancers();
auto it = std::find_if(
loadBalancers.begin(), loadBalancers.end(), [id](const auto& lb) {
return *lb.id() == id;
});
if (it == loadBalancers.end()) {
throw std::invalid_argument(
fmt::format("No {} load-balancer configured", lbIdToString(id)));
}
loadBalancers.erase(it);
return fmt::format("Deleted {} load-balancer", lbIdToString(id));
}

CmdDeleteLoadBalancingEcmpTraits::RetType
CmdDeleteLoadBalancingEcmp::queryClient(const HostInfo& /* hostInfo */) {
return runLoadBalancerDelete(cfg::LoadBalancerID::ECMP);
}

void CmdDeleteLoadBalancingEcmp::printOutput(const RetType& logMsg) {
std::cout << logMsg << std::endl;
}

CmdDeleteLoadBalancingLagTraits::RetType CmdDeleteLoadBalancingLag::queryClient(
const HostInfo& /* hostInfo */) {
return runLoadBalancerDelete(cfg::LoadBalancerID::AGGREGATE_PORT);
}

void CmdDeleteLoadBalancingLag::printOutput(const RetType& logMsg) {
std::cout << logMsg << std::endl;
}

// Explicit template instantiations
template void
CmdHandler<CmdDeleteLoadBalancing, CmdDeleteLoadBalancingTraits>::run();
template void
CmdHandler<CmdDeleteLoadBalancingEcmp, CmdDeleteLoadBalancingEcmpTraits>::run();
template void
CmdHandler<CmdDeleteLoadBalancingLag, CmdDeleteLoadBalancingLagTraits>::run();

} // namespace facebook::fboss
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* Copyright (c) 2004-present, Facebook, Inc.
* 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 <stdexcept>
#include <string>
#include "fboss/agent/gen-cpp2/switch_config_types.h"
#include "fboss/cli/fboss2/CmdHandler.h"
#include "fboss/cli/fboss2/utils/CmdUtilsCommon.h"

namespace facebook::fboss {

// Removes the load-balancer entry matching `id` from
// swConfig.loadBalancers, returning a human-readable result string.
// Throws std::invalid_argument if no entry with that ID is configured.
std::string removeLoadBalancer(
cfg::SwitchConfig& swConfig,
cfg::LoadBalancerID id);

struct CmdDeleteLoadBalancingTraits : public WriteCommandTraits {
using ObjectArgType = utils::NoneArgType;
using RetType = std::string;
};

class CmdDeleteLoadBalancing
: public CmdHandler<CmdDeleteLoadBalancing, CmdDeleteLoadBalancingTraits> {
public:
using ObjectArgType = CmdDeleteLoadBalancingTraits::ObjectArgType;
using RetType = CmdDeleteLoadBalancingTraits::RetType;

RetType queryClient(const HostInfo& /* hostInfo */) {
throw std::runtime_error(
"Incomplete command, please use 'ecmp' or 'lag' subcommand");
}

void printOutput(const RetType& /* model */) {}
};

// ECMP and LAG share the removal logic — they differ only in which
// LoadBalancerID they target. The two handler classes are thin wrappers that
// exist so the command tree can register them at distinct paths
// (`delete load-balancing ecmp` and `delete load-balancing lag`), mirroring
// the config-side CmdConfigLoadBalancing{Ecmp,Lag} split.

struct CmdDeleteLoadBalancingEcmpTraits : public WriteCommandTraits {
using ParentCmd = CmdDeleteLoadBalancing;
using ObjectArgType = utils::NoneArgType;
using RetType = std::string;
};

class CmdDeleteLoadBalancingEcmp : public CmdHandler<
CmdDeleteLoadBalancingEcmp,
CmdDeleteLoadBalancingEcmpTraits> {
public:
using ObjectArgType = CmdDeleteLoadBalancingEcmpTraits::ObjectArgType;
using RetType = CmdDeleteLoadBalancingEcmpTraits::RetType;

RetType queryClient(const HostInfo& hostInfo);

void printOutput(const RetType& logMsg);
};

struct CmdDeleteLoadBalancingLagTraits : public WriteCommandTraits {
using ParentCmd = CmdDeleteLoadBalancing;
using ObjectArgType = utils::NoneArgType;
using RetType = std::string;
};

class CmdDeleteLoadBalancingLag : public CmdHandler<
CmdDeleteLoadBalancingLag,
CmdDeleteLoadBalancingLagTraits> {
public:
using ObjectArgType = CmdDeleteLoadBalancingLagTraits::ObjectArgType;
using RetType = CmdDeleteLoadBalancingLagTraits::RetType;

RetType queryClient(const HostInfo& hostInfo);

void printOutput(const RetType& logMsg);
};

} // namespace facebook::fboss
1 change: 1 addition & 0 deletions fboss/cli/fboss2/test/config/BUCK
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ cpp_unittest(
"CmdDeleteDhcpTest.cpp",
"CmdDeleteInterfaceIpv6NdpTest.cpp",
"CmdDeleteInterfaceTest.cpp",
"CmdDeleteLoadBalancingTest.cpp",
"CmdDeleteQosDefaultPolicyTest.cpp",
"CmdDeleteQosQueueConfigTest.cpp",
"CmdDeleteTunnelIpInIpTest.cpp",
Expand Down
Loading
Loading