| GetVNC
| Get
| Set
+ | AddDisk
+ | AddNic
+ | AddPCI
+ | DelDisk
+ | DelNic
+ | DelPCI
+ | ListDisk
+ | ListNic
+ | ListPCI
| Trigger
| Device
| ReadConfig
type argty =
| ArgBool
| ArgString
+ | ArgInt
| ArgListString
type argval =
| ValBool of bool
+ | ValInt of int64
| ValString of string
| ValListString of string list
"extra", O, ArgListString; ]);
(Get, mk_desc_args "get" [ "field", R, ArgString; ]);
(Set, mk_desc_args "set" [ "field", R, ArgString; "value", R, ArgString ]);
+ (AddDisk, mk_desc_args "disk-add" [ "path", R, ArgString; "device", R, ArgString;
+ "type", R, ArgString; "mode", R, ArgString;
+ "devtype", R, ArgString ]);
+ (AddNic, mk_desc_args "nic-add" [ "bridge", O, ArgString; "mac", O, ArgString; "model", O, ArgString ]);
+ (AddPCI, mk_desc_args "pci-add" [ "domain", R, ArgInt; "bus", R, ArgInt; "slot", R, ArgInt; "func", R, ArgInt ]);
+ (DelDisk, mk_desc "disk-del");
+ (DelNic, mk_desc "nic-del");
+ (DelPCI, mk_desc "pci-del");
+ (ListDisk, mk_desc "disk-list");
+ (ListNic, mk_desc "nic-list");
+ (ListPCI, mk_desc "pci-list");
(ReadConfig, mk_desc_args "read-config" [ "path", O, ArgString ]);
(Help, mk_desc "help");
(*
| ValString s -> s
| _ -> raise (Invalid_type_registered name)
+let args_get_int args name =
+ match args_assoc name args with
+ | ValInt b -> b
+ | ValString s -> (try Int64.of_string s with exn -> raise (Invalid_type_registered name))
+ | _ -> raise (Invalid_type_registered name)
+
let args_get_bool args name =
match args_assoc name args with
| ValBool b -> b
- | ValString s -> try bool_of_string s with exn -> raise (Invalid_type_registered name)
+ | ValString s -> (try bool_of_string s with exn -> raise (Invalid_type_registered name))
| _ -> raise (Invalid_type_registered name)
let args_get_liststring args name =
with exn ->
Xenvmlib.Error (sprintf "%s %s: %s" ty subcmd (Printexc.to_string exn))
+let get_new_config state =
+ match state.vm_next_cfg with
+ | None -> state.vm_cfg
+ | Some cfg -> cfg
+
+let set_new_config state cfg =
+ state.vm_next_cfg <- Some cfg
+
let set state field value =
- let newcfg =
- match state.vm_next_cfg with
- | None -> state.vm_cfg
- | Some cfg -> cfg
- in
- let newcfg = Config.set newcfg field value in
- state.vm_next_cfg <- Some newcfg;
+ set_new_config state (Config.set (get_new_config state) field value);
Xenvmlib.Ok
let get state field =
- let cfg =
- match state.vm_next_cfg with
- | None -> state.vm_cfg
- | Some cfg -> cfg
- in
- let value = Config.get cfg field in
+ let value = Config.get (get_new_config state) field in
Xenvmlib.Msg value
+let add_disk state path device ty mode devtype =
+ let disk = {
+ Vmconfig.disk_physpath = path;
+ Vmconfig.disk_physty = Device.Vbd.physty_of_string ty;
+ Vmconfig.disk_virtpath = device;
+ Vmconfig.disk_mode = Device.Vbd.mode_of_string mode;
+ Vmconfig.disk_devtype = Device.Vbd.devty_of_string devtype;
+ Vmconfig.disk_dynadded = false;
+ } in
+ let cfg = get_new_config state in
+ (* add disk to disks *)
+ set_new_config state cfg;
+ Xenvmlib.Ok
+
+let add_nic state bridge mac model =
+ let nic = { Vmconfig.default_nic with
+ Vmconfig.nic_bridge = bridge;
+ Vmconfig.nic_mac = mac;
+ Vmconfig.nic_model = model;
+ } in
+ let cfg = get_new_config state in
+ (* add nic to nics *)
+ set_new_config state cfg;
+ Xenvmlib.Ok
+
+let add_pci state domain bus slot func bind msitranslate power_mgmt =
+ let msitranslate = may (fun b -> if b then 1 else 0) msitranslate in
+ let power_mgmt = may (fun b -> if b then 1 else 0) power_mgmt in
+ let pci = {
+ Vmconfig.pci_bind = bind;
+ Vmconfig.pci_domain = Int64.to_int domain;
+ Vmconfig.pci_bus = Int64.to_int bus;
+ Vmconfig.pci_slot = Int64.to_int slot;
+ Vmconfig.pci_func = Int64.to_int func;
+ Vmconfig.pci_msitranslate = msitranslate;
+ Vmconfig.pci_power_mgmt = power_mgmt;
+ } in
+ let cfg = get_new_config state in
+ (* add pci to pcis *)
+ set_new_config state cfg;
+ Xenvmlib.Ok
+
inject_sci: int;
}
+let default_nic =
+ {
+ nic_id = -1;
+ nic_aid = -1;
+ nic_bridge = None;
+ nic_bridge_gen = "";
+ nic_mac = None;
+ nic_mac_gen = "";
+ nic_model = None;
+ nic_dynadded = false;
+ }
+
module Config = struct
let config_pci_of_string s =
| _ -> ()
) ls;
- {
+ { default_nic with
nic_id = !id;
nic_aid = !id;
nic_bridge = !bridge;
- nic_bridge_gen = "";
nic_mac = !mac;
- nic_mac_gen = "";
nic_model = !model;
- nic_dynadded = false
}
let config_disk_of_string s =
let string_of_argtype argty =
match argty with
| Tasks.ArgBool -> "bool"
+ | Tasks.ArgInt -> "int"
| Tasks.ArgString -> "string"
| Tasks.ArgListString -> "list-string"
in
let optional_arg default f args s =
try f args s with Tasks.Argument_not_found _ -> default
in
+ let optional_arg_nodef f args s =
+ try Some (f args s) with Tasks.Argument_not_found _ -> None
+ in
let task_desc = List.assoc task Tasks.actions_table in
(*maybe assert_vmstate task_vmstate_required;*)
| Tasks.GetDomid -> Xenvmlib.Msg (string_of_int state.vm_domid)
| Tasks.GetStatus -> Xenvmlib.Msg (string_of_vmlifestate state.vm_lifestate)
| Tasks.GetVNC -> Xenvmlib.Msg (string_of_int state.vm_vnc_port)
+ | Tasks.AddDisk ->
+ let path = Tasks.args_get_string args "path" in
+ let device = Tasks.args_get_string args "device" in
+ let ty = Tasks.args_get_string args "type" in
+ let mode = Tasks.args_get_string args "mode" in
+ let devtype = Tasks.args_get_string args "devtype" in
+ Vmact.add_disk state path device ty mode devtype
+ | Tasks.AddNic ->
+ let bridge = optional_arg_nodef Tasks.args_get_string args "bridge" in
+ let mac = optional_arg_nodef Tasks.args_get_string args "mac" in
+ let model = optional_arg_nodef Tasks.args_get_string args "model" in
+ Vmact.add_nic state bridge mac model
+ | Tasks.AddPCI ->
+ let domain = Tasks.args_get_int args "domain" in
+ let bus = Tasks.args_get_int args "bus" in
+ let slot = Tasks.args_get_int args "slot" in
+ let func = Tasks.args_get_int args "func" in
+ let bind = optional_arg true Tasks.args_get_bool args "bind" in
+ let msitranslate = optional_arg_nodef Tasks.args_get_bool args "msitranslate" in
+ let power_mgmt = optional_arg_nodef Tasks.args_get_bool args "power_mgmt" in
+ Vmact.add_pci state domain bus slot func bind msitranslate power_mgmt
+ | Tasks.DelDisk | Tasks.DelNic | Tasks.DelPCI ->
+ Xenvmlib.Error "not implemented"
+ | Tasks.ListDisk | Tasks.ListNic | Tasks.ListPCI ->
+ Xenvmlib.Error "not implemented"
| Tasks.Get ->
let field = Tasks.args_get_string args "field" in
Vmact.get state field