Skip to content

Commit 89449cd

Browse files
committed
storage: keep the vdi available when entering the debugger
Signed-off-by: Gaëtan Lehmann <gaetan.lehmann@vates.tech>
1 parent 7c53280 commit 89449cd

8 files changed

Lines changed: 145 additions & 101 deletions

File tree

tests/storage/ext/test_ext_sr.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,21 @@ def test_snapshot(self, vm_on_ext_sr):
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):
91-
coalesce_integrity(storage_test_vm, vdi_on_ext_sr, vdi_op)
90+
def test_coalesce(
91+
self, storage_test_vm: VM, vdi_on_ext_sr: VDI, vdi_op: CoalesceOperation, request: pytest.FixtureRequest
92+
):
93+
coalesce_integrity(storage_test_vm, vdi_on_ext_sr, vdi_op, request)
9294

9395
@pytest.mark.small_vm
9496
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
9597
def test_xva_export_import(self, vm_on_ext_sr: VM, compression: XVACompression, request: pytest.FixtureRequest):
9698
xva_export_import(vm_on_ext_sr, compression, request)
9799

98100
@pytest.mark.small_vm
99-
def test_vdi_export_import(self, storage_test_vm: VM, ext_sr: SR, image_format: ImageFormat):
100-
vdi_export_import(storage_test_vm, ext_sr, image_format)
101+
def test_vdi_export_import(
102+
self, storage_test_vm: VM, ext_sr: SR, image_format: ImageFormat, request: pytest.FixtureRequest
103+
):
104+
vdi_export_import(storage_test_vm, ext_sr, image_format, request)
101105

102106
# *** tests with reboots (longer tests).
103107

tests/storage/lvm/test_lvm_sr.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,17 +140,21 @@ def test_failing_resize_on_inflate_after_setSizePhys(self, host, lvm_sr, vm_on_l
140140

141141
@pytest.mark.small_vm
142142
@pytest.mark.parametrize("vdi_op", ["snapshot", "clone"])
143-
def test_coalesce(self, storage_test_vm: VM, vdi_on_lvm_sr: VDI, vdi_op: CoalesceOperation):
144-
coalesce_integrity(storage_test_vm, vdi_on_lvm_sr, vdi_op)
143+
def test_coalesce(
144+
self, storage_test_vm: VM, vdi_on_lvm_sr: VDI, vdi_op: CoalesceOperation, request: pytest.FixtureRequest
145+
):
146+
coalesce_integrity(storage_test_vm, vdi_on_lvm_sr, vdi_op, request)
145147

146148
@pytest.mark.small_vm
147149
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
148150
def test_xva_export_import(self, vm_on_lvm_sr: VM, compression: XVACompression, request: pytest.FixtureRequest):
149151
xva_export_import(vm_on_lvm_sr, compression, request)
150152

151153
@pytest.mark.small_vm
152-
def test_vdi_export_import(self, storage_test_vm: VM, lvm_sr: SR, image_format: ImageFormat):
153-
vdi_export_import(storage_test_vm, lvm_sr, image_format)
154+
def test_vdi_export_import(
155+
self, storage_test_vm: VM, lvm_sr: SR, image_format: ImageFormat, request: pytest.FixtureRequest
156+
):
157+
vdi_export_import(storage_test_vm, lvm_sr, image_format, request)
154158

155159
# *** tests with reboots (longer tests).
156160

tests/storage/lvmoiscsi/test_lvmoiscsi_sr.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,14 @@ def test_snapshot(self, vm_on_lvmoiscsi_sr):
6464

6565
@pytest.mark.small_vm
6666
@pytest.mark.parametrize("vdi_op", ["snapshot", "clone"])
67-
def test_coalesce(self, storage_test_vm: 'VM', vdi_on_lvmoiscsi_sr: 'VDI', vdi_op: CoalesceOperation):
68-
coalesce_integrity(storage_test_vm, vdi_on_lvmoiscsi_sr, vdi_op)
67+
def test_coalesce(
68+
self,
69+
storage_test_vm: 'VM',
70+
vdi_on_lvmoiscsi_sr: 'VDI',
71+
vdi_op: CoalesceOperation,
72+
request: pytest.FixtureRequest,
73+
):
74+
coalesce_integrity(storage_test_vm, vdi_on_lvmoiscsi_sr, vdi_op, request)
6975

7076
@pytest.mark.small_vm
7177
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
@@ -75,8 +81,10 @@ def test_xva_export_import(
7581
xva_export_import(vm_on_lvmoiscsi_sr, compression, request)
7682

7783
@pytest.mark.small_vm
78-
def test_vdi_export_import(self, storage_test_vm: VM, lvmoiscsi_sr: SR, image_format: ImageFormat):
79-
vdi_export_import(storage_test_vm, lvmoiscsi_sr, image_format)
84+
def test_vdi_export_import(
85+
self, storage_test_vm: VM, lvmoiscsi_sr: SR, image_format: ImageFormat, request: pytest.FixtureRequest
86+
):
87+
vdi_export_import(storage_test_vm, lvmoiscsi_sr, image_format, request)
8088

8189
# *** tests with reboots (longer tests).
8290

tests/storage/nfs/test_nfs_sr.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,10 @@ def test_snapshot(self, dispatch_nfs):
115115
@pytest.mark.small_vm
116116
@pytest.mark.parametrize('dispatch_nfs', ['vdi_on_nfs_sr', 'vdi_on_nfs4_sr'], indirect=True)
117117
@pytest.mark.parametrize('vdi_op', ['snapshot', 'clone'])
118-
def test_coalesce(self, storage_test_vm: VM, dispatch_nfs: VDI, vdi_op: CoalesceOperation):
119-
coalesce_integrity(storage_test_vm, dispatch_nfs, vdi_op)
118+
def test_coalesce(
119+
self, storage_test_vm: VM, dispatch_nfs: VDI, vdi_op: CoalesceOperation, request: pytest.FixtureRequest
120+
):
121+
coalesce_integrity(storage_test_vm, dispatch_nfs, vdi_op, request)
120122

121123
@pytest.mark.small_vm
122124
# Make sure this fixture is called before the parametrized one
@@ -128,8 +130,10 @@ def test_xva_export_import(self, dispatch_nfs: VM, compression: XVACompression,
128130

129131
@pytest.mark.small_vm
130132
@pytest.mark.parametrize('dispatch_nfs', ['nfs_sr', 'nfs4_sr'], indirect=True)
131-
def test_vdi_export_import(self, storage_test_vm: VM, dispatch_nfs: SR, image_format: ImageFormat):
132-
vdi_export_import(storage_test_vm, dispatch_nfs, image_format)
133+
def test_vdi_export_import(
134+
self, storage_test_vm: VM, dispatch_nfs: SR, image_format: ImageFormat, request: pytest.FixtureRequest
135+
):
136+
vdi_export_import(storage_test_vm, dispatch_nfs, image_format, request)
133137

134138
# *** tests with reboots (longer tests).
135139

tests/storage/storage.py

Lines changed: 49 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -181,25 +181,23 @@ def install_randstream(vm: 'VM'):
181181

182182
CoalesceOperation = 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, request: pytest.FixtureRequest):
185185
vbd = vm.connect_vdi(vdi)
186+
request.addfinalizer(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+
request.addfinalizer(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

204202
XVACompression = Literal['none', 'gzip', 'zstd']
205203

@@ -229,31 +227,37 @@ def xva_export_import(vm: VM, compression: XVACompression, request: pytest.Fixtu
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, request: pytest.FixtureRequest):
231+
vdi_src = sr.create_vdi(image_format=image_format)
232+
request.addfinalizer(lambda: vdi_src.destroy() if vdi_src is not None else None)
233+
234+
vbd = vm.connect_vdi(vdi_src)
235+
request.addfinalizer(lambda: vm.disconnect_vdi(vdi_src) if vdi_src is not None 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+
request.addfinalizer(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+
request.addfinalizer(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+
request.addfinalizer(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}")

tests/storage/xfs/test_xfs_sr.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,21 @@ def test_snapshot(self, vm_on_xfs_sr):
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):
108-
coalesce_integrity(storage_test_vm, vdi_on_xfs_sr, vdi_op)
107+
def test_coalesce(
108+
self, storage_test_vm: VM, vdi_on_xfs_sr: VDI, vdi_op: CoalesceOperation, request: pytest.FixtureRequest
109+
):
110+
coalesce_integrity(storage_test_vm, vdi_on_xfs_sr, vdi_op, request)
109111

110112
@pytest.mark.small_vm
111113
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
112114
def test_xva_export_import(self, vm_on_xfs_sr: VM, compression: XVACompression, request: pytest.FixtureRequest):
113115
xva_export_import(vm_on_xfs_sr, compression, request)
114116

115117
@pytest.mark.small_vm
116-
def test_vdi_export_import(self, storage_test_vm: VM, xfs_sr: SR, image_format: ImageFormat):
117-
vdi_export_import(storage_test_vm, xfs_sr, image_format)
118+
def test_vdi_export_import(
119+
self, storage_test_vm: VM, xfs_sr: SR, image_format: ImageFormat, request: pytest.FixtureRequest
120+
):
121+
vdi_export_import(storage_test_vm, xfs_sr, image_format, request)
118122

119123
# *** tests with reboots (longer tests).
120124

tests/storage/zfs/test_zfs_sr.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,21 @@ def test_snapshot(self, vm_on_zfs_sr):
106106

107107
@pytest.mark.small_vm
108108
@pytest.mark.parametrize("vdi_op", ["snapshot", "clone"])
109-
def test_coalesce(self, storage_test_vm: VM, vdi_on_zfs_sr: VDI, vdi_op: CoalesceOperation):
110-
coalesce_integrity(storage_test_vm, vdi_on_zfs_sr, vdi_op)
109+
def test_coalesce(
110+
self, storage_test_vm: VM, vdi_on_zfs_sr: VDI, vdi_op: CoalesceOperation, request: pytest.FixtureRequest
111+
):
112+
coalesce_integrity(storage_test_vm, vdi_on_zfs_sr, vdi_op, request)
111113

112114
@pytest.mark.small_vm
113115
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
114116
def test_xva_export_import(self, vm_on_zfs_sr: VM, compression: XVACompression, request: pytest.FixtureRequest):
115117
xva_export_import(vm_on_zfs_sr, compression, request)
116118

117119
@pytest.mark.small_vm
118-
def test_vdi_export_import(self, storage_test_vm: VM, zfs_sr: SR, image_format: ImageFormat):
119-
vdi_export_import(storage_test_vm, zfs_sr, image_format)
120+
def test_vdi_export_import(
121+
self, storage_test_vm: VM, zfs_sr: SR, image_format: ImageFormat, request: pytest.FixtureRequest
122+
):
123+
vdi_export_import(storage_test_vm, zfs_sr, image_format, request)
120124

121125
# *** tests with reboots (longer tests).
122126

tests/storage/zfsvol/test_zfsvol_sr.py

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -63,47 +63,59 @@ def test_snapshot(self, vm_on_zfsvol_sr):
6363

6464
@pytest.mark.small_vm
6565
@pytest.mark.parametrize("vdi_op", ["snapshot"]) # "clone" requires a snapshot
66-
def test_coalesce(self, storage_test_vm: VM, vdi_on_zfsvol_sr: VDI, vdi_op: CoalesceOperation):
67-
coalesce_integrity(storage_test_vm, vdi_on_zfsvol_sr, vdi_op)
66+
def test_coalesce(
67+
self, storage_test_vm: VM, vdi_on_zfsvol_sr: VDI, vdi_op: CoalesceOperation, request: pytest.FixtureRequest
68+
):
69+
coalesce_integrity(storage_test_vm, vdi_on_zfsvol_sr, vdi_op, request)
6870

6971
@pytest.mark.small_vm
7072
@pytest.mark.parametrize("compression", ["none", "gzip", "zstd"])
7173
def test_xva_export_import(self, vm_on_zfsvol_sr: VM, compression: XVACompression, request: pytest.FixtureRequest):
7274
xva_export_import(vm_on_zfsvol_sr, compression, request)
7375

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

108120
# *** tests with reboots (longer tests).
109121

0 commit comments

Comments
 (0)