@@ -181,25 +181,25 @@ def install_randstream(vm: VM) -> None:
181181
182182CoalesceOperation = 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
204204XVACompression = 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 } " )
0 commit comments