Skip to content

Commit 42cb9bd

Browse files
committed
storage: Add VDI.{add_tags,remove_tags} methods
This allows for the storage backend to preserve tags after creating a destination VDI during migration. Signed-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>
1 parent 51b3030 commit 42cb9bd

6 files changed

Lines changed: 116 additions & 1 deletion

File tree

ocaml/xapi-idl/storage/storage_interface.ml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,16 @@ module StorageAPI (R : RPC) = struct
999999
declare "VDI.remove_from_sm_config" []
10001000
(dbg_p @-> sr_p @-> vdi_p @-> key_p @-> returning unit_p err)
10011001

1002+
(** [add_tags] task sr vdi key value] adds [key] to [vdi] tags *)
1003+
let add_tags =
1004+
declare "VDI.add_tags" []
1005+
(dbg_p @-> sr_p @-> vdi_p @-> key_p @-> returning unit_p err)
1006+
1007+
(** [remove_tags dbg sr vdi key] removes [key] from [vdi] tags *)
1008+
let remove_tags =
1009+
declare "VDI.remove_tags" []
1010+
(dbg_p @-> sr_p @-> vdi_p @-> key_p @-> returning unit_p err)
1011+
10021012
(** [enable_cbt dbg sr vdi] enables changed block tracking for [vdi] *)
10031013
let enable_cbt =
10041014
declare "VDI.enable_cbt" []
@@ -1628,6 +1638,12 @@ module type Server_impl = sig
16281638
val remove_from_sm_config :
16291639
context -> dbg:debug_info -> sr:sr -> vdi:vdi -> key:string -> unit
16301640

1641+
val add_tags :
1642+
context -> dbg:debug_info -> sr:sr -> vdi:vdi -> key:string -> unit
1643+
1644+
val remove_tags :
1645+
context -> dbg:debug_info -> sr:sr -> vdi:vdi -> key:string -> unit
1646+
16311647
val enable_cbt : context -> dbg:debug_info -> sr:sr -> vdi:vdi -> unit
16321648

16331649
val disable_cbt : context -> dbg:debug_info -> sr:sr -> vdi:vdi -> unit
@@ -1832,6 +1848,12 @@ module Server (Impl : Server_impl) () = struct
18321848
S.VDI.remove_from_sm_config (fun dbg sr vdi key ->
18331849
Impl.VDI.remove_from_sm_config () ~dbg ~sr ~vdi ~key
18341850
) ;
1851+
S.VDI.add_tags (fun dbg sr vdi key ->
1852+
Impl.VDI.add_tags () ~dbg ~sr ~vdi ~key
1853+
) ;
1854+
S.VDI.remove_tags (fun dbg sr vdi key ->
1855+
Impl.VDI.remove_tags () ~dbg ~sr ~vdi ~key
1856+
) ;
18351857
S.VDI.enable_cbt (fun dbg sr vdi -> Impl.VDI.enable_cbt () ~dbg ~sr ~vdi) ;
18361858
S.VDI.disable_cbt (fun dbg sr vdi -> Impl.VDI.disable_cbt () ~dbg ~sr ~vdi) ;
18371859
S.VDI.data_destroy (fun dbg sr vdi -> Impl.VDI.data_destroy () ~dbg ~sr ~vdi) ;

ocaml/xapi-idl/storage/storage_skeleton.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ module VDI = struct
164164
let remove_from_sm_config ctx ~dbg ~sr ~vdi ~key =
165165
Storage_interface.unimplemented __FUNCTION__
166166

167+
let add_tags ctx ~dbg ~sr ~vdi ~key =
168+
Storage_interface.unimplemented __FUNCTION__
169+
170+
let remove_tags ctx ~dbg ~sr ~vdi ~key =
171+
Storage_interface.unimplemented __FUNCTION__
172+
167173
let enable_cbt ctx ~dbg ~sr ~vdi =
168174
Storage_interface.unimplemented __FUNCTION__
169175

ocaml/xapi-storage-script/main.ml

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,8 @@ let _is_a_snapshot_key = "is_a_snapshot"
367367

368368
let _snapshot_of_key = "snapshot_of"
369369

370+
let _vdi_tags_key = "tags"
371+
370372
module Script = struct
371373
(** We cache (lowercase script name -> original script name) mapping for the
372374
scripts in the root directory of every registered plugin. *)
@@ -740,6 +742,19 @@ let vdi_of_volume x =
740742
v |> of_string
741743
in
742744
let find_string = find ~of_string:Fun.id in
745+
let extract_prefixed_list prefix =
746+
List.filter_map
747+
(fun (k, _) ->
748+
if String.starts_with ~prefix k then
749+
Some
750+
(String.sub k (String.length prefix)
751+
(String.length k - String.length prefix)
752+
)
753+
else
754+
None
755+
)
756+
x.Xapi_storage.Control.keys
757+
in
743758
let open Storage_interface in
744759
{
745760
vdi= Vdi.of_string x.Xapi_storage.Control.key
@@ -777,7 +792,7 @@ let vdi_of_volume x =
777792
x.Xapi_storage.Control.keys
778793
; sharable= x.Xapi_storage.Control.sharable
779794
; persistent= true
780-
; tags= []
795+
; tags= extract_prefixed_list _vdi_tags_key
781796
}
782797

783798
let choose_datapath ?(persistent = true) response =
@@ -1742,6 +1757,22 @@ module VDIImpl (M : META) = struct
17421757
let* () = unset ~dbg ~sr ~vdi ~key:(_sm_config_prefix_key ^ key) in
17431758
return ()
17441759

1760+
let vdi_add_tags_impl dbg sr vdi key =
1761+
wrap
1762+
@@
1763+
let* sr = Attached_SRs.find sr in
1764+
let vdi = Storage_interface.Vdi.string_of vdi in
1765+
let* () = set ~dbg ~sr ~vdi ~key:(_vdi_tags_key ^ key) ~value:key in
1766+
return ()
1767+
1768+
let vdi_remove_tags_impl dbg sr vdi key =
1769+
wrap
1770+
@@
1771+
let* sr = Attached_SRs.find sr in
1772+
let vdi = Storage_interface.Vdi.string_of vdi in
1773+
let* () = unset ~dbg ~sr ~vdi ~key:(_vdi_tags_key ^ key) in
1774+
return ()
1775+
17451776
let similar_content_impl _dbg _sr _vdi = wrap @@ return []
17461777
end
17471778

@@ -1946,6 +1977,8 @@ let bind ~volume_script_dir =
19461977
S.VDI.set_content_id VDI.vdi_set_content_id_impl ;
19471978
S.VDI.add_to_sm_config VDI.vdi_add_to_sm_config_impl ;
19481979
S.VDI.remove_from_sm_config VDI.vdi_remove_from_sm_config_impl ;
1980+
S.VDI.add_tags VDI.vdi_add_tags_impl ;
1981+
S.VDI.remove_tags VDI.vdi_remove_tags_impl ;
19491982
S.VDI.similar_content VDI.similar_content_impl ;
19501983

19511984
let module DP = DPImpl (RuntimeMeta) in

ocaml/xapi/storage_mux.ml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,24 @@ module Mux = struct
741741
end)) in
742742
C.VDI.remove_from_sm_config (Debug_info.to_string di) sr vdi key
743743

744+
let add_tags () ~dbg ~sr ~vdi ~key =
745+
with_dbg ~name:"VDI.add_tags" ~dbg @@ fun di ->
746+
info "VDI.add_tags dbg:%s sr:%s vdi:%s key:%s" dbg (s_of_sr sr)
747+
(s_of_vdi vdi) key ;
748+
let module C = StorageAPI (Idl.Exn.GenClient (struct
749+
let rpc = of_sr sr
750+
end)) in
751+
C.VDI.add_tags (Debug_info.to_string di) sr vdi key
752+
753+
let remove_tags () ~dbg ~sr ~vdi ~key =
754+
with_dbg ~name:"VDI.remove_tags" ~dbg @@ fun di ->
755+
info "VDI.remove_tags dbg:%s sr:%s vdi:%s key:%s" dbg (s_of_sr sr)
756+
(s_of_vdi vdi) key ;
757+
let module C = StorageAPI (Idl.Exn.GenClient (struct
758+
let rpc = of_sr sr
759+
end)) in
760+
C.VDI.remove_tags (Debug_info.to_string di) sr vdi key
761+
744762
let get_url () ~dbg ~sr ~vdi =
745763
with_dbg ~name:"VDI.get_url" ~dbg @@ fun di ->
746764
info "VDI.get_url dbg:%s sr:%s vdi:%s" dbg (s_of_sr sr) (s_of_vdi vdi) ;

ocaml/xapi/storage_smapiv1.ml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,28 @@ module SMAPIv1 : Server_impl = struct
10511051
Db.VDI.remove_from_sm_config ~__context ~self ~key
10521052
)
10531053

1054+
let add_tags _context ~dbg ~sr ~vdi ~key =
1055+
with_dbg ~name:"VDI.add_to_tags" ~dbg @@ fun di ->
1056+
info "VDI.add_tags dbg:%s sr:%s vdi:%s key:[%s]" di.log (s_of_sr sr)
1057+
(s_of_vdi vdi) key ;
1058+
let dbg = Debug_info.to_string di in
1059+
Server_helpers.exec_with_new_task "VDI.add_tags"
1060+
~subtask_of:(Ref.of_string dbg) (fun __context ->
1061+
let vdi, _ = find_vdi ~__context sr vdi in
1062+
Db.VDI.add_tags ~__context ~self:vdi ~value:key
1063+
)
1064+
1065+
let remove_tags _context ~dbg ~sr ~vdi ~key =
1066+
with_dbg ~name:"VDI.remove_tags" ~dbg @@ fun di ->
1067+
info "VDI.remove_tags dbg:%s sr:%s vdi:%s key:%s" di.log (s_of_sr sr)
1068+
(s_of_vdi vdi) key ;
1069+
let dbg = Debug_info.to_string di in
1070+
Server_helpers.exec_with_new_task "VDI.remove_tags"
1071+
~subtask_of:(Ref.of_string dbg) (fun __context ->
1072+
let self = find_vdi ~__context sr vdi |> fst in
1073+
Db.VDI.remove_tags ~__context ~self ~value:key
1074+
)
1075+
10541076
let get_url _context ~dbg ~sr ~vdi =
10551077
with_dbg ~name:"VDI.get_url" ~dbg @@ fun di ->
10561078
info "VDI.get_url dbg:%s sr:%s vdi:%s" di.log (s_of_sr sr) (s_of_vdi vdi) ;

ocaml/xapi/storage_smapiv1_wrapper.ml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,20 @@ functor
908908
let dbg = Debug_info.to_string di in
909909
Impl.VDI.remove_from_sm_config context ~dbg ~sr ~vdi ~key
910910

911+
let add_tags context ~dbg ~sr ~vdi ~key =
912+
with_dbg ~name:"VDI.add_tags" ~dbg @@ fun di ->
913+
info "VDI.add_tags dbg:%s sr:%s vdi:%s key:%s" di.log (s_of_sr sr)
914+
(s_of_vdi vdi) key ;
915+
let dbg = Debug_info.to_string di in
916+
Impl.VDI.add_tags context ~dbg ~sr ~vdi ~key
917+
918+
let remove_tags context ~dbg ~sr ~vdi ~key =
919+
with_dbg ~name:"VDI.remove_tags" ~dbg @@ fun di ->
920+
info "VDI.remove_tags dbg:%s sr:%s vdi:%s key:%s" di.log (s_of_sr sr)
921+
(s_of_vdi vdi) key ;
922+
let dbg = Debug_info.to_string di in
923+
Impl.VDI.remove_tags context ~dbg ~sr ~vdi ~key
924+
911925
let get_url context ~dbg ~sr ~vdi =
912926
with_dbg ~name:"VDI.get_url" ~dbg @@ fun di ->
913927
info "VDI.get_url dbg:%s sr:%s vdi:%s" di.log (s_of_sr sr) (s_of_vdi vdi) ;

0 commit comments

Comments
 (0)