Skip to content

Commit 63d6054

Browse files
committed
storage: move partial disk populating and validation to helper functions
Signed-off-by: Gaëtan Lehmann <gaetan.lehmann@vates.tech>
1 parent abf0772 commit 63d6054

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):
1818
try:
@@ -25,6 +25,28 @@ def try_to_create_sr_with_missing_device(sr_type, label, host):
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):
2951
""" Storage migration of a shutdown VM, then migrate it back. """
3052
prov_sr = vm.get_sr()
@@ -197,30 +219,23 @@ def randstream(vm: VM, args: str) -> str:
197219

198220
def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer):
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
match vdi_op:
217232
case 'clone': new_vdi = vdi.clone()
218233
case 'snapshot': new_vdi = vdi.snapshot()
219234
defer(lambda: new_vdi.destroy() if new_vdi is not None else None)
220235

221236
# add some data in a non-used place, and overwrite an already used one
222-
checksum2bis = randstream(vm, f'generate --seed 1 --position {vdi_size // 2} --size {stream_size} {dev}')
223-
checksum4 = randstream(vm, f'generate --position {stream_size} --size {stream_size} {dev}')
237+
checksum2bis = randstream(vm, f'generate --seed 0 --position {vdi_size // 2} --size {stream_size} {dev}')
238+
checksum4 = randstream(vm, f'generate --seed 1 --position {stream_size} --size {stream_size} {dev}')
224239
# make sure we can write that data before the coalesce
225240
randstream(
226241
vm, f'validate --expected-checksum {checksum2bis} --position {vdi_size // 2} --size {stream_size} {dev}',
@@ -233,13 +248,7 @@ def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer
233248
new_vdi = vdi.wait_for_coalesce(new_vdi.destroy)
234249

235250
# verify the data is still as expected
236-
randstream(vm, f'validate --expected-checksum {checksum1} --size {stream_size} {dev}')
237-
randstream(
238-
vm, f'validate --expected-checksum {checksum2bis} --position {vdi_size // 2} --size {stream_size} {dev}',
239-
)
240-
randstream(
241-
vm, f'validate --expected-checksum {checksum3} --position {vdi_size - stream_size} --size {stream_size} {dev}'
242-
)
251+
validate_partially_populated_device(vm, dev, vdi_size, (checksum1, checksum2bis, checksum3))
243252
randstream(
244253
vm, f'validate --expected-checksum {checksum4} --position {stream_size} --size {stream_size} {dev}'
245254
)

0 commit comments

Comments
 (0)