mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-30 04:33:00 +02:00
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>
115 lines
4.1 KiB
Python
Executable File
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()
|