From bd4a7d3fb71853493a37f73b94af7b070addbdcb Mon Sep 17 00:00:00 2001 From: David Scott Date: Fri, 1 May 2015 12:14:49 +0100 Subject: [PATCH 1/3] Add basic lvdisplay support Signed-off-by: David Scott --- xenvm/lvdisplay.ml | 64 ++++++++++++++++++++++++++++++++++++++++++++++ xenvm/xenvm.ml | 1 + 2 files changed, 65 insertions(+) create mode 100644 xenvm/lvdisplay.ml diff --git a/xenvm/lvdisplay.ml b/xenvm/lvdisplay.ml new file mode 100644 index 0000000..6e34ae8 --- /dev/null +++ b/xenvm/lvdisplay.ml @@ -0,0 +1,64 @@ +(* LVM compatible bits and pieces *) + +open Cmdliner +open Xenvm_common +open Lwt + +let print_verbose vg lv = + let read_write = + let all = + (if List.mem Lvm.Lv.Status.Read lv.Lvm.Lv.status + then [ "read" ] else []) @ + (if List.mem Lvm.Lv.Status.Write lv.Lvm.Lv.status + then [ "write" ] else []) in + String.concat "/" all in + let size = Int64.mul vg.Lvm.Vg.extent_size (Lvm.Lv.size_in_extents lv) in + let lines = [ + "--- Logical volume ---"; + Printf.sprintf "LV Path /dev/%s/%s" vg.Lvm.Vg.name lv.Lvm.Lv.name; + Printf.sprintf "LV Name %s" lv.Lvm.Lv.name; + Printf.sprintf "VG Name %s" vg.Lvm.Vg.name; + Printf.sprintf "LV UUID %s" (Lvm.Uuid.to_string lv.Lvm.Lv.id); + Printf.sprintf "LV Write Access %s" read_write; + Printf.sprintf "LV Creation host, time unknown, unknown"; + Printf.sprintf "LV Status %s" (if List.mem Lvm.Lv.Status.Visible lv.Lvm.Lv.status then "available" else ""); + Printf.sprintf "# open uknown"; + Printf.sprintf "LV Size %LdB" size; + Printf.sprintf "Current LE %Ld" (Lvm.Lv.size_in_extents lv); + Printf.sprintf "Segments %d" (List.length lv.Lvm.Lv.segments); + Printf.sprintf "Allocation: inherit"; + Printf.sprintf "Read ahead sectors: auto"; + (* + - currently set to 256 + Block device 253:0 + *) + ""; + ] in + List.iter (fun line -> Printf.printf " %s\n" line) lines + +let lvdisplay copts colon (vg_name,lv_display_opt) = + let open Xenvm_common in + + let t = + get_vg_info_t copts vg_name >>= fun info -> + set_uri copts info; + Client.get () >>= fun vg -> + + Lvm.Vg.LVs.iter (fun _ lv -> + print_verbose vg lv + ) vg.Lvm.Vg.lvs; + + Lwt.return () in + Lwt_main.run t + +let lvdisplay_cmd = + let doc = "report information about logical volumes" in + let man = [ + `S "DESCRIPTION"; + `P "lvdisplay produces formatted output about logical volumes"; + ] in + let colon_arg = + let doc = "Print in terse colon-separated form" in + Arg.(value & flag & info ["colon";"c"] ~doc) in + Term.(pure lvdisplay $ Xenvm_common.copts_t $ colon_arg $ Xenvm_common.name_arg), + Term.info "lvdisplay" ~sdocs:"COMMON OPTIONS" ~doc ~man diff --git a/xenvm/xenvm.ml b/xenvm/xenvm.ml index b9b03b5..ab00f5c 100644 --- a/xenvm/xenvm.ml +++ b/xenvm/xenvm.ml @@ -354,6 +354,7 @@ let cmds = [ Pvremove.pvremove_cmd; Lvremove.lvremove_cmd; Lvrename.lvrename_cmd; + Lvdisplay.lvdisplay_cmd; ] let () = From d17482446f5ee599044438605eea0958fe9db8ba Mon Sep 17 00:00:00 2001 From: David Scott Date: Fri, 1 May 2015 12:23:34 +0100 Subject: [PATCH 2/3] lvdisplay: add support for "-c" (terse colon-separated output) Signed-off-by: David Scott --- xenvm/lvdisplay.ml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/xenvm/lvdisplay.ml b/xenvm/lvdisplay.ml index 6e34ae8..02e3124 100644 --- a/xenvm/lvdisplay.ml +++ b/xenvm/lvdisplay.ml @@ -23,7 +23,7 @@ let print_verbose vg lv = Printf.sprintf "LV Creation host, time unknown, unknown"; Printf.sprintf "LV Status %s" (if List.mem Lvm.Lv.Status.Visible lv.Lvm.Lv.status then "available" else ""); Printf.sprintf "# open uknown"; - Printf.sprintf "LV Size %LdB" size; + Printf.sprintf "LV Size %Lds" size; Printf.sprintf "Current LE %Ld" (Lvm.Lv.size_in_extents lv); Printf.sprintf "Segments %d" (List.length lv.Lvm.Lv.segments); Printf.sprintf "Allocation: inherit"; @@ -36,6 +36,25 @@ let print_verbose vg lv = ] in List.iter (fun line -> Printf.printf " %s\n" line) lines +let print_colon vg lv = + let sectors = Int64.mul vg.Lvm.Vg.extent_size (Lvm.Lv.size_in_extents lv) in + let parts = [ + Printf.sprintf "/dev/%s/%s" vg.Lvm.Vg.name lv.Lvm.Lv.name; + vg.Lvm.Vg.name; + "?"; (* access *) + "?"; (* volume status *) + "?"; (* internal logical volume number *) + "?"; (* open count *) + Int64.to_string sectors; (* size in sectors *) + "?"; (* current size in extents *) + "?"; (* allocated extents *) + "?"; (* allocation policy *) + "?"; (* read ahead sectors *) + "?"; (* major *) + "?"; (* minor *) + ] in + Printf.printf " %s\n" (String.concat ":" parts) + let lvdisplay copts colon (vg_name,lv_display_opt) = let open Xenvm_common in @@ -45,7 +64,7 @@ let lvdisplay copts colon (vg_name,lv_display_opt) = Client.get () >>= fun vg -> Lvm.Vg.LVs.iter (fun _ lv -> - print_verbose vg lv + (if colon then print_colon else print_verbose) vg lv ) vg.Lvm.Vg.lvs; Lwt.return () in From 3dcb4586930429235c2414340fe23a3d4a1b0521 Mon Sep 17 00:00:00 2001 From: David Scott Date: Fri, 1 May 2015 12:29:30 +0100 Subject: [PATCH 3/3] lvdisplay: fail if querying a volume which doesn't exist Signed-off-by: David Scott --- xenvm/lvdisplay.ml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/xenvm/lvdisplay.ml b/xenvm/lvdisplay.ml index 02e3124..b16bd03 100644 --- a/xenvm/lvdisplay.ml +++ b/xenvm/lvdisplay.ml @@ -62,11 +62,18 @@ let lvdisplay copts colon (vg_name,lv_display_opt) = get_vg_info_t copts vg_name >>= fun info -> set_uri copts info; Client.get () >>= fun vg -> - - Lvm.Vg.LVs.iter (fun _ lv -> - (if colon then print_colon else print_verbose) vg lv + let print = if colon then print_colon else print_verbose in + let success = ref false in + Lvm.Vg.LVs.iter (fun _ lv -> match lv_display_opt with + | None -> + print vg lv; + success := true + | Some lv' when lv.Lvm.Lv.name = lv' -> + print vg lv; + success := true + | Some _ -> () ) vg.Lvm.Vg.lvs; - + if not !success then failwith "Failed to find any matching logical volumes"; Lwt.return () in Lwt_main.run t