66import  shutil 
77from  pathlib  import  Path 
88
9+ import  pytest 
10+ 
911import  host_tools .drive  as  drive_tools 
1012from  framework .utils_drive  import  partuuid_and_disk_path 
1113from  host_tools .fcmetrics  import  FcDeviceMetrics 
1214
1315
16+ @pytest .fixture  
17+ def  uvm_vhost_user_plain_any (microvm_factory , guest_kernel , pci_enabled ):
18+     """Builds a plain VM with no root volume""" 
19+     return  microvm_factory .build (
20+         guest_kernel , None , pci = pci_enabled , monitor_memory = False 
21+     )
22+ 
23+ 
24+ @pytest .fixture  
25+ def  uvm_vhost_user_booted_ro (uvm_vhost_user_plain_any , rootfs ):
26+     """Returns a VM with a vhost-user rootfs""" 
27+     vm  =  uvm_vhost_user_plain_any 
28+ 
29+     # We need to setup ssh keys manually because we did not specify rootfs 
30+     # in microvm_factory.build method 
31+     ssh_key  =  rootfs .with_suffix (".id_rsa" )
32+     vm .ssh_key  =  ssh_key 
33+     vm .spawn ()
34+     vm .basic_config (add_root_device = False )
35+     vm .add_vhost_user_drive ("rootfs" , rootfs , is_root_device = True , is_read_only = True )
36+     vm .add_net_iface ()
37+     vm .start ()
38+ 
39+     return  vm 
40+ 
41+ 
42+ @pytest .fixture  
43+ def  uvm_vhost_user_booted_rw (uvm_vhost_user_plain_any , rootfs ):
44+     """Returns a VM with a vhost-user rootfs""" 
45+     vm  =  uvm_vhost_user_plain_any 
46+ 
47+     # We need to setup ssh keys manually because we did not specify rootfs 
48+     # in microvm_factory.build method 
49+     ssh_key  =  rootfs .with_suffix (".id_rsa" )
50+     vm .ssh_key  =  ssh_key 
51+     vm .spawn ()
52+     vm .basic_config (add_root_device = False )
53+     # Create a rw rootfs file that is unique to the microVM 
54+     rootfs_rw  =  Path (vm .chroot ()) /  "rootfs" 
55+     shutil .copy (rootfs , rootfs_rw )
56+     vm .add_vhost_user_drive (
57+         "rootfs" , rootfs_rw , is_root_device = True , is_read_only = False 
58+     )
59+     vm .add_net_iface ()
60+     vm .start ()
61+ 
62+     return  vm 
63+ 
64+ 
1465def  _check_block_size (ssh_connection , dev_path , size ):
1566    """ 
1667    Checks the size of the block device. 
@@ -34,26 +85,16 @@ def _check_drives(test_microvm, assert_dict, keys_array):
3485        assert  blockdev_out_line_cols [col ] ==  assert_dict [key ]
3586
3687
37- def  test_vhost_user_block (microvm_factory ,  guest_kernel ,  rootfs ):
88+ def  test_vhost_user_block (uvm_vhost_user_booted_ro ):
3889    """ 
3990    This test simply tries to boot a VM with 
4091    vhost-user-block as a root device. 
4192    """ 
4293
43-     vm  =  microvm_factory .build (guest_kernel , None , monitor_memory = False )
44- 
45-     # We need to setup ssh keys manually because we did not specify rootfs 
46-     # in microvm_factory.build method 
47-     ssh_key  =  rootfs .with_suffix (".id_rsa" )
48-     vm .ssh_key  =  ssh_key 
49-     vm .spawn ()
50-     vm .basic_config (add_root_device = False )
51-     vm .add_vhost_user_drive ("rootfs" , rootfs , is_root_device = True , is_read_only = True )
52-     vm .add_net_iface ()
94+     vm  =  uvm_vhost_user_booted_ro 
5395    vhost_user_block_metrics  =  FcDeviceMetrics (
5496        "vhost_user_block" , 1 , aggr_supported = False 
5597    )
56-     vm .start ()
5798
5899    # Now check that vhost-user-block with rw is last. 
59100    # 1-0 means line 1, column 0. 
@@ -65,29 +106,14 @@ def test_vhost_user_block(microvm_factory, guest_kernel, rootfs):
65106    vhost_user_block_metrics .validate (vm )
66107
67108
68- def  test_vhost_user_block_read_write (microvm_factory ,  guest_kernel ,  rootfs ):
109+ def  test_vhost_user_block_read_write (uvm_vhost_user_booted_rw ):
69110    """ 
70111    This test simply tries to boot a VM with 
71112    vhost-user-block as a root device. 
72113    This test configures vhost-user-block to be read write. 
73114    """ 
74115
75-     vm  =  microvm_factory .build (guest_kernel , None , monitor_memory = False )
76- 
77-     # We need to setup ssh keys manually because we did not specify rootfs 
78-     # in microvm_factory.build method 
79-     ssh_key  =  rootfs .with_suffix (".id_rsa" )
80-     vm .ssh_key  =  ssh_key 
81-     vm .spawn ()
82-     vm .basic_config (add_root_device = False )
83- 
84-     # Create a rw rootfs file that is unique to the microVM 
85-     rootfs_rw  =  Path (vm .chroot ()) /  "rootfs" 
86-     shutil .copy (rootfs , rootfs_rw )
87- 
88-     vm .add_vhost_user_drive ("rootfs" , rootfs_rw , is_root_device = True )
89-     vm .add_net_iface ()
90-     vm .start ()
116+     vm  =  uvm_vhost_user_booted_rw 
91117
92118    # Now check that vhost-user-block with rw is last. 
93119    # 1-0 means line 1, column 0. 
@@ -98,22 +124,12 @@ def test_vhost_user_block_read_write(microvm_factory, guest_kernel, rootfs):
98124    _check_drives (vm , assert_dict , assert_dict .keys ())
99125
100126
101- def  test_vhost_user_block_disconnect (microvm_factory ,  guest_kernel ,  rootfs ):
127+ def  test_vhost_user_block_disconnect (uvm_vhost_user_booted_ro ):
102128    """ 
103129    Test that even if backend is killed, Firecracker is still responsive. 
104130    """ 
105131
106-     vm  =  microvm_factory .build (guest_kernel , None , monitor_memory = False )
107- 
108-     # We need to set up ssh keys manually because we did not specify rootfs 
109-     # in microvm_factory.build method 
110-     ssh_key  =  rootfs .with_suffix (".id_rsa" )
111-     vm .ssh_key  =  ssh_key 
112-     vm .spawn ()
113-     vm .basic_config (add_root_device = False )
114-     vm .add_vhost_user_drive ("rootfs" , rootfs , is_root_device = True , is_read_only = True )
115-     vm .add_net_iface ()
116-     vm .start ()
132+     vm  =  uvm_vhost_user_booted_ro 
117133
118134    # Killing the backend 
119135    vm .disks_vhost_user ["rootfs" ].kill ()
@@ -123,15 +139,15 @@ def test_vhost_user_block_disconnect(microvm_factory, guest_kernel, rootfs):
123139    _config  =  vm .api .vm_config .get ().json ()
124140
125141
126- def  test_device_ordering (microvm_factory ,  guest_kernel , rootfs ):
142+ def  test_device_ordering (uvm_vhost_user_plain_any , rootfs ):
127143    """ 
128144    Verify device ordering. 
129145
130146    The root device should correspond to /dev/vda in the guest and 
131147    the order of the other devices should match their configuration order. 
132148    """ 
133149
134-     vm  =  microvm_factory . build ( guest_kernel ,  None ,  monitor_memory = False ) 
150+     vm  =  uvm_vhost_user_plain_any 
135151
136152    # We need to setup ssh keys manually because we did not specify rootfs 
137153    # in microvm_factory.build method 
@@ -194,16 +210,12 @@ def test_device_ordering(microvm_factory, guest_kernel, rootfs):
194210    vhost_user_block_metrics .validate (vm )
195211
196212
197- def  test_partuuid_boot (
198-     microvm_factory ,
199-     guest_kernel ,
200-     rootfs ,
201- ):
213+ def  test_partuuid_boot (uvm_vhost_user_plain_any , rootfs ):
202214    """ 
203215    Test the output reported by blockdev when booting with PARTUUID. 
204216    """ 
205217
206-     vm  =  microvm_factory . build ( guest_kernel ,  None ,  monitor_memory = False ) 
218+     vm  =  uvm_vhost_user_plain_any 
207219
208220    # We need to setup ssh keys manually because we did not specify rootfs 
209221    # in microvm_factory.build method 
@@ -230,12 +242,12 @@ def test_partuuid_boot(
230242    _check_drives (vm , assert_dict , assert_dict .keys ())
231243
232244
233- def  test_partuuid_update (microvm_factory ,  guest_kernel , rootfs ):
245+ def  test_partuuid_update (uvm_vhost_user_plain_any , rootfs ):
234246    """ 
235247    Test successful switching from PARTUUID boot to /dev/vda boot. 
236248    """ 
237249
238-     vm  =  microvm_factory . build ( guest_kernel ,  None ,  monitor_memory = False ) 
250+     vm  =  uvm_vhost_user_plain_any 
239251
240252    # We need to setup ssh keys manually because we did not specify rootfs 
241253    # in microvm_factory.build method 
@@ -272,7 +284,7 @@ def test_partuuid_update(microvm_factory, guest_kernel, rootfs):
272284    vhost_user_block_metrics .validate (vm )
273285
274286
275- def  test_config_change (microvm_factory ,  guest_kernel ,  rootfs ):
287+ def  test_config_change (uvm_plain_any ):
276288    """ 
277289    Verify handling of block device resize. 
278290    We expect that the guest will start reporting the updated size 
@@ -283,7 +295,7 @@ def test_config_change(microvm_factory, guest_kernel, rootfs):
283295    new_sizes  =  [20 , 10 , 30 ]  # MB 
284296    mkfs_mount_cmd  =  "mkfs.ext4 /dev/vdb && mkdir -p /tmp/tmp && mount /dev/vdb /tmp/tmp && umount /tmp/tmp" 
285297
286-     vm  =  microvm_factory . build ( guest_kernel ,  rootfs ,  monitor_memory = False ) 
298+     vm  =  uvm_plain_any 
287299    vm .spawn (log_level = "Info" )
288300    vm .basic_config ()
289301    vm .add_net_iface ()
0 commit comments