From: Vincent Hanquez Date: Wed, 29 Jul 2009 00:23:13 +0000 (+0100) Subject: add RPC to add disk/nic/pci X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=c7f420c9c320bf089ebf478888de66bf784b8b6b;p=xenclient%2Ftoolstack.git add RPC to add disk/nic/pci --- diff --git a/xenvm/tasks.ml b/xenvm/tasks.ml index 032deef..73286f7 100644 --- a/xenvm/tasks.ml +++ b/xenvm/tasks.ml @@ -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 = diff --git a/xenvm/vmact.ml b/xenvm/vmact.ml index 3967f0c..efe8733 100644 --- a/xenvm/vmact.ml +++ b/xenvm/vmact.ml @@ -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 + diff --git a/xenvm/vmconfig.ml b/xenvm/vmconfig.ml index b7f8482..3a2ef95 100644 --- a/xenvm/vmconfig.ml +++ b/xenvm/vmconfig.ml @@ -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 = diff --git a/xenvm/xenvm.ml b/xenvm/xenvm.ml index cbafc59..420c59a 100644 --- a/xenvm/xenvm.ml +++ b/xenvm/xenvm.ml @@ -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