Skip to content

Commit 91ee6f4

Browse files
committed
quicktest: Add delta tests for VHD data integrity suite
These generate two different VDIs (base and leaf), export the difference, import the diff file into the base VDI and check if it's the same as the leaf. Signed-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>
1 parent cf25b00 commit 91ee6f4

1 file changed

Lines changed: 119 additions & 24 deletions

File tree

ocaml/quicktest/quicktest_vdi_ops_data_integrity.ml

Lines changed: 119 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -76,53 +76,103 @@ let check_vdi_unchanged rpc session_id ~vdi_size ~prepare_vdi ~vdi_op sr_info ()
7676
)
7777
)
7878

79+
let check_vdi_delta rpc session_id ~vdi_size ~prepare_vdi ~prepare_vdi_base
80+
~vdi_op sr_info () =
81+
let sR = sr_info.Qt.sr in
82+
Qt.VDI.with_new ~virtual_size:vdi_size rpc session_id sR
83+
@@ fun vdi_original ->
84+
Qt.VDI.with_new ~virtual_size:vdi_size rpc session_id sR @@ fun base_vdi ->
85+
prepare_vdi rpc session_id vdi_original ;
86+
let checksum_original = checksum rpc session_id vdi_original in
87+
prepare_vdi_base rpc session_id base_vdi ;
88+
89+
vdi_op rpc session_id ~vdi:vdi_original ~base_vdi ;
90+
let checksum_copy = checksum rpc session_id base_vdi in
91+
if checksum_copy <> checksum_original then
92+
failwith
93+
(Printf.sprintf
94+
"New VDI (checksum: %s) has different data than original (checksum: \
95+
%s)."
96+
checksum_copy checksum_original
97+
)
98+
7999
let copy_vdi rpc session_id sr vdi =
80100
Client.Client.VDI.copy ~rpc ~session_id ~vdi ~base_vdi:API.Ref.null
81101
~into_vdi:API.Ref.null ~sr
82102

83-
let export_import_vdi rpc session_id ~exportformat sR vdi =
84-
let vdi_uuid = Client.Client.VDI.get_uuid ~rpc ~session_id ~self:vdi in
103+
let export_vdi_to_file ~rpc ~session_id ~exportformat ?base_vdi ~vdi () =
104+
let get_uuid vdi = Client.Client.VDI.get_uuid ~rpc ~session_id ~self:vdi in
105+
let vdi_uuid = get_uuid vdi in
106+
let base_vdi_uuid = Option.map get_uuid base_vdi in
85107
let file = "/tmp/quicktest_export_" ^ vdi_uuid in
108+
Qt.cli_cmd
109+
([
110+
"vdi-export"
111+
; "uuid=" ^ vdi_uuid
112+
; "filename=" ^ file
113+
; "format=" ^ exportformat
114+
]
115+
@ match base_vdi_uuid with None -> [] | Some x -> ["base=" ^ x]
116+
)
117+
|> ignore ;
118+
file
119+
120+
let create_new_vdi ~rpc ~session_id ~sR ~vdi =
121+
let virtual_size =
122+
Client.Client.VDI.get_virtual_size ~rpc ~session_id ~self:vdi
123+
in
124+
let new_vdi =
125+
Client.Client.VDI.create ~rpc ~session_id ~name_label:""
126+
~name_description:"" ~sR ~virtual_size ~_type:`user ~sharable:false
127+
~read_only:false ~other_config:[] ~xenstore_data:[] ~sm_config:[] ~tags:[]
128+
in
129+
let new_vdi_uuid =
130+
Client.Client.VDI.get_uuid ~rpc ~session_id ~self:new_vdi
131+
in
132+
(new_vdi_uuid, new_vdi)
133+
134+
let import_file_into_vdi ~file ~vdi_uuid ~exportformat =
86135
Qt.cli_cmd
87136
[
88-
"vdi-export"
137+
"vdi-import"
89138
; "uuid=" ^ vdi_uuid
90139
; "filename=" ^ file
91140
; "format=" ^ exportformat
92141
]
93-
|> ignore ;
142+
|> ignore
143+
144+
let export_import_vdi rpc session_id ~exportformat sR vdi =
145+
let file = export_vdi_to_file ~rpc ~session_id ~exportformat ~vdi () in
94146
Xapi_stdext_pervasives.Pervasiveext.finally
95147
(fun () ->
96-
let virtual_size =
97-
Client.Client.VDI.get_virtual_size ~rpc ~session_id ~self:vdi
98-
in
99-
let new_vdi =
100-
Client.Client.VDI.create ~rpc ~session_id ~name_label:""
101-
~name_description:"" ~sR ~virtual_size ~_type:`user ~sharable:false
102-
~read_only:false ~other_config:[] ~xenstore_data:[] ~sm_config:[]
103-
~tags:[]
104-
in
105-
let new_vdi_uuid =
106-
Client.Client.VDI.get_uuid ~rpc ~session_id ~self:new_vdi
107-
in
108-
Qt.cli_cmd
109-
[
110-
"vdi-import"
111-
; "uuid=" ^ new_vdi_uuid
112-
; "filename=" ^ file
113-
; "format=" ^ exportformat
114-
]
115-
|> ignore ;
148+
let new_vdi_uuid, new_vdi = create_new_vdi ~rpc ~session_id ~sR ~vdi in
149+
import_file_into_vdi ~file ~vdi_uuid:new_vdi_uuid ~exportformat ;
116150
new_vdi
117151
)
118152
(fun () -> Sys.remove file)
119153

154+
let export_delta_import_vdi rpc session_id ~exportformat ~vdi ~base_vdi =
155+
let file =
156+
export_vdi_to_file ~rpc ~session_id ~exportformat ~vdi ~base_vdi ()
157+
in
158+
Xapi_stdext_pervasives.Pervasiveext.finally
159+
(fun () ->
160+
(* Import delta on top of base_vdi *)
161+
let base_uuid =
162+
Client.Client.VDI.get_uuid ~rpc ~session_id ~self:base_vdi
163+
in
164+
import_file_into_vdi ~file ~vdi_uuid:base_uuid ~exportformat
165+
)
166+
(fun () -> Sys.remove file)
167+
120168
let export_import_raw = export_import_vdi ~exportformat:"raw"
121169

122170
let export_import_vhd = export_import_vdi ~exportformat:"vhd"
123171

124172
let export_import_tar = export_import_vdi ~exportformat:"tar"
125173

174+
let delta_export_import_vhd = export_delta_import_vdi ~exportformat:"vhd"
175+
126176
let data_integrity_tests vdi_op op_name =
127177
[
128178
( op_name ^ ": small empty VDI"
@@ -141,6 +191,47 @@ let data_integrity_tests vdi_op op_name =
141191
)
142192
]
143193

194+
let delta_data_integrity_tests vdi_op op_name =
195+
[
196+
( op_name ^ ": delta between empty & empty VDI"
197+
, `Slow
198+
, check_vdi_delta
199+
~vdi_size:Sizes.(4L ** mib)
200+
~prepare_vdi:noop ~prepare_vdi_base:noop ~vdi_op
201+
)
202+
; ( op_name ^ ": delta between random & empty VDI"
203+
, `Slow
204+
, check_vdi_delta
205+
~vdi_size:Sizes.(4L ** mib)
206+
~prepare_vdi:write_random_data ~prepare_vdi_base:noop ~vdi_op
207+
)
208+
; ( op_name ^ ": delta between random & random VDI"
209+
, `Slow
210+
, check_vdi_delta
211+
~vdi_size:Sizes.(4L ** mib)
212+
~prepare_vdi:write_random_data ~prepare_vdi_base:write_random_data
213+
~vdi_op
214+
)
215+
; ( op_name ^ ": delta between full and empty VDI"
216+
, `Slow
217+
, check_vdi_delta
218+
~vdi_size:Sizes.(4L ** mib)
219+
~prepare_vdi:fill ~prepare_vdi_base:noop ~vdi_op
220+
)
221+
; ( op_name ^ ": delta between full and random VDI"
222+
, `Slow
223+
, check_vdi_delta
224+
~vdi_size:Sizes.(4L ** mib)
225+
~prepare_vdi:fill ~prepare_vdi_base:write_random_data ~vdi_op
226+
)
227+
; ( op_name ^ ": delta between full and full VDI"
228+
, `Slow
229+
, check_vdi_delta
230+
~vdi_size:Sizes.(4L ** mib)
231+
~prepare_vdi:fill ~prepare_vdi_base:fill ~vdi_op
232+
)
233+
]
234+
144235
let large_data_integrity_tests vdi_op op_name =
145236
let b = Random.int64 16L in
146237
[
@@ -179,6 +270,10 @@ let tests () =
179270
@ (data_integrity_tests export_import_vhd "VDI export/import to/from VHD file"
180271
|> supported_srs
181272
)
273+
@ (delta_data_integrity_tests delta_export_import_vhd
274+
"VDI delta export/import to/from VHD file"
275+
|> supported_srs
276+
)
182277
@ (data_integrity_tests export_import_tar "VDI export/import to/from TAR file"
183278
|> supported_srs
184279
)

0 commit comments

Comments
 (0)