mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-30 12:33:02 +02:00
106 lines
3.5 KiB
Python
Executable File
106 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Interface status
|
|
|
|
Verify interface status properly propagate changes when an interface
|
|
is disabled and then re-enabled.
|
|
|
|
Both admin-status and oper-status are verified.
|
|
"""
|
|
|
|
import infamy
|
|
import infamy.iface as iface
|
|
|
|
from infamy import until
|
|
|
|
def print_error_message(iface, param, exp_val, act_val):
|
|
return f"'{param}' failure for interface '{iface}'. Expected '{exp_val}', Actual: '{act_val}'"
|
|
|
|
def assert_param(target, interface, parameter, expected_value):
|
|
def check_param():
|
|
actual_value = iface.get_param(target, interface, parameter)
|
|
if actual_value is None:
|
|
raise ValueError(f"Failed to retrieve '{parameter}' for interface '{interface}'")
|
|
return actual_value == expected_value
|
|
|
|
until(check_param)
|
|
|
|
actual_value = iface.get_param(target, interface, parameter)
|
|
assert (expected_value == actual_value), print_error_message(
|
|
iface=interface,
|
|
param = parameter,
|
|
exp_val = expected_value,
|
|
act_val = actual_value
|
|
)
|
|
|
|
def configure_interface(target, iface_name, iface_type=None, enabled=True, ip_address=None, bridge=None):
|
|
|
|
interface_config = {
|
|
"name": iface_name,
|
|
"enabled": enabled
|
|
}
|
|
|
|
if iface_type:
|
|
interface_config["type"] = iface_type
|
|
|
|
if ip_address:
|
|
interface_config["ipv4"] = {
|
|
"address": [
|
|
{
|
|
"ip": ip_address,
|
|
"prefix-length": 24
|
|
}]}
|
|
|
|
if bridge:
|
|
interface_config["infix-interfaces:bridge-port"] = {
|
|
"bridge": bridge
|
|
}
|
|
|
|
target.put_config_dicts({"ietf-interfaces": {
|
|
"interfaces": {
|
|
"interface": [
|
|
interface_config
|
|
]}}})
|
|
|
|
with infamy.Test() as test:
|
|
with test.step("Set up topology and attach to target DUTs"):
|
|
env = infamy.Env()
|
|
target1 = env.attach("target1", "mgmt")
|
|
target2 = env.attach("target2", "mgmt")
|
|
|
|
_, data1 = env.ltop.xlate("target1", "data")
|
|
_, link1 = env.ltop.xlate("target1", "link")
|
|
|
|
_, iface_under_test = env.ltop.xlate("target2", "link")
|
|
_, host_send_iface = env.ltop.xlate("host", "data")
|
|
_bridge = "br_0"
|
|
|
|
target_address = "10.10.10.2"
|
|
host_address = "10.10.10.1"
|
|
|
|
with test.step("Configure bridge and associated interfaces in target1"):
|
|
configure_interface(target1, _bridge, enabled=True, iface_type="infix-if-type:bridge")
|
|
configure_interface(target1, data1, enabled=True, bridge=_bridge)
|
|
configure_interface(target1, link1, enabled=True, bridge=_bridge)
|
|
|
|
with test.step("Disable interface in target2"):
|
|
configure_interface(target2, iface_under_test, enabled=False)
|
|
|
|
with test.step("Verify the interface is disabled"):
|
|
assert_param(target2, iface_under_test, "admin-status", "down")
|
|
assert_param(target2, iface_under_test, "oper-status", "down")
|
|
|
|
with test.step("Enable the interface and assign an IP address"):
|
|
configure_interface(target2, iface_under_test, enabled=True, ip_address=target_address)
|
|
|
|
with test.step("Verify the interface is enabled"):
|
|
assert_param(target2, iface_under_test, "admin-status", "up")
|
|
assert_param(target2, iface_under_test, "oper-status", "up")
|
|
|
|
with infamy.IsolatedMacVlan(host_send_iface) as send_ns:
|
|
with test.step("Verify it is possible to ping the interface"):
|
|
send_ns.addip(host_address)
|
|
send_ns.must_reach(target_address)
|
|
|
|
test.succeed()
|