From c8437f040a360d925128d6fff7c8a4b34074c5d9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Fri, 27 Sep 2024 13:08:26 +0200 Subject: [PATCH] test: verify VETH pairs can be removed Verify a VETH pair can be removed after a couple of dummy operations to step the dagger generation past the initial where the pair is created. NOTE: Infamy currenly lacks support for removing chunks of configuraion e.g., a dut.del_config_dict(), or similar, and delete_xpath() is not valid for configurations with dependencies like VETH pairs. Issue #658 Signed-off-by: Joachim Wiberg --- .../case/ietf_interfaces/ietf_interfaces.yaml | 3 + .../ietf_interfaces/veth_delete/Readme.adoc | 35 ++++++ test/case/ietf_interfaces/veth_delete/test.py | 111 ++++++++++++++++++ .../ietf_interfaces/veth_delete/topology.dot | 25 ++++ .../ietf_interfaces/veth_delete/topology.png | Bin 0 -> 9088 bytes 5 files changed, 174 insertions(+) create mode 100644 test/case/ietf_interfaces/veth_delete/Readme.adoc create mode 100755 test/case/ietf_interfaces/veth_delete/test.py create mode 100644 test/case/ietf_interfaces/veth_delete/topology.dot create mode 100644 test/case/ietf_interfaces/veth_delete/topology.png diff --git a/test/case/ietf_interfaces/ietf_interfaces.yaml b/test/case/ietf_interfaces/ietf_interfaces.yaml index 2141ccbf..6e72bf26 100644 --- a/test/case/ietf_interfaces/ietf_interfaces.yaml +++ b/test/case/ietf_interfaces/ietf_interfaces.yaml @@ -26,6 +26,9 @@ - name: bridge_vlan case: bridge_vlan/test.py +- name: veth_delete + case: veth_delete/test.py + - name: ipv4_autoconf case: ipv4_autoconf/test.py diff --git a/test/case/ietf_interfaces/veth_delete/Readme.adoc b/test/case/ietf_interfaces/veth_delete/Readme.adoc new file mode 100644 index 00000000..96ce39de --- /dev/null +++ b/test/case/ietf_interfaces/veth_delete/Readme.adoc @@ -0,0 +1,35 @@ +=== Verify that VETH pairs can be deleted +==== Description +``` + veth0b veth0a e1 e2 + `---------' +``` + +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::../../test/case/ietf_interfaces/veth_delete/topology.png[Verify that VETH pairs can be deleted topology] +endif::topdoc[] +ifndef::topdoc[] +ifdef::testgroup[] +image::veth_delete/topology.png[Verify that VETH pairs can be deleted topology] +endif::testgroup[] +ifndef::testgroup[] +image::topology.png[Verify that VETH pairs can be deleted topology] +endif::testgroup[] +endif::topdoc[] +==== Test sequence +. Initialize +. Create VETH pair +. Verify VETH pair exists +. Set IP address on target:eth0 (dummy op) +. Set IP address on target:eth1 (dummy op) +. Reset configuration +. Verify target:eth0 and target:eth1 still exist +. Verify VETH pair have been removed + + +<<< + diff --git a/test/case/ietf_interfaces/veth_delete/test.py b/test/case/ietf_interfaces/veth_delete/test.py new file mode 100755 index 00000000..e4f68ac9 --- /dev/null +++ b/test/case/ietf_interfaces/veth_delete/test.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +"""Verify that VETH pairs can be deleted + +``` + veth0b veth0a e1 e2 + `---------' +``` + +Each test step to create, add address, or delete an interace is distinct +from any other step. This to trigger a new configuration "generation". + +""" + +import infamy +import infamy.iface as iface + + +with infamy.Test() as test: + with test.step("Initialize"): + env = infamy.Env() + target = env.attach("target", "mgmt") + + _, eth0 = env.ltop.xlate("target", "eth0") + _, eth1 = env.ltop.xlate("target", "eth1") + + veth0a = "veth0a" + veth0b = "veth0b" + + with test.step("Create VETH pair"): + target.put_config_dict("ietf-interfaces", { + "interfaces": { + "interface": [ + { + "name": veth0a, + "type": "infix-if-type:veth", + "enabled": True, + "infix-interfaces:veth": { + "peer": veth0b + } + }, + { + "name": veth0b, + "type": "infix-if-type:veth", + "enabled": True, + "infix-interfaces:veth": { + "peer": veth0a + } + } + ] + } + }) + + with test.step("Verify VETH pair exists"): + assert iface.interface_exist(target, veth0a), \ + f"Interface <{veth0a}> does not exist." + assert iface.interface_exist(target, veth0b), \ + f"Interface <{veth0b}> does not exist." + + with test.step("Set IP address on target:eth0 (dummy op)"): + target.put_config_dict("ietf-interfaces", { + "interfaces": { + "interface": [{ + "name": f"{eth0}", + "ipv4": { + "address": [{ + "ip": "10.0.0.1", + "prefix-length": 24 + }] + } + }] + } + }) + + with test.step("Set IP address on target:eth1 (dummy op)"): + target.put_config_dict("ietf-interfaces", { + "interfaces": { + "interface": [{ + "name": f"{eth1}", + "ipv4": { + "address": [{ + "ip": "20.0.0.1", + "prefix-length": 24 + }] + } + }] + } + }) + + # TODO: need target.del_config_dict() or similar for VETH _pairs_, + # because both interfaces must be removed at the same time. + # with test.step("Delete VETH pair"): + # xpath = f"/ietf-interfaces:interfaces/interface[name='{veth0a}']" + # target.delete_xpath(xpath) + # XXX: temporary workaround + with test.step("Reset configuration"): + # Calls target.test_reset() to apply safe-config + target = env.attach("target", "mgmt") + + with test.step("Verify target:eth0 and target:eth1 still exist"): + assert iface.interface_exist(target, eth0), \ + f"Interface {eth0} missing!" + assert iface.interface_exist(target, eth1), \ + f"Interface {eth1} missing!" + + with test.step("Verify VETH pair have been removed"): + assert not iface.interface_exist(target, veth0a), \ + f"Interface <{veth0a}> still exists!" + assert not iface.interface_exist(target, veth0b), \ + f"Interface <{veth0b}> still exists!" + + test.succeed() diff --git a/test/case/ietf_interfaces/veth_delete/topology.dot b/test/case/ietf_interfaces/veth_delete/topology.dot new file mode 100644 index 00000000..0029eb79 --- /dev/null +++ b/test/case/ietf_interfaces/veth_delete/topology.dot @@ -0,0 +1,25 @@ +graph "1x3" { + layout="neato"; + overlap="false"; + esep="+80"; + + node [shape=record, fontname="monospace"]; + edge [color="cornflowerblue", penwidth="2"]; + + host [ + label="host | { tgt | dummy0 | dummy1 }", + pos="0,12!", + kind="controller", + ]; + + target [ + label="{ mgmt | eth0 | eth1 } | target", + pos="10,12!", + + kind="infix", + ]; + + host:tgt -- target:mgmt [kind=mgmt] + host:dummy0 -- target:eth0 [color=black] + host:dummy1 -- target:eth1 [color=black] +} diff --git a/test/case/ietf_interfaces/veth_delete/topology.png b/test/case/ietf_interfaces/veth_delete/topology.png new file mode 100644 index 0000000000000000000000000000000000000000..154cd3d06e310a659719c1fd0ce9d19f05e05cea GIT binary patch literal 9088 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 Ylr13z>% literal 0 HcmV?d00001