Skip to content

Commit beeefbb

Browse files
Add a fboss2 config interface <name> description <desc> command.
Add some helper code to process interface-list arguments.
1 parent 6d1cdea commit beeefbb

15 files changed

+525
-0
lines changed

cmake/CliFboss2.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,9 @@ add_library(fboss2_config_lib
577577
fboss/cli/fboss2/commands/config/CmdConfigAppliedInfo.cpp
578578
fboss/cli/fboss2/commands/config/CmdConfigReload.h
579579
fboss/cli/fboss2/commands/config/CmdConfigReload.cpp
580+
fboss/cli/fboss2/commands/config/interface/CmdConfigInterface.h
581+
fboss/cli/fboss2/commands/config/interface/CmdConfigInterfaceDescription.h
582+
fboss/cli/fboss2/commands/config/interface/CmdConfigInterfaceDescription.cpp
580583
fboss/cli/fboss2/commands/config/history/CmdConfigHistory.h
581584
fboss/cli/fboss2/commands/config/history/CmdConfigHistory.cpp
582585
fboss/cli/fboss2/commands/config/rollback/CmdConfigRollback.h
@@ -587,6 +590,8 @@ add_library(fboss2_config_lib
587590
fboss/cli/fboss2/commands/config/session/CmdConfigSessionDiff.cpp
588591
fboss/cli/fboss2/session/ConfigSession.h
589592
fboss/cli/fboss2/session/ConfigSession.cpp
593+
fboss/cli/fboss2/utils/InterfaceList.h
594+
fboss/cli/fboss2/utils/InterfaceList.cpp
590595
fboss/cli/fboss2/CmdListConfig.cpp
591596
fboss/cli/fboss2/CmdHandlerImplConfig.cpp
592597
)

cmake/CliFboss2Test.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ add_executable(fboss2_cmd_test
3535
fboss/cli/fboss2/test/TestMain.cpp
3636
fboss/cli/fboss2/test/CmdConfigAppliedInfoTest.cpp
3737
fboss/cli/fboss2/test/CmdConfigHistoryTest.cpp
38+
fboss/cli/fboss2/test/CmdConfigInterfaceDescriptionTest.cpp
3839
fboss/cli/fboss2/test/CmdConfigReloadTest.cpp
3940
fboss/cli/fboss2/test/CmdConfigSessionDiffTest.cpp
4041
fboss/cli/fboss2/test/CmdConfigSessionTest.cpp

fboss/cli/fboss2/BUCK

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,19 +783,24 @@ cpp_library(
783783
"commands/config/CmdConfigAppliedInfo.cpp",
784784
"commands/config/CmdConfigReload.cpp",
785785
"commands/config/history/CmdConfigHistory.cpp",
786+
"commands/config/interface/CmdConfigInterfaceDescription.cpp",
786787
"commands/config/rollback/CmdConfigRollback.cpp",
787788
"commands/config/session/CmdConfigSessionCommit.cpp",
788789
"commands/config/session/CmdConfigSessionDiff.cpp",
789790
"session/ConfigSession.cpp",
791+
"utils/InterfaceList.cpp",
790792
],
791793
headers = [
792794
"commands/config/CmdConfigAppliedInfo.h",
793795
"commands/config/CmdConfigReload.h",
794796
"commands/config/history/CmdConfigHistory.h",
797+
"commands/config/interface/CmdConfigInterface.h",
798+
"commands/config/interface/CmdConfigInterfaceDescription.h",
795799
"commands/config/rollback/CmdConfigRollback.h",
796800
"commands/config/session/CmdConfigSessionCommit.h",
797801
"commands/config/session/CmdConfigSessionDiff.h",
798802
"session/ConfigSession.h",
803+
"utils/InterfaceList.h",
799804
],
800805
exported_deps = [
801806
"fbsource//third-party/fmt:fmt",

fboss/cli/fboss2/CmdHandler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ class CmdHandler {
169169
RetType result;
170170
try {
171171
result = queryClientHelper(hostInfo);
172+
} catch (std::invalid_argument const& err) {
173+
errStr = folly::to<std::string>("Invalid argument: ", err.what());
172174
} catch (std::exception const& err) {
173175
errStr = folly::to<std::string>("Thrift call failed: '", err.what(), "'");
174176
}

fboss/cli/fboss2/CmdHandlerImplConfig.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include "fboss/cli/fboss2/commands/config/CmdConfigAppliedInfo.h"
1717
#include "fboss/cli/fboss2/commands/config/CmdConfigReload.h"
1818
#include "fboss/cli/fboss2/commands/config/history/CmdConfigHistory.h"
19+
#include "fboss/cli/fboss2/commands/config/interface/CmdConfigInterface.h"
20+
#include "fboss/cli/fboss2/commands/config/interface/CmdConfigInterfaceDescription.h"
1921
#include "fboss/cli/fboss2/commands/config/rollback/CmdConfigRollback.h"
2022
#include "fboss/cli/fboss2/commands/config/session/CmdConfigSessionCommit.h"
2123
#include "fboss/cli/fboss2/commands/config/session/CmdConfigSessionDiff.h"
@@ -25,6 +27,10 @@ namespace facebook::fboss {
2527
template void
2628
CmdHandler<CmdConfigAppliedInfo, CmdConfigAppliedInfoTraits>::run();
2729
template void CmdHandler<CmdConfigReload, CmdConfigReloadTraits>::run();
30+
template void CmdHandler<CmdConfigInterface, CmdConfigInterfaceTraits>::run();
31+
template void CmdHandler<
32+
CmdConfigInterfaceDescription,
33+
CmdConfigInterfaceDescriptionTraits>::run();
2834
template void CmdHandler<CmdConfigHistory, CmdConfigHistoryTraits>::run();
2935
template void CmdHandler<CmdConfigRollback, CmdConfigRollbackTraits>::run();
3036
template void

fboss/cli/fboss2/CmdListConfig.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include "fboss/cli/fboss2/commands/config/CmdConfigAppliedInfo.h"
1515
#include "fboss/cli/fboss2/commands/config/CmdConfigReload.h"
1616
#include "fboss/cli/fboss2/commands/config/history/CmdConfigHistory.h"
17+
#include "fboss/cli/fboss2/commands/config/interface/CmdConfigInterface.h"
18+
#include "fboss/cli/fboss2/commands/config/interface/CmdConfigInterfaceDescription.h"
1719
#include "fboss/cli/fboss2/commands/config/rollback/CmdConfigRollback.h"
1820
#include "fboss/cli/fboss2/commands/config/session/CmdConfigSessionCommit.h"
1921
#include "fboss/cli/fboss2/commands/config/session/CmdConfigSessionDiff.h"
@@ -34,6 +36,20 @@ const CommandTree& kConfigCommandTree() {
3436
commandHandler<CmdConfigHistory>,
3537
argTypeHandler<CmdConfigHistoryTraits>},
3638

39+
{
40+
"config",
41+
"interface",
42+
"Configure interface settings",
43+
commandHandler<CmdConfigInterface>,
44+
argTypeHandler<CmdConfigInterfaceTraits>,
45+
{{
46+
"description",
47+
"Set interface description",
48+
commandHandler<CmdConfigInterfaceDescription>,
49+
argTypeHandler<CmdConfigInterfaceDescriptionTraits>,
50+
}},
51+
},
52+
3753
{
3854
"config",
3955
"session",

fboss/cli/fboss2/CmdSubcommands.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,9 @@ CLI::App* CmdSubcommands::addCommand(
219219
case utils::ObjectArgTypeId::OBJECT_ARG_TYPE_FAN_PWM:
220220
subCmd->add_option("pwm", args, "Fan PWM (0..100) or 'disable'");
221221
break;
222+
case utils::ObjectArgTypeId::OBJECT_ARG_TYPE_ID_INTERFACE_LIST:
223+
subCmd->add_option("interfaces", args, "Interface(s)");
224+
break;
222225
case utils::ObjectArgTypeId::OBJECT_ARG_TYPE_ID_REVISION_LIST:
223226
subCmd->add_option(
224227
"revisions", args, "Revision(s) in the form 'rN' or 'current'");
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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 "fboss/cli/fboss2/CmdHandler.h"
14+
#include "fboss/cli/fboss2/utils/CmdUtils.h"
15+
16+
namespace facebook::fboss {
17+
18+
struct CmdConfigInterfaceTraits : public WriteCommandTraits {
19+
static constexpr utils::ObjectArgTypeId ObjectArgTypeId =
20+
utils::ObjectArgTypeId::OBJECT_ARG_TYPE_ID_PORT_LIST;
21+
using ObjectArgType = std::vector<std::string>;
22+
using RetType = std::string;
23+
};
24+
25+
class CmdConfigInterface
26+
: public CmdHandler<CmdConfigInterface, CmdConfigInterfaceTraits> {
27+
public:
28+
RetType queryClient(
29+
const HostInfo& /* hostInfo */,
30+
const ObjectArgType& /* interfaceNames */) {
31+
throw std::runtime_error(
32+
"Incomplete command, please use one of the subcommands");
33+
}
34+
35+
void printOutput(const RetType& /* model */) {}
36+
};
37+
38+
} // namespace facebook::fboss
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
#include "fboss/cli/fboss2/commands/config/interface/CmdConfigInterfaceDescription.h"
12+
13+
#include <folly/Conv.h>
14+
#include "fboss/cli/fboss2/session/ConfigSession.h"
15+
16+
namespace facebook::fboss {
17+
18+
CmdConfigInterfaceDescriptionTraits::RetType
19+
CmdConfigInterfaceDescription::queryClient(
20+
const HostInfo& hostInfo,
21+
const utils::InterfaceList& interfaces,
22+
const ObjectArgType& description) {
23+
if (interfaces.empty()) {
24+
throw std::invalid_argument("No interface name provided");
25+
}
26+
27+
std::string descriptionStr = description.data()[0];
28+
29+
// Update description for all resolved ports
30+
for (const utils::Intf& intf : interfaces) {
31+
cfg::Port* port = intf.getPort();
32+
if (port) {
33+
port->description() = descriptionStr;
34+
}
35+
}
36+
37+
// Save the updated config
38+
ConfigSession::getInstance().saveConfig();
39+
40+
std::string interfaceList = folly::join(", ", interfaces.getNames());
41+
return "Successfully set description for interface(s) " + interfaceList;
42+
}
43+
44+
void CmdConfigInterfaceDescription::printOutput(const RetType& logMsg) {
45+
std::cout << logMsg << std::endl;
46+
}
47+
48+
} // namespace facebook::fboss
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 "fboss/cli/fboss2/CmdHandler.h"
14+
#include "fboss/cli/fboss2/commands/config/interface/CmdConfigInterface.h"
15+
#include "fboss/cli/fboss2/utils/CmdUtils.h"
16+
#include "fboss/cli/fboss2/utils/InterfaceList.h"
17+
18+
namespace facebook::fboss {
19+
20+
struct CmdConfigInterfaceDescriptionTraits : public WriteCommandTraits {
21+
using ParentCmd = CmdConfigInterface;
22+
static constexpr utils::ObjectArgTypeId ObjectArgTypeId =
23+
utils::ObjectArgTypeId::OBJECT_ARG_TYPE_ID_MESSAGE;
24+
using ObjectArgType = utils::Message;
25+
using RetType = std::string;
26+
};
27+
28+
class CmdConfigInterfaceDescription : public CmdHandler<
29+
CmdConfigInterfaceDescription,
30+
CmdConfigInterfaceDescriptionTraits> {
31+
public:
32+
using ObjectArgType = CmdConfigInterfaceDescriptionTraits::ObjectArgType;
33+
using RetType = CmdConfigInterfaceDescriptionTraits::RetType;
34+
35+
RetType queryClient(
36+
const HostInfo& hostInfo,
37+
const utils::InterfaceList& interfaces,
38+
const ObjectArgType& description);
39+
40+
void printOutput(const RetType& logMsg);
41+
};
42+
43+
} // namespace facebook::fboss

0 commit comments

Comments
 (0)