diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2012-10-08 17:26:53 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2012-10-09 09:45:42 +0100 |
commit | 0a85fbc946d7838366c35c0425efddb1a91f593c (patch) | |
tree | bfc621b7075d563a37fdaafda05b594c0522c9c6 /tests | |
parent | 18b7f09f366d518050f467d0944c81c82fd5e39e (diff) | |
download | libguestfs-0a85fbc946d7838366c35c0425efddb1a91f593c.tar.gz libguestfs-0a85fbc946d7838366c35c0425efddb1a91f593c.tar.xz libguestfs-0a85fbc946d7838366c35c0425efddb1a91f593c.zip |
Add support for hotplugging (removing disks).
New API: remove-drive.
Note because of a bug in fuser, this only works with psmisc >= 22.20.
This also updates the hotplugging tests.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/hotplug/Makefile.am | 6 | ||||
-rwxr-xr-x | tests/hotplug/test-hot-remove.pl | 88 | ||||
-rwxr-xr-x | tests/hotplug/test-hotplug-repeated.pl | 57 |
3 files changed, 149 insertions, 2 deletions
diff --git a/tests/hotplug/Makefile.am b/tests/hotplug/Makefile.am index 6644930a..9187c766 100644 --- a/tests/hotplug/Makefile.am +++ b/tests/hotplug/Makefile.am @@ -18,9 +18,11 @@ include $(top_srcdir)/subdir-rules.mk TESTS = \ - test-hot-add.pl + test-hot-add.pl \ + test-hot-remove.pl TESTS_ENVIRONMENT = $(top_builddir)/run --test EXTRA_DIST = \ - $(TESTS) + $(TESTS) \ + test-hotplug-repeated.pl diff --git a/tests/hotplug/test-hot-remove.pl b/tests/hotplug/test-hot-remove.pl new file mode 100755 index 00000000..af30869e --- /dev/null +++ b/tests/hotplug/test-hot-remove.pl @@ -0,0 +1,88 @@ +#!/usr/bin/perl +# Copyright (C) 2012 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, Fifth Floor, Boston, MA 02110-1301 USA. + +# Test hot-adding and -removing disks. + +use strict; +use warnings; + +use Sys::Guestfs; + +my $g = Sys::Guestfs->new (); + +# Skip the test if the default attach-method isn't libvirt, since only +# the libvirt backend supports hotplugging. +my $attach_method = $g->get_attach_method (); +unless ($attach_method eq "libvirt" || $attach_method =~ /^libvirt:/) { + print "$0: test skipped because attach-method ($attach_method) is not libvirt\n"; + exit 77 +} + +# Create some temporary disks. +open FILE, ">test1.img" or die "test1.img: $!"; +truncate FILE, 512 * 1024 * 1024 or die "test1.img: truncate: $!"; +close FILE; + +open FILE, ">test2.img" or die "test2.img: $!"; +truncate FILE, 512 * 1024 * 1024 or die "test2.img: truncate: $!"; +close FILE; + +die unless system ("qemu-img create -f qcow2 test3.img 1G") == 0; + +# Hot-add them. Labels are required. +$g->add_drive ("test1.img", label => "a"); # autodetect format +$g->add_drive ("test2.img", label => "b", format => "raw", readonly => 1); +$g->add_drive ("test3.img", label => "c", format => "qcow2"); + +# Remove them (before launch). +$g->remove_drive ("a"); +$g->remove_drive ("b"); +$g->remove_drive ("c"); + +$g->launch (); + +# There should be no drives yet. +my @devices = $g->list_devices (); +die unless 0 == @devices; + +# Add them again (after launch). +$g->add_drive ("test1.img", label => "a"); # autodetect format +$g->add_drive ("test2.img", label => "b", format => "raw", readonly => 1); +$g->add_drive ("test3.img", label => "c", format => "qcow2"); + +# Check we can use the disks immediately. +$g->part_disk ("/dev/disk/guestfs/a", "mbr"); +$g->mkfs ("ext2", "/dev/disk/guestfs/c"); +$g->mkfs ("ext2", "/dev/disk/guestfs/a1"); + +# Remove them (hotplug this time). +$g->remove_drive ("a"); +$g->remove_drive ("b"); +$g->remove_drive ("c"); + +# There should be no drives remaining. +@devices = $g->list_devices (); +die unless 0 == @devices; + +$g->shutdown (); +$g->close (); + +unlink "test1.img"; +unlink "test2.img"; +unlink "test3.img"; + +exit 0 diff --git a/tests/hotplug/test-hotplug-repeated.pl b/tests/hotplug/test-hotplug-repeated.pl new file mode 100755 index 00000000..8c4fc446 --- /dev/null +++ b/tests/hotplug/test-hotplug-repeated.pl @@ -0,0 +1,57 @@ +#!/usr/bin/perl +# Copyright (C) 2012 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, Fifth Floor, Boston, MA 02110-1301 USA. + +# Test repeatedly hotplugging a single disk. + +use strict; +use warnings; + +use Sys::Guestfs; + +my $g = Sys::Guestfs->new (); + +# Skip the test if the default attach-method isn't libvirt, since only +# the libvirt backend supports hotplugging. +my $attach_method = $g->get_attach_method (); +unless ($attach_method eq "libvirt" || $attach_method =~ /^libvirt:/) { + print "$0: test skipped because attach-method ($attach_method) is not libvirt\n"; + exit 77 +} + +$g->launch (); + +# Create a temporary disk. +open FILE, ">test1.img" or die "test1.img: $!"; +truncate FILE, 512 * 1024 * 1024 or die "test1.img: truncate: $!"; +close FILE; + +my $start_t = time (); +while (time () - $start_t <= 60) { + $g->add_drive ("test1.img", label => "a", format => "raw"); + $g->remove_drive ("a"); +} + +# There should be no drives remaining. +my @devices = $g->list_devices (); +die unless 0 == @devices; + +$g->shutdown (); +$g->close (); + +unlink "test1.img"; + +exit 0 |