# HG changeset patch # User Rok Strnisa # Date 1284055403 -3600 # Node ID 72be7ae7cce88c175f17eb23a933077edeef6fa0 # Parent a8e653c6723583f762d05aee11cdb25379029f4a imported patch refactoring-cli-operations_includes-CA-44714 diff --git a/ocaml/xapi/cli_operations.ml b/ocaml/xapi/cli_operations.ml --- a/ocaml/xapi/cli_operations.ml +++ b/ocaml/xapi/cli_operations.ml @@ -42,11 +42,11 @@ let bool_of_string param string = | "0" -> false | _ -> failwith ("Failed to parse parameter '"^param^"': expecting 'true' or 'false'") +let get_bool_param params param = + List.mem_assoc param params && (bool_of_string param (List.assoc param params)) + open Client -(* !! FIXME - trap proper MISSINGREFERENCE exception when this has been defined *) -let getparam param params = try Some (List.assoc param params) with _ -> None - (* Return the list of k=v pairs for maps *) let read_map_params name params = let len = String.length name + 1 in (* include ':' *) @@ -312,8 +312,8 @@ let string_of_task_status task = match t *) let user_password_change _ rpc session_id params = - let old_pwd = if List.mem_assoc "old" params then List.assoc "old" params else "" - and new_pwd = List.assoc "new" params in + let old_pwd = List.assoc_default "old" params "" + and new_pwd = List.assoc_default "new" params "" in Client.Session.change_password rpc session_id old_pwd new_pwd (** Low level CLI interface **) @@ -536,12 +536,7 @@ let make_param_funs getall getallrecs ge (* Filter all the records *) let records = List.fold_left filter_records_on_fields all_recs filter_params in - let print_all = - if List.mem_assoc "all" params then - List.assoc "all" params = "true" - else - false - in + let print_all = get_bool_param params "all" in let print_params = select_fields params (if print_all then all_recs else records) def_list_params in let print_params = List.map (fun fields -> List.filter (fun field -> not field.hidden) fields) print_params in @@ -824,7 +819,7 @@ let pool_designate_new_master printer rp let pool_join printer rpc session_id params = try - let force = (List.mem_assoc "force" params) && (bool_of_string "force" (List.assoc "force" params)) in + let force = get_bool_param params "force" in if force then Client.Pool.join_force ~rpc ~session_id ~master_address:(List.assoc "master-address" params) @@ -845,7 +840,7 @@ let pool_join printer rpc session_id par let pool_eject fd printer rpc session_id params = let host_uuid = List.assoc "host-uuid" params in let host=Client.Host.get_by_uuid rpc session_id host_uuid in - let force = List.mem_assoc "force" params && (bool_of_string "force" (List.assoc "force" params)) in + let force = get_bool_param params "force" in let go () = Client.Pool.eject ~rpc ~session_id ~host; @@ -1027,8 +1022,8 @@ let vdi_introduce printer rpc session_id let name_label = try List.assoc "name-label" params with _ -> "" in let name_description = if List.mem_assoc "name-description" params then List.assoc "name-description" params else "" in let _type = vdi_type_of_string (List.assoc "type" params) in - let sharable = if List.mem_assoc "sharable" params then bool_of_string "sharable" (List.assoc "sharable" params) else false in - let read_only = if List.mem_assoc "read-only" params then bool_of_string "read-only" (List.assoc "read-only" params) else false in + let sharable = get_bool_param params "sharable" in + let read_only = get_bool_param params "read-only" in (* NB call is new so backwards compat other-config- not required *) let other_config = read_map_params "other-config" params in let xenstore_data = read_map_params "xenstore-data" params in @@ -1192,10 +1187,7 @@ let vbd_create printer rpc session_id pa if empty then Ref.null else Client.VDI.get_by_uuid ~rpc ~session_id ~uuid:(List.assoc "vdi-uuid" params) in - let bootable = - if List.mem_assoc "bootable" params - then bool_of_string "bootable" (List.assoc "bootable" params) - else false in + let bootable = get_bool_param params "bootable" in let mode = if List.mem_assoc "mode" params then match String.lowercase (List.assoc "mode" params) with @@ -1208,10 +1200,7 @@ let vbd_create printer rpc session_id pa | "cd" -> `CD | "disk" -> `Disk | x -> failwith (Printf.sprintf "Unknown type: %s (should be \"cd\" or \"disk\"" x) else `Disk in - let unpluggable = - if List.mem_assoc "unpluggable" params - then bool_of_string "unpluggable" (List.assoc "unpluggable" params) - else true in + let unpluggable = get_bool_param params "unpluggable" in if _type=`Disk && empty then failwith "Empty VBDs can only be made for type=CD"; let vbd=Client.VBD.create ~rpc ~session_id ~vM ~vDI ~userdevice:(List.assoc "device" params) ~bootable @@ -1248,7 +1237,7 @@ let vbd_unplug printer rpc session_id pa if List.mem_assoc "timeout" params then (try float_of_string (List.assoc "timeout" params) with _ -> failwith "Failed to parse parameter 'timeout': expecting a float") else 0. in - let force = (List.mem_assoc "force" params) && (bool_of_string "force" (List.assoc "force" params)) in + let force = get_bool_param params "force" in let start = Unix.gettimeofday () in try (if force then Client.VBD.unplug_force else Client.VBD.unplug) rpc session_id vbd @@ -1302,9 +1291,8 @@ let parse_device_config params = Record_util.bytes_of_string "physical-size" (List.assoc "physical-size" params) with _ -> 0L in let _type=List.assoc "type" params in - let content_type = try List.assoc "content-type" params with _ -> "" in - let shared = if List.mem_assoc "shared" params then List.assoc "shared" params else "false" in - let shared = bool_of_string "shared" shared in + let content_type = List.assoc_default "content-type" params "" in + let shared = get_bool_param params "shared" in let device_config = parse_device_config params in @@ -1321,10 +1309,9 @@ let parse_device_config params = let sr_introduce printer rpc session_id params = let name_label=List.assoc "name-label" params in let _type=List.assoc "type" params in - let content_type = try List.assoc "content-type" params with _ -> "" in + let content_type = List.assoc_default "content-type" params "" in let uuid = List.assoc "uuid" params in - let shared = if List.mem_assoc "shared" params then List.assoc "shared" params else "false" in - let shared = bool_of_string "shared" shared in + let shared = get_bool_param params "shared" in let _ = Client.SR.introduce ~rpc ~session_id ~uuid ~name_label ~name_description:"" ~_type ~content_type ~shared ~sm_config:[] in printer (Cli_printer.PList [uuid]) @@ -1386,7 +1373,7 @@ let vif_create printer rpc session_id pa let device = List.assoc "device" params in let network_uuid = List.assoc "network-uuid" params in let vm_uuid=List.assoc "vm-uuid" params in - let mac=try List.assoc "mac" params with _ -> "" in + let mac=List.assoc_default "mac" params "" in let mac=if mac="random" then (Record_util.random_mac_local ()) else mac in let vm=Client.VM.get_by_uuid rpc session_id vm_uuid in let network=Client.Network.get_by_uuid rpc session_id network_uuid in @@ -1412,7 +1399,7 @@ let vif_unplug printer rpc session_id pa let net_create printer rpc session_id params = let network = List.assoc "name-label" params in - let descr = if List.mem_assoc "name-description" params then List.assoc "name-description" params else "" in + let descr = List.assoc_default "name-description" params "" in let mtu = if List.mem_assoc "MTU" params then Int64.of_string (List.assoc "MTU" params) else 1500L in let net = Client.Network.create rpc session_id network descr mtu [] [] in let uuid = Client.Network.get_uuid rpc session_id net in @@ -1429,7 +1416,7 @@ let net_attach printer rpc session_id pa let vm_create printer rpc session_id params = let name_label=List.assoc "name-label" params in - let name_description=if List.mem_assoc "name-description" params then List.assoc "name-description" params else "" in + let name_description=List.assoc_default "name-description" params "" in let ( ** ) = Int64.mul in let mib = 1024L ** 1024L in let memory_max = 256L ** mib in @@ -1680,9 +1667,6 @@ let select_vm_geneva rpc session_id para (failwith ("Must select a VM using either vm-name or vm-id: params=" ^(String.concat "," (List.map (fun (a,b) -> a^"="^b) params)))) -let compat_mode params = - (List.mem_assoc "compat" params) && (bool_of_string "compat" (List.assoc "compat" params)) - exception Multiple_failure of (string * string) list let format_message msg = @@ -1725,7 +1709,7 @@ let do_vm_op ?(include_control_vms = fal printer rpc session_id op params ?(multiple=true) ignore_params = let msg_prio = try Int64.of_string (List.assoc "message-priority" params) with _ -> 1L in let op = wrap_op printer msg_prio rpc session_id op in - if compat_mode params + if get_bool_param params "compat_mode" then (* Geneva compatability mode *) let vm = select_vm_geneva rpc session_id params in @@ -1738,7 +1722,7 @@ let do_vm_op ?(include_control_vms = fal | 0 -> failwith "No matching VMs found" | 1 -> [ op (List.hd vms) ] | _ -> - if multiple && (List.mem_assoc "multiple" params) && (bool_of_string "multiple" (List.assoc "multiple" params)) then + if multiple && get_bool_param params "multiple" then do_multiple op vms else failwith @@ -1750,7 +1734,7 @@ let do_vm_op ?(include_control_vms = fal failwith ("Parameter '"^name^"' is not a field of the VM class. Failed to select VM for operation.") let do_host_op rpc session_id op params ?(multiple=true) ignore_params = - if compat_mode params + if get_bool_param params "compat_mode" then let host = host_record rpc session_id (get_host_from_session rpc session_id) in [op 1 host] @@ -1760,7 +1744,7 @@ let do_host_op rpc session_id op params | 0 -> failwith "No matching hosts found" | 1 -> [ op 1 (List.hd hosts) ] | _ -> - if multiple && (List.mem_assoc "multiple" params) && (bool_of_string "multiple" (List.assoc "multiple" params)) then + if multiple && get_bool_param params "multiple" then do_multiple (op (List.length hosts)) hosts else failwith @@ -1954,8 +1938,8 @@ let vm_memory_shadow_multiplier_set prin () let vm_start printer rpc session_id params = - let force = (List.mem_assoc "force" params) && (bool_of_string "force" (List.assoc "force" params)) in - let paused = List.mem_assoc "paused" params && (bool_of_string "paused" (List.assoc "paused" params)) in + let force = get_bool_param params "force" in + let paused = get_bool_param params "paused" in ignore(do_vm_op printer rpc session_id (fun vm -> let vm=vm.getref () in @@ -1971,7 +1955,7 @@ let vm_suspend printer rpc session_id pa ignore(do_vm_op printer rpc session_id (fun vm -> Client.VM.suspend rpc session_id (vm.getref ())) params []) let vm_resume printer rpc session_id params = - let force = (List.mem_assoc "force" params) && (bool_of_string "force" (List.assoc "force" params)) in + let force = get_bool_param params "force" in ignore(do_vm_op printer rpc session_id (fun vm -> if List.mem_assoc "on" params then @@ -2105,7 +2089,7 @@ let vm_install printer rpc session_id pa let vm_uninstall_common fd printer rpc session_id params vms = let toremove = ref [] in let toprint = ref [] in - let compat = compat_mode params in + let compat = get_bool_param params "compat_mode" in (* Destroy the disks too *) let choose_objects_to_delete vm = let vbds=Client.VM.get_VBDs rpc session_id vm in @@ -2150,7 +2134,7 @@ let vm_uninstall_common fd printer rpc s List.iter choose_objects_to_delete vms; marshal fd (Command (Print "The following items are about to be destroyed")); List.iter (fun s -> marshal fd (Command (Print s))) !toprint; - let force = compat || ((List.mem_assoc "force" params) && (bool_of_string "force" (List.assoc "force" params))) in + let force = compat || (get_bool_param params "force") in if force then (List.iter (fun f -> f ()) !toremove; marshal fd (Command (Print "All objects destroyed"))) else @@ -2170,7 +2154,7 @@ let template_uninstall fd printer rpc se vm_uninstall_common fd printer rpc session_id params [ vm ] let vm_clone_aux clone_op cloned_string printer include_template_vms rpc session_id params = - let compat = compat_mode params in + let compat = get_bool_param params "compat_mode" in let new_name = if compat then List.assoc "new-name" params @@ -2248,20 +2232,20 @@ let snapshot_reset_powerstate printer rp Client.VM.power_state_reset rpc session_id snapshot let vm_shutdown printer rpc session_id params = - let force = (List.mem_assoc "force" params) && (bool_of_string "force" (List.assoc "force" params)) in + let force = get_bool_param params "force" in ignore(if force then do_vm_op printer rpc session_id (fun vm -> Client.VM.hard_shutdown rpc session_id (vm.getref())) params [] else do_vm_op printer rpc session_id (fun vm -> Client.VM.clean_shutdown rpc session_id (vm.getref())) params []) let vm_reboot printer rpc session_id params = - let force = (List.mem_assoc "force" params) && (bool_of_string "force" (List.assoc "force" params)) in + let force = get_bool_param params "force" in ignore(if force then do_vm_op printer rpc session_id (fun vm -> Client.VM.hard_reboot rpc session_id (vm.getref())) params [] else do_vm_op printer rpc session_id (fun vm -> Client.VM.clean_reboot rpc session_id (vm.getref())) params []) let vm_compute_maximum_memory printer rpc session_id params = let total = Record_util.bytes_of_string "total" (List.assoc "total" params) in - let approximate = List.mem_assoc "approximate" params && (bool_of_string "approximate" (List.assoc "approximate" params)) in + let approximate = get_bool_param params "approximate" in ignore(do_vm_op printer rpc session_id (fun vm -> let max = Client.VM.maximise_memory rpc session_id (vm.getref()) total approximate in @@ -2346,7 +2330,7 @@ let vm_crashdump_list printer rpc sessio * can be optionally specified. A VBD is then creased with the device name as specified *) let vm_disk_add printer rpc session_id params = (* Required params *) - let compat = compat_mode params in + let compat = get_bool_param params "compat_mode" in let vdi_size = if not compat then Record_util.bytes_of_string "disk-size" (List.assoc "disk-size" params) @@ -2387,7 +2371,7 @@ let vm_disk_add printer rpc session_id p ignore(do_vm_op printer rpc session_id op params ["sr-uuid";"device";"disk-size"]) let vm_disk_remove printer rpc session_id params = - let compat = compat_mode params in + let compat = get_bool_param params "compat_mode" in let device = if not compat then List.assoc "device" params @@ -2418,7 +2402,7 @@ let vm_disk_detach printer rpc session_i ignore(do_vm_op printer rpc session_id op params ["device"]) let vm_disk_resize printer rpc session_id params = - let compat = compat_mode params in + let compat = get_bool_param params "compat_mode" in let device = if not compat then List.assoc "device" params @@ -2460,7 +2444,7 @@ let vm_cd_remove printer rpc session_id ignore(do_vm_op printer rpc session_id op params ["cd-name"]) let vm_cd_add printer rpc session_id params = - let compat = compat_mode params in + let compat = get_bool_param params "compat_mode" in let cd_name = List.assoc "cd-name" params in let vdis = Client.VDI.get_by_name_label rpc session_id cd_name in let vdis = List.filter (fun vdi -> let sr = Client.VDI.get_SR rpc session_id vdi in "iso"=Client.SR.get_content_type rpc session_id sr) vdis in @@ -2515,7 +2499,7 @@ let host_forget fd printer rpc session_i let pool_master = Client.Pool.get_master rpc session_id pool in (* if pool_master = host then failwith "Cannot forget pool master"; *) - let force = List.mem_assoc "force" params && (bool_of_string "force" (List.assoc "force" params)) in + let force = get_bool_param params "force" in let go () = ignore (Client.Host.destroy rpc session_id host) in @@ -2756,9 +2740,9 @@ let pool_retrieve_wlb_diagnostics fd pri let vm_import fd printer rpc session_id params = let filename = List.assoc "filename" params in - let full_restore = List.mem_assoc "preserve" params && (List.assoc "preserve" params = "true") in - let vm_metadata_only = List.mem_assoc "metadata" params in - let force = List.mem_assoc "force" params && (List.assoc "force" params = "true") in + let full_restore = get_bool_param params "preserve" in + let vm_metadata_only = get_bool_param params "metadata" in + let force = get_bool_param params "force" in let sr = if List.mem_assoc "sr-uuid" params then Client.SR.get_by_uuid rpc session_id (List.assoc "sr-uuid" params) @@ -3041,7 +3025,7 @@ let blob_put fd printer rpc session_id p let blob_create printer rpc session_id params = let name = List.assoc "name" params in - let mime_type = try List.assoc "mime-type" params with _ -> "" in + let mime_type = List.assoc_default "mime-type" params "" in if (List.mem_assoc "vm-uuid" params) then begin let uuid = List.assoc "vm-uuid" params in @@ -3087,6 +3071,7 @@ let blob_create printer rpc session_id p let export_common fd printer rpc session_id params filename num ?task_uuid use_compression preserve_power_state vm = + let vm_metadata_only = get_bool_param params "metadata" in let vm_record = vm.record () in let exporttask, task_destroy_fn = match task_uuid with @@ -3109,9 +3094,7 @@ let export_common fd printer rpc session download_file ~__context rpc session_id exporttask fd f (Printf.sprintf "%s?session_id=%s&task_id=%s&ref=%s&%s=%s&preserve_power_state=%b" - (if List.mem_assoc "metadata" params - then Constants.export_metadata_uri - else Constants.export_uri) + (if vm_metadata_only then Constants.export_metadata_uri else Constants.export_uri) (Ref.string_of session_id) (Ref.string_of exporttask) (Ref.string_of (vm.getref ())) @@ -3124,8 +3107,8 @@ let export_common fd printer rpc session let vm_export fd printer rpc session_id params = let filename = List.assoc "filename" params in - let use_compression = List.mem_assoc "compress" params && (List.assoc "compress" params = "true") in - let preserve_power_state = List.mem_assoc "preserve-power-state" params && bool_of_string "preserve-power-state" (List.assoc "preserve-power-state" params) in + let use_compression = get_bool_param params "compress" in + let preserve_power_state = get_bool_param params "preserve-power-state" in let task_uuid = if (List.mem_assoc "task-uuid" params) then Some (List.assoc "task-uuid" params) else None in let num = ref 1 in let op vm = @@ -3135,8 +3118,8 @@ let vm_export fd printer rpc session_id let vm_export_aux obj_type fd printer rpc session_id params = let filename = List.assoc "filename" params in - let use_compression = List.mem_assoc "compress" params && (List.assoc "compress" params = "true") in - let preserve_power_state = List.mem_assoc "preserve-power-state" params && bool_of_string "preserve-power-state" (List.assoc "preserve-power-state" params) in + let use_compression = get_bool_param params "compress" in + let preserve_power_state = get_bool_param params "preserve-power-state" in let num = ref 1 in let uuid = List.assoc (obj_type ^ "-uuid") params in let ref = Client.VM.get_by_uuid rpc session_id uuid in @@ -3252,15 +3235,13 @@ let pif_reconfigure_ip printer rpc sessi let read_optional_case_insensitive key = let lower_case_params = List.map (fun (k,v)->(String.lowercase k,v)) params in let lower_case_key = String.lowercase key in - if List.mem_assoc lower_case_key lower_case_params then - List.assoc lower_case_key lower_case_params - else "" in + List.assoc_default lower_case_key lower_case_params "" in let pif = Client.PIF.get_by_uuid rpc session_id (List.assoc "uuid" params) in let mode = Record_util.ip_configuration_mode_of_string (List.assoc "mode" params) in let ip = read_optional_case_insensitive "IP" in - let netmask = if List.mem_assoc "netmask" params then List.assoc "netmask" params else "" in - let gateway = if List.mem_assoc "gateway" params then List.assoc "gateway" params else "" in + let netmask = List.assoc_default "netmask" params "" in + let gateway = List.assoc_default "gateway" params "" in let dns = read_optional_case_insensitive "DNS" in let () = Client.PIF.reconfigure_ip rpc session_id pif mode ip netmask gateway dns in () @@ -3301,7 +3282,7 @@ let pif_db_forget printer rpc session_id let bond_create printer rpc session_id params = let network = List.assoc "network-uuid" params in - let mac = if List.mem_assoc "mac" params then List.assoc "mac" params else "" in + let mac = List.assoc_default "mac" params "" in let network = Client.Network.get_by_uuid rpc session_id network in let pifs = List.assoc "pif-uuids" params in let uuids = String.split ',' pifs in @@ -3380,7 +3361,7 @@ let host_set_power_on_mode printer rpc s let host_crash_upload printer rpc session_id params = let crash = Client.Host_crashdump.get_by_uuid rpc session_id (List.assoc "uuid" params) in - let url = if List.mem_assoc "url" params then List.assoc "url" params else "" in + let url = List.assoc_default "url" params "" in (* pass everything else in as an option *) let options = List.filter (fun (k, _) -> k <> "uuid" && k <> "url") params in Client.Host_crashdump.upload rpc session_id crash url options @@ -3391,7 +3372,7 @@ let host_crash_destroy printer rpc sessi let host_bugreport_upload printer rpc session_id params = let op _ host = - let url = if List.mem_assoc "url" params then List.assoc "url" params else "" in + let url = List.assoc_default "url" params "" in (* pass everything else in as an option *) let options = List.filter (fun (k, _) -> k <> "host" && k <> "url") params in Client.Host.bugreport_upload rpc session_id (host.getref ()) url options @@ -3534,11 +3515,7 @@ let wait_for_task rpc session_id task __ let host_get_system_status fd printer rpc session_id params = let filename = List.assoc "filename" params in - let get_param s = - try List.assoc s params - with _ -> "" - in - let entries = get_param "entries" in + let entries = List.assoc_default "entries" params "" in let output = try List.assoc "output" params with _ -> "tar.bz2" in begin match output with "tar.bz2" | "tar" | "zip" -> () | _ -> failwith "Invalid output format. Must be 'tar', 'zip' or 'tar.bz2'" end; @@ -3746,7 +3723,7 @@ let host_emergency_management_reconfigur Client.Host.local_management_reconfigure rpc session_id interface let host_emergency_ha_disable printer rpc session_id params = - let force = List.mem_assoc "force" params && (bool_of_string "force" (List.assoc "force" params)) in + let force = get_bool_param params "force" in if not force then failwith "This operation is extremely dangerous and may cause data loss. This operation must be forced (use --force)."; Client.Host.emergency_ha_disable rpc session_id @@ -3762,7 +3739,7 @@ let host_signal_networking_change printe let host_notify printer rpc session_id params = let ty = List.assoc "type" params in - let args = if List.mem_assoc "params" params then List.assoc "params" params else "" in + let args = List.assoc_default "params" params "" in Client.Host.notify rpc session_id ty args let host_syslog_reconfigure printer rpc session_id params = @@ -3845,9 +3822,9 @@ let subject_remove printer rpc session_i Client.Subject.destroy ~rpc ~session_id ~self:subject let subject_role_common rpc session_id params = - let role_uuid = if List.mem_assoc "role-uuid" params then List.assoc "role-uuid" params else "" in - let role_name = if List.mem_assoc "role-name" params then List.assoc "role-name" params else "" in - if role_uuid="" && role_name="" + let role_uuid = List.assoc_default "role-uuid" params "" in + let role_name = List.assoc_default "role-name" params "" in + if role_uuid="" && role_name="" then failwith "Required parameter not found: role-uuid or role-name" else if role_uuid<>"" && role_name<>""