test/case: simplify AsciiDoc image references

This commit greatly simplifies AsciiDoc image references in generated
Readme.adoc files.  The two focused use-cases that remain after this
change are working references in:

 - Generated output/images/test-report.pdf
 - Viewing test's Readme.adoc from GitHub

Previously we aimed to have working images also when the test's Readme
was included in the parent directory's Readme.adoc.  This, however, is
not supported as of this commit.  It seems unlikely also to ever be a
supported feature of AsciiDoc on GitHub, for details, see the following
issue: <https://github.com/github/markup/issues/1095>

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2025-09-15 06:40:38 +02:00
parent c14140a8fe
commit fe2d0f488d
85 changed files with 421 additions and 1203 deletions
+5 -14
View File
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_hardware/usb]
=== USB configuration
==== Description
This test checks if the configuration is consistent with hardware state,
@@ -11,18 +13,9 @@ If this pass you can be certain that the configuration of the USB
port is handled correctly.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_hardware/usb/topology.svg[USB configuration topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::usb/topology.svg[USB configuration topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[USB configuration topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[USB configuration topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Unlock all USB ports
. Verify that all USB ports are unlocked
@@ -36,5 +29,3 @@ endif::topdoc[]
. Verify USB port remain unlocked after reboot
<<<
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_hardware/usb_two_ports]
=== USB configuration with two USB ports
==== Description
Test that the USB locked/unlocked configuration is consistent
when having two USB ports.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_hardware/usb_two_ports/topology.svg[USB configuration with two USB ports topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::usb_two_ports/topology.svg[USB configuration with two USB ports topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[USB configuration with two USB ports topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[USB configuration with two USB ports topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Lock the first USB port and unlock the second USB port
. Verify that the correct port is locked and the correct one is unlocked
@@ -23,5 +16,3 @@ endif::topdoc[]
. Verify that the correct port is locked and the correct one is unlocked
<<<
+3
View File
@@ -15,6 +15,9 @@
- name: bridge_basic
case: bridge_basic/test.py
- name: dual_bridge
case: dual_bridge/test.py
- name: bridge_veth
case: bridge_veth/test.py
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/bridge_basic]
=== Bridge basic
==== Description
Test basic connectivity to a bridge
@@ -11,22 +13,11 @@ Test basic connectivity to a bridge
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/bridge_basic/topology.svg[Bridge basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::bridge_basic/topology.svg[Bridge basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Bridge basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Bridge basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure single bridge with a single physical port, bridge @ IP 10.0.0.2
. Verify ping 10.0.0.2 is possible from host:data
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/bridge_fwd_dual_dut]
=== Bridge forwarding dual DUTs
==== Description
Ping through two bridges on two different DUTs.
@@ -23,22 +25,11 @@ Ping through two bridges on two different DUTs.
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/bridge_fwd_dual_dut/topology.svg[Bridge forwarding dual DUTs topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::bridge_fwd_dual_dut/topology.svg[Bridge forwarding dual DUTs topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Bridge forwarding dual DUTs topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Bridge forwarding dual DUTs topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure a bridge with triple physical port
. Verify ping 10.0.0.3 and 10.0.0.4 from host:data11
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/bridge_fwd_sgl_dut]
=== Bridge forwarding single DUTs
==== Description
Tests forwarding through a DUT with two bridged interfaces on one DUT.
@@ -23,22 +25,11 @@ Tests forwarding through a DUT with two bridged interfaces on one DUT.
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/bridge_fwd_sgl_dut/topology.svg[Bridge forwarding single DUTs topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::bridge_fwd_sgl_dut/topology.svg[Bridge forwarding single DUTs topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Bridge forwarding single DUTs topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Bridge forwarding single DUTs topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure a bridge with dual physical port
. Verify ping from host:data1 to 10.0.0.2
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/bridge_stp_basic]
=== Bridge STP Basic
==== Description
First, verify that a fully connected mesh of 4 DUTs is pruned to a
@@ -12,18 +14,9 @@ that a spanning tree rooted at A is formed, with B, C, and D all
directly connected to A.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/bridge_stp_basic/topology.svg[Bridge STP Basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::bridge_stp_basic/topology.svg[Bridge STP Basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Bridge STP Basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Bridge STP Basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure a bridge with spanning tree eneabled on dut a, b, c, and d
. Add an IP address to each host interface in the 10.0.0.0/24 subnet
@@ -35,5 +28,3 @@ endif::topdoc[]
. Verify that host:a can reach host:{b,c,d}
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/bridge_veth]
=== Bridge with a physical port and a veth
==== Description
This tests the possibility to add software added interfaces, in this case
@@ -13,22 +15,11 @@ PING --> br0
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/bridge_veth/topology.svg[Bridge with a physical port and a veth topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::bridge_veth/topology.svg[Bridge with a physical port and a veth topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Bridge with a physical port and a veth topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Bridge with a physical port and a veth topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure bridged eth port and veth pair with IP 10.0.0.2
. Verify ping from host:data to 10.0.0.2
<<<
@@ -1,38 +1,19 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/bridge_vlan]
=== Bridge VLAN
==== Description
Verify VLAN filtering bridge, with a VLAN trunk to a neighboring device,
which in turn untags one VLAN outisde a non-VLAN filtering bridge.
.Logical network setup
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/bridge_vlan/bridge-vlan.svg[]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::bridge_vlan/bridge-vlan.svg[]
endif::testgroup[]
ifndef::testgroup[]
image::bridge-vlan.svg[]
endif::testgroup[]
endif::topdoc[]
image::bridge-vlan.svg[align=center, scaledwidth=75%]
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/bridge_vlan/topology.svg[Bridge VLAN topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::bridge_vlan/topology.svg[Bridge VLAN topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Bridge VLAN topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Bridge VLAN topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure DUTs
. Verify ping from host:data to 10.0.0.2 and 10.0.0.3
<<<
@@ -6,7 +6,7 @@ Verify VLAN filtering bridge, with a VLAN trunk to a neighboring device,
which in turn untags one VLAN outisde a non-VLAN filtering bridge.
.Logical network setup
image::bridge-vlan.svg[]
image::bridge-vlan.svg[align=center, scaledwidth=75%]
"""
import infamy
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/bridge_vlan_separation]
=== Bridge VLAN separation
==== Description
Test that two VLANs are correctly separated in the bridge
@@ -22,18 +24,9 @@ Test that two VLANs are correctly separated in the bridge
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/bridge_vlan_separation/topology.svg[Bridge VLAN separation topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::bridge_vlan_separation/topology.svg[Bridge VLAN separation topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Bridge VLAN separation topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Bridge VLAN separation topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure DUTs
. Verify ping 10.0.0.3 from host:data10
@@ -45,5 +38,3 @@ endif::topdoc[]
. Verify broadcast is NOT received on host:data11 and host:data21
<<<
@@ -1,6 +1,9 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/dual_bridge]
=== Dual bridges on one device
==== Description
Verify that it is possible to ping through a bridge to another bridge via VETH interfaces.
Verify that it is possible to ping through a bridge to another bridge
via a VETH pair connected to both.
....
PING --> br0 br1 10.0.0.2
@@ -9,22 +12,11 @@ PC - target:data veth0a - veth0b
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/dual_bridge/topology.svg[Dual bridges on one device topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::dual_bridge/topology.svg[Dual bridges on one device topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Dual bridges on one device topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Dual bridges on one device topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure two bridges linked and a veth pair
. Verify ping from host:data to 10.0.0.2
<<<
@@ -1,16 +1,15 @@
#!/usr/bin/env python3
#
"""Dual bridges on one device
"""
Dual bridges on one device
Verify that it is possible to ping through a bridge to another bridge via VETH interfaces.
Verify that it is possible to ping through a bridge to another bridge
via a VETH pair connected to both.
....
PING --> br0 br1 10.0.0.2
/ \\ /
PC - target:data veth0a - veth0b
....
"""
import infamy
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/iface_enable_disable]
=== Interface status
==== Description
Verify interface status properly propagate changes when an interface
@@ -6,18 +8,9 @@ is disabled and then re-enabled.
Both admin-status and oper-status are verified.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/iface_enable_disable/topology.svg[Interface status topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::iface_enable_disable/topology.svg[Interface status topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Interface status topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Interface status topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure bridge and associated interfaces in target1
. Disable interface in target2
@@ -27,5 +20,3 @@ endif::topdoc[]
. Verify it is possible to ping the interface
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/iface_phys_address]
=== Custom MAC address on interface
==== Description
Verify support for setting and removing a custom MAC address on interfaces.
@@ -5,18 +7,9 @@ Both static MAC address and derived from the chassis MAC with, or without,
an offset applied.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/iface_phys_address/topology.svg[Custom MAC address on interface topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::iface_phys_address/topology.svg[Custom MAC address on interface topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Custom MAC address on interface topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Custom MAC address on interface topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set target:data static MAC address '02:01:00:c0:ff:ee'
. Verify target:data has MAC address '02:01:00:c0:ff:ee'
@@ -30,5 +23,3 @@ endif::topdoc[]
. Verify target:data MAC address is reset to default
<<<
+5 -14
View File
@@ -1,25 +1,16 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/ifalias]
=== Interface Description (ifAlias)
==== Description
Verify interface description (ifAlias) can be set on an interface and
then be read back from the operational datastore.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/ifalias/topology.svg[Interface Description (ifAlias) topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ifalias/topology.svg[Interface Description (ifAlias) topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Interface Description (ifAlias) topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Interface Description (ifAlias) topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set up interface target:data with description
. Verify description can be read back from operational
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/igmp_basic]
=== IGMP basic
==== Description
Verify that all multicast get flooded when no IGMP join exists in the system and
@@ -17,18 +19,9 @@ the flooding stops as soon a join arrives
HOST
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/igmp_basic/topology.svg[IGMP basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::igmp_basic/topology.svg[IGMP basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[IGMP basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[IGMP basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure device
. Start multicast sender on host:data0, group 224.1.1.1
@@ -38,5 +31,3 @@ endif::topdoc[]
. Verify that the group 224.1.1.1 is no longer received on host:data3
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/igmp_vlan]
=== IGMP VLAN
==== Description
Test tagged IGMP control traffic and that VLAN separation is respected for multicast
@@ -20,18 +22,9 @@ Test tagged IGMP control traffic and that VLAN separation is respected for multi
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/igmp_vlan/topology.svg[IGMP VLAN topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::igmp_vlan/topology.svg[IGMP VLAN topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[IGMP VLAN topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[IGMP VLAN topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure device
. Start multicast sender on host:data11, group 224.2.2.2
@@ -45,5 +38,3 @@ endif::topdoc[]
. Verify group 224.1.1.1 is forwarded to host:data12
<<<
@@ -1,20 +1,13 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/ipv4_address]
=== Interface with IPv4
==== Description
Test that it is possible to set and remove the IPv4 address on an interface
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/ipv4_address/topology.svg[Interface with IPv4 topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ipv4_address/topology.svg[Interface with IPv4 topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Interface with IPv4 topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Interface with IPv4 topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure IPv4 address 10.10.10.20/24 on target:mgmt
. Verify '10.10.10.20/24' exists on target:mgmt
@@ -22,5 +15,3 @@ endif::topdoc[]
. Verify target:mgmt no longer has the address 10.10.10.20
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/ipv4_autoconf]
=== IPv4 link-local
==== Description
Verifies that link-local (IPv4LL/ZeroConf) address assignment work as
@@ -5,18 +7,9 @@ expected. Checks random address, the request-address setting, and
address removal on autoconf disable.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/ipv4_autoconf/topology.svg[IPv4 link-local topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ipv4_autoconf/topology.svg[IPv4 link-local topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[IPv4 link-local topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[IPv4 link-local topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure interface target:data with IPv4 ZeroConf IP
. Verify link-local address exist on target:data
@@ -26,5 +19,3 @@ endif::topdoc[]
. Verify link-local addresses has been removed from target:data
<<<
@@ -1,25 +1,16 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/ipv6_address]
=== Interface IPv6 autoconf for bridges
==== Description
Verify IPv6 autoconf on a bridge is properly set up for global prefix.
See issue #473 for details.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/ipv6_address/topology.svg[Interface IPv6 autoconf for bridges topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ipv6_address/topology.svg[Interface IPv6 autoconf for bridges topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Interface IPv6 autoconf for bridges topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Interface IPv6 autoconf for bridges topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Setting up bridge with IPv6 SLAAC for global prefix on target:data
. Verify using sysctl that 'net.ipv6.conf.br0.autoconf' is 1 on target
<<<
@@ -1,37 +1,20 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/lag_basic]
=== Ling Aggregation Basic
==== Description
Verify communication over a link aggregate in static and LACP operating
modes during basic failure scenarios.
.Internal network setup, PC verifies connectivity with dut2 via dut1
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/lag_basic/lag-basic.svg[Internal networks]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::lag_basic/lag-basic.svg[Internal networks]
endif::testgroup[]
ifndef::testgroup[]
image::lag-basic.svg[Internal networks]
endif::testgroup[]
endif::topdoc[]
image::lag-basic.svg[align=center, scaledwidth=75%]
The host verifies connectivity with dut2 via dut1 over the aggregate for
each test step using the `mon` interface.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/lag_basic/topology.svg[Ling Aggregation Basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::lag_basic/topology.svg[Ling Aggregation Basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Ling Aggregation Basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Ling Aggregation Basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Set up LACP link aggregate, lag0, on dut1 and dut2
. Verify failure modes for lacp mode
@@ -39,5 +22,3 @@ endif::topdoc[]
. Verify failure modes for static mode
<<<
+1 -1
View File
@@ -5,7 +5,7 @@ Verify communication over a link aggregate in static and LACP operating
modes during basic failure scenarios.
.Internal network setup, PC verifies connectivity with dut2 via dut1
image::lag-basic.svg[Internal networks]
image::lag-basic.svg[align=center, scaledwidth=75%]
The host verifies connectivity with dut2 via dut1 over the aggregate for
each test step using the `mon` interface.
@@ -1,42 +1,23 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/lag_failure]
=== LACP Aggregate w/ Degraded Link
==== Description
Verify communication over an LACP link aggregate when individual member
links stop forwarding traffic, without carrier loss.
.Logical network setup, link breakers (lb1 & lb2) here managed by host PC
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/lag_failure/lag-failure.svg[]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::lag_failure/lag-failure.svg[]
endif::testgroup[]
ifndef::testgroup[]
image::lag-failure.svg[]
endif::testgroup[]
endif::topdoc[]
image::lag-failure.svg[align=center, scaledwidth=75%]
The host verifies connectivity with dut2 via dut1 over the aggregate for
each failure mode step using the `mon` interface.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/lag_failure/topology.svg[LACP Aggregate w/ Degraded Link topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::lag_failure/topology.svg[LACP Aggregate w/ Degraded Link topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[LACP Aggregate w/ Degraded Link topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[LACP Aggregate w/ Degraded Link topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Set up link aggregate, lag0, between dut1 and dut2
. Initial connectivity check ...
. Verify failure modes
<<<
@@ -5,7 +5,7 @@ Verify communication over an LACP link aggregate when individual member
links stop forwarding traffic, without carrier loss.
.Logical network setup, link breakers (lb1 & lb2) here managed by host PC
image::lag-failure.svg[]
image::lag-failure.svg[align=center, scaledwidth=75%]
The host verifies connectivity with dut2 via dut1 over the aggregate for
each failure mode step using the `mon` interface.
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/routing_basic]
=== Routing basic
==== Description
Verify routing between interfaces is possible. That enable/disable routing
in configuration has the expected result.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/routing_basic/topology.svg[Routing basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::routing_basic/topology.svg[Routing basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Routing basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Routing basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Setup host
. Enable forwarding on target:data1 and target:data2
@@ -25,5 +18,3 @@ endif::topdoc[]
. Verify ping does not work host:data1 to 10.0.0.10 and host:data2 to 192.168.0.10
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/speed_duplex_copper]
=== Interface Speed Duplex (Copper)
==== Description
Verify that the interface operates at the expected speed/duplex in two scenarios:
@@ -7,18 +9,9 @@ Verify that the interface operates at the expected speed/duplex in two scenarios
to the highest common speed/duplex.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/speed_duplex_copper/topology.svg[Interface Speed Duplex (Copper) topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::speed_duplex_copper/topology.svg[Interface Speed Duplex (Copper) topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Interface Speed Duplex (Copper) topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Interface Speed Duplex (Copper) topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Enable target interface
. Verify fixed 10/full
@@ -34,5 +27,3 @@ endif::topdoc[]
. Verify auto-negotiation to 10/half + 10/full + 100/half + 100/full + 1000/full
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/static_multicast_filters]
=== Static multicast filters
==== Description
Verify that static multicast filters work (remember that snooping needs to
@@ -19,18 +21,9 @@ enabled when using static multicast filters)
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/static_multicast_filters/topology.svg[Static multicast filters topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::static_multicast_filters/topology.svg[Static multicast filters topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Static multicast filters topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Static multicast filters topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure device without static filter
. Start multicast sender on host:data1, group 224.1.1.1
@@ -45,5 +38,3 @@ endif::topdoc[]
. Verify that the MAC group is no longer forwarded to host:data3
<<<
@@ -1,6 +1,10 @@
include::gre_basic.adoc[]
<<<
include::gretap_basic.adoc[]
<<<
include::vxlan_basic.adoc[]
@@ -1,26 +1,17 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/tunnel_basic]
=== GRE point-to-point
==== Description
Test setting up gre tunnels using IPv4 and IPv6,
and ends with a connectivity test.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/tunnel_basic/topology.svg[GRE point-to-point topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::tunnel_basic/topology.svg[GRE point-to-point topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[GRE point-to-point topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[GRE point-to-point topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure DUTs
. Verify connectivity host:data to 10.0.0.2
. Verify connectivity host:data to 2001:db8::c0a8:0a02
<<<
@@ -1,26 +1,17 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/tunnel_basic]
=== GRETAP point-to-point
==== Description
Test setting up gretap tunnels using IPv4 and IPv6,
and ends with a connectivity test.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/tunnel_basic/topology.svg[GRETAP point-to-point topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::tunnel_basic/topology.svg[GRETAP point-to-point topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[GRETAP point-to-point topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[GRETAP point-to-point topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure DUTs
. Verify connectivity host:data to 10.0.0.2
. Verify connectivity host:data to 2001:db8::c0a8:0a02
<<<
@@ -1,26 +1,17 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/tunnel_basic]
=== VXLAN point-to-point
==== Description
Test setting up vxlan tunnels using IPv4 and IPv6,
and ends with a connectivity test.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/tunnel_basic/topology.svg[VXLAN point-to-point topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::tunnel_basic/topology.svg[VXLAN point-to-point topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[VXLAN point-to-point topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[VXLAN point-to-point topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure DUTs
. Verify connectivity host:data to 10.0.0.2
. Verify connectivity host:data to 2001:db8::c0a8:0a02
<<<
@@ -1,4 +1,6 @@
include::gretap_bridged.adoc[]
<<<
include::vxlan_bridged.adoc[]
@@ -1,24 +1,15 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/tunnel_bridged]
=== GRETAP bridged with physical interface
==== Description
Test that gretap works as it should and that it possible to bridge it.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/tunnel_bridged/topology.svg[GRETAP bridged with physical interface topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::tunnel_bridged/topology.svg[GRETAP bridged with physical interface topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[GRETAP bridged with physical interface topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[GRETAP bridged with physical interface topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure DUTs
. Test connectivity host:data to right:gretap0 at 192.168.10.2
<<<
@@ -1,24 +1,15 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/tunnel_bridged]
=== VXLAN bridged with physical interface
==== Description
Test that vxlan works as it should and that it possible to bridge it.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/tunnel_bridged/topology.svg[VXLAN bridged with physical interface topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::tunnel_bridged/topology.svg[VXLAN bridged with physical interface topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[VXLAN bridged with physical interface topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[VXLAN bridged with physical interface topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure DUTs
. Test connectivity host:data to right:vxlan0 at 192.168.10.2
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/verify_all_interface_types]
=== Verify that all interface types can be created
==== Description
This test verifies that all interface types can be created and also
@@ -15,18 +17,9 @@ slightly longer than sending the entire configuration at once.
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/verify_all_interface_types/topology.svg[Verify that all interface types can be created topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::verify_all_interface_types/topology.svg[Verify that all interface types can be created topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Verify that all interface types can be created topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Verify that all interface types can be created topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure an empty bridge br-0
. Configure bridge br-X and associated interfaces
@@ -44,5 +37,3 @@ endif::topdoc[]
. Verify VxLAN interfaces 'vxlan-v4' and 'vxlan-v6'
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/veth_delete]
=== Verify that VETH pairs can be deleted
==== Description
```
@@ -9,18 +11,9 @@ Each test step to create, add address, or delete an interace is distinct
from any other step. This to trigger a new configuration "generation".
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/veth_delete/topology.svg[Verify that VETH pairs can be deleted topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::veth_delete/topology.svg[Verify that VETH pairs can be deleted topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Verify that VETH pairs can be deleted topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Verify that VETH pairs can be deleted topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Create VETH pair
. Verify interfaces 'veth0a' and 'veth0b' exist
@@ -31,5 +24,3 @@ endif::topdoc[]
. Verify VETH pair have been removed
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/vlan_iface_termination]
=== VLAN Interface Termination
==== Description
Verify that VLANs stacked on top of an interfaces that are also
@@ -26,18 +28,9 @@ both `data1` and `data2`, _bridging_ of packets from one to the other
must _not_ be allowed.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/vlan_iface_termination/topology.svg[VLAN Interface Termination topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::vlan_iface_termination/topology.svg[VLAN Interface Termination topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[VLAN Interface Termination topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[VLAN Interface Termination topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target
. Configure bridge and VLAN interfaces on target
. Configure IP addresses and VLAN interfaces on host
@@ -47,5 +40,3 @@ endif::topdoc[]
. Verify that host:data2 can reach target on VLAN 10
<<<
@@ -1,20 +1,13 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/vlan_ping]
=== VLAN ping connectivity
==== Description
Very basic test if the VLAN interface configuration works.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/vlan_ping/topology.svg[VLAN ping connectivity topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::vlan_ping/topology.svg[VLAN ping connectivity topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[VLAN ping connectivity topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[VLAN ping connectivity topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set up VLAN interface on host:data with IP 10.0.0.1
. Configure VLAN 10 interface on target:data with IP 10.0.0.2
@@ -24,5 +17,3 @@ endif::topdoc[]
. Verify that host:data can no longer reach 10.0.0.2
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_interfaces/vlan_qos]
=== VLAN Interface Ingress/Egress QoS
==== Description
Inject different packets from the host and verify that the VLAN priority
@@ -15,18 +17,9 @@ correctly to PCP on egress ('from internal priority' or static '0..7').
{ "id": 6, "pcp": 6, "ingress": "from-pcp", "egress": "from-priority", "expect": 6 },
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_interfaces/vlan_qos/topology.svg[VLAN Interface Ingress/Egress QoS topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::vlan_qos/topology.svg[VLAN Interface Ingress/Egress QoS topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[VLAN Interface Ingress/Egress QoS topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[VLAN Interface Ingress/Egress QoS topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Apply initial config without priority mapping
. Setup host VLANs
@@ -38,5 +31,3 @@ endif::topdoc[]
. Verify that packet with id=6 egressed with pcp=6
<<<
@@ -1,26 +1,17 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/ospf_basic]
=== OSPF Basic
==== Description
Very basic OSPF test just test that OSPF sends HELLO packets between the DUTs
and that they exchange routes, ending with a simple connectivity check.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/ospf_basic/topology.svg[OSPF Basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ospf_basic/topology.svg[OSPF Basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[OSPF Basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[OSPF Basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure targets
. Wait for OSPF routes
. Test connectivity from PC:data to 192.168.200.1
<<<
+5 -14
View File
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/ospf_bfd]
=== OSPF BFD
==== Description
Verify that a router running OSPF, with Bidirectional Forwarding
@@ -9,18 +11,9 @@ perspective, is made up of multiple physical links containing media
converters without link fault forwarding.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/ospf_bfd/topology.svg[OSPF BFD topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ospf_bfd/topology.svg[OSPF BFD topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[OSPF BFD topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[OSPF BFD topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Setup TPMR between R1fast and R2fast
. Configure R1 and R2
@@ -31,5 +24,3 @@ endif::topdoc[]
. Verify connectivity from PC:src to PC:dst via slow link
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/ospf_default_route_advertise]
=== OSPF Default route advertise
==== Description
Verify _default-route-advertising_ in OSPF, sometimes called 'redistribute origin'. Verify both
@@ -28,18 +30,9 @@ unless _always_ is set for _default-route-advertising_.
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/ospf_default_route_advertise/topology.svg[OSPF Default route advertise topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ospf_default_route_advertise/topology.svg[OSPF Default route advertise topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[OSPF Default route advertise topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[OSPF Default route advertise topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure targets
. Verify R2 has a default route and 192.168.100.1/32 from OSPF
@@ -53,5 +46,3 @@ endif::topdoc[]
. Verify connectivity from PC:data2 to 10.10.10.10
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/ospf_multiarea]
=== OSPF with multiple areas
==== Description
This test evaluates various OSPF features across three areas (one NSSA area, with no summary)
@@ -23,18 +25,9 @@ explicit router-id.
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/ospf_multiarea/topology.svg[OSPF with multiple areas topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ospf_multiarea/topology.svg[OSPF with multiple areas topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[OSPF with multiple areas topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[OSPF with multiple areas topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure targets
. Wait for all neighbors to peer
@@ -49,5 +42,3 @@ endif::topdoc[]
. Verify that the route to 10.0.0.3 from PC:data4, go through 10.0.24.1
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/ospf_unnumbered_interface]
=== OSPF unnumbered interfaces
==== Description
This test that a configuration expecting unnumbered interfaces
@@ -8,18 +10,9 @@ When this test pass, you can expect unnumbered interfaces, interface type
configuration and passive to function
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/ospf_unnumbered_interface/topology.svg[OSPF unnumbered interfaces topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ospf_unnumbered_interface/topology.svg[OSPF unnumbered interfaces topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[OSPF unnumbered interfaces topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[OSPF unnumbered interfaces topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure targets
. Wait for OSPF routes
@@ -28,5 +21,3 @@ endif::topdoc[]
. Test connectivity from PC:data to 192.168.200.1
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/route_pref_255]
=== Route preference: Static Route Activation and Maximum Distance
==== Description
This test configures a device with a static route to a destination with
@@ -6,18 +8,9 @@ Then, the routing preference is increased to the maximum value (255),
which should prevent the route from becoming active.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/route_pref_255/topology.svg[Route preference: Static Route Activation and Maximum Distance topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::route_pref_255/topology.svg[Route preference: Static Route Activation and Maximum Distance topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Route preference: Static Route Activation and Maximum Distance topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Route preference: Static Route Activation and Maximum Distance topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure targets with active static route
. Verify that static route with preference 254 is active
@@ -25,5 +18,3 @@ endif::topdoc[]
. Verify that high-preference static route (255) does not become active
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/route_pref_dhcp]
=== Route preference: DHCP vs Static
==== Description
This test configures a device with both a DHCP-acquired route on a
@@ -9,18 +11,9 @@ route takes precedence by adjusting the routing preference value
to the one lower than DHCP.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/route_pref_dhcp/topology.svg[Route preference: DHCP vs Static topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::route_pref_dhcp/topology.svg[Route preference: DHCP vs Static topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Route preference: DHCP vs Static topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Route preference: DHCP vs Static topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure targets. Assign higher priority to the dhcp route
. Wait for DHCP and static routes
@@ -29,5 +22,3 @@ endif::topdoc[]
. Verify connectivity from PC:data12 to R2:lo via static route
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/route_pref_ospf]
=== Route preference: OSPF vs Static
==== Description
This test configures a device with both an OSPF-acquired route on a
@@ -9,18 +11,9 @@ Initially, the device should prefer the OSPF route; if the OSPF route
becomes unavailable, the static route should take over.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/route_pref_ospf/topology.svg[Route preference: OSPF vs Static topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::route_pref_ospf/topology.svg[Route preference: OSPF vs Static topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Route preference: OSPF vs Static topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Route preference: OSPF vs Static topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Set up TPMR between R1ospf and R2ospf
. Configure targets
@@ -31,5 +24,3 @@ endif::topdoc[]
. Verify connectivity via static route after OSPF failover
<<<
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_routing/static_routing]
=== Static routing
==== Description
Verify that it is possible to add static routes, both IPv4 and IPv6, and
that data forwarding works as expected via an intermediate device.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_routing/static_routing/topology.svg[Static routing topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::static_routing/topology.svg[Static routing topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Static routing topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Static routing topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure targets
. Wait for routes
@@ -26,5 +19,3 @@ endif::topdoc[]
. Verify R2 is no longer reachable on either IPv4 or IPv6 from PC:data
<<<
+5 -14
View File
@@ -1,24 +1,15 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_syslog/basic]
=== Syslog Basic
==== Description
Add syslog actions to log to local files, then verify new log files have been created.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_syslog/basic/topology.svg[Syslog Basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::basic/topology.svg[Syslog Basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Syslog Basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Syslog Basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure syslog on DUT to log to files '/log/bar.log' (absolute path) and 'foo' (non-absolute).
. Verify log files /var/log/foo and /var/log/bar.log have been created
<<<
+5 -14
View File
@@ -1,25 +1,16 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_syslog/remote]
=== Remote syslog
==== Description
Verify logging to remote, acting as a remote, and RFC5424 log format.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_syslog/remote/topology.svg[Remote syslog topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::remote/topology.svg[Remote syslog topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Remote syslog topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Remote syslog topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to client and server DUTs
. Configure client DUT as syslog client with server DUT as remote, and configure server DUT as syslog server
. Send security:notice log message from client
. Verify reception of client log message, incl. sorting to /log/security on server
<<<
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_system/add_delete_user]
=== Add/delete user
==== Description
Verify that it is possible to add/delete a user. The user password is hashed
with yescrypt.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_system/add_delete_user/topology.svg[Add/delete user topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::add_delete_user/topology.svg[Add/delete user topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Add/delete user topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Add/delete user topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Add new user 'newuser01' with password 'newuser01password'
. Verify user 'newuser01' exist in operational
@@ -25,5 +18,3 @@ endif::topdoc[]
. Verify that 'newuser01' is removed from /etc/passwd
<<<
+5 -14
View File
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_system/hostname]
=== Set hostname
==== Description
Verify that it is possible to change hostname both normal
@@ -9,18 +11,9 @@ where MAC is the last three bytes of the base MAC address.
e.g. ix-01-01-01.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_system/hostname/topology.svg[Set hostname topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::hostname/topology.svg[Set hostname topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Set hostname topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Set hostname topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set hostname to 'h0stn4m3'
. Verify new hostname 'h0stn4m3'
@@ -29,5 +22,3 @@ endif::topdoc[]
. Verify hostname format in operational
<<<
@@ -1,25 +1,16 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_system/ntp_client]
=== Basic NTP client test
==== Description
Verify NTP client with multiple servers, ensure one get selected.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_system/ntp_client/topology.svg[Basic NTP client test topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ntp_client/topology.svg[Basic NTP client test topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Basic NTP client test topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Basic NTP client test topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure NTP client on 'target'
. Verify one source is in 'selected' state on 'target'
. Verify three sources exist in NTP client on 'target'
<<<
+5 -14
View File
@@ -1,24 +1,15 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_system/timezone]
=== Set timezone using timezone name
==== Description
Verify that it is possible to set timezone using timezone names.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_system/timezone/topology.svg[Set timezone using timezone name topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::timezone/topology.svg[Set timezone using timezone name topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Set timezone using timezone name topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Set timezone using timezone name topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set timezone to Australia/Perth
. Verify timezone is Australia/Perth
<<<
@@ -1,24 +1,15 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_system/timezone_utc_offset]
=== Set timezone with UTC offset
==== Description
Verify that it is possible to set timezone using UTC offset
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_system/timezone_utc_offset/topology.svg[Set timezone with UTC offset topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::timezone_utc_offset/topology.svg[Set timezone with UTC offset topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Set timezone with UTC offset topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Set timezone with UTC offset topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set timezone UTC offset to +12
. Verify current timezone is UTC+12:00
<<<
+5 -14
View File
@@ -1,20 +1,13 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_system/upgrade]
=== Upgrade
==== Description
Verify it is possible to upgrade.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_system/upgrade/topology.svg[Upgrade topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::upgrade/topology.svg[Upgrade topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Upgrade topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Upgrade topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Start installation of selected package
. Wait for upgrade to finish
@@ -22,5 +15,3 @@ endif::topdoc[]
. Verify that the partition is the booted
<<<
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/ietf_system/user_admin]
=== Add admin user
==== Description
Test that a non-admin user is not an admin in Linux, and
check that it when added as admin it is also the case in Linux.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/ietf_system/user_admin/topology.svg[Add admin user topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::user_admin/topology.svg[Add admin user topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Add admin user topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Add admin user topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Add new user 'jacky' with no NACM access
. Verify regular user jacky exists
@@ -29,5 +22,3 @@ endif::topdoc[]
. Verify user jacky can log in with SSH
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_basic]
=== Container basic
==== Description
Verify that a simple web server container can be configured to run
@@ -7,18 +9,9 @@ simple GET request for index.html and checking for a key phrase.
The RPC actions: stop + start, and restart are also verified.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_basic/topology.svg[Container basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_basic/topology.svg[Container basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Container basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Container basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set hostname to 'container-host'
. Create container 'web' from bundled OCI image
@@ -30,5 +23,3 @@ endif::topdoc[]
. Verify container 'web' is reachable on http://container-host.local:91
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_bridge]
=== Container with bridge network
==== Description
Verify connectivity with a simple web server container from behind a
@@ -8,18 +10,9 @@ This also verifies port forwarding from container internal port to a
port accessed from the host.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_bridge/topology.svg[Container with bridge network topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_bridge/topology.svg[Container with bridge network topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Container with bridge network topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Container with bridge network topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Create httpd container from bundled OCI image
. Verify container has started
@@ -27,5 +20,3 @@ endif::topdoc[]
. Verify container is reachable on http://10.0.0.2:8080
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_enabled]
=== Container enabled/disabled
==== Description
Verify that a container can be enabled and disabled via configuration.
@@ -10,28 +12,16 @@ Tests the 'enabled' leaf functionality by:
Uses operational datastore to verify container running status.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_enabled/topology.svg[Container enabled/disabled topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_enabled/topology.svg[Container enabled/disabled topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Container enabled/disabled topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Container enabled/disabled topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set hostname to 'container-host'
. Create enabled container from bundled OCI image
. Verify container has started
. Let container settle
. Disable container
. Verify container has stopped
. Re-enable container
. Verify container has started again
<<<
@@ -1,36 +1,23 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_environment]
=== Container environment variables
==== Description
Verify that environment variables can be set in container configuration
and are available inside the running container. Tests the 'env' list
functionality by:
and are available inside the running container.
1. Creating a container with multiple environment variables
2. Using a custom script to extract env vars and serve them via HTTP
3. Fetching the served content to verify environment variables are set correctly
Uses the nftables container image with custom rc.local script.
1 Set up a container config with multiple environment variables
2. Serve variables back to host using a CGI script in container
3. Verify served content against environment variables
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_environment/topology.svg[Container environment variables topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_environment/topology.svg[Container environment variables topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Container environment variables topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Container environment variables topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure data interface with static IPv4
. Create container with environment variables
. Set up container with environment variables
. Verify container has started
. Verify environment variables are available via HTTP
. Verify basic connectivity to data interface
. Verify environment variables in HTTP response
. Verify environment variables in CGI response
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_firewall_basic]
=== Basic Firewall Container
==== Description
Verify that an nftables container can be used for IP masquerading and
@@ -26,18 +28,9 @@ phrase, is only reachable from the public interface `ext0`, on
192.168.0.1:8080.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_firewall_basic/topology.svg[Basic Firewall Container topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_firewall_basic/topology.svg[Basic Firewall Container topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Basic Firewall Container topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Basic Firewall Container topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set hostname to 'container-host'
. Create VETH pair for web server container
@@ -50,5 +43,3 @@ endif::topdoc[]
. Verify 'web' is reachable on http://container-host.local:8080
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_host_commands]
=== Host Command Execution from Container
==== Description
This test verifies that a container running on Infix can execute commands
@@ -5,18 +7,9 @@ that affect the host system. Specifically, it confirms that the container
can change the hostname of the host.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_host_commands/topology.svg[Host Command Execution from Container topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_host_commands/topology.svg[Host Command Execution from Container topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Host Command Execution from Container topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Host Command Execution from Container topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set initial hostname
. Verify initial hostname in operational
@@ -25,5 +18,3 @@ endif::topdoc[]
. Verify the new hostname set by the container
<<<
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_phys]
=== Container with physical interface
==== Description
Verify connectivity with a simple web server container that's been
given a physical interface instead of an end of a VETH pair.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_phys/topology.svg[Container with physical interface topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_phys/topology.svg[Container with physical interface topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Container with physical interface topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Container with physical interface topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Create httpd container from bundled OCI image
. Verify container has started
@@ -25,5 +18,3 @@ endif::topdoc[]
. Verify server is restarted and returns new content
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_veth]
=== Container with VETH pair
==== Description
Verify connectivity with a simple web server container from behind a
@@ -14,18 +16,9 @@ regular bridge, a VETH pair connects the container to the bridge.
....
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_veth/topology.svg[Container with VETH pair topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_veth/topology.svg[Container with VETH pair topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Container with VETH pair topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Container with VETH pair topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Create 'web-br0-veth' container from bundled OCI image
. Verify container 'web-br0-veth' has started
@@ -33,5 +26,3 @@ endif::topdoc[]
. Verify container 'web-br0-veth' is reachable on http://10.0.0.2:91
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_containers/container_volume]
=== Container Volume Persistence
==== Description
Verify that a container created from a local OCI archive, with a volume
@@ -5,18 +7,9 @@ for persistent content, can be upgraded at runtime, without losing the
content in the volume on restart.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_containers/container_volume/topology.svg[Container Volume Persistence topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::container_volume/topology.svg[Container Volume Persistence topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Container Volume Persistence topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Container Volume Persistence topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Create container with volume from bundled OCI image
. Verify container has started
@@ -26,5 +19,3 @@ endif::topdoc[]
. Verify container volume content survived upgrade
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_dhcp/client_basic]
=== DHCP Basic
==== Description
This is a very basic DHCP test that requests an IPv4 lease
@@ -5,21 +7,10 @@ from a DHCP server and checks that the lease is set on the
interface.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_dhcp/client_basic/topology.svg[DHCP Basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::client_basic/topology.svg[DHCP Basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[DHCP Basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[DHCP Basic topology, align=center, scaledwidth=75%]
==== Sequence
. Initialize
. Verify client lease for 10.0.0.42
<<<
@@ -1,25 +0,0 @@
=== DHCP Basic
==== Description
This is a very basic DHCP test that requests an IPv4 lease
from a DHCP server and checks that the lease is set on the
interface.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_dhcp/dhcp_basic/topology.svg[DHCP Basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::dhcp_basic/topology.svg[DHCP Basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[DHCP Basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
. Initialize
. Verify client get DHCP lease for 10.0.0.42 on client:data
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_dhcp/client_default_gw]
=== DHCP router
==== Description
Verify that the DHCP client receives default gateway (DHCP option 3,
@@ -6,22 +8,11 @@ server runs at 192.168.0.1 but should hand out option 3 to clients
with address 192.168.0.254.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_dhcp/client_default_gw/topology.svg[DHCP router topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::client_default_gw/topology.svg[DHCP router topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[DHCP router topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[DHCP router topology, align=center, scaledwidth=75%]
==== Sequence
. Initialize
. Set up DHCP server as 192.168.0.1, option 3: 192.168.0.254
. Verify DHCP client has default route via 192.168.0.254
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_dhcp/client_routes]
=== DHCP option 121 vs option 3
==== Description
Verify that DHCP option 121 (classless static routes) is used over the
@@ -15,18 +17,9 @@ The DHCP server is set up to hand out both a default router (option 3)
via 192.168.0.1 and a default route (option 121) via 192.168.0.254.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_dhcp/client_routes/topology.svg[DHCP option 121 vs option 3 topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::client_routes/topology.svg[DHCP option 121 vs option 3 topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[DHCP option 121 vs option 3 topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[DHCP option 121 vs option 3 topology, align=center, scaledwidth=75%]
==== Sequence
. Setting up canary route, 20.0.0.0/24 via 192.168.0.2
. Enabling DHCP client, allow option 3 and 121
. Verify client has route 10.0.0.0/24 via 192.168.0.254 (option 121)
@@ -34,5 +27,3 @@ endif::topdoc[]
. Verify client still has canary route to 20.0.0.0/24 via 192.168.0.2
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_dhcp/server_basic]
=== DHCP Server Basic
==== Description
Verify basic DHCP server functionality. The server is set up to only
@@ -7,18 +9,9 @@ other options are sent by checking, e.g., that the client has not set up
a default route to the server.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_dhcp/server_basic/topology.svg[DHCP Server Basic topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::server_basic/topology.svg[DHCP Server Basic topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[DHCP Server Basic topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[DHCP Server Basic topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to client and server DUTs
. Configure DHCP server and client
. Verify DHCP client's original hostname
@@ -27,5 +20,3 @@ endif::topdoc[]
. Verify DHCP client has no default route
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_dhcp/server_host]
=== DHCP Server Static Host
==== Description
Verify DHCP server can hand out static host leases based on client-id,
@@ -5,18 +7,9 @@ both hexadecimal and a very long string, ensuring no pool address is
handed out instead.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_dhcp/server_host/topology.svg[DHCP Server Static Host topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::server_host/topology.svg[DHCP Server Static Host topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[DHCP Server Static Host topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[DHCP Server Static Host topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to client and server DUTs
. Configure DHCP client and server DUTs
. Verify DHCP client1 static lease
@@ -27,5 +20,3 @@ endif::topdoc[]
. Verify DHCP client2 has default gateway
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_dhcp/server_subnets]
=== DHCP Server Multiple Subnets
==== Description
Verify that the DHCP server is capble of acting on more than one subnet,
@@ -6,17 +8,7 @@ subnet, and host-specific options are honored and do not leak between
subnets.
.Internal network setup, client2 and client3 are on the same LAN
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_dhcp/server_subnets/dhcp-subnets.svg[Internal networks]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::server_subnets/dhcp-subnets.svg[Internal networks]
endif::testgroup[]
ifndef::testgroup[]
image::dhcp-subnets.svg[Internal networks]
endif::testgroup[]
endif::topdoc[]
image::dhcp-subnets.svg[align=center, scaledwidth=75%]
To verify isolation of subnet settings, a few "decoys" are added to the
configuration of each subnet. These are then checked for on each of the
@@ -30,18 +22,9 @@ The test is concluded by the server trying to reach each client using
ping of the hostname.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_dhcp/server_subnets/topology.svg[DHCP Server Multiple Subnets topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::server_subnets/topology.svg[DHCP Server Multiple Subnets topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[DHCP Server Multiple Subnets topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[DHCP Server Multiple Subnets topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to client and server DUTs
. Configure DHCP server and clients
. Verify DHCP client1 get correct lease
@@ -55,5 +38,3 @@ endif::topdoc[]
. Verify DHCP client3 has correct DNS and NTP server(s)
<<<
+1 -1
View File
@@ -7,7 +7,7 @@ subnet, and host-specific options are honored and do not leak between
subnets.
.Internal network setup, client2 and client3 are on the same LAN
image::dhcp-subnets.svg[Internal networks]
image::dhcp-subnets.svg[align=center, scaledwidth=75%]
To verify isolation of subnet settings, a few "decoys" are added to the
configuration of each subnet. These are then checked for on each of the
@@ -1,20 +1,13 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_services/lldp/lldp_admin_status]
=== LLDP admin status
==== Description
Verify that LLDP admin status is set properly by lldpd
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_services/lldp/lldp_admin_status/topology.svg[LLDP admin status topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::lldp/lldp_admin_status/topology.svg[LLDP admin status topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[LLDP admin status topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[LLDP admin status topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Enable target interface and enable LLDP
. Verify admin-status: 'rx-only'
@@ -23,5 +16,3 @@ endif::topdoc[]
. Verify admin-status: 'tx-and-rx'
<<<
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_services/lldp/lldp_enable_disable]
=== LLDP enable disable
==== Description
Verify that LLDP can be enabled and disabled.
Operation and non-operation are confirmed using tcpdump.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_services/lldp/lldp_enable_disable/topology.svg[LLDP enable disable topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::lldp/lldp_enable_disable/topology.svg[LLDP enable disable topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[LLDP enable disable topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[LLDP enable disable topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Enable target interface and disable LLDP
. Enable LLDP
@@ -24,5 +17,3 @@ endif::topdoc[]
. Verify no LLDP packets on host:data
<<<
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_services/lldp/lldp_ieee_group_forward]
=== LLDP IEEE Group Forward
==== Description
Verify that LLDP packets can be flooded to all ports on a bridge.
Operation and non-operation are confirmed using tcpdump.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_services/lldp/lldp_ieee_group_forward/topology.svg[LLDP IEEE Group Forward topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::lldp/lldp_ieee_group_forward/topology.svg[LLDP IEEE Group Forward topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[LLDP IEEE Group Forward topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[LLDP IEEE Group Forward topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure interfaces and disable LLDP daemon
. Verify LLDP absence on host:data2
@@ -23,5 +16,3 @@ endif::topdoc[]
. Verify LLDP arrival on host:data2
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_services/mdns/mdns_allow_deny]
=== mDNS allow/deny interfaces
==== Description
Verify the mDNS responder interface allow/deny configuration. Both
@@ -9,18 +11,9 @@ with three scenarios:
3. Allow p1 and p3, deny p2 and p3, traffic only on p1
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_services/mdns/mdns_allow_deny/topology.svg[mDNS allow/deny interfaces topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::mdns/mdns_allow_deny/topology.svg[mDNS allow/deny interfaces topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[mDNS allow/deny interfaces topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[mDNS allow/deny interfaces topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Configure device
. Allow mDNS on a single interface: p2
@@ -28,5 +21,3 @@ endif::topdoc[]
. Allow mDNS on p1, p3 deny on p2, p3
<<<
@@ -1,21 +1,14 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_services/mdns/mdns_enable_disable]
=== mDNS enable disable
==== Description
Verify that mDNS can be enabled and disabled.
Operation and non-operation are confirmed using tcpdump.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_services/mdns/mdns_enable_disable/topology.svg[mDNS enable disable topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::mdns/mdns_enable_disable/topology.svg[mDNS enable disable topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[mDNS enable disable topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[mDNS enable disable topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Set IPv4 address 10.0.0.10/24 on target:data and disable mDNS
. Enable mDNS
@@ -24,5 +17,3 @@ endif::topdoc[]
. Verify on host:data there are no packets from 10.0.0.10:5354 (mDNS)
<<<
@@ -1,20 +1,13 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_services/ssh/ssh_key_authentication]
=== Generate ssh key pair
==== Description
Verify that 'guest' user can fetch data using only the 'public' key
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_services/ssh/ssh_key_authentication/topology.svg[Generate ssh key pair topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ssh/ssh_key_authentication/topology.svg[Generate ssh key pair topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Generate ssh key pair topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Generate ssh key pair topology, align=center, scaledwidth=75%]
==== Sequence
. Connect to the target device
. Create a guest user on the target device
. Wait until SSH server is ready to accept connections
@@ -22,5 +15,3 @@ endif::topdoc[]
. Verify it is possible to fetch syslog data using public key
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/infix_services/ssh/ssh_server_config]
=== SSH server configuration
==== Description
Test SSH server functionality with pre-defined key pair:
@@ -6,18 +8,9 @@ Test SSH server functionality with pre-defined key pair:
3. Validate connectivity using static key pair.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/infix_services/ssh/ssh_server_config/topology.svg[SSH server configuration topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ssh/ssh_server_config/topology.svg[SSH server configuration topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[SSH server configuration topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[SSH server configuration topology, align=center, scaledwidth=75%]
==== Sequence
. Setup topology and attach to the target
. Configure SSH server
. Wait until SSH server is ready to accept connections
@@ -26,5 +19,3 @@ endif::topdoc[]
. Disable SSH server
<<<
@@ -1,24 +1,15 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/misc/operational_all]
=== Get operational
==== Description
Basic test just to get operational from test-config without errors.
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/misc/operational_all/topology.svg[Get operational topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::operational_all/topology.svg[Get operational topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[Get operational topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[Get operational topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUT
. Copy test-config to running configuration
. Get all Operational data from 'target', verify there are no errors
<<<
@@ -1,3 +1,5 @@
ifdef::topdoc[:imagesdir: {topdoc}../../test/case/use_case/ospf_container]
=== OSPF Container
==== Description
This use-case test verifies connectivity in an OSPF network to services
@@ -9,17 +11,7 @@ PC, which can act as a link breaker.
.Use-case overview.
[#img-overview]
ifdef::topdoc[]
image::{topdoc}../../test/case/use_case/ospf_container/overview.svg[]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ospf_container/overview.svg[]
endif::testgroup[]
ifndef::testgroup[]
image::overview.svg[]
endif::testgroup[]
endif::topdoc[]
The DUTs are connected in a routed topology inside their own OSPF area.
A single area border router (ABR) is used to access the controller
@@ -50,17 +42,7 @@ second bridge, `br1`, only use IPv6 link-local addresses.
.Internal network setup, here router R1 on subnet 10.1.1.1/24.
[#img-setup]
ifdef::topdoc[]
image::{topdoc}../../test/case/use_case/ospf_container/internal-network.svg[Internal networks]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ospf_container/internal-network.svg[Internal networks]
endif::testgroup[]
ifndef::testgroup[]
image::internal-network.svg[Internal networks]
endif::testgroup[]
endif::topdoc[]
- *Container A* runs a very basic web server, it runs on port 80 inside
the container, and `br0`, but is accessible outside on port 8080.
@@ -74,18 +56,9 @@ endif::topdoc[]
will have a unique hostname derived from the chassis MAC address
==== Topology
ifdef::topdoc[]
image::{topdoc}../../test/case/use_case/ospf_container/topology.svg[OSPF Container topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::ospf_container/topology.svg[OSPF Container topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.svg[OSPF Container topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
image::topology.svg[OSPF Container topology, align=center, scaledwidth=75%]
==== Sequence
. Set up topology and attach to target DUTs
. Configure DUTs
. Wait for all routers to peer
@@ -94,5 +67,3 @@ endif::topdoc[]
. Verify ABR:data can access container A on R3 (10.1.3.101)
<<<
+17 -43
View File
@@ -12,32 +12,6 @@ from pathlib import Path
import graphviz
def replace_image_tag(text, test_dir):
"""
Convert images added in the description and replace with the required ifdefs to work
generating the test specifcation as well.
"""
pattern = r"image::(?P<image_name>\S+)\[(?P<label>[^\]]*)\]"
def repl(match):
image_name = match.group("image_name")
label = match.group("label")
return f"""ifdef::topdoc[]
image::{{topdoc}}../../{test_dir}/{image_name}[{label}]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::{'/'.join(Path(test_dir).parts[3:])}/{image_name}[{label}]
endif::testgroup[]
ifndef::testgroup[]
image::{image_name}[{label}]
endif::testgroup[]
endif::topdoc[]"""
return re.sub(pattern, repl, text)
class TestStepVisitor(ast.NodeVisitor):
"""
A custom test step visitor to grab the test description (docstring)
@@ -163,32 +137,27 @@ class TestCase:
name = visitor.name
self.generate_topology()
description = replace_image_tag(description, self.test_dir)
with open(spec_path, "w") as spec:
spec.write(f"=== {name}\n")
with open(spec_path, "w", encoding='utf-8') as spec:
# When included in another document, e.g., the test-report.pdf,
# AsciiDoc needs to know where iamges are located. For other
# use-cases, e.g., browsing in GitHub '.' is implied.
spec.write(f"ifdef::topdoc[:imagesdir: {{topdoc}}../../{self.test_dir}]\n")
spec.write(f"\n=== {name}\n")
spec.write("==== Description\n")
spec.write(description + "\n\n")
spec.write("==== Topology\n")
spec.write("ifdef::topdoc[]\n")
spec.write(f"image::{{topdoc}}../../{self.test_dir}/topology.svg[{name} topology]\n")
spec.write("endif::topdoc[]\n")
spec.write("ifndef::topdoc[]\n")
spec.write("ifdef::testgroup[]\n")
spec.write(f"image::{Path(*self.test_dir.parts[3:])}/topology.svg[{name} topology]\n")
spec.write("endif::testgroup[]\n")
spec.write("ifndef::testgroup[]\n")
spec.write(f"image::topology.svg[{name} topology]\n")
spec.write("endif::testgroup[]\n")
spec.write("endif::topdoc[]\n")
spec.write("==== Test sequence\n")
spec.write(f"image::topology.svg[{name} topology, align=center, scaledwidth=75%]\n\n")
spec.write("==== Sequence\n")
spec.writelines([f". {step}\n" for step in test_steps])
spec.write("\n\n<<<\n\n") # need empty lines to pagebreak
spec.write("\n\n")
def parse_suite(directory, root, suitefile):
"""Parse 9pm .yaml suite file"""
test_spec = None
readme = None
first_test = True
with open(suitefile, "r", encoding='utf-8') as f:
data = yaml.safe_load(f)
@@ -217,7 +186,12 @@ def parse_suite(directory, root, suitefile):
test_spec = f"{directory}/{path}/{test_case_id}.adoc"
test_case = TestCase(f"{directory}/{path}", root)
test_case.generate_specification(test_title, test_file, test_spec, variables)
readme.write(f"include::{path}{test_case_id}.adoc[]\n\n")
if first_test:
readme.write(f"include::{path}{test_case_id}.adoc[]\n\n")
first_test = False
else:
readme.write(f"<<<\n\n") # Page break before subsequent tests
readme.write(f"include::{path}{test_case_id}.adoc[]\n\n")
if path != "":
lnk = f"{directory}/{path}/Readme.adoc"
readme.close()