Skip to content

Commit d1dd44e

Browse files
authored
CP-540722: Define the MIRROR interface to be implemented by Storage_smapi{v1,v3}_migrate.ml (#6404)
This is a continuation of #6378: the refactoring effort of SXM code. To be continued...
2 parents bf4dce3 + 2490595 commit d1dd44e

17 files changed

+578
-344
lines changed

ocaml/xapi-idl/storage/storage_interface.ml

Lines changed: 102 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,37 +1000,70 @@ module StorageAPI (R : RPC) = struct
10001000
@-> returning result_p err
10011001
)
10021002

1003+
(** [import_activate dbg dp sr vdi vm] returns a server socket address to
1004+
which a fd can be passed via SCM_RIGHTS for mirroring purposes.*)
1005+
let import_activate =
1006+
declare "DATA.import_activate" []
1007+
(dbg_p
1008+
@-> dp_p
1009+
@-> sr_p
1010+
@-> vdi_p
1011+
@-> vm_p
1012+
@-> returning sock_path_p err
1013+
)
1014+
1015+
(** [get_nbd_server dbg dp sr vdi vm] returns the address of a generic nbd
1016+
server that can be connected to. Depending on the backend, this will either
1017+
be a nbd server backed by tapdisk or qemu-dp. Note this is different
1018+
from [import_activate] as the returned server does not accept fds. *)
1019+
let get_nbd_server =
1020+
declare "DATA.get_nbd_server" []
1021+
(dbg_p
1022+
@-> dp_p
1023+
@-> sr_p
1024+
@-> vdi_p
1025+
@-> vm_p
1026+
@-> returning sock_path_p err
1027+
)
1028+
10031029
module MIRROR = struct
10041030
let mirror_vm_p = Param.mk ~name:"mirror_vm" Vm.t
10051031

10061032
let copy_vm_p = Param.mk ~name:"copy_vm" Vm.t
10071033

1008-
(** [start task sr vdi url sr2] creates a VDI in remote [url]'s [sr2] and
1009-
writes data synchronously. It returns the id of the VDI.*)
1010-
let start =
1011-
declare "DATA.MIRROR.start" []
1034+
let live_vm_p = Param.mk ~name:"live_vm" Vm.t
1035+
1036+
let id_p = Param.mk ~name:"id" Mirror.id
1037+
1038+
(** [send_start dbg dp task src_sr vdi mirror_vm mirror_id local_vdi copy_vm
1039+
live_vm url remote_mirror dest_sr verify_dest]
1040+
takes the remote mirror [remote_mirror] prepared by the destination host
1041+
and initiates the mirroring of [vdi] from the source *)
1042+
let send_start =
1043+
let recv_result_p =
1044+
Param.mk ~name:"recv_result" Mirror.mirror_receive_result
1045+
in
1046+
let local_vdi_p = Param.mk ~name:"local_vdi" vdi_info in
1047+
let src_sr_p = Param.mk ~name:"src_sr" Sr.t in
1048+
let dest_sr_p = Param.mk ~name:"dest_sr" Sr.t in
1049+
declare "DATA.MIRROR.send_start" []
10121050
(dbg_p
1013-
@-> sr_p
1014-
@-> vdi_p
10151051
@-> dp_p
1052+
@-> task_id_p
1053+
@-> src_sr_p
1054+
@-> vdi_p
10161055
@-> mirror_vm_p
1056+
@-> id_p
1057+
@-> local_vdi_p
10171058
@-> copy_vm_p
1059+
@-> live_vm_p
10181060
@-> url_p
1019-
@-> dest_p
1061+
@-> recv_result_p
1062+
@-> dest_sr_p
10201063
@-> verify_dest_p
1021-
@-> returning task_id_p err
1064+
@-> returning unit_p err
10221065
)
10231066

1024-
let id_p = Param.mk ~name:"id" Mirror.id
1025-
1026-
(** [stop task sr vdi] stops mirroring local [vdi] *)
1027-
let stop =
1028-
declare "DATA.MIRROR.stop" [] (dbg_p @-> id_p @-> returning unit_p err)
1029-
1030-
let stat =
1031-
let result_p = Param.mk ~name:"result" Mirror.t in
1032-
declare "DATA.MIRROR.stat" [] (dbg_p @-> id_p @-> returning result_p err)
1033-
10341067
(** Called on the receiving end
10351068
@deprecated This function is deprecated, and is only here to keep backward
10361069
compatibility with old xapis that call Remote.DATA.MIRROR.receive_start during SXM.
@@ -1085,38 +1118,6 @@ module StorageAPI (R : RPC) = struct
10851118
let receive_cancel =
10861119
declare "DATA.MIRROR.receive_cancel" []
10871120
(dbg_p @-> id_p @-> returning unit_p err)
1088-
1089-
let list =
1090-
let result_p =
1091-
Param.mk ~name:"mirrors" TypeCombinators.(list (pair Mirror.(id, t)))
1092-
in
1093-
declare "DATA.MIRROR.list" [] (dbg_p @-> returning result_p err)
1094-
1095-
(** [import_activate dbg dp sr vdi vm] returns a server socket address to
1096-
which a fd can be passed via SCM_RIGHTS for mirroring purposes.*)
1097-
let import_activate =
1098-
declare "DATA.MIRROR.import_activate" []
1099-
(dbg_p
1100-
@-> dp_p
1101-
@-> sr_p
1102-
@-> vdi_p
1103-
@-> vm_p
1104-
@-> returning sock_path_p err
1105-
)
1106-
1107-
(** [get_nbd_server dbg dp sr vdi vm] returns the address of a generic nbd
1108-
server that can be connected to. Depending on the backend, this will either
1109-
be a nbd server backed by tapdisk or qemu-dp. Note this is different
1110-
from [import_activate] as the returned server does not accept fds. *)
1111-
let get_nbd_server =
1112-
declare "DATA.MIRROR.get_nbd_server" []
1113-
(dbg_p
1114-
@-> dp_p
1115-
@-> sr_p
1116-
@-> vdi_p
1117-
@-> vm_p
1118-
@-> returning sock_path_p err
1119-
)
11201121
end
11211122
end
11221123

@@ -1164,22 +1165,23 @@ end
11641165
module type MIRROR = sig
11651166
type context = unit
11661167

1167-
val start :
1168+
val send_start :
11681169
context
11691170
-> dbg:debug_info
1171+
-> task_id:Task.id
1172+
-> dp:dp
11701173
-> sr:sr
11711174
-> vdi:vdi
1172-
-> dp:dp
11731175
-> mirror_vm:vm
1176+
-> mirror_id:Mirror.id
1177+
-> local_vdi:vdi_info
11741178
-> copy_vm:vm
1179+
-> live_vm:vm
11751180
-> url:string
1176-
-> dest:sr
1181+
-> remote_mirror:Mirror.mirror_receive_result
1182+
-> dest_sr:sr
11771183
-> verify_dest:bool
1178-
-> Task.id
1179-
1180-
val stop : context -> dbg:debug_info -> id:Mirror.id -> unit
1181-
1182-
val stat : context -> dbg:debug_info -> id:Mirror.id -> Mirror.t
1184+
-> unit
11831185

11841186
val receive_start :
11851187
context
@@ -1205,14 +1207,6 @@ module type MIRROR = sig
12051207
val receive_finalize2 : context -> dbg:debug_info -> id:Mirror.id -> unit
12061208

12071209
val receive_cancel : context -> dbg:debug_info -> id:Mirror.id -> unit
1208-
1209-
val list : context -> dbg:debug_info -> (Mirror.id * Mirror.t) list
1210-
1211-
val import_activate :
1212-
context -> dbg:debug_info -> dp:dp -> sr:sr -> vdi:vdi -> vm:vm -> sock_path
1213-
1214-
val get_nbd_server :
1215-
context -> dbg:debug_info -> dp:dp -> sr:sr -> vdi:vdi -> vm:vm -> sock_path
12161210
end
12171211

12181212
module type Server_impl = sig
@@ -1471,6 +1465,24 @@ module type Server_impl = sig
14711465
-> verify_dest:bool
14721466
-> Task.id
14731467

1468+
val import_activate :
1469+
context
1470+
-> dbg:debug_info
1471+
-> dp:dp
1472+
-> sr:sr
1473+
-> vdi:vdi
1474+
-> vm:vm
1475+
-> sock_path
1476+
1477+
val get_nbd_server :
1478+
context
1479+
-> dbg:debug_info
1480+
-> dp:dp
1481+
-> sr:sr
1482+
-> vdi:vdi
1483+
-> vm:vm
1484+
-> sock_path
1485+
14741486
module MIRROR : MIRROR
14751487
end
14761488

@@ -1627,13 +1639,27 @@ module Server (Impl : Server_impl) () = struct
16271639
S.DATA.copy (fun dbg sr vdi vm url dest verify_dest ->
16281640
Impl.DATA.copy () ~dbg ~sr ~vdi ~vm ~url ~dest ~verify_dest
16291641
) ;
1630-
S.DATA.MIRROR.start
1631-
(fun dbg sr vdi dp mirror_vm copy_vm url dest verify_dest ->
1632-
Impl.DATA.MIRROR.start () ~dbg ~sr ~vdi ~dp ~mirror_vm ~copy_vm ~url
1633-
~dest ~verify_dest
1642+
S.DATA.MIRROR.send_start
1643+
(fun
1644+
dbg
1645+
task_id
1646+
dp
1647+
sr
1648+
vdi
1649+
mirror_vm
1650+
mirror_id
1651+
local_vdi
1652+
copy_vm
1653+
live_vm
1654+
url
1655+
remote_mirror
1656+
dest_sr
1657+
verify_dest
1658+
->
1659+
Impl.DATA.MIRROR.send_start () ~dbg ~task_id ~dp ~sr ~vdi ~mirror_vm
1660+
~mirror_id ~local_vdi ~copy_vm ~live_vm ~url ~remote_mirror ~dest_sr
1661+
~verify_dest
16341662
) ;
1635-
S.DATA.MIRROR.stop (fun dbg id -> Impl.DATA.MIRROR.stop () ~dbg ~id) ;
1636-
S.DATA.MIRROR.stat (fun dbg id -> Impl.DATA.MIRROR.stat () ~dbg ~id) ;
16371663
S.DATA.MIRROR.receive_start (fun dbg sr vdi_info id similar ->
16381664
Impl.DATA.MIRROR.receive_start () ~dbg ~sr ~vdi_info ~id ~similar
16391665
) ;
@@ -1649,12 +1675,11 @@ module Server (Impl : Server_impl) () = struct
16491675
S.DATA.MIRROR.receive_finalize2 (fun dbg id ->
16501676
Impl.DATA.MIRROR.receive_finalize2 () ~dbg ~id
16511677
) ;
1652-
S.DATA.MIRROR.list (fun dbg -> Impl.DATA.MIRROR.list () ~dbg) ;
1653-
S.DATA.MIRROR.import_activate (fun dbg dp sr vdi vm ->
1654-
Impl.DATA.MIRROR.import_activate () ~dbg ~dp ~sr ~vdi ~vm
1678+
S.DATA.import_activate (fun dbg dp sr vdi vm ->
1679+
Impl.DATA.import_activate () ~dbg ~dp ~sr ~vdi ~vm
16551680
) ;
1656-
S.DATA.MIRROR.get_nbd_server (fun dbg dp sr vdi vm ->
1657-
Impl.DATA.MIRROR.get_nbd_server () ~dbg ~dp ~sr ~vdi ~vm
1681+
S.DATA.get_nbd_server (fun dbg dp sr vdi vm ->
1682+
Impl.DATA.get_nbd_server () ~dbg ~dp ~sr ~vdi ~vm
16581683
) ;
16591684
S.Policy.get_backend_vm (fun dbg vm sr vdi ->
16601685
Impl.Policy.get_backend_vm () ~dbg ~vm ~sr ~vdi

ocaml/xapi-idl/storage/storage_skeleton.ml

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,17 @@ let get_by_name ctx ~dbg ~name = u "get_by_name"
154154
module DATA = struct
155155
let copy ctx ~dbg ~sr ~vdi ~vm ~url ~dest = u "DATA.copy"
156156

157-
module MIRROR = struct
158-
type context = unit
157+
let import_activate ctx ~dbg ~dp ~sr ~vdi ~vm =
158+
u "DATA.MIRROR.import_activate"
159159

160-
(** [start task sr vdi url sr2] creates a VDI in remote [url]'s [sr2] and
161-
writes data synchronously. It returns the id of the VDI.*)
162-
let start ctx ~dbg ~sr ~vdi ~dp ~mirror_vm ~copy_vm ~url ~dest =
163-
u "DATA.MIRROR.start"
160+
let get_nbd_server ctx ~dbg ~dp ~sr ~vdi ~vm = u "DATA.MIRROR.get_nbd_server"
164161

165-
let stop ctx ~dbg ~id = u "DATA.MIRROR.stop"
162+
module MIRROR = struct
163+
type context = unit
166164

167-
let stat ctx ~dbg ~id = u "DATA.MIRROR.stat"
165+
let send_start ctx ~dbg ~task_id ~dp ~sr ~vdi ~mirror_vm ~mirror_id
166+
~local_vdi ~copy_vm ~live_vm ~url ~remote_mirror ~dest_sr ~verify_dest =
167+
u "DATA.MIRROR.send_start"
168168

169169
let receive_start ctx ~dbg ~sr ~vdi_info ~id ~similar =
170170
u "DATA.MIRROR.receive_start"
@@ -177,14 +177,6 @@ module DATA = struct
177177
let receive_finalize2 ctx ~dbg ~id = u "DATA.MIRROR.receive_finalize2"
178178

179179
let receive_cancel ctx ~dbg ~id = u "DATA.MIRROR.receive_cancel"
180-
181-
let list ctx ~dbg = u "DATA.MIRROR.list"
182-
183-
let import_activate ctx ~dbg ~dp ~sr ~vdi ~vm =
184-
u "DATA.MIRROR.import_activate"
185-
186-
let get_nbd_server ctx ~dbg ~dp ~sr ~vdi ~vm =
187-
u "DATA.MIRROR.get_nbd_server"
188180
end
189181
end
190182

ocaml/xapi-storage-cli/dune

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
xapi-idl
66
xapi-idl.storage
77
xapi-idl.storage.interface
8+
xapi_internal
89
re
910
re.str
1011
rpclib.core

ocaml/xapi-storage-cli/main.ml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ let string_of_file filename =
149149

150150
let mirror_list common_opts =
151151
wrap common_opts (fun () ->
152-
let list = Client.DATA.MIRROR.list dbg in
152+
let list = Storage_migrate.list ~dbg in
153153
List.iter
154154
(fun (id, status) -> Printf.printf "%s" (string_of_mirror id status))
155155
list
@@ -323,9 +323,9 @@ let mirror_start common_opts sr vdi dp url dest verify_dest =
323323
let url = get_opt url "Need a URL" in
324324
let dest = get_opt dest "Need a destination SR" in
325325
let task =
326-
Client.DATA.MIRROR.start dbg sr vdi dp mirror_vm copy_vm url
327-
(Storage_interface.Sr.of_string dest)
328-
verify_dest
326+
Storage_migrate.start ~dbg ~sr ~vdi ~dp ~mirror_vm ~copy_vm ~url
327+
~dest:(Storage_interface.Sr.of_string dest)
328+
~verify_dest
329329
in
330330
Printf.printf "Task id: %s\n" task
331331
)
@@ -335,7 +335,7 @@ let mirror_stop common_opts id =
335335
wrap common_opts (fun () ->
336336
match id with
337337
| Some id ->
338-
Client.DATA.MIRROR.stop dbg id
338+
Storage_migrate.stop ~dbg ~id
339339
| None ->
340340
failwith "Need an ID"
341341
)

0 commit comments

Comments
 (0)