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
6 changes: 6 additions & 0 deletions cmake/CliFboss2.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -968,6 +968,12 @@ add_library(fboss2_config_lib
fboss/cli/fboss2/commands/config/qos/CmdConfigQos.h
fboss/cli/fboss2/commands/config/qos/buffer_pool/CmdConfigQosBufferPool.cpp
fboss/cli/fboss2/commands/config/qos/buffer_pool/CmdConfigQosBufferPool.h
fboss/cli/fboss2/commands/config/qos/default_policy/CmdConfigQosDefaultPolicy.cpp
fboss/cli/fboss2/commands/config/qos/default_policy/CmdConfigQosDefaultPolicy.h
fboss/cli/fboss2/commands/delete/qos/CmdDeleteQos.cpp
fboss/cli/fboss2/commands/delete/qos/CmdDeleteQos.h
fboss/cli/fboss2/commands/delete/qos/default_policy/CmdDeleteQosDefaultPolicy.cpp
fboss/cli/fboss2/commands/delete/qos/default_policy/CmdDeleteQosDefaultPolicy.h
fboss/cli/fboss2/commands/config/qos/policy/CmdConfigQosPolicy.cpp
fboss/cli/fboss2/commands/config/qos/policy/CmdConfigQosPolicy.h
fboss/cli/fboss2/commands/config/qos/policy/CmdConfigQosPolicyMap.cpp
Expand Down
2 changes: 2 additions & 0 deletions cmake/CliFboss2TestConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ add_executable(fboss2_cmd_config_test
fboss/cli/fboss2/test/config/CmdConfigMacAgingTimeTest.cpp
fboss/cli/fboss2/test/config/CmdConfigLoadBalancingTest.cpp
fboss/cli/fboss2/test/config/CmdConfigQosBufferPoolTest.cpp
fboss/cli/fboss2/test/config/CmdConfigQosDefaultPolicyTest.cpp
fboss/cli/fboss2/test/config/CmdDeleteQosDefaultPolicyTest.cpp
fboss/cli/fboss2/test/config/CmdConfigReloadTest.cpp
fboss/cli/fboss2/test/config/CmdConfigSessionCommitTest.cpp
fboss/cli/fboss2/test/config/CmdConfigSessionDiffTest.cpp
Expand Down
1 change: 1 addition & 0 deletions cmake/CliFboss2TestIntegrationTest.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ add_executable(fboss2_integration_test
fboss/cli/fboss2/test/integration_test/ConfigInterfaceLldpExpectedValueTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigInterfaceLoopbackModeTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigInterfaceTypeTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigQosDefaultPolicyTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigQosPolicyMapTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigSessionClearTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigVlanCreateTest.cpp
Expand Down
6 changes: 6 additions & 0 deletions fboss/cli/fboss2/BUCK
Original file line number Diff line number Diff line change
Expand Up @@ -1128,6 +1128,9 @@ cpp_library(
"commands/config/ptp/transparent_clock/CmdConfigPtpTransparentClock.cpp",
"commands/config/qos/CmdConfigQos.cpp",
"commands/config/qos/buffer_pool/CmdConfigQosBufferPool.cpp",
"commands/config/qos/default_policy/CmdConfigQosDefaultPolicy.cpp",
"commands/delete/qos/CmdDeleteQos.cpp",
"commands/delete/qos/default_policy/CmdDeleteQosDefaultPolicy.cpp",
"commands/config/qos/policy/CmdConfigQosPolicy.cpp",
"commands/config/qos/policy/CmdConfigQosPolicyMap.cpp",
"commands/config/qos/priority_group_policy/CmdConfigQosPriorityGroupPolicy.cpp",
Expand Down Expand Up @@ -1251,6 +1254,9 @@ cpp_library(
"commands/config/ptp/transparent_clock/CmdConfigPtpTransparentClock.h",
"commands/config/qos/CmdConfigQos.h",
"commands/config/qos/buffer_pool/CmdConfigQosBufferPool.h",
"commands/config/qos/default_policy/CmdConfigQosDefaultPolicy.h",
"commands/delete/qos/CmdDeleteQos.h",
"commands/delete/qos/default_policy/CmdDeleteQosDefaultPolicy.h",
"commands/config/qos/policy/CmdConfigQosPolicy.h",
"commands/config/qos/policy/CmdConfigQosPolicyMap.h",
"commands/config/qos/priority_group_policy/CmdConfigQosPriorityGroupPolicy.h",
Expand Down
23 changes: 23 additions & 0 deletions fboss/cli/fboss2/CmdListConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
#include "fboss/cli/fboss2/commands/config/ptp/transparent_clock/CmdConfigPtpTransparentClock.h"
#include "fboss/cli/fboss2/commands/config/qos/CmdConfigQos.h"
#include "fboss/cli/fboss2/commands/config/qos/buffer_pool/CmdConfigQosBufferPool.h"
#include "fboss/cli/fboss2/commands/config/qos/default_policy/CmdConfigQosDefaultPolicy.h"
#include "fboss/cli/fboss2/commands/config/qos/policy/CmdConfigQosPolicy.h"
#include "fboss/cli/fboss2/commands/config/qos/policy/CmdConfigQosPolicyMap.h"
#include "fboss/cli/fboss2/commands/config/qos/priority_group_policy/CmdConfigQosPriorityGroupPolicy.h"
Expand Down Expand Up @@ -131,6 +132,8 @@
#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"
#include "fboss/cli/fboss2/commands/delete/qos/CmdDeleteQos.h"
#include "fboss/cli/fboss2/commands/delete/qos/default_policy/CmdDeleteQosDefaultPolicy.h"
#include "fboss/cli/fboss2/commands/delete/tunnel/CmdDeleteTunnel.h"
#include "fboss/cli/fboss2/commands/delete/tunnel/ip_in_ip/CmdDeleteTunnelIpInIp.h"
#include "fboss/cli/fboss2/commands/delete/tunnel/ip_in_ip/decap/CmdDeleteTunnelIpInIpDecap.h"
Expand Down Expand Up @@ -866,6 +869,12 @@ const CommandTree& kConfigCommandTree() {
commandHandler<CmdConfigQosBufferPool>,
argRegistrar<CmdConfigQosBufferPoolTraits>,
},
{
"default-policy",
"Set the default data-plane QoS policy for ports not in portIdToQosPolicy",
commandHandler<CmdConfigQosDefaultPolicy>,
argRegistrar<CmdConfigQosDefaultPolicyTraits>,
},
{
"policy",
"Configure QoS policy settings",
Expand Down Expand Up @@ -1043,6 +1052,20 @@ const CommandTree& kConfigCommandTree() {
}},
},

{
"delete",
"qos",
"Delete (reset to default) QoS settings",
commandHandler<CmdDeleteQos>,
argRegistrar<CmdDeleteQosTraits>,
{{
"default-policy",
"Clear the default data-plane QoS policy",
commandHandler<CmdDeleteQosDefaultPolicy>,
argRegistrar<CmdDeleteQosDefaultPolicyTraits>,
}},
},

{
"delete",
"protocol",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* 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/config/qos/default_policy/CmdConfigQosDefaultPolicy.h"

#include "fboss/cli/fboss2/CmdHandler.cpp"

#include <fmt/format.h>
#include <folly/String.h>
#include <re2/re2.h>
#include <iostream>
#include <stdexcept>

#include "fboss/agent/gen-cpp2/switch_config_types.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 {

DefaultPolicyName::DefaultPolicyName(std::vector<std::string> v) {
if (v.empty()) {
throw std::invalid_argument("QoS policy name is required");
}
if (v.size() != 1) {
throw std::invalid_argument(
fmt::format(
"Expected single QoS policy name, got: {}", folly::join(", ", v)));
}
const auto& name = v[0];
static const re2::RE2 kValidPolicyNamePattern(
"^[a-zA-Z][a-zA-Z0-9_-]{0,63}$");
if (!re2::RE2::FullMatch(name, kValidPolicyNamePattern)) {
throw std::invalid_argument(
"Invalid QoS policy name: '" + name +
"'. Name must start with a letter, contain only alphanumeric "
"characters, underscores, or hyphens, and be 1-64 characters long.");
}
data_.push_back(name);
}

CmdConfigQosDefaultPolicyTraits::RetType CmdConfigQosDefaultPolicy::queryClient(
const HostInfo& /* hostInfo */,
const ObjectArgType& policyName) {
auto& session = ConfigSession::getInstance();
auto& agentConfig = session.getAgentConfig();
auto& switchConfig = *agentConfig.sw();

const auto& name = policyName.getName();
bool found = false;
for (const auto& policy : *switchConfig.qosPolicies()) {
if (*policy.name() == name) {
found = true;
break;
}
}
if (!found) {
std::vector<std::string> available;
for (const auto& policy : *switchConfig.qosPolicies()) {
available.push_back(*policy.name());
}
throw std::invalid_argument(
fmt::format(
"QoS policy '{}' not found in config. Available policies: {}",
name,
available.empty() ? "<none>" : folly::join(", ", available)));
}

if (!switchConfig.dataPlaneTrafficPolicy().has_value()) {
switchConfig.dataPlaneTrafficPolicy() = cfg::TrafficPolicyConfig{};
}
switchConfig.dataPlaneTrafficPolicy()->defaultQosPolicy() = name;

session.saveConfig(cli::ServiceType::AGENT, cli::ConfigActionLevel::HITLESS);

return fmt::format("Successfully set default QoS policy to '{}'", name);
}

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

// Explicit template instantiation
template void
CmdHandler<CmdConfigQosDefaultPolicy, CmdConfigQosDefaultPolicyTraits>::run();

} // namespace facebook::fboss
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* 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 <string>
#include <vector>
#include "fboss/cli/fboss2/CmdHandler.h"
#include "fboss/cli/fboss2/commands/config/qos/CmdConfigQos.h"
#include "fboss/cli/fboss2/utils/CmdUtilsCommon.h"
#include "fboss/cli/fboss2/utils/HostInfo.h"

namespace facebook::fboss {

class DefaultPolicyName : public utils::BaseObjectArgType<std::string> {
public:
// NOLINTNEXTLINE(google-explicit-constructor)
/* implicit */ DefaultPolicyName(std::vector<std::string> v);

const std::string& getName() const {
return data_[0];
}
};

struct CmdConfigQosDefaultPolicyTraits : public WriteCommandTraits {
using ParentCmd = CmdConfigQos;
static void addCliArg(CLI::App& cmd, std::vector<std::string>& args) {
cmd.add_option("policy_name", args, "QoS policy name to set as default");
}
using ObjectArgType = DefaultPolicyName;
using RetType = std::string;
};

class CmdConfigQosDefaultPolicy : public CmdHandler<
CmdConfigQosDefaultPolicy,
CmdConfigQosDefaultPolicyTraits> {
public:
using ObjectArgType = CmdConfigQosDefaultPolicyTraits::ObjectArgType;
using RetType = CmdConfigQosDefaultPolicyTraits::RetType;

RetType queryClient(
const HostInfo& hostInfo,
const ObjectArgType& policyName);

void printOutput(const RetType& logMsg);
};

} // namespace facebook::fboss
30 changes: 30 additions & 0 deletions fboss/cli/fboss2/commands/delete/qos/CmdDeleteQos.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* 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/qos/CmdDeleteQos.h"

#include "fboss/cli/fboss2/CmdHandler.cpp"

#include <iostream>

namespace facebook::fboss {

CmdDeleteQosTraits::RetType CmdDeleteQos::queryClient(
const HostInfo& /* hostInfo */) {
return "Delete QoS configuration commands. Use subcommands: default-policy";
}

void CmdDeleteQos::printOutput(const RetType& output) {
std::cout << output << std::endl;
}

template void CmdHandler<CmdDeleteQos, CmdDeleteQosTraits>::run();

} // namespace facebook::fboss
33 changes: 33 additions & 0 deletions fboss/cli/fboss2/commands/delete/qos/CmdDeleteQos.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* 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 "fboss/cli/fboss2/CmdHandler.h"

namespace facebook::fboss {

struct CmdDeleteQosTraits : public WriteCommandTraits {
using ParentCmd = void;
using ObjectArgType = std::monostate;
using RetType = std::string;
};

class CmdDeleteQos : public CmdHandler<CmdDeleteQos, CmdDeleteQosTraits> {
public:
using ObjectArgType = CmdDeleteQosTraits::ObjectArgType;
using RetType = CmdDeleteQosTraits::RetType;

RetType queryClient(const HostInfo& hostInfo);

void printOutput(const RetType& output);
};

} // namespace facebook::fboss
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* 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/qos/default_policy/CmdDeleteQosDefaultPolicy.h"

#include "fboss/cli/fboss2/CmdHandler.cpp"

#include <fmt/format.h>
#include <iostream>

#include "fboss/agent/gen-cpp2/switch_config_types.h"
#include "fboss/cli/fboss2/session/ConfigSession.h"
#include "fboss/cli/fboss2/utils/HostInfo.h"

namespace facebook::fboss {

CmdDeleteQosDefaultPolicyTraits::RetType CmdDeleteQosDefaultPolicy::queryClient(
const HostInfo& /* hostInfo */) {
auto& session = ConfigSession::getInstance();
auto& agentConfig = session.getAgentConfig();
auto& switchConfig = *agentConfig.sw();

if (!switchConfig.dataPlaneTrafficPolicy().has_value() ||
!switchConfig.dataPlaneTrafficPolicy()->defaultQosPolicy().has_value()) {
return "No default QoS policy is currently configured";
}

auto removedName = *switchConfig.dataPlaneTrafficPolicy()->defaultQosPolicy();
switchConfig.dataPlaneTrafficPolicy()->defaultQosPolicy().reset();

// COLDBOOT: a hitless unset of defaultQosPolicy desyncs SaiQosMapManager
// handle bookkeeping in the hw agent and the next qos policy change aborts
// it. Relax to HITLESS once the agent handle-ownership bug is fixed.
session.saveConfig(
cli::ServiceType::AGENT, cli::ConfigActionLevel::AGENT_COLDBOOT);

return fmt::format(
"Successfully removed default QoS policy '{}'", removedName);
}

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

// Explicit template instantiation
template void
CmdHandler<CmdDeleteQosDefaultPolicy, CmdDeleteQosDefaultPolicyTraits>::run();

} // namespace facebook::fboss
Loading