99from libs .net .traffic_generator import TcpServer
1010from libs .net .traffic_generator import VMTcpClient as TcpClient
1111from libs .net .vmspec import lookup_iface_status
12+ from libs .vm .spec import Interface , Multus , Network
1213from libs .vm .vm import BaseVirtualMachine
14+ from tests .network .libs import cloudinit
1315from tests .network .libs import cluster_user_defined_network as libcudn
1416from tests .network .libs .ip import random_ipv4_address
1517from tests .network .localnet .liblocalnet import (
1618 LINK_STATE_DOWN ,
19+ LOCALNET_BR_EX_INTERFACE ,
20+ LOCALNET_BR_EX_INTERFACE_NO_VLAN ,
1721 LOCALNET_BR_EX_NETWORK ,
22+ LOCALNET_BR_EX_NETWORK_NO_VLAN ,
23+ LOCALNET_OVS_BRIDGE_INTERFACE ,
1824 LOCALNET_OVS_BRIDGE_NETWORK ,
1925 LOCALNET_TEST_LABEL ,
2026 client_server_active_connection ,
3137from utilities .virt import migrate_vm_and_verify
3238
3339NNCP_INTERFACE_TYPE_OVS_BRIDGE = "ovs-bridge"
40+ PRIMARY_INTERFACE_NAME = "eth0"
3441
3542
3643@pytest .fixture (scope = "module" )
@@ -95,25 +102,61 @@ def cudn_localnet(
95102 yield cudn
96103
97104
105+ @pytest .fixture (scope = "module" )
106+ def cudn_localnet_no_vlan (
107+ namespace_localnet_1 : Namespace ,
108+ ) -> Generator [libcudn .ClusterUserDefinedNetwork ]:
109+ with localnet_cudn (
110+ name = LOCALNET_BR_EX_NETWORK_NO_VLAN ,
111+ match_labels = LOCALNET_TEST_LABEL ,
112+ physical_network_name = LOCALNET_BR_EX_NETWORK ,
113+ ) as cudn :
114+ cudn .wait_for_status_success ()
115+ yield cudn
116+
117+
98118@pytest .fixture (scope = "module" )
99119def ipv4_localnet_address_pool () -> Generator [str ]:
100120 return (f"{ random_ipv4_address (net_seed = 0 , host_address = host_value )} /24" for host_value in range (1 , 254 ))
101121
102122
123+ @pytest .fixture (scope = "module" )
124+ def vm_localnet_1_secondary_ip (ipv4_localnet_address_pool : Generator [str ]) -> str :
125+ return next (ipv4_localnet_address_pool )
126+
127+
103128@pytest .fixture (scope = "module" )
104129def vm_localnet_1 (
105130 namespace_localnet_1 : Namespace ,
106131 ipv4_localnet_address_pool : Generator [str ],
132+ vm_localnet_1_secondary_ip : str ,
107133 cudn_localnet : libcudn .ClusterUserDefinedNetwork ,
134+ cudn_localnet_no_vlan : libcudn .ClusterUserDefinedNetwork ,
108135 unprivileged_client : DynamicClient ,
109136) -> Generator [BaseVirtualMachine ]:
137+ """
138+ Creates a VM with two interfaces:
139+ - Primary interface (eth0): connected to VLAN-enabled localnet
140+ - Secondary interface (eth1): connected to no-VLAN localnet
141+ """
110142 with localnet_vm (
111143 namespace = namespace_localnet_1 .name ,
112144 name = "test-vm1" ,
113- physical_network_name = cudn_localnet .name ,
114- spec_logical_network = LOCALNET_BR_EX_NETWORK ,
115- cidr = next (ipv4_localnet_address_pool ),
116145 client = unprivileged_client ,
146+ networks = [
147+ Network (name = LOCALNET_BR_EX_INTERFACE , multus = Multus (networkName = cudn_localnet .name )),
148+ Network (name = LOCALNET_BR_EX_INTERFACE_NO_VLAN , multus = Multus (networkName = cudn_localnet_no_vlan .name )),
149+ ],
150+ interfaces = [
151+ Interface (name = LOCALNET_BR_EX_INTERFACE , bridge = {}),
152+ Interface (name = LOCALNET_BR_EX_INTERFACE_NO_VLAN , bridge = {}),
153+ ],
154+ network_data = cloudinit .NetworkData (
155+ ethernets = {
156+ PRIMARY_INTERFACE_NAME : cloudinit .EthernetDevice (addresses = [next (ipv4_localnet_address_pool )]),
157+ "eth1" : cloudinit .EthernetDevice (addresses = [vm_localnet_1_secondary_ip ]),
158+ }
159+ ),
117160 ) as vm :
118161 yield vm
119162
@@ -128,10 +171,12 @@ def vm_localnet_2(
128171 with localnet_vm (
129172 namespace = namespace_localnet_2 .name ,
130173 name = "test-vm2" ,
131- physical_network_name = cudn_localnet .name ,
132- spec_logical_network = LOCALNET_BR_EX_NETWORK ,
133- cidr = next (ipv4_localnet_address_pool ),
134174 client = unprivileged_client ,
175+ networks = [Network (name = LOCALNET_BR_EX_INTERFACE , multus = Multus (networkName = cudn_localnet .name ))],
176+ interfaces = [Interface (name = LOCALNET_BR_EX_INTERFACE , bridge = {})],
177+ network_data = cloudinit .NetworkData (
178+ ethernets = {PRIMARY_INTERFACE_NAME : cloudinit .EthernetDevice (addresses = [next (ipv4_localnet_address_pool )])}
179+ ),
135180 ) as vm :
136181 yield vm
137182
@@ -156,7 +201,7 @@ def localnet_client(localnet_running_vms: tuple[BaseVirtualMachine, BaseVirtualM
156201 with create_traffic_client (
157202 server_vm = localnet_running_vms [0 ],
158203 client_vm = localnet_running_vms [1 ],
159- spec_logical_network = LOCALNET_BR_EX_NETWORK ,
204+ spec_logical_network = LOCALNET_BR_EX_INTERFACE ,
160205 ) as client :
161206 assert client .is_running ()
162207 yield client
@@ -227,11 +272,14 @@ def vm_ovs_bridge_localnet_link_down(
227272 with localnet_vm (
228273 namespace = namespace_localnet_1 .name ,
229274 name = "localnet-ovs-link-down-vm" ,
230- physical_network_name = cudn_localnet_ovs_bridge .name ,
231- spec_logical_network = LOCALNET_OVS_BRIDGE_NETWORK ,
232- cidr = next (ipv4_localnet_address_pool ),
233275 client = unprivileged_client ,
234- interface_state = LINK_STATE_DOWN ,
276+ networks = [
277+ Network (name = LOCALNET_OVS_BRIDGE_INTERFACE , multus = Multus (networkName = cudn_localnet_ovs_bridge .name ))
278+ ],
279+ interfaces = [Interface (name = LOCALNET_OVS_BRIDGE_INTERFACE , bridge = {}, state = LINK_STATE_DOWN )],
280+ network_data = cloudinit .NetworkData (
281+ ethernets = {PRIMARY_INTERFACE_NAME : cloudinit .EthernetDevice (addresses = [next (ipv4_localnet_address_pool )])}
282+ ),
235283 ) as vm :
236284 yield vm
237285
@@ -246,10 +294,14 @@ def vm_ovs_bridge_localnet_1(
246294 with localnet_vm (
247295 namespace = namespace_localnet_1 .name ,
248296 name = "localnet-ovs-vm1" ,
249- physical_network_name = cudn_localnet_ovs_bridge .name ,
250- spec_logical_network = LOCALNET_OVS_BRIDGE_NETWORK ,
251- cidr = next (ipv4_localnet_address_pool ),
252297 client = unprivileged_client ,
298+ networks = [
299+ Network (name = LOCALNET_OVS_BRIDGE_INTERFACE , multus = Multus (networkName = cudn_localnet_ovs_bridge .name ))
300+ ],
301+ interfaces = [Interface (name = LOCALNET_OVS_BRIDGE_INTERFACE , bridge = {})],
302+ network_data = cloudinit .NetworkData (
303+ ethernets = {PRIMARY_INTERFACE_NAME : cloudinit .EthernetDevice (addresses = [next (ipv4_localnet_address_pool )])}
304+ ),
253305 ) as vm :
254306 yield vm
255307
@@ -264,10 +316,14 @@ def vm_ovs_bridge_localnet_2(
264316 with localnet_vm (
265317 namespace = namespace_localnet_1 .name ,
266318 name = "localnet-ovs-vm2" ,
267- physical_network_name = cudn_localnet_ovs_bridge .name ,
268- spec_logical_network = LOCALNET_OVS_BRIDGE_NETWORK ,
269- cidr = next (ipv4_localnet_address_pool ),
270319 client = unprivileged_client ,
320+ networks = [
321+ Network (name = LOCALNET_OVS_BRIDGE_INTERFACE , multus = Multus (networkName = cudn_localnet_ovs_bridge .name ))
322+ ],
323+ interfaces = [Interface (name = LOCALNET_OVS_BRIDGE_INTERFACE , bridge = {})],
324+ network_data = cloudinit .NetworkData (
325+ ethernets = {PRIMARY_INTERFACE_NAME : cloudinit .EthernetDevice (addresses = [next (ipv4_localnet_address_pool )])}
326+ ),
271327 ) as vm :
272328 yield vm
273329
@@ -279,7 +335,7 @@ def ovs_bridge_localnet_running_vms_one_with_interface_down(
279335 vm1 , vm2 = run_vms (vms = (vm_ovs_bridge_localnet_link_down , vm_ovs_bridge_localnet_1 ))
280336 lookup_iface_status (
281337 vm = vm_ovs_bridge_localnet_link_down ,
282- iface_name = LOCALNET_OVS_BRIDGE_NETWORK ,
338+ iface_name = LOCALNET_OVS_BRIDGE_INTERFACE ,
283339 predicate = lambda interface : "guest-agent" in interface ["infoSource" ]
284340 and interface ["linkState" ] == LINK_STATE_DOWN ,
285341 )
@@ -310,7 +366,7 @@ def localnet_ovs_bridge_client(
310366 with create_traffic_client (
311367 server_vm = ovs_bridge_localnet_running_vms [0 ],
312368 client_vm = ovs_bridge_localnet_running_vms [1 ],
313- spec_logical_network = LOCALNET_OVS_BRIDGE_NETWORK ,
369+ spec_logical_network = LOCALNET_OVS_BRIDGE_INTERFACE ,
314370 ) as client :
315371 assert client .is_running ()
316372 yield client
@@ -321,7 +377,7 @@ def localnet_vms_have_connectivity(localnet_running_vms: tuple[BaseVirtualMachin
321377 with client_server_active_connection (
322378 client_vm = localnet_running_vms [0 ],
323379 server_vm = localnet_running_vms [1 ],
324- spec_logical_network = LOCALNET_BR_EX_NETWORK ,
380+ spec_logical_network = LOCALNET_BR_EX_INTERFACE ,
325381 ):
326382 pass
327383
0 commit comments