Skip to content

Commit aeaca44

Browse files
committed
storage: use defer fixture for VDI lifecycle management
Replace try-finally blocks with defer calls in storage tests to keep VDIs available when entering the debugger. Signed-off-by: Gaëtan Lehmann <gaetan.lehmann@vates.tech>
1 parent 9eba9cd commit aeaca44

8 files changed

Lines changed: 122 additions & 104 deletions

File tree

tests/storage/ext/test_ext_sr.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,17 @@ def test_snapshot(self, vm_on_ext_sr: VM) -> None:
8787

8888
@pytest.mark.small_vm
8989
@pytest.mark.parametrize("vdi_op", ["snapshot", "clone"])
90-
def test_coalesce(self, storage_test_vm: VM, vdi_on_ext_sr: VDI, vdi_op: CoalesceOperation) -> None:
91-
coalesce_integrity(storage_test_vm, vdi_on_ext_sr, vdi_op)
90+
def test_coalesce(self, storage_test_vm: VM, vdi_on_ext_sr: VDI, vdi_op: CoalesceOperation, defer: Defer) -> None:
91+
coalesce_integrity(storage_test_vm, vdi_on_ext_sr, vdi_op, defer)
9292

9393
@pytest.mark.small_vm
9494
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
9595
def test_xva_export_import(self, vm_on_ext_sr: VM, compression: XVACompression, defer: Defer) -> None:
9696
xva_export_import(vm_on_ext_sr, compression, defer)
9797

9898
@pytest.mark.small_vm
99-
def test_vdi_export_import(self, storage_test_vm: VM, ext_sr: SR, image_format: ImageFormat) -> None:
100-
vdi_export_import(storage_test_vm, ext_sr, image_format)
99+
def test_vdi_export_import(self, storage_test_vm: VM, ext_sr: SR, image_format: ImageFormat, defer: Defer) -> None:
100+
vdi_export_import(storage_test_vm, ext_sr, image_format, defer)
101101

102102
# *** tests with reboots (longer tests).
103103

tests/storage/lvm/test_lvm_sr.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,17 +144,17 @@ def test_failing_resize_on_inflate_after_setSizePhys(
144144

145145
@pytest.mark.small_vm
146146
@pytest.mark.parametrize("vdi_op", ["snapshot", "clone"])
147-
def test_coalesce(self, storage_test_vm: VM, vdi_on_lvm_sr: VDI, vdi_op: CoalesceOperation) -> None:
148-
coalesce_integrity(storage_test_vm, vdi_on_lvm_sr, vdi_op)
147+
def test_coalesce(self, storage_test_vm: VM, vdi_on_lvm_sr: VDI, vdi_op: CoalesceOperation, defer: Defer) -> None:
148+
coalesce_integrity(storage_test_vm, vdi_on_lvm_sr, vdi_op, defer)
149149

150150
@pytest.mark.small_vm
151151
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
152152
def test_xva_export_import(self, vm_on_lvm_sr: VM, compression: XVACompression, defer: Defer) -> None:
153153
xva_export_import(vm_on_lvm_sr, compression, defer)
154154

155155
@pytest.mark.small_vm
156-
def test_vdi_export_import(self, storage_test_vm: VM, lvm_sr: SR, image_format: ImageFormat) -> None:
157-
vdi_export_import(storage_test_vm, lvm_sr, image_format)
156+
def test_vdi_export_import(self, storage_test_vm: VM, lvm_sr: SR, image_format: ImageFormat, defer: Defer) -> None:
157+
vdi_export_import(storage_test_vm, lvm_sr, image_format, defer)
158158

159159
# *** tests with reboots (longer tests).
160160

tests/storage/lvmoiscsi/test_lvmoiscsi_sr.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,19 @@ def test_snapshot(self, vm_on_lvmoiscsi_sr: VM) -> None:
6969

7070
@pytest.mark.small_vm
7171
@pytest.mark.parametrize("vdi_op", ["snapshot", "clone"])
72-
def test_coalesce(self, storage_test_vm: VM, vdi_on_lvmoiscsi_sr: VDI, vdi_op: CoalesceOperation) -> None:
73-
coalesce_integrity(storage_test_vm, vdi_on_lvmoiscsi_sr, vdi_op)
72+
def test_coalesce(self, storage_test_vm: 'VM', vdi_on_lvmoiscsi_sr: 'VDI', vdi_op: CoalesceOperation,
73+
defer: Defer) -> None:
74+
coalesce_integrity(storage_test_vm, vdi_on_lvmoiscsi_sr, vdi_op, defer)
7475

7576
@pytest.mark.small_vm
7677
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
7778
def test_xva_export_import(self, vm_on_lvmoiscsi_sr: VM, compression: XVACompression, defer: Defer) -> None:
7879
xva_export_import(vm_on_lvmoiscsi_sr, compression, defer)
7980

8081
@pytest.mark.small_vm
81-
def test_vdi_export_import(self, storage_test_vm: VM, lvmoiscsi_sr: SR, image_format: ImageFormat) -> None:
82-
vdi_export_import(storage_test_vm, lvmoiscsi_sr, image_format)
82+
def test_vdi_export_import(self, storage_test_vm: VM, lvmoiscsi_sr: SR, image_format: ImageFormat, defer: Defer) \
83+
-> None:
84+
vdi_export_import(storage_test_vm, lvmoiscsi_sr, image_format, defer)
8385

8486
# *** tests with reboots (longer tests).
8587

tests/storage/nfs/test_nfs_sr.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ def test_snapshot(self, dispatch_nfs: VM) -> None:
116116
@pytest.mark.small_vm
117117
@pytest.mark.parametrize('dispatch_nfs', ['vdi_on_nfs_sr', 'vdi_on_nfs4_sr'], indirect=True)
118118
@pytest.mark.parametrize('vdi_op', ['snapshot', 'clone'])
119-
def test_coalesce(self, storage_test_vm: VM, dispatch_nfs: VDI, vdi_op: CoalesceOperation) -> None:
120-
coalesce_integrity(storage_test_vm, dispatch_nfs, vdi_op)
119+
def test_coalesce(self, storage_test_vm: VM, dispatch_nfs: VDI, vdi_op: CoalesceOperation, defer: Defer) -> None:
120+
coalesce_integrity(storage_test_vm, dispatch_nfs, vdi_op, defer)
121121

122122
@pytest.mark.small_vm
123123
# Make sure this fixture is called before the parametrized one
@@ -129,8 +129,9 @@ def test_xva_export_import(self, dispatch_nfs: VM, compression: XVACompression,
129129

130130
@pytest.mark.small_vm
131131
@pytest.mark.parametrize('dispatch_nfs', ['nfs_sr', 'nfs4_sr'], indirect=True)
132-
def test_vdi_export_import(self, storage_test_vm: VM, dispatch_nfs: SR, image_format: ImageFormat) -> None:
133-
vdi_export_import(storage_test_vm, dispatch_nfs, image_format)
132+
def test_vdi_export_import(self, storage_test_vm: VM, dispatch_nfs: SR, image_format: ImageFormat, defer: Defer) \
133+
-> None:
134+
vdi_export_import(storage_test_vm, dispatch_nfs, image_format, defer)
134135

135136
# *** tests with reboots (longer tests).
136137

tests/storage/storage.py

Lines changed: 52 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -181,25 +181,25 @@ def install_randstream(vm: VM) -> None:
181181

182182
CoalesceOperation = Literal['snapshot', 'clone']
183183

184-
def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation) -> None:
184+
def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer) -> None:
185185
vbd = vm.connect_vdi(vdi)
186+
defer(lambda: vm.disconnect_vdi(vdi))
187+
186188
dev = f'/dev/{vbd.param_get("device")}'
189+
vm.ssh(f"randstream generate -v {dev}")
190+
# default seed is 0
191+
vm.ssh(f"randstream validate -v --expected-checksum 65280014 {dev}")
187192
new_vdi: VDI | None = None
188-
try:
189-
vm.ssh(f"randstream generate -v {dev}")
190-
# default seed is 0
191-
vm.ssh(f"randstream validate -v --expected-checksum 65280014 {dev}")
192-
match vdi_op:
193-
case 'clone': new_vdi = vdi.clone()
194-
case 'snapshot': new_vdi = vdi.snapshot()
195-
vm.ssh(f"randstream generate -v --seed 1 --size 128Mi {dev}")
196-
vm.ssh(f"randstream validate -v --expected-checksum ad2ca9af {dev}")
197-
new_vdi = vdi.wait_for_coalesce(new_vdi.destroy)
198-
vm.ssh(f"randstream validate -v --expected-checksum ad2ca9af {dev}")
199-
finally:
200-
vm.disconnect_vdi(vdi)
201-
if new_vdi is not None:
202-
new_vdi.destroy()
193+
match vdi_op:
194+
case 'clone': new_vdi = vdi.clone()
195+
case 'snapshot': new_vdi = vdi.snapshot()
196+
defer(lambda: new_vdi.destroy() if new_vdi is not None else None)
197+
assert vdi is not None
198+
199+
vm.ssh(f"randstream generate -v --seed 1 --size 128Mi {dev}")
200+
vm.ssh(f"randstream validate -v --expected-checksum ad2ca9af {dev}")
201+
new_vdi = vdi.wait_for_coalesce(new_vdi.destroy)
202+
vm.ssh(f"randstream validate -v --expected-checksum ad2ca9af {dev}")
203203

204204
XVACompression = Literal['none', 'gzip', 'zstd']
205205

@@ -229,33 +229,39 @@ def xva_export_import(vm: VM, compression: XVACompression, defer: Defer) -> None
229229
imported_vm.wait_for_vm_running_and_ssh_up()
230230
imported_vm.ssh("randstream validate -v --expected-checksum 24e905d6 /root/data")
231231

232-
def vdi_export_import(vm: VM, sr: SR, image_format: ImageFormat) -> None:
233-
vdi: VDI | None = sr.create_vdi(image_format=image_format)
234-
assert vdi is not None
235-
image_path = f'/tmp/{vdi.uuid}.{image_format}'
236-
try:
237-
vbd = vm.connect_vdi(vdi)
238-
dev = f'/dev/{vbd.param_get("device")}'
239-
# generate 2 blocks of data of 200MiB, at position 0 and at position 500MiB
240-
vm.ssh(f"randstream generate -v --size 200MiB {dev}")
241-
# use a different seed to not write the same data (default seed is 0)
242-
vm.ssh(f"randstream generate -v --seed 1 --position 500MiB --size 200MiB {dev}")
243-
vm.ssh(f"randstream validate -v --size 200MiB --expected-checksum c6310c52 {dev}")
244-
vm.ssh(f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e {dev}")
245-
vm.disconnect_vdi(vdi)
246-
vm.host.xe('vdi-export', {'uuid': vdi.uuid, 'filename': image_path, 'format': image_format})
247-
vdi.destroy()
248-
vdi = None
249-
# check that the zero blocks are not part of the result
250-
size_mb = int(vm.host.ssh(f'du -sm --apparent-size {image_path}').split()[0])
251-
assert 400 < size_mb < 410, f"unexpected image size: {size_mb}"
252-
vdi = sr.create_vdi(image_format=image_format)
253-
vm.host.xe('vdi-import', {'uuid': vdi.uuid, 'filename': image_path, 'format': image_format})
254-
vm.connect_vdi(vdi, 'xvdb')
255-
vm.ssh(f"randstream validate -v --size 200MiB --expected-checksum c6310c52 {dev}")
256-
vm.ssh(f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e {dev}")
257-
finally:
258-
if vdi is not None:
259-
vm.disconnect_vdi(vdi)
260-
vdi.destroy()
261-
vm.host.ssh(f'rm -f {image_path}')
232+
def vdi_export_import(vm: VM, sr: SR, image_format: ImageFormat, defer: Defer) -> None:
233+
vdi_src: VDI | None = sr.create_vdi(image_format=image_format)
234+
defer(lambda: vdi_src.destroy() if vdi_src is not None else None)
235+
assert vdi_src is not None
236+
237+
vbd = vm.connect_vdi(vdi_src)
238+
defer(lambda: vm.disconnect_vdi(vdi_src) if vdi_src is not None and vdi_src.uuid in vm.vdis else None)
239+
dev = f'/dev/{vbd.param_get("device")}'
240+
241+
# generate 2 blocks of data of 200MiB, at position 0 and at position 500MiB
242+
vm.ssh(f"randstream generate -v --size 200MiB {dev}")
243+
# use a different seed to not write the same data (default seed is 0)
244+
vm.ssh(f"randstream generate -v --seed 1 --position 500MiB --size 200MiB {dev}")
245+
vm.ssh(f"randstream validate -v --size 200MiB --expected-checksum c6310c52 {dev}")
246+
vm.ssh(f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e {dev}")
247+
vm.disconnect_vdi(vdi_src)
248+
249+
image_path = f'/tmp/{vdi_src.uuid}.{image_format}'
250+
defer(lambda: vm.host.ssh(f'rm -f {image_path}'))
251+
252+
vm.host.xe('vdi-export', {'uuid': vdi_src.uuid, 'filename': image_path, 'format': image_format})
253+
vdi_src.destroy()
254+
vdi_src = None
255+
256+
# check that the zero blocks are not part of the result
257+
size_mb = int(vm.host.ssh(f'du -sm --apparent-size {image_path}').split()[0])
258+
assert 400 < size_mb < 410, f"unexpected image size: {size_mb}"
259+
vdi_dest = sr.create_vdi(image_format=image_format)
260+
defer(lambda: vdi_dest.destroy())
261+
262+
vm.host.xe('vdi-import', {'uuid': vdi_dest.uuid, 'filename': image_path, 'format': image_format})
263+
vm.connect_vdi(vdi_dest, 'xvdb')
264+
defer(lambda: vm.disconnect_vdi(vdi_dest))
265+
266+
vm.ssh(f"randstream validate -v --size 200MiB --expected-checksum c6310c52 {dev}")
267+
vm.ssh(f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e {dev}")

tests/storage/xfs/test_xfs_sr.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,17 @@ def test_snapshot(self, vm_on_xfs_sr: VM) -> None:
104104

105105
@pytest.mark.small_vm
106106
@pytest.mark.parametrize("vdi_op", ["snapshot", "clone"])
107-
def test_coalesce(self, storage_test_vm: VM, vdi_on_xfs_sr: VDI, vdi_op: CoalesceOperation) -> None:
108-
coalesce_integrity(storage_test_vm, vdi_on_xfs_sr, vdi_op)
107+
def test_coalesce(self, storage_test_vm: VM, vdi_on_xfs_sr: VDI, vdi_op: CoalesceOperation, defer: Defer) -> None:
108+
coalesce_integrity(storage_test_vm, vdi_on_xfs_sr, vdi_op, defer)
109109

110110
@pytest.mark.small_vm
111111
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
112112
def test_xva_export_import(self, vm_on_xfs_sr: VM, compression: XVACompression, defer: Defer) -> None:
113113
xva_export_import(vm_on_xfs_sr, compression, defer)
114114

115115
@pytest.mark.small_vm
116-
def test_vdi_export_import(self, storage_test_vm: VM, xfs_sr: SR, image_format: ImageFormat) -> None:
117-
vdi_export_import(storage_test_vm, xfs_sr, image_format)
116+
def test_vdi_export_import(self, storage_test_vm: VM, xfs_sr: SR, image_format: ImageFormat, defer: Defer) -> None:
117+
vdi_export_import(storage_test_vm, xfs_sr, image_format, defer)
118118

119119
# *** tests with reboots (longer tests).
120120

tests/storage/zfs/test_zfs_sr.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,17 +101,17 @@ def test_snapshot(self, vm_on_zfs_sr: VM) -> None:
101101

102102
@pytest.mark.small_vm
103103
@pytest.mark.parametrize("vdi_op", ["snapshot", "clone"])
104-
def test_coalesce(self, storage_test_vm: VM, vdi_on_zfs_sr: VDI, vdi_op: CoalesceOperation) -> None:
105-
coalesce_integrity(storage_test_vm, vdi_on_zfs_sr, vdi_op)
104+
def test_coalesce(self, storage_test_vm: VM, vdi_on_zfs_sr: VDI, vdi_op: CoalesceOperation, defer: Defer) -> None:
105+
coalesce_integrity(storage_test_vm, vdi_on_zfs_sr, vdi_op, defer)
106106

107107
@pytest.mark.small_vm
108108
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
109109
def test_xva_export_import(self, vm_on_zfs_sr: VM, compression: XVACompression, defer: Defer) -> None:
110110
xva_export_import(vm_on_zfs_sr, compression, defer)
111111

112112
@pytest.mark.small_vm
113-
def test_vdi_export_import(self, storage_test_vm: VM, zfs_sr: SR, image_format: ImageFormat) -> None:
114-
vdi_export_import(storage_test_vm, zfs_sr, image_format)
113+
def test_vdi_export_import(self, storage_test_vm: VM, zfs_sr: SR, image_format: ImageFormat, defer: Defer) -> None:
114+
vdi_export_import(storage_test_vm, zfs_sr, image_format, defer)
115115

116116
# *** tests with reboots (longer tests).
117117

tests/storage/zfsvol/test_zfsvol_sr.py

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -66,49 +66,58 @@ def test_snapshot(self, vm_on_zfsvol_sr: VM) -> None:
6666
@pytest.mark.small_vm
6767
@pytest.mark.parametrize("vdi_op", ["snapshot"]) # "clone" requires a snapshot
6868
@pytest.mark.skip("zfsvol doesn't provide vhd-parent")
69-
def test_coalesce(self, storage_test_vm: VM, vdi_on_zfsvol_sr: VDI, vdi_op: CoalesceOperation) -> None:
70-
coalesce_integrity(storage_test_vm, vdi_on_zfsvol_sr, vdi_op)
69+
def test_coalesce(self, storage_test_vm: VM, vdi_on_zfsvol_sr: VDI, vdi_op: CoalesceOperation, defer: Defer) \
70+
-> None:
71+
coalesce_integrity(storage_test_vm, vdi_on_zfsvol_sr, vdi_op, defer)
7172

7273
@pytest.mark.small_vm
7374
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
7475
def test_xva_export_import(self, vm_on_zfsvol_sr: VM, compression: XVACompression, defer: Defer) -> None:
7576
xva_export_import(vm_on_zfsvol_sr, compression, defer)
7677

7778
@pytest.mark.small_vm
78-
def test_vdi_export_import(self, storage_test_vm: VM, zfsvol_sr: SR, image_format: ImageFormat) -> None:
79+
def test_vdi_export_import(self, storage_test_vm: VM, zfsvol_sr: SR, image_format: ImageFormat, defer: Defer) \
80+
-> None:
7981
vm = storage_test_vm
8082
sr = zfsvol_sr
81-
vdi: VDI | None = sr.create_vdi(image_format=image_format)
82-
assert vdi is not None
83-
image_path = f'/tmp/{vdi.uuid}.{image_format}'
84-
try:
85-
vbd = vm.connect_vdi(vdi)
86-
dev = f'/dev/{vbd.param_get("device")}'
87-
# generate 2 blocks of data of 200MiB, at position 0 and at position 500MiB
88-
vm.ssh(f"randstream generate -v --size 200MiB {dev}")
89-
vm.ssh(f"randstream generate -v --seed 1 --position 500MiB --size 200MiB {dev}")
90-
vm.ssh(f"randstream validate -v --size 200MiB --expected-checksum c6310c52 {dev}")
91-
vm.ssh(f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e {dev}")
92-
vm.disconnect_vdi(vdi)
93-
vm.host.xe('vdi-export', {'uuid': vdi.uuid, 'filename': image_path, 'format': image_format})
94-
vdi.destroy()
95-
vdi = None
96-
# check that the zero blocks are not part of the result
97-
size_mb = int(vm.host.ssh(f'du -sm --apparent-size {image_path}').split()[0])
98-
if image_format == 'vhd':
99-
logging.warning(f"FIXME: this is broken with vhd, skip for now (XCPNG-2631). File size is {size_mb}MB")
100-
else:
101-
assert 400 < size_mb < 410, f"unexpected image size: {size_mb}"
102-
vdi = sr.create_vdi(image_format=image_format)
103-
vm.host.xe('vdi-import', {'uuid': vdi.uuid, 'filename': image_path, 'format': image_format})
104-
vm.connect_vdi(vdi, 'xvdb')
105-
vm.ssh(f"randstream validate -v --size 200MiB --expected-checksum c6310c52 {dev}")
106-
vm.ssh(f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e {dev}")
107-
finally:
108-
if vdi is not None:
109-
vm.disconnect_vdi(vdi)
110-
vdi.destroy()
111-
vm.host.ssh(f'rm -f {image_path}')
83+
vdi_src: VDI | None = sr.create_vdi(image_format=image_format)
84+
defer(lambda: vdi_src.destroy() if vdi_src is not None else None)
85+
assert vdi_src is not None
86+
87+
vbd = vm.connect_vdi(vdi_src)
88+
defer(lambda: vm.disconnect_vdi(vdi_src) if vdi_src is not None else None)
89+
dev = f'/dev/{vbd.param_get("device")}'
90+
91+
# generate 2 blocks of data of 200MiB, at position 0 and at position 500MiB
92+
vm.ssh(f"randstream generate -v --size 200MiB {dev}")
93+
# use a different seed to not write the same data (default seed is 0)
94+
vm.ssh(f"randstream generate -v --seed 1 --position 500MiB --size 200MiB {dev}")
95+
vm.ssh(f"randstream validate -v --size 200MiB --expected-checksum c6310c52 {dev}")
96+
vm.ssh(f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e {dev}")
97+
vm.disconnect_vdi(vdi_src)
98+
99+
image_path = f'/tmp/{vdi_src.uuid}.{image_format}'
100+
defer(lambda: vm.host.ssh(f'rm -f {image_path}'))
101+
102+
vm.host.xe('vdi-export', {'uuid': vdi_src.uuid, 'filename': image_path, 'format': image_format})
103+
vdi_src.destroy()
104+
vdi_src = None
105+
106+
# check that the zero blocks are not part of the result
107+
size_mb = int(vm.host.ssh(f'du -sm --apparent-size {image_path}').split()[0])
108+
if image_format == 'vhd':
109+
logging.warning(f"FIXME: this is broken with vhd, skip for now (XCPNG-2631). File size is {size_mb}MB")
110+
else:
111+
assert 400 < size_mb < 410, f"unexpected image size: {size_mb}"
112+
vdi_dest = sr.create_vdi(image_format=image_format)
113+
defer(lambda: vdi_dest.destroy())
114+
115+
vm.host.xe('vdi-import', {'uuid': vdi_dest.uuid, 'filename': image_path, 'format': image_format})
116+
vm.connect_vdi(vdi_dest, 'xvdb')
117+
defer(lambda: vm.disconnect_vdi(vdi_dest))
118+
119+
vm.ssh(f"randstream validate -v --size 200MiB --expected-checksum c6310c52 {dev}")
120+
vm.ssh(f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e {dev}")
112121

113122
# *** tests with reboots (longer tests).
114123

0 commit comments

Comments
 (0)