Skip to content

[Nexthop][fboss2-dev] Add fboss2-dev config dhcp {relay,reply}-source-override CLI subcommands#1333

Open
benoit-nexthop wants to merge 1 commit into
facebook:mainfrom
nexthop-ai:dhcp-cli
Open

[Nexthop][fboss2-dev] Add fboss2-dev config dhcp {relay,reply}-source-override CLI subcommands#1333
benoit-nexthop wants to merge 1 commit into
facebook:mainfrom
nexthop-ai:dhcp-cli

Conversation

@benoit-nexthop

Copy link
Copy Markdown
Contributor

Summary

Adds two new fboss2-dev config dhcp subcommand families for setting
the FBOSS agent's DHCP source-override addresses at runtime. All four
fields are applied via plain setters in ApplyThriftConfig.cpp with no
*ChangeProhibited guard, so all are HITLESS:

  • config dhcp relay-source-override ipv4 <A.B.C.D>sw.dhcpRelaySrcOverrideV4
  • config dhcp relay-source-override ipv6 <A:B::C>sw.dhcpRelaySrcOverrideV6
  • config dhcp reply-source-override ipv4 <A.B.C.D>sw.dhcpReplySrcOverrideV4
  • config dhcp reply-source-override ipv6 <A:B::C>sw.dhcpReplySrcOverrideV6

The <family> <ip> positional arguments are parsed by the shared
DhcpSourceOverrideArgs class which validates the family token
(ipv4/ipv6) and the IP address via folly::IPAddressV{4,6}::tryFromString.

Test Plan

Unit tests

$ fboss2_cmd_config_test --gtest_filter='CmdConfigDhcpTestFixture.*'

[==========] Running 11 tests from 1 test suite.
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_valid
[       OK ] CmdConfigDhcpTestFixture.argValidation_valid (49 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_badArity
[       OK ] CmdConfigDhcpTestFixture.argValidation_badArity (34 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_unknownFamily
[       OK ] CmdConfigDhcpTestFixture.argValidation_unknownFamily (33 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_invalidIpv4
[       OK ] CmdConfigDhcpTestFixture.argValidation_invalidIpv4 (32 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_invalidIpv6
[       OK ] CmdConfigDhcpTestFixture.argValidation_invalidIpv6 (33 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_familyMismatch
[       OK ] CmdConfigDhcpTestFixture.argValidation_familyMismatch (34 ms)
[ RUN      ] CmdConfigDhcpTestFixture.setRelayIpv4
[       OK ] CmdConfigDhcpTestFixture.setRelayIpv4 (76 ms)
[ RUN      ] CmdConfigDhcpTestFixture.setRelayIpv6
[       OK ] CmdConfigDhcpTestFixture.setRelayIpv6 (69 ms)
[ RUN      ] CmdConfigDhcpTestFixture.setReplyIpv4
[       OK ] CmdConfigDhcpTestFixture.setReplyIpv4 (58 ms)
[ RUN      ] CmdConfigDhcpTestFixture.setReplyIpv6
[       OK ] CmdConfigDhcpTestFixture.setReplyIpv6 (67 ms)
[ RUN      ] CmdConfigDhcpTestFixture.setRelayIpv4_overwrites
[       OK ] CmdConfigDhcpTestFixture.setRelayIpv4_overwrites (117 ms)
[----------] 11 tests from CmdConfigDhcpTestFixture (605 ms total)
[  PASSED  ] 11 tests.

Integration tests (on NH-4010-F)

$ fboss2_integration_test --gtest_filter='ConfigDhcpSourceOverrideTest.*'

[==========] Running 4 tests from 1 test suite.
[ RUN      ] ConfigDhcpSourceOverrideTest.SetRelayIpv4
[       OK ] ConfigDhcpSourceOverrideTest.SetRelayIpv4 (76 ms)
[ RUN      ] ConfigDhcpSourceOverrideTest.SetRelayIpv6
[       OK ] ConfigDhcpSourceOverrideTest.SetRelayIpv6 (59 ms)
[ RUN      ] ConfigDhcpSourceOverrideTest.SetReplyIpv4
[       OK ] ConfigDhcpSourceOverrideTest.SetReplyIpv4 (60 ms)
[ RUN      ] ConfigDhcpSourceOverrideTest.SetReplyIpv6
[       OK ] ConfigDhcpSourceOverrideTest.SetReplyIpv6 (69 ms)
[----------] 4 tests from ConfigDhcpSourceOverrideTest (264 ms total)
[  PASSED  ] 4 tests.

Each test reads the current field value via getRunningConfig(), sets a
new value via the CLI, commits the session (HITLESS), verifies the
running config reflects the change, then restores the original value if
one was set.

Sample usage

$ fboss2-dev config dhcp relay-source-override ipv4 192.0.2.1
Set dhcp relay-source-override ipv4 to 192.0.2.1
$ fboss2-dev config dhcp relay-source-override ipv6 2001:db8::1
Set dhcp relay-source-override ipv6 to 2001:db8::1
$ fboss2-dev config dhcp reply-source-override ipv4 192.0.2.11
Set dhcp reply-source-override ipv4 to 192.0.2.11
$ fboss2-dev config dhcp reply-source-override ipv6 2001:db8::11
Set dhcp reply-source-override ipv6 to 2001:db8::11

$ fboss2-dev config session diff
--- current live config
+++ session config
@@ -40,6 +40,10 @@
  "sw": {
    ...
+    "dhcpRelaySrcOverrideV4": "192.0.2.1",
+    "dhcpRelaySrcOverrideV6": "2001:db8::1",
+    "dhcpReplySrcOverrideV4": "192.0.2.11",
+    "dhcpReplySrcOverrideV6": "2001:db8::11",
    ...

$ fboss2-dev config session commit
Config session committed successfully as a1b2c3d and config reloaded for fboss_sw_agent.

@benoit-nexthop benoit-nexthop requested review from a team as code owners June 25, 2026 00:17
@meta-cla meta-cla Bot added the CLA Signed label Jun 25, 2026
Adds two new `fboss2-dev config dhcp` subcommand families for setting
the FBOSS agent's DHCP source-override addresses at runtime. All four
fields are applied via plain setters in `ApplyThriftConfig.cpp` with no
`*ChangeProhibited` guard, so all are HITLESS:

- `config dhcp relay-source-override ipv4 <A.B.C.D>` → `sw.dhcpRelaySrcOverrideV4`
- `config dhcp relay-source-override ipv6 <A:B::C>`  → `sw.dhcpRelaySrcOverrideV6`
- `config dhcp reply-source-override ipv4 <A.B.C.D>` → `sw.dhcpReplySrcOverrideV4`
- `config dhcp reply-source-override ipv6 <A:B::C>`  → `sw.dhcpReplySrcOverrideV6`

The `<family> <ip>` positional arguments are parsed by the shared
`DhcpSourceOverrideArgs` class (in `CmdConfigDhcp.h`) which validates the
family token (`ipv4`/`ipv6`, case-insensitive) and the IP address via
`folly::IPAddressV{4,6}::tryFromString`.

The `reply-source-override` handler additionally validates that the
supplied IP matches a configured interface IP (required by the agent at
reply-processing time) via a template helper `requireInterfaceIp<V4/V6>`.
A clear error listing valid addresses is surfaced on failure.

```
$ fboss2_cmd_config_test \
    --gtest_filter='CmdConfigDhcpTestFixture.*:CmdConfigDhcpReplyTestFixture.*'

[----------] 10 tests from CmdConfigDhcpTestFixture
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_valid
[       OK ] CmdConfigDhcpTestFixture.argValidation_valid (60 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_badArity
[       OK ] CmdConfigDhcpTestFixture.argValidation_badArity (30 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_caseInsensitive
[       OK ] CmdConfigDhcpTestFixture.argValidation_caseInsensitive (29 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_unknownFamily
[       OK ] CmdConfigDhcpTestFixture.argValidation_unknownFamily (29 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_invalidIpv4
[       OK ] CmdConfigDhcpTestFixture.argValidation_invalidIpv4 (29 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_invalidIpv6
[       OK ] CmdConfigDhcpTestFixture.argValidation_invalidIpv6 (32 ms)
[ RUN      ] CmdConfigDhcpTestFixture.argValidation_familyMismatch
[       OK ] CmdConfigDhcpTestFixture.argValidation_familyMismatch (30 ms)
[ RUN      ] CmdConfigDhcpTestFixture.setRelayIpv4
[       OK ] CmdConfigDhcpTestFixture.setRelayIpv4 (62 ms)
[ RUN      ] CmdConfigDhcpTestFixture.setRelayIpv6
[       OK ] CmdConfigDhcpTestFixture.setRelayIpv6 (62 ms)
[ RUN      ] CmdConfigDhcpTestFixture.setRelayIpv4_overwrites
[       OK ] CmdConfigDhcpTestFixture.setRelayIpv4_overwrites (76 ms)
[----------] 10 tests from CmdConfigDhcpTestFixture (444 ms total)

[----------] 4 tests from CmdConfigDhcpReplyTestFixture
[ RUN      ] CmdConfigDhcpReplyTestFixture.setReplyIpv4
[       OK ] CmdConfigDhcpReplyTestFixture.setReplyIpv4 (58 ms)
[ RUN      ] CmdConfigDhcpReplyTestFixture.setReplyIpv6
[       OK ] CmdConfigDhcpReplyTestFixture.setReplyIpv6 (50 ms)
[ RUN      ] CmdConfigDhcpReplyTestFixture.setReplyIpv4_rejectsBogusIp
[       OK ] CmdConfigDhcpReplyTestFixture.setReplyIpv4_rejectsBogusIp (47 ms)
[ RUN      ] CmdConfigDhcpReplyTestFixture.setReplyIpv6_rejectsBogusIp
[       OK ] CmdConfigDhcpReplyTestFixture.setReplyIpv6_rejectsBogusIp (47 ms)
[----------] 4 tests from CmdConfigDhcpReplyTestFixture (203 ms total)

[==========] 227 tests from 18 test suites ran. (10857 ms total)
[  PASSED  ] 227 tests.
```

```
$ fboss2_integration_test \
    --gtest_filter='ConfigDhcpSourceOverrideTest.*'

[==========] Running 4 tests from 1 test suite.
[ RUN      ] ConfigDhcpSourceOverrideTest.SetRelayIpv4
I ConfigDhcpSourceOverrideTest.cpp] [Step 1] Original dhcpRelaySrcOverrideV4 = 192.0.2.1
I ConfigDhcpSourceOverrideTest.cpp] [Step 2] Running: config dhcp relay-source-override ipv4 192.0.2.2
I ConfigDhcpSourceOverrideTest.cpp] [Step 3] Committing (expect HITLESS, no restart)...
I ConfigDhcpSourceOverrideTest.cpp] [Step 4] Verifying running config...
I ConfigDhcpSourceOverrideTest.cpp] [Step 5] Restoring original value 192.0.2.1
[       OK ] ConfigDhcpSourceOverrideTest.SetRelayIpv4 (115 ms)
[ RUN      ] ConfigDhcpSourceOverrideTest.SetRelayIpv6
I ConfigDhcpSourceOverrideTest.cpp] [Step 1] Original dhcpRelaySrcOverrideV6 = 2001:db8::1
I ConfigDhcpSourceOverrideTest.cpp] [Step 2] Running: config dhcp relay-source-override ipv6 2001:db8::2
I ConfigDhcpSourceOverrideTest.cpp] [Step 3] Committing (expect HITLESS, no restart)...
I ConfigDhcpSourceOverrideTest.cpp] [Step 4] Verifying running config...
I ConfigDhcpSourceOverrideTest.cpp] [Step 5] Restoring original value 2001:db8::1
[       OK ] ConfigDhcpSourceOverrideTest.SetRelayIpv6 (109 ms)
[ RUN      ] ConfigDhcpSourceOverrideTest.SetReplyIpv4
ConfigDhcpSourceOverrideTest.cpp:195: Skipped
No IPv4 interface IPs configured on this DUT; reply-source-override requires an IP that matches an interface
[  SKIPPED ] ConfigDhcpSourceOverrideTest.SetReplyIpv4 (6 ms)
[ RUN      ] ConfigDhcpSourceOverrideTest.SetReplyIpv6
ConfigDhcpSourceOverrideTest.cpp:205: Skipped
No non-link-local IPv6 interface IPs configured on this DUT; reply-source-override requires an IP that matches an interface
[  SKIPPED ] ConfigDhcpSourceOverrideTest.SetReplyIpv6 (6 ms)
[----------] 4 tests from ConfigDhcpSourceOverrideTest (239 ms total)

[  PASSED  ] 2 tests.
[  SKIPPED ] 2 tests, listed below:
[  SKIPPED ] ConfigDhcpSourceOverrideTest.SetReplyIpv4
[  SKIPPED ] ConfigDhcpSourceOverrideTest.SetReplyIpv6
```

The reply-source-override integration tests skip on NH-4010-F because the DUT
has no L3 interface IPs (only link-local fe80:: addresses). The CLI-level
validation (`requireInterfaceIp`) ensures a clear error is returned if an
operator supplies an IP not configured on any interface.

```
$ fboss2-dev config dhcp relay-source-override ipv4 192.0.2.1
Set dhcp relay-source-override ipv4 to 192.0.2.1
$ fboss2-dev config dhcp relay-source-override ipv6 2001:db8::1
Set dhcp relay-source-override ipv6 to 2001:db8::1

$ fboss2-dev config dhcp reply-source-override ipv4 10.0.0.1
Set dhcp reply-source-override ipv4 to 10.0.0.1
$ fboss2-dev config dhcp reply-source-override ipv4 10.9.9.9
Error: Reply source override address '10.9.9.9' does not match any
configured interface IP. Valid addresses: 10.0.0.1, 10.1.2.3

$ fboss2-dev config session diff
--- current live config
+++ session config
@@ -40,6 +40,8 @@
  "sw": {
    ...
+    "dhcpRelaySrcOverrideV4": "192.0.2.1",
+    "dhcpRelaySrcOverrideV6": "2001:db8::1",
    ...

$ fboss2-dev config session commit
Config session committed successfully and config reloaded for fboss_sw_agent.
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant