[libguestfs] Add virt-v2v-test-harness subpackage.
Richard W.M. Jones
rjones at fedoraproject.org
Thu Mar 12 14:59:32 UTC 2015
commit 64c77957119db9a184e42032efe1b535057aaee7
Author: Richard W.M. Jones <rjones at redhat.com>
Date: Thu Mar 12 12:05:29 2015 +0000
Add virt-v2v-test-harness subpackage.
- Add a couple of upstream patches to fix the virt-v2v test harness.
...rness-Measure-similarity-between-images-w.patch | 60 +++++++++++++++++
...rness-Fix-boot-loop-so-it-detects-disk-in.patch | 75 ++++++++++++++++++++++
libguestfs.spec | 63 +++++++++++++++++-
3 files changed, 195 insertions(+), 3 deletions(-)
---
diff --git a/0001-v2v-test-harness-Measure-similarity-between-images-w.patch b/0001-v2v-test-harness-Measure-similarity-between-images-w.patch
new file mode 100644
index 0000000..fb8e091
--- /dev/null
+++ b/0001-v2v-test-harness-Measure-similarity-between-images-w.patch
@@ -0,0 +1,60 @@
+From a3beda8b77363e13f652104b06efaee33ecfe67c Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Wed, 11 Mar 2015 15:02:58 +0000
+Subject: [PATCH 1/2] v2v: test-harness: Measure similarity between images when
+ comparing screenshots.
+
+Since wallclock time differs between boots, we cannot just compare two
+screenshots by checking if they are identical -- if the screenshot
+contains any time information, then that will be different, and it
+turns out that VMs print the current time at boot.
+
+Therefore parse out and use the "similarity" metric printed by the
+ImageMagick "compare" command when it compares the screenshots, and
+allow a small epsilon for the case where a few oixels are different.
+---
+ v2v/test-harness/v2v_test_harness.ml | 26 +++++++++++++++++++++-----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/v2v/test-harness/v2v_test_harness.ml b/v2v/test-harness/v2v_test_harness.ml
+index cd08cd0..998903a 100644
+--- a/v2v/test-harness/v2v_test_harness.ml
++++ b/v2v/test-harness/v2v_test_harness.ml
+@@ -196,13 +196,29 @@ let run ~test ?input_disk ?input_xml ?(test_plan = default_plan) () =
+
+ let display_matches_screenshot screenshot1 screenshot2 =
+ let cmd =
+- sprintf "compare -metric MAE %s %s null:"
++ (* Grrr compare sends its normal output to stderr. *)
++ sprintf "compare -metric MAE %s %s null: 2>&1"
+ (quote screenshot1) (quote screenshot2) in
+ printf "%s\n%!" cmd;
+- let r = Sys.command cmd in
+- if r < 0 || r > 1 then
+- failwith "compare command failed";
+- r = 0
++ let chan = Unix.open_process_in cmd in
++ let lines = ref [] in
++ (try while true do lines := input_line chan :: !lines done
++ with End_of_file -> ());
++ let lines = List.rev !lines in
++ let stat = Unix.close_process_in chan in
++ let similarity =
++ match stat with
++ | Unix.WEXITED 0 -> 0.0 (* exact match *)
++ | Unix.WEXITED 1 ->
++ Scanf.sscanf (List.hd lines) "%f" (fun f -> f)
++ | Unix.WEXITED i ->
++ failwithf "external command '%s' exited with error %d" cmd i
++ | Unix.WSIGNALED i ->
++ failwithf "external command '%s' killed by signal %d" cmd i
++ | Unix.WSTOPPED i ->
++ failwithf "external command '%s' stopped by signal %d" cmd i in
++ printf "%s %s have similarity %f\n" screenshot1 screenshot2 similarity;
++ similarity <= 60.0
+ in
+
+ let dom_is_alive () =
+--
+2.3.1
+
diff --git a/0002-v2v-test-harness-Fix-boot-loop-so-it-detects-disk-in.patch b/0002-v2v-test-harness-Fix-boot-loop-so-it-detects-disk-in.patch
new file mode 100644
index 0000000..fabc5b4
--- /dev/null
+++ b/0002-v2v-test-harness-Fix-boot-loop-so-it-detects-disk-in.patch
@@ -0,0 +1,75 @@
+From 0827b006e4943a670dbe193dd8b522d7cc3b4bf5 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Wed, 11 Mar 2015 15:05:13 +0000
+Subject: [PATCH 2/2] v2v: test-harness: Fix boot loop so it detects disk
+ inactivity properly.
+
+---
+ v2v/test-harness/v2v_test_harness.ml | 50 +++++++++++++++++++-----------------
+ 1 file changed, 27 insertions(+), 23 deletions(-)
+
+diff --git a/v2v/test-harness/v2v_test_harness.ml b/v2v/test-harness/v2v_test_harness.ml
+index 998903a..fe09d6f 100644
+--- a/v2v/test-harness/v2v_test_harness.ml
++++ b/v2v/test-harness/v2v_test_harness.ml
+@@ -280,30 +280,34 @@ let run ~test ?input_disk ?input_xml ?(test_plan = default_plan) () =
+ if active then (
+ printf "%s: disk activity detected\n" (timestamp t);
+ loop start t stats
+- ) else if t -. last_activity <= float test_plan.boot_idle_time then (
+- let screenshot = take_screenshot t in
+- (* Reached the final screenshot? *)
+- let done_ =
+- match test_plan.boot_plan with
+- | Boot_to_screenshot final_screenshot ->
+- if display_matches_screenshot screenshot final_screenshot then (
+- printf "%s: guest reached final screenshot\n" (timestamp t);
+- true
+- ) else false
+- | _ -> false in
+- if not done_ then (
+- (* A screenshot matching one of the screenshots in the set
+- * resets the timeout.
+- *)
+- let waiting_in_known_good_state =
+- List.exists (display_matches_screenshot screenshot)
+- test_plan.boot_known_good_screenshots in
+- if waiting_in_known_good_state then (
+- printf "%s: guest at known-good screenshot\n" (timestamp t);
+- loop t last_activity stats
+- ) else
+- loop start last_activity stats
++ ) else (
++ if t -. last_activity <= float test_plan.boot_idle_time then (
++ let screenshot = take_screenshot t in
++ (* Reached the final screenshot? *)
++ let done_ =
++ match test_plan.boot_plan with
++ | Boot_to_screenshot final_screenshot ->
++ if display_matches_screenshot screenshot final_screenshot then (
++ printf "%s: guest reached final screenshot\n" (timestamp t);
++ true
++ ) else false
++ | _ -> false in
++ if not done_ then (
++ (* A screenshot matching one of the screenshots in the set
++ * resets the timeouts.
++ *)
++ let waiting_in_known_good_state =
++ List.exists (display_matches_screenshot screenshot)
++ test_plan.boot_known_good_screenshots in
++ if waiting_in_known_good_state then (
++ printf "%s: guest at known-good screenshot\n" (timestamp t);
++ loop t t stats
++ ) else
++ loop start last_activity stats
++ )
+ )
++ else
++ bootfail t "guest timed out with no disk activity before reaching final state"
+ )
+ in
+ loop start last_activity stats;
+--
+2.3.1
+
diff --git a/libguestfs.spec b/libguestfs.spec
index be1454a..4750170 100644
--- a/libguestfs.spec
+++ b/libguestfs.spec
@@ -25,13 +25,16 @@ Summary: Access and modify virtual machine disk images
Name: libguestfs
Epoch: 1
Version: 1.29.30
-Release: 1%{?dist}
+Release: 2%{?dist}
License: LGPLv2+
# Source and patches.
URL: http://libguestfs.org/
Source0: http://libguestfs.org/download/1.29-development/%{name}-%{version}.tar.gz
+Patch1: 0001-v2v-test-harness-Measure-similarity-between-images-w.patch
+Patch2: 0002-v2v-test-harness-Fix-boot-loop-so-it-detects-disk-in.patch
+
# Basic build requirements:
BuildRequires: perl(Pod::Simple)
BuildRequires: perl(Pod::Man)
@@ -66,6 +69,7 @@ BuildRequires: ocaml
BuildRequires: ocaml-findlib-devel
BuildRequires: ocaml-gettext-devel
BuildRequires: ocaml-ounit-devel
+BuildRequires: ocaml-libvirt-devel >= 0.6.1.4-5
BuildRequires: systemd-units
BuildRequires: netpbm-progs
BuildRequires: icoutils
@@ -189,6 +193,12 @@ Provides: bundled(gnulib)
# Fedora, which breaks everything. Thus:
Conflicts: libguestfs-winsupport
+# virt-v2v-test-harness uses an internal module called 'Xml' which
+# conflicts with an OCaml module of the same name. Ignore the
+# internal module when generating requires & provides.
+%global __ocaml_requires_opts -i Xml
+%global __ocaml_provides_opts -i Xml
+
%description
Libguestfs is a library for accessing and modifying virtual machine
@@ -525,6 +535,37 @@ Virt-v2v and virt-p2v are tools that convert virtual machines from
non-KVM hypervisors, or physical machines, to run under KVM.
+%package -n virt-v2v-test-harness
+Summary: Library used to write test cases for virt-v2v
+License: LGPLv2+
+
+Requires: %{name} = %{epoch}:%{version}-%{release}
+Requires: virt-v2v = %{epoch}:%{version}-%{release}
+Requires: ocaml-libguestfs-devel = %{epoch}:%{version}-%{release}
+
+Requires: ocaml-libvirt-devel >= 0.6.1.4-5
+Requires: /usr/bin/virsh
+Requires: /usr/bin/compare
+Requires: /usr/bin/unxz
+
+
+%description -n virt-v2v-test-harness
+Virt-v2v-test-harness is a small library (module name: V2v_test_harness)
+used to run virt-v2v against a set of test cases consisting of real
+virtual machines.
+
+It acts as a test harness, taking a test case, running virt-v2v on it,
+then test-booting the result. It can ensure that the test case
+converts successfully, boots successfully, and reaches a milestone
+(such as a particular screenshot). It can also test that the
+conversion created, modified or deleted the expected files from within
+the guest.
+
+Note that this package includes only the test harness and not the test
+cases, which are distributed separately. See the
+virt-v2v-test-harness(1) manual page for details.
+
+
%package bash-completion
Summary: Bash tab-completion scripts for %{name} tools
BuildArch: noarch
@@ -768,6 +809,10 @@ for %{name}.
%prep
%setup -q
+# Apply patches, if any, here.
+%patch1 -p1
+%patch2 -p1
+
# For Python 3 we must build libguestfs twice. This creates:
# %{name}-%{version}/
# %{name}-%{version}/python3/
@@ -1171,6 +1216,14 @@ popd
%{_datadir}/virt-tools
+%files -n virt-v2v-test-harness
+%doc COPYING.LIB
+%{_mandir}/man1/virt-v2v-test-harness.1*
+%{_libdir}/ocaml/v2v_test_harness
+%{_libdir}/ocaml/stublibs/dllv2v_test_harness.so
+%{_libdir}/ocaml/stublibs/dllv2v_test_harness.so.owner
+
+
%files bash-completion
%dir %{_datadir}/bash-completion/completions
%{_datadir}/bash-completion/completions/guestfish
@@ -1193,8 +1246,8 @@ popd
%exclude %{_libdir}/ocaml/guestfs/*.cmxa
%exclude %{_libdir}/ocaml/guestfs/*.cmx
%exclude %{_libdir}/ocaml/guestfs/*.mli
-%{_libdir}/ocaml/stublibs/*.so
-%{_libdir}/ocaml/stublibs/*.so.owner
+%{_libdir}/ocaml/stublibs/dllmlguestfs.so
+%{_libdir}/ocaml/stublibs/dllmlguestfs.so.owner
%files -n ocaml-%{name}-devel
@@ -1317,6 +1370,10 @@ popd
%changelog
+* Thu Mar 12 2015 Richard W.M. Jones <rjones at redhat.com> - 1:1.29.30-2
+- Add virt-v2v-test-harness subpackage.
+- Add a couple of upstream patches to fix the virt-v2v test harness.
+
* Wed Mar 11 2015 Richard W.M. Jones <rjones at redhat.com> - 1:1.29.30-1
- New upstream version 1.29.30.
More information about the scm-commits
mailing list