Files
Richard AlpeandJoachim Wiberg d73d5440c5 test: remove hardcoded interface type
This can now a days be inferred and isn't needed. Also, the interface
type in virtual testing is now etherlike not ethernet.

Signed-off-by: Richard Alpe <richard@bit42.se>
2024-02-05 18:01:30 +01:00

115 lines
4.1 KiB
Python
Executable File

#!/usr/bin/env python3
import copy
import infamy
#Set of parameters needed to add/remove IPv4 addresses from interface
new_ip_address = "10.10.10.20"
new_prefix_length = 24
def print_ip_addresses(target):
running = target.get_config_dict("/ietf-interfaces:interfaces")
interfaces = running.get("interfaces", {}).get("interface", [])
for interface in interfaces:
name = interface["name"]
if "ipv4" in interface:
ipv4_addresses = interface["ipv4"].get("address", [])
for ipv4_address in ipv4_addresses:
address = ipv4_address.get("ip")
prefix_length = ipv4_address.get("prefix-length")
print(f"Interface: {name}, IPv4 Address: {address}/{prefix_length}")
else:
print(f"Interface: {name}, No IPv4 Address")
if "ipv6" in interface:
ipv6_addresses = interface["ipv6"].get("address", [])
for ipv6_address in ipv6_addresses:
address = ipv6_address.get("ip")
prefix_length = ipv6_address.get("prefix-length")
print(f"Interface: {name}, IPv6 Address: {address}/{prefix_length}")
else:
print(f"Interface: {name}, No IPv6 Address")
def assert_ipv4_address_in_interface(target, ip_address, interface_name, prefix_length):
running = target.get_config_dict("/ietf-interfaces:interfaces")
interfaces = running.get("interfaces", {}).get("interface", [])
found = False
for interface in interfaces:
name = interface["name"]
if name == interface_name:
if "ipv4" in interface:
ipv4_addresses = interface["ipv4"].get("address", [])
for ipv4_address in ipv4_addresses:
address = ipv4_address.get("ip")
length = ipv4_address.get("prefix-length")
if address == ip_address and length == prefix_length:
found = True
break
assert found, f"IP address {ip_address}/{prefix_length} not found for interface {interface_name}"
def assert_ipv4_removed(target, interface_name):
running = target.get_config_dict("/ietf-interfaces:interfaces")
interfaces = running.get("interfaces", {}).get("interface", [])
for interface in interfaces:
name = interface["name"]
if name == interface_name:
assert "ipv4" not in interface, f"IPv4 address not removed from interface {interface_name}"
return
print(f"No interface with the name {interface_name}")
with infamy.Test() as test:
with test.step("Setup"):
env = infamy.Env(infamy.std_topology("1x1"))
target = env.attach("target", "mgmt")
_, interface_name = env.ltop.xlate("target", "mgmt")
with test.step("Get initial IP addresses"):
print_ip_addresses(target)
with test.step("Configure IP address"):
config = {
"interfaces": {
"interface": [{
"name": f"{interface_name}",
"ipv4": {
"address": [{
"ip": f"{new_ip_address}",
"prefix-length": new_prefix_length
}]
}
}]
}
}
target.put_config_dict("ietf-interfaces", config)
with test.step("Get updated IP addresses"):
print_ip_addresses(target)
assert_ipv4_address_in_interface(target, new_ip_address, interface_name, new_prefix_length)
with test.step(f"Remove IPv4 addresses from {interface_name}"):
# Get current interface configuration
running = target.get_config_dict("/ietf-interfaces:interfaces")
new = copy.deepcopy(running)
for iface in new["interfaces"]["interface"]:
if iface["name"] == interface_name and "ipv4" in iface:
del iface["ipv4"]
break
target.put_diff_dicts("ietf-interfaces", running, new)
with test.step("Get updated IP addresses"):
print_ip_addresses(target)
assert_ipv4_removed(target, interface_name)
test.succeed()