Skip to content

Commit accd1d0

Browse files
committed
storage: extract device population and validation helpers
Extract reusable functions for partially populating and validating disk contents to reduce code duplication in storage tests. Signed-off-by: Gaëtan Lehmann <gaetan.lehmann@vates.tech>
1 parent c7a206c commit accd1d0

1 file changed

Lines changed: 29 additions & 20 deletions

File tree

tests/storage/storage.py

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from lib.vdi import VDI, ImageFormat
1313
from lib.vm import VM
1414

15-
from typing import Literal
15+
from typing import Literal, Tuple
1616

1717
def try_to_create_sr_with_missing_device(sr_type, label, host) -> None:
1818
try:
@@ -25,6 +25,28 @@ def try_to_create_sr_with_missing_device(sr_type, label, host) -> None:
2525
return
2626
assert False, 'SR creation should not have succeeded!'
2727

28+
def partial_stream_size(vdi_size: int) -> int:
29+
return min((vdi_size // 16 // (32 * KiB)) * (32 * KiB), 2 * GiB)
30+
31+
def partially_populate_device(vm: VM, dev_path: str, dev_size: int) -> Tuple[str, str, str]:
32+
logging.info(f"Generate {dev_path} content")
33+
size = partial_stream_size(dev_size)
34+
# generate at the start, in the middle and the end of the disk
35+
# use seeds unlikely to collide with other usages
36+
checksum1 = randstream(vm, f'generate --seed 10 --size {size} {dev_path}')
37+
checksum2 = randstream(vm, f'generate --seed 11 --position {dev_size // 2} --size {size} {dev_path}')
38+
checksum3 = randstream(vm, f'generate --seed 12 --position {dev_size - size} --size {size} {dev_path}')
39+
return (checksum1, checksum2, checksum3)
40+
41+
def validate_partially_populated_device(vm: VM, dev_path: str, dev_size: int, checksums: Tuple[str, str, str]) -> None:
42+
logging.info(f"Validate {dev_path} content")
43+
size = partial_stream_size(dev_size)
44+
checksum1, checksum2, checksum3 = checksums
45+
randstream(vm, f'validate --expected-checksum {checksum1} --size {size} {dev_path}')
46+
randstream(vm, f'validate --expected-checksum {checksum2} --position {dev_size // 2} --size {size} {dev_path}')
47+
randstream(vm, f'validate --expected-checksum {checksum3} --position {dev_size - size} --size {size} {dev_path}')
48+
49+
2850
def cold_migration_then_come_back(vm: VM, prov_host: Host, dest_host: Host, dest_sr: SR) -> None:
2951
""" Storage migration of a shutdown VM, then migrate it back. """
3052
prov_sr = vm.get_sr()
@@ -197,22 +219,15 @@ def randstream(vm: VM, args: str) -> str:
197219

198220
def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer) -> None:
199221
vdi_size = vdi.get_virtual_size()
200-
# second stream is 1/16 of the full one, truncated to a multiple of 32KiB
201-
stream_size = min((vdi_size // 16 // (32 * KiB)) * (32 * KiB), 2 * GiB)
222+
stream_size = partial_stream_size(vdi_size)
202223
vbd = vm.connect_vdi(vdi)
203224
defer(lambda: vm.disconnect_vdi(vdi))
204225

205226
dev = f'/dev/{vbd.param_get("device")}'
206227
# generate at the start, in the middle and the end of the disk
207-
checksum1 = randstream(vm, f'generate --size {stream_size} {dev}')
208-
checksum2 = randstream(vm, f'generate --position {vdi_size // 2} --size {stream_size} {dev}')
209-
checksum3 = randstream(vm, f'generate --position {vdi_size - stream_size} --size {stream_size} {dev}')
228+
checksum1, checksum2, checksum3 = partially_populate_device(vm, dev, vdi_size)
210229
# make sure we can read that exact data before the snapshot/clone
211-
randstream(vm, f'validate --expected-checksum {checksum1} --size {stream_size} {dev}')
212-
randstream(vm, f'validate --expected-checksum {checksum2} --position {vdi_size // 2} --size {stream_size} {dev}')
213-
randstream(
214-
vm, f'validate --expected-checksum {checksum3} --position {vdi_size - stream_size} --size {stream_size} {dev}'
215-
)
230+
validate_partially_populated_device(vm, dev, vdi_size, (checksum1, checksum2, checksum3))
216231
new_vdi: VDI | None = None
217232
match vdi_op:
218233
case 'clone': new_vdi = vdi.clone()
@@ -221,8 +236,8 @@ def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer
221236
assert vdi is not None
222237

223238
# add some data in a non-used place, and overwrite an already used one
224-
checksum2bis = randstream(vm, f'generate --seed 1 --position {vdi_size // 2} --size {stream_size} {dev}')
225-
checksum4 = randstream(vm, f'generate --position {stream_size} --size {stream_size} {dev}')
239+
checksum2bis = randstream(vm, f'generate --seed 0 --position {vdi_size // 2} --size {stream_size} {dev}')
240+
checksum4 = randstream(vm, f'generate --seed 1 --position {stream_size} --size {stream_size} {dev}')
226241
# make sure we can write that data before the coalesce
227242
randstream(
228243
vm, f'validate --expected-checksum {checksum2bis} --position {vdi_size // 2} --size {stream_size} {dev}',
@@ -236,13 +251,7 @@ def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer
236251
new_vdi = None
237252

238253
# verify the data is still as expected
239-
randstream(vm, f'validate --expected-checksum {checksum1} --size {stream_size} {dev}')
240-
randstream(
241-
vm, f'validate --expected-checksum {checksum2bis} --position {vdi_size // 2} --size {stream_size} {dev}',
242-
)
243-
randstream(
244-
vm, f'validate --expected-checksum {checksum3} --position {vdi_size - stream_size} --size {stream_size} {dev}'
245-
)
254+
validate_partially_populated_device(vm, dev, vdi_size, (checksum1, checksum2bis, checksum3))
246255
randstream(
247256
vm, f'validate --expected-checksum {checksum4} --position {stream_size} --size {stream_size} {dev}'
248257
)

0 commit comments

Comments
 (0)