diff --git a/app/vmmc.ml b/app/vmmc.ml index 87d7745..04ca11f 100644 --- a/app/vmmc.ml +++ b/app/vmmc.ml @@ -167,7 +167,7 @@ let remove_policy_cmd = `P "Removes a policy."] in Term.(ret (const remove_policy $ setup_log $ socket $ opt_vmname)), - Term.info "remove" ~doc ~man + Term.info "remove_policy" ~doc ~man let info_cmd = let doc = "information about VMs" in diff --git a/src/vmm_asn.ml b/src/vmm_asn.ml index d7b1854..d0e4ed7 100644 --- a/src/vmm_asn.ml +++ b/src/vmm_asn.ml @@ -628,13 +628,13 @@ let header = (required ~label:"sequence" int64) (required ~label:"id" (sequence_of utf8_string))) -type success = [ `Empty | `String of string | `Policies of policy list | `Vms of vm_config list ] +type success = [ `Empty | `String of string | `Policies of (id * policy) list | `Vms of (id * vm_config) list ] let pp_success ppf = function | `Empty -> Fmt.string ppf "success" | `String data -> Fmt.pf ppf "success: %s" data - | `Policies ps -> Fmt.(list ~sep:(unit "@.") pp_policy) ppf ps - | `Vms vms -> Fmt.(list ~sep:(unit "@.") pp_vm_config) ppf vms + | `Policies ps -> Fmt.(list ~sep:(unit "@.") (pair ~sep:(unit ": ") pp_id pp_policy)) ppf ps + | `Vms vms -> Fmt.(list ~sep:(unit "@.") (pair ~sep:(unit ": ") pp_id pp_vm_config)) ppf vms type wire = header * [ | `Command of wire_command @@ -685,8 +685,14 @@ let wire = (explicit 1 (choice4 (explicit 0 null) (explicit 1 utf8_string) - (explicit 2 (sequence_of policy_obj)) - (explicit 3 (sequence_of vm_config)))) + (explicit 2 (sequence_of + (sequence2 + (required ~label:"name" (sequence_of utf8_string)) + (required ~label:"policy" policy_obj)))) + (explicit 3 (sequence_of + (sequence2 + (required ~label:"name" (sequence_of utf8_string)) + (required ~label:"vm_config" vm_config)))))) (explicit 2 utf8_string)))) let wire_of_cstruct, wire_to_cstruct = projections_of wire diff --git a/src/vmm_asn.mli b/src/vmm_asn.mli index 80c60ee..fa4de53 100644 --- a/src/vmm_asn.mli +++ b/src/vmm_asn.mli @@ -219,7 +219,7 @@ type header = { type wire = header * [ | `Command of wire_command - | `Success of [ `Empty | `String of string | `Policies of policy list | `Vms of vm_config list ] + | `Success of [ `Empty | `String of string | `Policies of (id * policy) list | `Vms of (id * vm_config) list ] | `Failure of string ] val pp_wire : wire Fmt.t diff --git a/src/vmm_engine.ml b/src/vmm_engine.ml index 8fdc605..7fd35c5 100644 --- a/src/vmm_engine.ml +++ b/src/vmm_engine.ml @@ -122,86 +122,86 @@ let handle_command t (header, payload) = msg_to_err ( let id = header.Vmm_asn.id in match payload with - | `Failure f -> - Logs.warn (fun m -> m "ignoring failure %s" f) ; - Ok (t, [], `End) - | `Success _ -> - Logs.warn (fun m -> m "ignoring success") ; - Ok (t, [], `End) - | `Command (`Policy_cmd `Policy_remove) -> - Logs.debug (fun m -> m "remove policy %a" pp_id header.Vmm_asn.id) ; - let resources = Vmm_resources.remove t.resources id in - Ok ({ t with resources }, [ `Data (header, `Success (`String "removed policy")) ], `End) - | `Command (`Policy_cmd (`Policy_add policy)) -> - Logs.debug (fun m -> m "insert policy %a" pp_id id) ; - Vmm_resources.insert_policy t.resources id policy >>= fun resources -> - Ok ({ t with resources }, [ `Data (header, `Success (`String "added policy")) ], `End) - | `Command (`Policy_cmd `Policy_info) -> - begin - Logs.debug (fun m -> m "policy %a" pp_id id) ; - let policies = - Vmm_resources.fold t.resources id - (fun _ policies -> policies) - (fun prefix policy policies-> (prefix, policy) :: policies) - [] - in - match policies with - | [] -> - Logs.debug (fun m -> m "policies: couldn't find %a" pp_id id) ; - Error (`Msg "policy: not found") - | _ -> - Ok (t, [ `Data (header, `Success (`Policies policies)) ], `End) + | `Command (`Policy_cmd pc) -> + begin match pc with + | `Policy_remove -> + Logs.debug (fun m -> m "remove policy %a" pp_id header.Vmm_asn.id) ; + let resources = Vmm_resources.remove t.resources id in + Ok ({ t with resources }, [ `Data (header, `Success (`String "removed policy")) ], `End) + | `Policy_add policy -> + Logs.debug (fun m -> m "insert policy %a" pp_id id) ; + Vmm_resources.insert_policy t.resources id policy >>= fun resources -> + Ok ({ t with resources }, [ `Data (header, `Success (`String "added policy")) ], `End) + | `Policy_info -> + begin + Logs.debug (fun m -> m "policy %a" pp_id id) ; + let policies = + Vmm_resources.fold t.resources id + (fun _ _ policies -> policies) + (fun prefix policy policies-> (prefix, policy) :: policies) + [] + in + match policies with + | [] -> + Logs.debug (fun m -> m "policies: couldn't find %a" pp_id id) ; + Error (`Msg "policy: not found") + | _ -> + Ok (t, [ `Data (header, `Success (`Policies policies)) ], `End) + end end - | `Command (`Vm_cmd `Vm_info) -> - begin + | `Command (`Vm_cmd vc) -> + begin match vc with + | `Vm_info -> Logs.debug (fun m -> m "info %a" pp_id id) ; let vms = Vmm_resources.fold t.resources id - (fun vm vms -> vm :: vms) + (fun id vm vms -> (id, vm.config) :: vms) (fun _ _ vms-> vms) [] in - match vms with - | [] -> - Logs.debug (fun m -> m "info: couldn't find %a" pp_id id) ; - Error (`Msg "info: not found") - | _ -> - let vm_configs = List.map (fun vm -> vm.config) vms in - Ok (t, [ `Data (header, `Success (`Vms vm_configs)) ], `End) - end - | `Command (`Vm_cmd (`Vm_create vm_config)) -> - handle_create t header vm_config - | `Command (`Vm_cmd (`Vm_force_create vm_config)) -> - let resources = Vmm_resources.remove t.resources id in - if Vmm_resources.check_vm_policy resources id vm_config then - begin match Vmm_resources.find_vm t.resources id with - | None -> handle_create t header vm_config - | Some vm -> - Vmm_unix.destroy vm ; - let id_str = string_of_id id in - match String.Map.find_opt id_str t.tasks with - | None -> handle_create t header vm_config - | Some task -> + begin match vms with + | [] -> + Logs.debug (fun m -> m "info: couldn't find %a" pp_id id) ; + Error (`Msg "info: not found") + | _ -> + Ok (t, [ `Data (header, `Success (`Vms vms)) ], `End) + end + | `Vm_create vm_config -> + handle_create t header vm_config + | `Vm_force_create vm_config -> + let resources = Vmm_resources.remove t.resources id in + if Vmm_resources.check_vm_policy resources id vm_config then + begin match Vmm_resources.find_vm t.resources id with + | None -> handle_create t header vm_config + | Some vm -> + Vmm_unix.destroy vm ; + let id_str = string_of_id id in + match String.Map.find_opt id_str t.tasks with + | None -> handle_create t header vm_config + | Some task -> + let tasks = String.Map.remove id_str t.tasks in + let t = { t with tasks } in + Ok (t, [], `Wait_and_create + (task, fun t -> msg_to_err @@ handle_create t header vm_config)) + end + else + Error (`Msg "wouldn't match policy") + | `Vm_destroy -> + begin match Vmm_resources.find_vm t.resources id with + | Some vm -> + Vmm_unix.destroy vm ; + let id_str = string_of_id id in + let out, next = + let s = [ `Data (header, `Success (`String "destroyed vm")) ] in + match String.Map.find_opt id_str t.tasks with + | None -> s, `End + | Some t -> [], `Wait (t, s) + in let tasks = String.Map.remove id_str t.tasks in - let t = { t with tasks } in - Ok (t, [], `Wait_and_create - (task, fun t -> msg_to_err @@ handle_create t header vm_config)) - end - else - Error (`Msg "wouldn't match policy") - | `Command (`Vm_cmd `Vm_destroy) -> - begin match Vmm_resources.find_vm t.resources id with - | Some vm -> - Vmm_unix.destroy vm ; - let id_str = string_of_id id in - let out, next = - let s = [ `Data (header, `Success (`String "destroyed vm")) ] in - match String.Map.find_opt id_str t.tasks with - | None -> s, `End - | Some t -> [], `Wait (t, s) - in - let tasks = String.Map.remove id_str t.tasks in - Ok ({ t with tasks }, out, next) - | None -> Error (`Msg "destroy: not found") + Ok ({ t with tasks }, out, next) + | None -> Error (`Msg "destroy: not found") + end end - | _ -> Error (`Msg "unknown command")) + | _ -> + Logs.err (fun m -> m "ignoring %a" Vmm_asn.pp_wire (header, payload)) ; + Error (`Msg "unknown command")) diff --git a/src/vmm_resources.ml b/src/vmm_resources.ml index 55d2932..f51799b 100644 --- a/src/vmm_resources.ml +++ b/src/vmm_resources.ml @@ -33,7 +33,7 @@ let remove t name = Vmm_trie.remove name t let fold t name f g acc = Vmm_trie.fold name t (fun prefix entry acc -> match entry with - | Vm vm -> f vm acc + | Vm vm -> f prefix vm acc | Policy p -> g prefix p acc) acc (* we should hide this type and confirm the following invariant: diff --git a/src/vmm_resources.mli b/src/vmm_resources.mli index ced6a6b..d41d64a 100644 --- a/src/vmm_resources.mli +++ b/src/vmm_resources.mli @@ -36,5 +36,6 @@ val insert_policy : t -> Vmm_core.id -> Vmm_core.policy -> (t, [> `Msg of string val remove : t -> Vmm_core.id -> t (** [fold t id f g acc] folds [f] and [g] below [id] over [t]. *) -val fold : t -> Vmm_core.id -> (Vmm_core.vm -> 'a -> 'a) -> +val fold : t -> Vmm_core.id -> + (Vmm_core.id -> Vmm_core.vm -> 'a -> 'a) -> (Vmm_core.id -> Vmm_core.policy -> 'a -> 'a) -> 'a -> 'a