[Libguestfs] [PATCH] v2v: Add --print-estimate option to print source size estimate.

Nir Soffer nsoffer at redhat.com
Tue Aug 14 18:31:06 UTC 2018


On Tue, Aug 14, 2018 at 8:29 PM Richard W.M. Jones <rjones at redhat.com>
wrote:

> This option prints the estimated size of the data that will be copied
> from the source disk.
>
> For interest, the test prints:
>
> 3747840 ../test-data/phony-guests/windows.img
> Estimate: 3710976
>

Why not use qemu-img measure on the overlay?

It gives a conservative estimate that will never fail, based on the
allocated
blocks and additional metadata required for the destination file format.

Nir


> ---
>  v2v/Makefile.am                |  2 ++
>  v2v/cmdline.ml                 | 17 ++++++++++--
>  v2v/cmdline.mli                |  2 ++
>  v2v/test-v2v-print-estimate.sh | 47 +++++++++++++++++++++++++++++++++
>  v2v/v2v.ml                     | 48 ++++++++++++++++++++++++++++++++++
>  v2v/virt-v2v.pod               | 17 ++++++++++++
>  6 files changed, 131 insertions(+), 2 deletions(-)
>
> diff --git a/v2v/Makefile.am b/v2v/Makefile.am
> index 5461055d1..2ea0dd1d5 100644
> --- a/v2v/Makefile.am
> +++ b/v2v/Makefile.am
> @@ -379,6 +379,7 @@ TESTS += \
>         test-v2v-oa-option.sh \
>         test-v2v-of-option.sh \
>         test-v2v-on-option.sh \
> +       test-v2v-print-estimate.sh \
>         test-v2v-print-source.sh \
>         test-v2v-sound.sh \
>         $(SLOW_TESTS) \
> @@ -534,6 +535,7 @@ EXTRA_DIST += \
>         test-v2v-oa-option.sh \
>         test-v2v-of-option.sh \
>         test-v2v-on-option.sh \
> +       test-v2v-print-estimate.sh \
>         test-v2v-print-source.expected \
>         test-v2v-print-source.sh \
>         test-v2v-print-source.xml \
> diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
> index 5b2df3555..74cc27714 100644
> --- a/v2v/cmdline.ml
> +++ b/v2v/cmdline.ml
> @@ -33,10 +33,12 @@ type cmdline = {
>    debug_overlays : bool;
>    do_copy : bool;
>    in_place : bool;
> +  machine_readable : bool;
>    network_map : Networks.t;
>    output_alloc : output_allocation;
>    output_format : string option;
>    output_name : string option;
> +  print_estimate : bool;
>    print_source : bool;
>    root_choice : root_choice;
>  }
> @@ -49,6 +51,7 @@ let parse_cmdline () =
>    let debug_overlays = ref false in
>    let do_copy = ref true in
>    let machine_readable = ref false in
> +  let print_estimate = ref false in
>    let print_source = ref false in
>    let qemu_boot = ref false in
>
> @@ -235,6 +238,8 @@ let parse_cmdline () =
>                                      s_"Set output storage location";
>      [ L"password-file" ], Getopt.String ("filename",
> set_string_option_once "--password-file" input_password),
>                                      s_"Same as ‘-ip filename’";
> +    [ L"print-estimate" ], Getopt.Set print_estimate,
> +                                    s_"Estimate size of source and stop";
>      [ L"print-source" ], Getopt.Set print_source,
>                                      s_"Print source and stop";
>      [ L"qemu-boot" ], Getopt.Set qemu_boot, s_"Boot in qemu (-o qemu
> only)";
> @@ -330,6 +335,7 @@ read the man page virt-v2v(1).
>    let output_options = List.rev !output_options in
>    let output_password = !output_password in
>    let output_storage = !output_storage in
> +  let print_estimate = !print_estimate in
>    let print_source = !print_source in
>    let qemu_boot = !qemu_boot in
>    let root_choice = !root_choice in
> @@ -355,6 +361,12 @@ read the man page virt-v2v(1).
>      exit 0
>    );
>
> +  (* Some options cannot be used with --in-place. *)
> +  if in_place then (
> +    if print_estimate then
> +      error (f_"--in-place and --print-estimate cannot be used together")
> +  );
> +
>    (* Input transport affects whether some input options should or
>     * should not be used.
>     *)
> @@ -620,8 +632,9 @@ read the man page virt-v2v(1).
>        output_format, output_alloc in
>
>    {
> -    compressed; debug_overlays; do_copy; in_place; network_map;
> +    compressed; debug_overlays; do_copy; in_place;
> +    machine_readable; network_map;
>      output_alloc; output_format; output_name;
> -    print_source; root_choice;
> +    print_estimate; print_source; root_choice;
>    },
>    input, output
> diff --git a/v2v/cmdline.mli b/v2v/cmdline.mli
> index 25beb1c95..9b5bd4098 100644
> --- a/v2v/cmdline.mli
> +++ b/v2v/cmdline.mli
> @@ -23,10 +23,12 @@ type cmdline = {
>    debug_overlays : bool;
>    do_copy : bool;
>    in_place : bool;
> +  machine_readable : bool;
>    network_map : Networks.t;
>    output_alloc : Types.output_allocation;
>    output_format : string option;
>    output_name : string option;
> +  print_estimate : bool;
>    print_source : bool;
>    root_choice : Types.root_choice;
>  }
> diff --git a/v2v/test-v2v-print-estimate.sh
> b/v2v/test-v2v-print-estimate.sh
> new file mode 100755
> index 000000000..d952d1a37
> --- /dev/null
> +++ b/v2v/test-v2v-print-estimate.sh
> @@ -0,0 +1,47 @@
> +#!/bin/bash -
> +# libguestfs virt-v2v test script
> +# Copyright (C) 2018 Red Hat Inc.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street
> <https://maps.google.com/?q=51+Franklin+Street&entry=gmail&source=g>,
> Fifth Floor, Boston, MA 02110-1301 USA.
> +
> +# Test --print-estimate option.
> +
> +set -e
> +
> +$TEST_FUNCTIONS
> +skip_if_skipped
> +skip_unless_phony_guest windows.img
> +
> +f=test-v2v-print-estimate.out
> +rm -f $f
> +
> +du -s -B 1 ../test-data/phony-guests/windows.img
> +
> +$VG virt-v2v --debug-gc \
> +    -i libvirtxml test-v2v-print-source.xml \
> +    -o local -os $(pwd) \
> +    --print-estimate --quiet > $f
> +
> +echo -n "Estimate: "
> +cat $f
> +
> +# Check the output is a single number.
> +if [ "$(cat $f | wc -l)" -ne 1 ]; then
> +    echo "$0: expecting one line of output"
> +    exit 1
> +fi
> +grep -E '^[[:digit:]]+$' $f
> +
> +rm -f $f
> diff --git a/v2v/v2v.ml b/v2v/v2v.ml
> index 1775200d3..e24a9adf6 100644
> --- a/v2v/v2v.ml
> +++ b/v2v/v2v.ml
> @@ -104,6 +104,12 @@ let rec main () =
>    (* Decrypt the disks. *)
>    inspect_decrypt g;
>
> +  (* Print source disk size estimate and stop. *)
> +  if cmdline.print_estimate then (
> +    print_source_disk_size_estimate cmdline g;
> +    exit 0
> +  );
> +
>    (* Inspection - this also mounts up the filesystems. *)
>    (match conversion_mode with
>     | Copying _ -> message (f_"Inspecting the overlay")
> @@ -371,6 +377,48 @@ and print_mpstat chan { mp_dev = dev; mp_path = path;
>    fprintf chan "  bsize=%Ld blocks=%Ld bfree=%Ld bavail=%Ld\n"
>      s.Guestfs.bsize s.Guestfs.blocks s.Guestfs.bfree s.Guestfs.bavail
>
> +(* Print the estimated size of the source disk(s).
> + *
> + * These are somewhat related to mpstats above, except that
> + * we must also collect information about devices which do
> + * not contain mountable filesystems and so we must assume
> + * are copied completely.
> + *
> + * This function will unmount and mount filesystems
> + * randomly, but that's OK because we exit afterwards.
> + *)
> +and print_source_disk_size_estimate cmdline g =
> +  let fses = List.map fst (g#list_filesystems ()) in
> +
> +  let size =
> +    List.fold_left (
> +      fun size dev ->
> +        g#umount_all ();
> +        let mounted =
> +          try g#mount_ro dev "/"; true
> +          with G.Error _ -> false in
> +
> +        let sz, what =
> +          if mounted then (
> +            let { Guestfs.bfree; blocks; bsize } = g#statvfs "/" in
> +            (blocks -^ bfree) *^ bsize, "filesystem"
> +          )
> +          else (
> +            (* Assume the full size of the filesystem will have
> +             * to be copied.
> +             *)
> +            g#blockdev_getsize64 dev, "device"
> +          ) in
> +
> +        debug "print-estimate: %s %s uses %Ld (%s)"
> +              what dev sz (human_size sz);
> +        size +^ sz
> +    ) 0L fses in
> +
> +  g#umount_all ();
> +
> +  printf "%Ld\n" size
> +
>  (* Conversion can fail if there is no space on the guest filesystems
>   * (RHBZ#1139543).  To avoid this situation, check there is some
>   * headroom.  Mainly we care about the root filesystem.
> diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod
> index 303fe425c..80b765983 100644
> --- a/v2v/virt-v2v.pod
> +++ b/v2v/virt-v2v.pod
> @@ -794,6 +794,23 @@ C<root>.
>  You will get an error if virt-v2v is unable to mount/write to the
>  Export Storage Domain.
>
> +=item B<--print-estimate>
> +
> +Print the estimated size of the data which will be copied from the
> +source disk(s) and stop.
> +
> +A single number is printed on stdout which is the estimated size of
> +data that will be copied, in bytes.
> +
> +This estimate is the sum across all disks, because guest features such
> +as LVM and MD means that it is not meaningful to provide separate
> +estimates for each disk.  The size does not include deleted files and
> +empty space in the source, but it cannot detect used-but-zero space
> +and so it usually overestimates.
> +
> +You usually want to use this option in conjunction with the I<--quiet>
> +option so that the result is not mixed in with standard messages.
> +
>  =item B<--print-source>
>
>  Print information about the source guest and stop.  This option is
> --
> 2.18.0


> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20180814/30069012/attachment.htm>


More information about the Libguestfs mailing list