Skip to content

Commit 7ec08ac

Browse files
committed
add case for ethernet attachment
xxxx-296614: [attach-device][ethernet] hotplug ethernet type interface by attach-device Signed-off-by: nanli <[email protected]>
1 parent d4a34d0 commit 7ec08ac

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
- virtual_network.attach_detach_device.ethernet_interface:
2+
type = attach_ethernet_interface
3+
start_vm = no
4+
outside_ip = 'www.redhat.com'
5+
vm_ping_outside = pass
6+
default_br = "virbr0"
7+
expected_xpaths_detach = []
8+
variants :
9+
- managed_no_tap:
10+
device_type = tap
11+
tap_name = mytap0
12+
managed = "no"
13+
t_name = ${tap_name}
14+
iface_attrs = {'type_name': 'ethernet', 'target': {'dev': '${tap_name}', 'managed': '${managed}'}, 'model': 'virtio'}
15+
- managed_no_macvtap:
16+
device_type = macvtap
17+
macvtap_name = mymacvtap0
18+
managed = "no"
19+
t_name = ${macvtap_name}
20+
iface_attrs = {'type_name': 'ethernet', 'target': {'dev': '${macvtap_name}', 'managed': '${managed}'}, 'model': 'virtio'}
21+
expected_xpaths_attach = [{'element_attrs': ["//interface/target[@dev='${t_name}']"]}, {'element_attrs': ["//interface/target[@managed='${managed}']"]}]
22+
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
2+
from virttest import utils_misc
3+
from virttest import utils_net
4+
from virttest import virsh
5+
from virttest.libvirt_xml import vm_xml
6+
from virttest.utils_libvirt import libvirt_vmxml
7+
8+
from provider.virtual_network import network_base
9+
10+
VIRSH_ARGS = {'ignore_status': False, 'debug': True}
11+
12+
13+
def run(test, params, env):
14+
"""
15+
Test hotplug ethernet type interface by attach-device
16+
17+
Steps:
18+
1. Start the vm without any interface
19+
2. After vm boot successfully, hotplug the interface and check xpath
20+
3. Guest ping check
21+
4. Detach the interface and check no interface result
22+
"""
23+
24+
def setup_test():
25+
"""Setup VM without any interfaces and create required tap devices"""
26+
test.log.info("TEST_SETPUP: Setting up VM without interfaces")
27+
libvirt_vmxml.remove_vm_devices_by_type(vm, "interface")
28+
29+
if device_type == "tap":
30+
network_base.create_tap(tap_name, default_br, "root")
31+
elif device_type == "macvtap":
32+
network_base.create_macvtap(macvtap_name, host_iface, "root")
33+
vm.start()
34+
vm.wait_for_serial_login().close()
35+
36+
def run_test():
37+
"""Main test steps: attach interface, check, ping, detach"""
38+
test.log.info("TEST_STEP1: Attach device")
39+
mac_addr = utils_net.generate_mac_address_simple()
40+
iface_attrs['mac_address'] = mac_addr
41+
iface = libvirt_vmxml.create_vm_device_by_type('interface', iface_attrs)
42+
test.log.debug(f'Interface to attach:\n{iface}')
43+
virsh.attach_device(vm_name, iface.xml, **VIRSH_ARGS)
44+
45+
test.log.info("TEST_STEP2: Checking interface via xpath")
46+
vmxml = vm_xml.VMXML.new_from_dumpxml(vm_name)
47+
libvirt_vmxml.check_guest_xml_by_xpaths(vmxml, expected_xpaths_attach)
48+
49+
test.log.info("TEST_STEP3: Checking guest connectivity")
50+
session = vm.wait_for_serial_login()
51+
ips = {'outside_ip': params.get('outside_ip')}
52+
network_base.ping_check(params, ips, session, force_ipv4=True)
53+
54+
test.log.info("TEST_STEP4: Detaching ethernet interface and checking interface removal via xpath ")
55+
virsh.detach_device(vm_name, iface.xml, wait_for_event=True, **VIRSH_ARGS)
56+
libvirt_vmxml.check_guest_xml_by_xpaths(
57+
vm_xml.VMXML.new_from_dumpxml(vm_name), expected_xpaths_detach)
58+
59+
vm_iface_info_after = utils_net.get_linux_iface_info(mac=mac_addr, session=session)
60+
if vm_iface_info_after is not None:
61+
test.fail(f'Interface should be removed from guest: {vm_iface_info_after}')
62+
test.log.info("Interface successfully removed from guest")
63+
64+
session.close()
65+
66+
def teardown_test():
67+
"""Cleanup test environment"""
68+
test.log.info("TEST_TEARDOWN: Cleaning up test environment")
69+
70+
if device_type == "tap":
71+
test.log.info(f"Cleaning up tap device: {tap_name}")
72+
network_base.delete_tap(tap_name)
73+
elif device_type == "macvtap":
74+
test.log.info(f"Cleaning up macvtap device: {macvtap_name}")
75+
network_base.delete_tap(macvtap_name)
76+
77+
bkxml.sync()
78+
79+
# Get VM parameters
80+
vm_name = params.get('main_vm')
81+
vm = env.get_vm(vm_name)
82+
device_type = params.get('device_type')
83+
default_br = params.get('default_br')
84+
tap_name = params.get('tap_name', 'mytap0')
85+
macvtap_name = params.get('macvtap_name', 'mymacvtap0')
86+
iface_attrs = eval(params.get('iface_attrs', "{}"))
87+
expected_xpaths_attach = eval(params.get('expected_xpaths_attach'))
88+
expected_xpaths_detach = eval(params.get('expected_xpaths_detach'))
89+
if utils_misc.wait_for(
90+
lambda: utils_net.get_default_gateway(
91+
iface_name=True, force_dhcp=True, json=True) is None, timeout=15):
92+
test.fail("Not find host interface in 15s")
93+
host_iface = params.get("host_iface")
94+
host_iface = host_iface if host_iface else utils_net.get_default_gateway(
95+
iface_name=True, force_dhcp=True).split()[0]
96+
# Backup original VM XML
97+
vmxml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
98+
bkxml = vmxml.copy()
99+
100+
try:
101+
setup_test()
102+
run_test()
103+
finally:
104+
teardown_test()

0 commit comments

Comments
 (0)