Add caution subdirectory containing safety and liveness tests.
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 30 Jun 2011 11:57:31 +0000 (12:57 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Sat, 16 Jul 2011 08:32:19 +0000 (09:32 +0100)
Not that I'm paranoid about qemu breaking snapshots of anything like
that ...

Cherry picked from commit f3ada2c7653866f2529c9f18aaa99f76cd984844.

Makefile.am
caution/Makefile.am [new file with mode: 0644]
caution/qemu-snapshot-isolation.sh [new file with mode: 0755]
configure.ac
src/guestfs.pod

index 52823bb..acd8efc 100644 (file)
@@ -30,7 +30,7 @@ SUBDIRS += appliance
 endif
 
 # Tests and the test-tool.
-SUBDIRS += gnulib/tests capitests regressions test-tool
+SUBDIRS += gnulib/tests capitests caution regressions test-tool
 
 # Guestfish.
 SUBDIRS += fish
diff --git a/caution/Makefile.am b/caution/Makefile.am
new file mode 100644 (file)
index 0000000..f87884f
--- /dev/null
@@ -0,0 +1,36 @@
+# libguestfs
+# Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# Safety and liveness tests of components that libguestfs depends upon
+# (not of libguestfs itself).  Mainly this is for qemu and the kernel.
+#
+# See also capitests and regressions directories.
+
+include $(top_srcdir)/subdir-rules.mk
+
+TESTS = \
+       qemu-snapshot-isolation.sh
+
+random_val := $(shell awk 'BEGIN{srand(); print 1+int(255*rand())}' < /dev/null)
+
+TESTS_ENVIRONMENT = \
+       MALLOC_PERTURB_=$(random_val) \
+       LD_LIBRARY_PATH=$(top_builddir)/src/.libs \
+       LIBGUESTFS_PATH=$(top_builddir)/appliance
+
+EXTRA_DIST = \
+       $(TESTS)
diff --git a/caution/qemu-snapshot-isolation.sh b/caution/qemu-snapshot-isolation.sh
new file mode 100755 (executable)
index 0000000..ae22611
--- /dev/null
@@ -0,0 +1,94 @@
+#!/bin/bash -
+# libguestfs
+# Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# Test that qemu snapshots are really isolating writes from the
+# underlying disk image.  If this test were to fail, you could expect
+# libguestfs to cause massive disk corruption on live guests.
+
+set -e
+
+rm -f test1.img test2.img test3.img
+
+truncate -s 100M test1.img
+test1_md5sum="$(md5sum test1.img | awk '{print $1}')"
+truncate -s 100M test2.img
+test2_md5sum="$(md5sum test2.img | awk '{print $1}')"
+qemu-img create -f qcow2 test3.img 100M
+test3_md5sum="$(md5sum test3.img | awk '{print $1}')"
+
+# The vitally important calls are 'add-drive-ro' and
+# 'add-drive-opts ... readonly:true'.
+../fish/guestfish <<'EOF'
+add-drive-ro test1.img
+add-drive-opts test2.img format:raw readonly:true
+add-drive-opts test3.img format:qcow2 readonly:true
+run
+
+part-disk /dev/sda mbr
+part-disk /dev/sdb mbr
+part-disk /dev/sdc mbr
+
+mkfs ext2 /dev/sda1
+copy-size /dev/sda1 /dev/sdb1 5M
+pvcreate /dev/sdc1
+vgcreate VG /dev/sdc1
+lvcreate LV VG 80
+mkfs ext3 /dev/VG/LV
+
+mkmountpoint /a
+mount-options "" /dev/sda1 /a
+mkmountpoint /b
+mount-options "" /dev/sdb1 /b
+mkmountpoint /c
+mount-options "" /dev/VG/LV /c
+
+write /a/test "This is a test"
+write /b/test "This is a test"
+write /c/test "This is a test"
+
+# Really try hard to force writes to the disk.
+umount-all
+sync
+
+EOF
+
+# Now verify that the original disks have not been touched.
+function serious_error
+{
+    echo
+    echo
+    echo "***** SERIOUS ERROR *****"
+    echo "qemu's snapshot isolation does not appear to be working."
+    echo "Running libguestfs could cause disk corruption on live guests."
+    echo
+    echo "DO NOT USE libguestfs before you have resolved this problem."
+    echo
+    exit 1
+}
+
+if [ "$(md5sum test1.img | awk '{print $1}')" != "$test1_md5sum" ]; then
+    serious_error
+fi
+if [ "$(md5sum test2.img | awk '{print $1}')" != "$test2_md5sum" ]; then
+    serious_error
+fi
+if [ "$(md5sum test3.img | awk '{print $1}')" != "$test3_md5sum" ]; then
+    serious_error
+fi
+
+rm test1.img test2.img test3.img
index db591d0..94e5194 100644 (file)
@@ -810,6 +810,7 @@ AC_CONFIG_FILES([Makefile
                  appliance/Makefile
                  images/Makefile
                  capitests/Makefile
+                 caution/Makefile
                  regressions/Makefile
                  test-tool/Makefile
                  ocaml/Makefile ocaml/examples/Makefile
index 3b43b65..d8156b9 100644 (file)
@@ -2341,6 +2341,11 @@ Automated tests of the C API.
 The L<virt-cat(1)>, L<virt-filesystems(1)> and L<virt-ls(1)> commands
 and documentation.
 
+=item C<caution>
+
+Safety and liveness tests of components that libguestfs depends upon
+(not of libguestfs itself).  Mainly this is for qemu and the kernel.
+
 =item C<contrib>
 
 Outside contributions, experimental parts.