@@ -181,25 +181,23 @@ def install_randstream(vm: 'VM'):
181181
182182CoalesceOperation = Literal ['snapshot' , 'clone' ]
183183
184- def coalesce_integrity (vm : VM , vdi : VDI , vdi_op : CoalesceOperation ):
184+ def coalesce_integrity (vm : VM , vdi : VDI , vdi_op : CoalesceOperation , defer : Defer ):
185185 vbd = vm .connect_vdi (vdi )
186+ defer (lambda : vm .disconnect_vdi (vdi ))
187+
186188 dev = f'/dev/{ vbd .param_get ("device" )} '
187- new_vdi = 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 ()
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+ defer (lambda : new_vdi .destroy () if new_vdi is not None else None )
196+
197+ vm .ssh (f"randstream generate -v --seed 1 --size 128Mi { dev } " )
198+ vm .ssh (f"randstream validate -v --expected-checksum ad2ca9af { dev } " )
199+ new_vdi = vdi .wait_for_coalesce (new_vdi .destroy )
200+ vm .ssh (f"randstream validate -v --expected-checksum ad2ca9af { dev } " )
203201
204202XVACompression = Literal ['none' , 'gzip' , 'zstd' ]
205203
@@ -229,31 +227,37 @@ def xva_export_import(vm: VM, compression: XVACompression, defer: Defer):
229227 imported_vm .wait_for_vm_running_and_ssh_up ()
230228 imported_vm .ssh ("randstream validate -v --expected-checksum 24e905d6 /root/data" )
231229
232- def vdi_export_import (vm : VM , sr : SR , image_format : ImageFormat ):
233- vdi = sr .create_vdi (image_format = image_format )
234- image_path = f'/tmp/{ vdi .uuid } .{ image_format } '
235- try :
236- vbd = vm .connect_vdi (vdi )
237- dev = f'/dev/{ vbd .param_get ("device" )} '
238- # generate 2 blocks of data of 200MiB, at position 0 and at position 500MiB
239- vm .ssh (f"randstream generate -v --size 200MiB { dev } " )
240- # use a different seed to not write the same data (default seed is 0)
241- vm .ssh (f"randstream generate -v --seed 1 --position 500MiB --size 200MiB { dev } " )
242- vm .ssh (f"randstream validate -v --size 200MiB --expected-checksum c6310c52 { dev } " )
243- vm .ssh (f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e { dev } " )
244- vm .disconnect_vdi (vdi )
245- vm .host .xe ('vdi-export' , {'uuid' : vdi .uuid , 'filename' : image_path , 'format' : image_format })
246- vdi = vdi .destroy ()
247- # check that the zero blocks are not part of the result
248- size_mb = int (vm .host .ssh (f'du -sm --apparent-size { image_path } ' ).split ()[0 ])
249- assert 400 < size_mb < 410 , f"unexpected image size: { size_mb } "
250- vdi = sr .create_vdi (image_format = image_format )
251- vm .host .xe ('vdi-import' , {'uuid' : vdi .uuid , 'filename' : image_path , 'format' : image_format })
252- vm .connect_vdi (vdi , 'xvdb' )
253- vm .ssh (f"randstream validate -v --size 200MiB --expected-checksum c6310c52 { dev } " )
254- vm .ssh (f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e { dev } " )
255- finally :
256- if vdi is not None :
257- vm .disconnect_vdi (vdi )
258- vdi .destroy ()
259- vm .host .ssh (f'rm -f { image_path } ' )
230+ def vdi_export_import (vm : VM , sr : SR , image_format : ImageFormat , defer : Defer ):
231+ vdi_src = sr .create_vdi (image_format = image_format )
232+ defer (lambda : vdi_src .destroy () if vdi_src is not None else None )
233+
234+ vbd = vm .connect_vdi (vdi_src )
235+ defer (lambda : vm .disconnect_vdi (vdi_src ) if vdi_src is not None and vdi_src .uuid in vm .vdis else None )
236+ dev = f'/dev/{ vbd .param_get ("device" )} '
237+
238+ # generate 2 blocks of data of 200MiB, at position 0 and at position 500MiB
239+ vm .ssh (f"randstream generate -v --size 200MiB { dev } " )
240+ # use a different seed to not write the same data (default seed is 0)
241+ vm .ssh (f"randstream generate -v --seed 1 --position 500MiB --size 200MiB { dev } " )
242+ vm .ssh (f"randstream validate -v --size 200MiB --expected-checksum c6310c52 { dev } " )
243+ vm .ssh (f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e { dev } " )
244+ vm .disconnect_vdi (vdi_src )
245+
246+ image_path = f'/tmp/{ vdi_src .uuid } .{ image_format } '
247+ defer (lambda : vm .host .ssh (f'rm -f { image_path } ' ))
248+
249+ vm .host .xe ('vdi-export' , {'uuid' : vdi_src .uuid , 'filename' : image_path , 'format' : image_format })
250+ vdi_src = vdi_src .destroy ()
251+
252+ # check that the zero blocks are not part of the result
253+ size_mb = int (vm .host .ssh (f'du -sm --apparent-size { image_path } ' ).split ()[0 ])
254+ assert 400 < size_mb < 410 , f"unexpected image size: { size_mb } "
255+ vdi_dest = sr .create_vdi (image_format = image_format )
256+ defer (lambda : vdi_dest .destroy ())
257+
258+ vm .host .xe ('vdi-import' , {'uuid' : vdi_dest .uuid , 'filename' : image_path , 'format' : image_format })
259+ vm .connect_vdi (vdi_dest , 'xvdb' )
260+ defer (lambda : vm .disconnect_vdi (vdi_dest ))
261+
262+ vm .ssh (f"randstream validate -v --size 200MiB --expected-checksum c6310c52 { dev } " )
263+ vm .ssh (f"randstream validate -v --position 500MiB --size 200MiB --expected-checksum 1cb4218e { dev } " )
0 commit comments