@@ -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+
7999let 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: " " ~s R ~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: " " ~s R ~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 ~s R ~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+
120168let export_import_raw = export_import_vdi ~exportformat: " raw"
121169
122170let export_import_vhd = export_import_vdi ~exportformat: " vhd"
123171
124172let export_import_tar = export_import_vdi ~exportformat: " tar"
125173
174+ let delta_export_import_vhd = export_delta_import_vdi ~exportformat: " vhd"
175+
126176let 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+
144235let 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