From 159a8ed5ecf46c13704f71ceb8aa52144018ce37 Mon Sep 17 00:00:00 2001 From: Navaneeth Y V Date: Thu, 30 Jul 2026 11:32:41 +0000 Subject: [PATCH 1/3] Add RT-5.17: Physical Interface Drain via Admin Down test specification --- .../interface_admin_drain_test/README.md | 219 ++++++++++++++++++ .../metadata.textproto | 7 + testregistry.textproto | 5 + 3 files changed, 231 insertions(+) create mode 100644 feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md create mode 100644 feature/interface/singleton/otg_tests/interface_admin_drain_test/metadata.textproto diff --git a/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md b/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md new file mode 100644 index 00000000000..0d93190811f --- /dev/null +++ b/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md @@ -0,0 +1,219 @@ +# RT-5.17: Physical Interface Drain via Admin Down + +## Summary + +Validates that setting a physical interface's administrative state (`enabled`) +to `false` via gNMI causes associated routing protocols (BGP peering sessions +and IS-IS Level-2 adjacencies) to tear down cleanly, ceases all traffic +forwarding across the drained interface, and ensures pass-through traffic +across non-drained interfaces remains completely unaffected. Furthermore, +validates that re-enabling the interface restores routing protocol sessions +and traffic forwarding. + +## Testbed type + +* https://github.com/openconfig/featureprofiles/blob/main/topologies/atedut_4.testbed + +## Topology + +```text + +------------+ + ATE Port 1 --| Port 1 |-- (Drained Physical Interface Under Test) + ATE Port 2 --| Port 2 DUT |-- (Ingress Traffic Generator Port) + ATE Port 3 --| Port 3 |-- (Pass-through / Egress Port) + ATE Port 4 --| Port 4 |-- (Auxiliary Transit / Monitoring Port) + +------------+ +``` + +* **DUT Port 1** (Drained Interface): Connected to **ATE Port 1**. + * IPv4: `198.51.100.1/31`, IPv6: `2001:db8:1::1/127` + * ATE IPv4: `198.51.100.0/31`, ATE IPv6: `2001:db8:1::0/127` + * BGP Peer: eBGP between DUT AS `64500` and ATE AS `64501` + * IS-IS: Level-2 point-to-point adjacency +* **DUT Port 2** (Ingress Source): Connected to **ATE Port 2**. + * IPv4: `198.51.100.3/31`, IPv6: `2001:db8:1::3/127` + * ATE IPv4: `198.51.100.2/31`, ATE IPv6: `2001:db8:1::2/127` +* **DUT Port 3** (Pass-through Egress): Connected to **ATE Port 3**. + * IPv4: `198.51.100.5/31`, IPv6: `2001:db8:1::5/127` + * ATE IPv4: `198.51.100.4/31`, ATE IPv6: `2001:db8:1::4/127` + * BGP Peer: eBGP between DUT AS `64500` and ATE AS `64503` + * IS-IS: Level-2 point-to-point adjacency +* **DUT Port 4** (Auxiliary Transit): Connected to **ATE Port 4**. + * IPv4: `198.51.100.7/31`, IPv6: `2001:db8:1::7/127` + * ATE IPv4: `198.51.100.6/31`, ATE IPv6: `2001:db8:1::6/127` + +## Procedure + +### Test environment setup + +1. Establish Layer 3 interface configurations on DUT Ports 1, 2, 3, and 4 + with dual-stack IPv4 and IPv6 subnets. +2. Establish eBGP sessions: + * DUT Port 1 to ATE Port 1: ATE advertises prefix `203.0.113.0/24` (IPv4) + and `2001:db8:2::/64` (IPv6). + * DUT Port 3 to ATE Port 3: ATE advertises prefix `203.0.113.128/25` (IPv4) + and `2001:db8:3::/64` (IPv6). +3. Establish IS-IS Level-2 point-to-point adjacencies over DUT Port 1 and + DUT Port 3 with standard metrics. +4. Verify routing protocol session states: + * `/network-instances/network-instance[name=DEFAULT]/protocols/protocol[identifier=BGP][name=bgp]/bgp/neighbors/neighbor[neighbor-address=198.51.100.0]/state/session-state` + is `ESTABLISHED`. + * `/network-instances/network-instance[name=DEFAULT]/protocols/protocol[identifier=BGP][name=bgp]/bgp/neighbors/neighbor[neighbor-address=2001:db8:1::0]/state/session-state` + is `ESTABLISHED`. + * `/network-instances/network-instance[name=DEFAULT]/protocols/protocol[identifier=BGP][name=bgp]/bgp/neighbors/neighbor[neighbor-address=198.51.100.4]/state/session-state` + is `ESTABLISHED`. + * `/network-instances/network-instance[name=DEFAULT]/protocols/protocol[identifier=BGP][name=bgp]/bgp/neighbors/neighbor[neighbor-address=2001:db8:1::4]/state/session-state` + is `ESTABLISHED`. + * IS-IS Level-2 adjacencies on Port 1 and Port 3 are in `UP` state via + `/network-instances/network-instance[name=DEFAULT]/protocols/protocol[identifier=ISIS][name=DEFAULT]/isis/interfaces/interface/levels/level[level-number=2]/adjacencies/adjacency/state/adjacency-state`. +5. Start continuous bidirectional traffic streams from ATE Port 2: + * **Stream 1**: Ingress ATE Port 2 -> Destination `203.0.113.10` / + `2001:db8:2::10` (Egress DUT Port 1). + * **Stream 2**: Ingress ATE Port 2 -> Destination `203.0.113.130` / + `2001:db8:3::10` (Egress DUT Port 3). +6. Verify baseline forwarding: both Stream 1 and Stream 2 experience 0% + packet loss at line rate. + +### RT-5.17.1 - Physical Interface Admin Down Drain + +1. Administratively disable DUT Port 1 via gNMI.Set: + * Set `/interfaces/interface[name=port1]/config/enabled` to `false`. + +#### Canonical OC + +```json +{ + "openconfig-interfaces:interfaces": { + "interface": [ + { + "config": { + "enabled": false, + "name": "port1" + }, + "name": "port1" + } + ] + } +} +``` + +2. Validate Interface State via telemetry: + * `/interfaces/interface[name=port1]/state/enabled` is `false`. + * `/interfaces/interface[name=port1]/state/admin-status` transitions to `DOWN`. + * `/interfaces/interface[name=port1]/state/oper-status` transitions to `DOWN`. + +3. Validate Routing Protocol Reaction: + * Verify BGP neighbor sessions over Port 1 (`198.51.100.0` and + `2001:db8:1::0`) transition away from `ESTABLISHED` (to `IDLE` or `ACTIVE`) + within the hold-time / fast-down interval. + * Verify IS-IS Level-2 adjacency on Port 1 transitions to `DOWN` and is + removed from the active IS-IS neighbor table. + * Verify BGP neighbor sessions and IS-IS adjacencies over Port 3 remain + continuously `ESTABLISHED` and `UP` without flapping. + +4. Validate Data Plane Drain & Pass-Through Traffic Isolation: + * Verify traffic for Stream 1 (destined to Port 1 prefixes) immediately + ceases to egress DUT Port 1; + `/interfaces/interface[name=port1]/state/counters/out-pkts` stops + incrementing. + * Verify pass-through traffic for Stream 2 (destined to Port 3 prefixes) + continues forwarding through DUT Port 3 with 0% packet loss and no rate + degradation. + +5. Pass/Fail Criteria: + * **Pass**: + * DUT Port 1 `admin-status` and `oper-status` are `DOWN`. + * BGP sessions and IS-IS adjacencies on Port 1 tear down. + * Forwarding on Port 1 completely ceases. + * Stream 2 on Port 3 forwards with 0% packet loss and 0 protocol flaps. + * **Fail**: + * DUT Port 1 `oper-status` remains `UP`. + * BGP or IS-IS neighbor sessions over Port 1 remain `ESTABLISHED` or `UP`. + * Packets continue to be transmitted out of Port 1. + * Pass-through traffic on Port 3 experiences packet loss or session + interruption. + +### RT-5.17.2 - Physical Interface Un-drain and Traffic Restoration + +1. Administratively re-enable DUT Port 1 via gNMI.Set: + * Set `/interfaces/interface[name=port1]/config/enabled` to `true`. + +#### Canonical OC + +```json +{ + "openconfig-interfaces:interfaces": { + "interface": [ + { + "config": { + "enabled": true, + "name": "port1" + }, + "name": "port1" + } + ] + } +} +``` + +2. Validate Interface Operational State via telemetry: + * `/interfaces/interface[name=port1]/state/enabled` is `true`. + * `/interfaces/interface[name=port1]/state/admin-status` transitions to `UP`. + * `/interfaces/interface[name=port1]/state/oper-status` transitions to `UP`. + +3. Validate Routing Protocol Restoration: + * Verify BGP neighbor sessions over Port 1 (`198.51.100.0` and + `2001:db8:1::0`) re-establish to `ESTABLISHED`. + * Verify IS-IS Level-2 adjacency over Port 1 re-establishes to `UP`. + * Verify learned prefixes (`203.0.113.0/24` and `2001:db8:2::/64`) are + re-installed into the FIB. + +4. Validate Traffic Flow Recovery: + * Verify Stream 1 resumes line-rate forwarding across DUT Port 1 with 0% + steady-state packet loss. + * Verify Stream 2 on Port 3 remains stable with 0% packet loss. + +5. Pass/Fail Criteria: + * **Pass**: + * DUT Port 1 `oper-status` returns to `UP`. + * BGP neighbor sessions and IS-IS adjacencies on Port 1 return to + `ESTABLISHED` / `UP`. + * Stream 1 resumes 100% throughput with 0% steady-state packet loss. + * **Fail**: + * DUT Port 1 remains `DOWN`. + * BGP or IS-IS sessions fail to re-establish on Port 1. + * Forwarding on Port 1 fails to restore or experiences packet loss. + +## OpenConfig Path and RPC Coverage + +The below yaml defines the OC paths and RPCs intended to be covered by this +test. + +```yaml +paths: + ## Interface configuration and operational state + /interfaces/interface/config/enabled: + /interfaces/interface/config/name: + /interfaces/interface/state/admin-status: + /interfaces/interface/state/enabled: + /interfaces/interface/state/name: + /interfaces/interface/state/oper-status: + /interfaces/interface/state/counters/in-octets: + /interfaces/interface/state/counters/in-pkts: + /interfaces/interface/state/counters/out-octets: + /interfaces/interface/state/counters/out-pkts: + + ## Routing Protocol State (BGP & IS-IS) + /network-instances/network-instance/protocols/protocol/bgp/neighbors/neighbor/state/session-state: + /network-instances/network-instance/protocols/protocol/isis/interfaces/interface/levels/level/adjacencies/adjacency/state/adjacency-state: + +rpcs: + gnmi: + gNMI.Set: + gNMI.Subscribe: +``` + +## Required DUT platform + +* FFF +* MFF diff --git a/feature/interface/singleton/otg_tests/interface_admin_drain_test/metadata.textproto b/feature/interface/singleton/otg_tests/interface_admin_drain_test/metadata.textproto new file mode 100644 index 00000000000..3c236b3b274 --- /dev/null +++ b/feature/interface/singleton/otg_tests/interface_admin_drain_test/metadata.textproto @@ -0,0 +1,7 @@ +# proto-file: third_party/openconfig/featureprofiles/proto/metadata.proto +# proto-message: Metadata + +uuid: "a3bfb6f8-7755-445e-b91f-e68263e2c81c" +plan_id: "RT-5.17" +description: "Physical Interface Drain via Admin Down" +testbed: TESTBED_DUT_ATE_4LINKS diff --git a/testregistry.textproto b/testregistry.textproto index 5dfea2342d6..910f3df2cb1 100644 --- a/testregistry.textproto +++ b/testregistry.textproto @@ -1202,6 +1202,11 @@ test: { description: "LACP Member Linecard Reboot" readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/interface/lacp/otg_tests/lacp_member_reboot_test/README.md" } +test: { + id: "RT-5.17" + description: "Physical Interface Drain via Admin Down" + readme: "https://github.com/openconfig/featureprofiles/blob/main/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md" +} test: { id: "RT-5.2" description: "Aggregate Interfaces" From f70e0191609827b003c05e916c2b04a50e74fa51 Mon Sep 17 00:00:00 2001 From: "Navaneeth Y.V" <1040476+navaneethyv@users.noreply.github.com> Date: Thu, 30 Jul 2026 18:03:45 +0530 Subject: [PATCH 2/3] Update feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../interface_admin_drain_test/README.md | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md b/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md index 0d93190811f..881fd0f0de1 100644 --- a/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md +++ b/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md @@ -26,21 +26,25 @@ and traffic forwarding. ``` * **DUT Port 1** (Drained Interface): Connected to **ATE Port 1**. - * IPv4: `198.51.100.1/31`, IPv6: `2001:db8:1::1/127` - * ATE IPv4: `198.51.100.0/31`, ATE IPv6: `2001:db8:1::0/127` - * BGP Peer: eBGP between DUT AS `64500` and ATE AS `64501` + * Network Instance: DEFAULT + * IPv4: 198.51.100.1/31, IPv6: 2001:db8:1::1/127 + * ATE IPv4: 198.51.100.0/31, ATE IPv6: 2001:db8:1::0/127 + * BGP Peer: eBGP between DUT AS 64500 and ATE AS 64501 * IS-IS: Level-2 point-to-point adjacency * **DUT Port 2** (Ingress Source): Connected to **ATE Port 2**. - * IPv4: `198.51.100.3/31`, IPv6: `2001:db8:1::3/127` - * ATE IPv4: `198.51.100.2/31`, ATE IPv6: `2001:db8:1::2/127` + * Network Instance: DEFAULT + * IPv4: 198.51.100.3/31, IPv6: 2001:db8:1::3/127 + * ATE IPv4: 198.51.100.2/31, ATE IPv6: 2001:db8:1::2/127 * **DUT Port 3** (Pass-through Egress): Connected to **ATE Port 3**. - * IPv4: `198.51.100.5/31`, IPv6: `2001:db8:1::5/127` - * ATE IPv4: `198.51.100.4/31`, ATE IPv6: `2001:db8:1::4/127` - * BGP Peer: eBGP between DUT AS `64500` and ATE AS `64503` + * Network Instance: DEFAULT + * IPv4: 198.51.100.5/31, IPv6: 2001:db8:1::5/127 + * ATE IPv4: 198.51.100.4/31, ATE IPv6: 2001:db8:1::4/127 + * BGP Peer: eBGP between DUT AS 64500 and ATE AS 64503 * IS-IS: Level-2 point-to-point adjacency * **DUT Port 4** (Auxiliary Transit): Connected to **ATE Port 4**. - * IPv4: `198.51.100.7/31`, IPv6: `2001:db8:1::7/127` - * ATE IPv4: `198.51.100.6/31`, ATE IPv6: `2001:db8:1::6/127` + * Network Instance: DEFAULT + * IPv4: 198.51.100.7/31, IPv6: 2001:db8:1::7/127 + * ATE IPv4: 198.51.100.6/31, ATE IPv6: 2001:db8:1::6/127 ## Procedure From 8940d9487e6c251677ac51f042cc3ee2be996968 Mon Sep 17 00:00:00 2001 From: "Navaneeth Y.V" <1040476+navaneethyv@users.noreply.github.com> Date: Thu, 30 Jul 2026 18:03:53 +0530 Subject: [PATCH 3/3] Update feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../singleton/otg_tests/interface_admin_drain_test/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md b/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md index 881fd0f0de1..aca55235252 100644 --- a/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md +++ b/feature/interface/singleton/otg_tests/interface_admin_drain_test/README.md @@ -51,7 +51,7 @@ and traffic forwarding. ### Test environment setup 1. Establish Layer 3 interface configurations on DUT Ports 1, 2, 3, and 4 - with dual-stack IPv4 and IPv6 subnets. + with dual-stack IPv4 and IPv6 subnets under the default network instance (DEFAULT). 2. Establish eBGP sessions: * DUT Port 1 to ATE Port 1: ATE advertises prefix `203.0.113.0/24` (IPv4) and `2001:db8:2::/64` (IPv6).