]> xenbits.xensource.com Git - xenclient/toolstack.git/commitdiff
add RPC to add disk/nic/pci
authorVincent Hanquez <vincent.hanquez@eu.citrix.com>
Wed, 29 Jul 2009 00:23:13 +0000 (01:23 +0100)
committerVincent Hanquez <vincent.hanquez@eu.citrix.com>
Wed, 29 Jul 2009 00:23:13 +0000 (01:23 +0100)
xenvm/tasks.ml
xenvm/vmact.ml
xenvm/vmconfig.ml
xenvm/xenvm.ml

index 032deef282c39152e080f9ec6ab356e00c2ffe21..73286f701047eec071c872389f7cd573d20c975c 100644 (file)
@@ -30,6 +30,15 @@ type action =
        | GetVNC
        | Get
        | Set
+       | AddDisk
+       | AddNic
+       | AddPCI
+       | DelDisk
+       | DelNic
+       | DelPCI
+       | ListDisk
+       | ListNic
+       | ListPCI
        | Trigger
        | Device
        | ReadConfig
@@ -38,10 +47,12 @@ type action =
 type argty =
        | ArgBool 
        | ArgString
+       | ArgInt
        | ArgListString
 
 type argval =
        | ValBool of bool
+       | ValInt of int64
        | ValString of string
        | ValListString of string list
 
@@ -80,6 +91,17 @@ let actions_table = [
                                             "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");
        (*
@@ -104,10 +126,16 @@ let args_get_string args name =
        | 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 =
index 3967f0ccab68f64515e527632acbb149bcba2935..efe87330c8a05832098b949d6dde54cf27eb3623 100644 (file)
@@ -652,22 +652,61 @@ let device_cmd xc xs state ty subcmd args =
        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
+
index b7f84823eeac1cad7d5d283cf288c9171fe7021b..3a2ef955fc408e19cceb3111bb500f99349aff62 100644 (file)
@@ -134,6 +134,18 @@ type config = {
        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 =
@@ -199,15 +211,12 @@ let config_nic_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 =
index cbafc59894dcbfc2861dbacc66fad5756f6f13bf..420c59a5c971960e6829d2c70d2f0f78026a2294 100644 (file)
@@ -191,6 +191,7 @@ let do_help () =
        let string_of_argtype argty =
                match argty with
                | Tasks.ArgBool -> "bool"
+               | Tasks.ArgInt  -> "int"
                | Tasks.ArgString -> "string"
                | Tasks.ArgListString -> "list-string"
                in
@@ -396,6 +397,9 @@ let do_task quit state (task, args) =
        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;*)
@@ -447,6 +451,31 @@ let do_task quit state (task, args) =
        | 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