Skip to content

Commit

Permalink
test: verify interface status (enable/disable)
Browse files Browse the repository at this point in the history
Fixes #694
  • Loading branch information
axkar committed Oct 17, 2024
1 parent 4d4a4c6 commit 5a002ee
Show file tree
Hide file tree
Showing 6 changed files with 173 additions and 0 deletions.
2 changes: 2 additions & 0 deletions test/case/ietf_interfaces/Readme.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,5 @@ include::static_multicast_filters/Readme.adoc[]
include::vlan_qos/Readme.adoc[]

include::verify_all_interface_types/Readme.adoc[]

include::iface_enable_disable/Readme.adoc[]
3 changes: 3 additions & 0 deletions test/case/ietf_interfaces/ietf_interfaces.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,6 @@

- name: verify_all_interface_types
case: verify_all_interface_types/test.py

- name: iface_enable_disable
case: iface_enable_disable/test.py
28 changes: 28 additions & 0 deletions test/case/ietf_interfaces/iface_enable_disable/Readme.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
=== Interface status
==== Description
Verify that interface status works

==== Topology
ifdef::topdoc[]
image::../../test/case/ietf_interfaces/iface_enable_disable/topology.png[Interface status topology]
endif::topdoc[]
ifndef::topdoc[]
ifdef::testgroup[]
image::iface_enable_disable/topology.png[Interface status topology]
endif::testgroup[]
ifndef::testgroup[]
image::topology.png[Interface status topology]
endif::testgroup[]
endif::topdoc[]
==== Test sequence
. Set up topology and attach to target DUTs
. Configure bridge and associated interfaces in target1
. Disable interface in target2
. Verify the interface is disabled
. Enable the interface and assign an IP address
. Verify the interface is enabled
. Verify it is possible to ping the interface


<<<

105 changes: 105 additions & 0 deletions test/case/ietf_interfaces/iface_enable_disable/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#!/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_dict( "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()
35 changes: 35 additions & 0 deletions test/case/ietf_interfaces/iface_enable_disable/topology.dot
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
graph "2x4" {
layout="neato";
overlap="false";
esep="+40";

node [shape=record, fontname="monospace"];
edge [color="cornflowerblue", penwidth="2"];

host [
label="host | { <mgmt1> mgmt1 | <data> data | <mgmt2> mgmt2 }",
pos="0,15!",
kind="controller",
];

target1 [
label="{ <mgmt> mgmt | <data> data | <link> link } | { \n dut1 \n\n }",
pos="8,15!",

kind="infix",
];

target2 [
label="{ <link> link | <mgmt> mgmt } | { \n dut2 \n\n }",
pos="8,12!",

kind="infix",
];

host:mgmt1 -- target1:mgmt [kind=mgmt, color="lightgrey"]
host:data -- target1:data [color=black, fontcolor=black, taillabel="10.10.10.1/24"]

host:mgmt2 -- target2:mgmt [kind=mgmt, color="lightgrey"]

target1:link -- target2:link [color=black, fontcolor=black, headlabel="10.10.10.2/24"]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 5a002ee

Please sign in to comment.