Skip to content

Commit a8d96b6

Browse files
authored
Merge pull request #652 from xcp-ng/srt/vlan-filtering
XCPNG-3592: network: VLAN filtering tests
2 parents b322798 + bf2df7b commit a8d96b6

1 file changed

Lines changed: 109 additions & 0 deletions

File tree

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
from __future__ import annotations
2+
3+
import pytest
4+
5+
from lib.common import Defer
6+
from lib.network import Network
7+
from lib.vm import VM
8+
9+
# Requirements:
10+
# From --hosts parameter:
11+
# - host(A1): an XCP-ng host
12+
# From --vm parameter
13+
# - A VM to import
14+
15+
def start_vm_on_trunk(
16+
defer: Defer, vm: VM, network: Network, clone_vm: bool, name: str, trunks: str = ""
17+
) -> tuple[VM, str]:
18+
if clone_vm:
19+
vm = vm.clone()
20+
defer(lambda: vm.destroy())
21+
22+
vm.param_set("name-label", name)
23+
24+
n = len(vm.vifs())
25+
iface = f"eth{n}"
26+
vif = vm.create_vif(n, network_uuid=network.uuid)
27+
28+
vif.param_set("trunks", trunks)
29+
30+
vm.start()
31+
vm.wait_for_vm_running_and_ssh_up()
32+
vm.ssh(f"ip link set {iface} up")
33+
34+
return vm, iface
35+
36+
@pytest.mark.small_vm
37+
class TestBasic:
38+
39+
def test_passing(self, defer: Defer, empty_network: Network, imported_vm: VM, vm_with_tcpdump_scope_function: VM):
40+
vm_writer, ifaceW = start_vm_on_trunk(
41+
defer,
42+
vm=imported_vm,
43+
network=empty_network,
44+
clone_vm=True,
45+
name="test_passing: vm_writer",
46+
)
47+
48+
vm_reader, ifaceR = start_vm_on_trunk(
49+
defer,
50+
vm=vm_with_tcpdump_scope_function,
51+
network=empty_network,
52+
clone_vm=False,
53+
name="test_passing: vm_reader",
54+
trunks="42",
55+
)
56+
57+
# configure VLAN 42 on vm_writer
58+
vm_writer.ssh(f"ip link add link {ifaceW} name {ifaceW}.42 type vlan id 42")
59+
vm_writer.ssh(f"ip addr add 192.168.42.1/24 dev {ifaceW}.42")
60+
vm_writer.ssh(f"ip link set {ifaceW}.42 up")
61+
62+
# send some packets on VLAN 42 (ARP packets will be send)
63+
# the ping process could be still running after the test,
64+
# but vm_writer will be destroyed, so it isn't a problem.
65+
vm_writer.ssh("ping -c1 -w1 192.168.42.2", background=True, check=False)
66+
67+
# check packets are seen on vm_reader
68+
# fail if /tmp/out is empty
69+
vm_reader.ssh(
70+
f"tcpdump -i {ifaceR} -w /tmp/out -c1 -n 'vlan 42 and arp' &"
71+
"pid=$! ; sleep 5 ; kill $pid ;"
72+
"test -s /tmp/out"
73+
)
74+
75+
def test_filtered(self, defer: Defer, empty_network: Network, imported_vm: VM, vm_with_tcpdump_scope_function: VM):
76+
vm_writer, ifaceW = start_vm_on_trunk(
77+
defer,
78+
vm=imported_vm,
79+
network=empty_network,
80+
clone_vm=True,
81+
name="test_filtered: vm_writer",
82+
)
83+
84+
vm_reader, ifaceR = start_vm_on_trunk(
85+
defer,
86+
vm=vm_with_tcpdump_scope_function,
87+
network=empty_network,
88+
clone_vm=False,
89+
name="test_filtered: vm_reader",
90+
trunks="52",
91+
)
92+
93+
# configure VLAN 42 on vm_writer
94+
vm_writer.ssh(f"ip link add link {ifaceW} name {ifaceW}.42 type vlan id 42")
95+
vm_writer.ssh(f"ip addr add 192.168.42.1/24 dev {ifaceW}.42")
96+
vm_writer.ssh(f"ip link set {ifaceW}.42 up")
97+
98+
# send some packets on VLAN 42 (ARP packets will be send)
99+
# the ping process could be still running after the test,
100+
# but vm_writer will be destroyed, so it isn't a problem.
101+
vm_writer.ssh("ping -c1 -w1 192.168.42.2", background=True, check=False)
102+
103+
# check packets are seen on vm_reader
104+
# fail if /tmp/out is not empty
105+
vm_reader.ssh(
106+
f"tcpdump -i {ifaceR} -w /tmp/out -c1 -n 'vlan 42 and arp' &"
107+
"pid=$! ; sleep 5 ; kill $pid ;"
108+
"test ! -s /tmp/out"
109+
)

0 commit comments

Comments
 (0)