From fb394db98151f80a4e87accef36ba3444606a972 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Mon, 3 Feb 2025 20:33:15 +0100 Subject: [PATCH] test: lag_*: Ensure that links making up a LAG are compatible Do not allow the topology matcher to setup a LAG where one link is running at 10G while the other one runs at 1G, since the bond will never use the 1G port as long as there the 10G link is up. --- test/case/ietf_interfaces/lag_basic/test.py | 4 +-- .../ietf_interfaces/lag_basic/topology.dot | 4 +-- test/case/ietf_interfaces/lag_failure/test.py | 3 ++- .../ietf_interfaces/lag_failure/topology.dot | 8 +++--- test/infamy/lag.py | 26 +++++++++++++++++++ 5 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 test/infamy/lag.py diff --git a/test/case/ietf_interfaces/lag_basic/test.py b/test/case/ietf_interfaces/lag_basic/test.py index 9cbd0d25..7bb01045 100755 --- a/test/case/ietf_interfaces/lag_basic/test.py +++ b/test/case/ietf_interfaces/lag_basic/test.py @@ -14,9 +14,9 @@ each test step using the `mon` interface. from time import sleep, time from datetime import datetime import infamy +import infamy.lag from infamy.util import parallel, until - class DumbLinkBreaker: """Encapsulates basic, dumb link-breaking ops over SSH.""" @@ -135,7 +135,7 @@ def dut_init(dut, mode, addr): with infamy.Test() as test: with test.step("Set up topology and attach to target DUTs"): - env = infamy.Env() + env = infamy.Env(edge_mappings=infamy.lag.edge_mappings) dut1 = env.attach("dut1", "mgmt") dut2 = env.attach("dut2", "mgmt") diff --git a/test/case/ietf_interfaces/lag_basic/topology.dot b/test/case/ietf_interfaces/lag_basic/topology.dot index 9715914e..b8b7e3ff 100644 --- a/test/case/ietf_interfaces/lag_basic/topology.dot +++ b/test/case/ietf_interfaces/lag_basic/topology.dot @@ -28,6 +28,6 @@ graph "lag" { host:mon -- dut1:mon // Monitor connection to dut2 via dut1 host:mgmt2 -- dut2:mgmt [requires="mgmt", color=lightgrey] - dut1:link1 -- dut2:link1 [color=black, fontcolor=black, penwidth=3] - dut1:link2 -- dut2:link2 [color=black, fontcolor=black, penwidth=3] + dut1:link1 -- dut2:link1 [lag=true, color=black, fontcolor=black, penwidth=3] + dut1:link2 -- dut2:link2 [lag=true, color=black, fontcolor=black, penwidth=3] } diff --git a/test/case/ietf_interfaces/lag_failure/test.py b/test/case/ietf_interfaces/lag_failure/test.py index 315c2236..a5ee002b 100755 --- a/test/case/ietf_interfaces/lag_failure/test.py +++ b/test/case/ietf_interfaces/lag_failure/test.py @@ -13,6 +13,7 @@ each failure mode step using the `mon` interface. """ from time import time import infamy +import infamy.lag from infamy.netns import TPMR from infamy.util import parallel @@ -120,7 +121,7 @@ def dut_init(dut, addr, peer): with infamy.Test() as test: with test.step("Set up topology and attach to target DUTs"): - env = infamy.Env() + env = infamy.Env(edge_mappings=infamy.lag.edge_mappings) dut1 = env.attach("dut1") dut2 = env.attach("dut2") diff --git a/test/case/ietf_interfaces/lag_failure/topology.dot b/test/case/ietf_interfaces/lag_failure/topology.dot index 8b24b884..38ca7b55 100644 --- a/test/case/ietf_interfaces/lag_failure/topology.dot +++ b/test/case/ietf_interfaces/lag_failure/topology.dot @@ -28,9 +28,9 @@ graph "lag" { host:mon -- dut1:mon // Monitor connection to dut2 via dut1 host:mgmt2 -- dut2:mgmt [requires="mgmt", color=lightgrey] - dut1:link1 -- host:lb1a [requires="ieee-mc", color=black, fontcolor=black] - host:lb1b -- dut2:link1 [requires="ieee-mc", color=black, fontcolor=black] + dut1:link1 -- host:lb1a [requires="ieee-mc", lag=true, color=black, fontcolor=black] + host:lb1b -- dut2:link1 [requires="ieee-mc", lag=true, color=black, fontcolor=black] - dut1:link2 -- host:lb2a [requires="ieee-mc", color=black, fontcolor=black] - host:lb2b -- dut2:link2 [requires="ieee-mc", color=black, fontcolor=black] + dut1:link2 -- host:lb2a [requires="ieee-mc", lag=true, color=black, fontcolor=black] + host:lb2b -- dut2:link2 [requires="ieee-mc", lag=true, color=black, fontcolor=black] } diff --git a/test/infamy/lag.py b/test/infamy/lag.py new file mode 100644 index 00000000..7a2cf5b1 --- /dev/null +++ b/test/infamy/lag.py @@ -0,0 +1,26 @@ +from . import topology + +def edge_mappings(les, pes): + """Specialized topology edge mapper for LAG tests + + In addition to the standard provides/requires validation, ensure + that for all logical ports marked with a "lag" attribute, the + corresponding physical ports are all of the same link type + (e.g. "link-10gbase-r"). + + """ + def links_compatible(candidate): + seen = None + for (le, pe) in candidate: + if le.get("lag"): + link = set(filter(lambda f: f.startswith("link-"), pe["provides"])) + if seen is None: + seen = link + elif link != seen: + return False + + return True + + for candidate in topology.edge_mappings(les, pes): + if links_compatible(candidate): + yield candidate