Files

83 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""DHCPv6 Basic
Enable a DHCPv6 client and verify it requests an IPv6 lease from a
DHCPv6 server that is then set on the interface.
"""
import infamy
import infamy.dhcp
import infamy.iface as iface
import infamy.route as route
from infamy.util import until
def checkrun():
"""Check DHCPv6 client is running"""
res = tgtssh.runsh(f"pgrep -f 'odhcp6c.*{port}'")
return res.returncode == 0
def check_dns_resolution():
"""Check if DNS resolution works by pinging FQDN"""
rc = tgtssh.runsh(f"ping -6 -c1 -w5 {VERIFY}")
return rc.returncode == 0
with infamy.Test() as test:
SERVER = '2001:db8::1'
CLIENT = '2001:db8::42'
DOMAIN = 'example.com'
VERIFY = 'server.' + DOMAIN
with test.step("Set up topology and attach to target DUT"):
env = infamy.Env()
client = env.attach("client", "mgmt")
tgtssh = env.attach("client", "mgmt", "ssh")
_, host = env.ltop.xlate("host", "data")
_, port = env.ltop.xlate("client", "data")
with infamy.IsolatedMacVlan(host) as netns:
netns.addip(SERVER, prefix_length=64, proto="ipv6")
with infamy.dhcp.Server6Dnsmasq(netns,
start=CLIENT,
end=CLIENT,
dns=SERVER,
domain=DOMAIN,
address=SERVER):
with test.step("Configure DHCPv6 client"):
config = {
"interfaces": {
"interface": [{
"name": f"{port}",
"ipv6": {
"enabled": True,
"infix-dhcpv6-client:dhcp": {
"option": [
{"id": "dns-server"},
{"id": "domain-search"}
]
}
}
}]
}
}
client.put_config_dicts({"ietf-interfaces": config})
with test.step("Verify DHCPv6 client is running"):
until(checkrun, attempts=10)
with test.step(f"Verify client lease for {CLIENT}"):
until(lambda: iface.address_exist(client, port, CLIENT, prefix_length=128), attempts=30)
with test.step("Verify client default route ::/0"):
until(lambda: route.ipv6_route_exist(client, "::/0"), attempts=20)
with test.step("Verify client domain name resolution"):
# DNS configuration may take a moment, especially on ARM hardware
until(check_dns_resolution, attempts=20)
test.succeed()