mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-31 04:53:01 +02:00
To reduce the duplication of effort between 9pm and the Infamy framework this change consolidates the move from local 'infamy: title:' extension to 9pm 'name:'. For the parameterized tunnel tests we leverage the 9pm dynamic test-spec variable, which looks for a correspodning <case>.adoc instead of static Readme.adoc, when generating the test report. Each test documentation should cover all aspects of the test, much like the usage text of a UNIX program. To this end, the tunnel test docs are now more spelled out, including all invariants. Some refactoring of these tests were also necessary, e.g., replacing any reserved Python keywords like 'type', and other PEP-8 fixes. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
210 lines
7.4 KiB
Python
Executable File
210 lines
7.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Basic tunnel connectivity test
|
|
|
|
Set up a tunnel between two DUTs, host connected to the first DUT. Enable
|
|
IP forwarding on first DUT's interface to host and the tunnel interface to
|
|
the second DUT. On host, add route to IP network of second DUT and verify
|
|
connectivity with the second DUT through the tunnel.
|
|
|
|
- Tunnel types: GRE, GRETAP, and VxLAN
|
|
- Connectivity: IPv4 and IPv6
|
|
"""
|
|
|
|
import infamy
|
|
|
|
|
|
class ArgumentParser(infamy.ArgumentParser):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.add_argument("--tunnel")
|
|
|
|
|
|
with infamy.Test() as test:
|
|
with test.step("Set up topology and attach to target DUTs"):
|
|
arg = ArgumentParser()
|
|
env = infamy.Env(args=arg)
|
|
tunnel = env.args.tunnel
|
|
left = env.attach("left", "mgmt")
|
|
right = env.attach("right", "mgmt")
|
|
|
|
with test.step("Configure DUTs with tunnel {tunnel}"):
|
|
container_left4 = {
|
|
"local": "192.168.50.1",
|
|
"remote": "192.168.50.2"
|
|
}
|
|
container_left6 = {
|
|
"local": "2001:db8:3c4d:50::1",
|
|
"remote": "2001:db8:3c4d:50::2",
|
|
}
|
|
container_right4 = {
|
|
"local": "192.168.50.2",
|
|
"remote": "192.168.50.1"
|
|
}
|
|
container_right6 = {
|
|
"local": "2001:db8:3c4d:50::2",
|
|
"remote": "2001:db8:3c4d:50::1",
|
|
}
|
|
|
|
if tunnel in ("gretap", "gre"):
|
|
CONTAINER_TYPE = "gre"
|
|
else:
|
|
CONTAINER_TYPE = tunnel
|
|
container_left4.update({
|
|
"vni": 4
|
|
})
|
|
container_left6.update({
|
|
"vni": 6
|
|
})
|
|
container_right4.update({
|
|
"vni": 4
|
|
})
|
|
container_right6.update({
|
|
"vni": 6
|
|
})
|
|
|
|
left.put_config_dicts({"ietf-interfaces": {
|
|
"interfaces": {
|
|
"interface": [{
|
|
"name": left["link"],
|
|
"ipv4": {
|
|
"address": [{
|
|
"ip": "192.168.50.1",
|
|
"prefix-length": 24
|
|
}],
|
|
"forwarding": True
|
|
},
|
|
"ipv6": {
|
|
"address": [{
|
|
"ip": "2001:db8:3c4d:50::1",
|
|
"prefix-length": 64
|
|
}],
|
|
"forwarding": True
|
|
}
|
|
}, {
|
|
"name": left["data"],
|
|
"ipv4": {
|
|
"address": [{
|
|
"ip": "192.168.10.1",
|
|
"prefix-length": 24
|
|
}],
|
|
"forwarding": True
|
|
},
|
|
"ipv6": {
|
|
"address": [{
|
|
"ip": "2001:db8:3c4d:10::1",
|
|
"prefix-length": 64
|
|
}],
|
|
"forwarding": True
|
|
}
|
|
}, {
|
|
"name": f"{tunnel}4",
|
|
"type": f"infix-if-type:{tunnel}",
|
|
"ipv4": {
|
|
"address": [{
|
|
"ip": "192.168.30.1",
|
|
"prefix-length": 24
|
|
}],
|
|
"forwarding": True
|
|
},
|
|
CONTAINER_TYPE: container_left4
|
|
}, {
|
|
"name": f"{tunnel}6",
|
|
"type": f"infix-if-type:{tunnel}",
|
|
"ipv6": {
|
|
"address": [{
|
|
"ip": "2001:db8:3c4d:30::1",
|
|
"prefix-length": 64
|
|
}]
|
|
},
|
|
CONTAINER_TYPE: container_left6
|
|
}]
|
|
}
|
|
}})
|
|
|
|
right.put_config_dicts({
|
|
"ietf-interfaces": {
|
|
"interfaces": {
|
|
"interface": [{
|
|
"name": right["link"],
|
|
"ipv4": {
|
|
"address": [{
|
|
"ip": "192.168.50.2",
|
|
"prefix-length": 24
|
|
}],
|
|
"forwarding": True
|
|
},
|
|
"ipv6": {
|
|
"address": [{
|
|
"ip": "2001:db8:3c4d:50::2",
|
|
"prefix-length": 64
|
|
}]
|
|
}
|
|
}, {
|
|
"name": f"{tunnel}4",
|
|
"type": f"infix-if-type:{tunnel}",
|
|
"ipv4": {
|
|
"address": [{
|
|
"ip": "192.168.30.2",
|
|
"prefix-length": 24
|
|
}],
|
|
"forwarding": True
|
|
},
|
|
CONTAINER_TYPE: container_right4
|
|
}, {
|
|
"name": f"{tunnel}",
|
|
"type": f"infix-if-type:{tunnel}",
|
|
"ipv6": {
|
|
"address": [{
|
|
"ip": "2001:db8:3c4d:30::2",
|
|
"prefix-length": 64
|
|
}]
|
|
},
|
|
CONTAINER_TYPE: container_right6
|
|
}]
|
|
}
|
|
},
|
|
"ietf-routing": {
|
|
"routing": {
|
|
"control-plane-protocols": {
|
|
"control-plane-protocol": [{
|
|
"type": "infix-routing:static",
|
|
"name": "default",
|
|
"static-routes": {
|
|
"ipv4": {
|
|
"route": [{
|
|
"destination-prefix": "192.168.10.0/24",
|
|
"next-hop": {
|
|
"next-hop-address": "192.168.30.1"
|
|
}
|
|
}]
|
|
},
|
|
"ipv6": {
|
|
"route": [{
|
|
"destination-prefix": "2001:db8:3c4d:10::/64",
|
|
"next-hop": {
|
|
"next-hop-address": "2001:db8:3c4d:30::1"
|
|
}
|
|
}]
|
|
}
|
|
}
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
_, hport = env.ltop.xlate("host", "data")
|
|
with test.step("Verify connectivity host:data to 10.0.0.2"):
|
|
with infamy.IsolatedMacVlan(hport) as ns0:
|
|
ns0.addip("192.168.10.2")
|
|
ns0.addroute("192.168.30.0/24", "192.168.10.1")
|
|
ns0.must_reach("192.168.30.2")
|
|
with test.step("Verify connectivity host:data to 2001:db8::c0a8:0a02"):
|
|
with infamy.IsolatedMacVlan(hport) as ns0:
|
|
ns0.addip("2001:db8:3c4d:10::2", prefix_length=64, proto="ipv6")
|
|
ns0.addroute("2001:db8:3c4d:30::/64", "2001:db8:3c4d:10::1", proto="ipv6")
|
|
ns0.must_reach("2001:db8:3c4d:30::2")
|
|
|
|
test.succeed()
|