This adds a reasonably comprehensive test script for working with
disk based storage pools. It checks
- Prevent re-formating an existing partition table (currently
missing this check in libvirt)
- Formating of a partiton table
- Wiping a partition table (currently missing in libvirt)
- Creating multiple storage volumes
- Deleteing storage volumes
* conf/default.cfg: add config entry for specifying host block
devices that a test script can use
* lib/Sys/Virt/TCK.pm: Add API to get a host block device
* lib/Sys/Virt/TCK/StoragePoolBuilder.pm: Fix typo in device
XML formatting. Allow pool source format to be specified
* scripts/storage/110-disk-pool.t: Test which creates a storage
pool, creates some volumes, then deletes it all again.
---
conf/default.cfg | 9 ++
lib/Sys/Virt/TCK.pm | 7 ++
lib/Sys/Virt/TCK/StoragePoolBuilder.pm | 13 +++-
scripts/storage/110-disk-pool.t | 127 ++++++++++++++++++++++++++++++++
4 files changed, 155 insertions(+), 1 deletions(-)
create mode 100644 scripts/storage/110-disk-pool.t
diff --git a/conf/default.cfg b/conf/default.cfg
index 5b85cbc..288540f 100644
--- a/conf/default.cfg
+++ b/conf/default.cfg
@@ -127,3 +127,12 @@ host_pci_devices = (
# }
# Can list more than one PCI device if many are available
)
+
+# List of host block devices that the test suite can trash all
+# data on, for purposes of testing. You have been warned !
+# Only full block devices allowed, no single partitions, since
+# the test suite itself needs to create partitions.
+# The disks should be at *least* 512 MB in size
+host_block_devices = (
+# /dev/vdb
+)
diff --git a/lib/Sys/Virt/TCK.pm b/lib/Sys/Virt/TCK.pm
index f101937..d32b03d 100644
--- a/lib/Sys/Virt/TCK.pm
+++ b/lib/Sys/Virt/TCK.pm
@@ -805,4 +805,11 @@ sub get_host_pci_device {
return ($domain, $bus, $slot, $function);
}
+sub get_host_block_device {
+ my $self = shift;
+ my $devindex = @_ ? shift : 0;
+
+ return $self->config("host_block_devices/[$devindex]", undef);
+}
+
1;
diff --git a/lib/Sys/Virt/TCK/StoragePoolBuilder.pm
b/lib/Sys/Virt/TCK/StoragePoolBuilder.pm
index f92b21a..c9ef2dd 100644
--- a/lib/Sys/Virt/TCK/StoragePoolBuilder.pm
+++ b/lib/Sys/Virt/TCK/StoragePoolBuilder.pm
@@ -77,6 +77,14 @@ sub target {
return $self;
}
+sub format {
+ my $self = shift;
+
+ $self->{format} = shift;
+
+ return $self;
+}
+
sub as_xml {
my $self = shift;
@@ -98,7 +106,7 @@ sub as_xml {
}
if ($self->{source}->{device}) {
foreach my $dev (@{$self->{source}->{device}}) {
- $w->emptyTag("dev", path => $dev);
+ $w->emptyTag("device", path => $dev);
}
}
if ($self->{source}->{adapter}) {
@@ -107,6 +115,9 @@ sub as_xml {
if ($self->{source}->{name}) {
$w->dataElement("name", $self->{source}->{name});
}
+ if ($self->{format}) {
+ $w->emptyTag("format", type => $self->{format});
+ }
$w->endTag("source");
$w->startTag("target");
diff --git a/scripts/storage/110-disk-pool.t b/scripts/storage/110-disk-pool.t
new file mode 100644
index 0000000..faa13c5
--- /dev/null
+++ b/scripts/storage/110-disk-pool.t
@@ -0,0 +1,127 @@
+# -*- perl -*-
+#
+# Copyright (C) 2009-2010 Red Hat
+# Copyright (C) 2009-2010 Daniel P. Berrange
+#
+# This program is free software; You can redistribute it and/or modify
+# it under the GNU General Public License as published by the Free
+# Software Foundation; either version 2, or (at your option) any
+# later version
+#
+# The file "LICENSE" distributed along with this file provides full
+# details of the terms and conditions
+#
+
+=pod
+
+=head1 NAME
+
+storage/110-disk-pool.t - test disk storage pools
+
+=head1 DESCRIPTION
+
+The test case validates that it is possible to use all core
+functions of the disk pool type.
+
+=cut
+
+use strict;
+use warnings;
+
+use Test::More tests => 20;
+
+use Sys::Virt::TCK;
+use Test::Exception;
+use File::stat;
+
+my $tck = Sys::Virt::TCK->new();
+my $conn = eval { $tck->setup(); };
+BAIL_OUT "failed to setup test harness: $@" if $@;
+END {
+ $tck->cleanup if $tck;
+}
+
+
+SKIP: {
+ my $dev = $tck->get_host_block_device();
+
+ skip "no host block device available", 20 unless defined $dev;
+
+ # Blow away partition table (if any)
+ open DEV, ">$dev" or die "cannot write to $dev: $!";
+ my $data = " "x 512;
+
+ print DEV $data;
+ close DEV or die "cannot save $dev: $!";
+
+ my $poolxml = $tck->generic_pool("disk", "tck")
+ ->source_device($dev)
+ ->format("dos")
+ ->target("/dev/")
+ ->as_xml;
+
+ diag "Defining persistent storage pool $poolxml";
+ my $pool;
+ ok_pool(sub { $pool = $conn->define_storage_pool($poolxml) }, "define
persistent storage pool");
+
+ # Since we blew away the partition table we should not be able to
+ # start the pool yet
+ ok_error(sub { $pool->create }, "unable to start un-built storage
pool");
+
+ lives_ok(sub { $pool->build(0) }, "built storage pool");
+
+ # We should get an error if trying to build a pool which already
+ # has a partition table written.
+ ok_error(sub { $pool->build(0) }, "prevent rebuilding existing storage
pool");
+
+ lives_ok(sub { $pool->create }, "started storage pool");
+
+ my @vols = $pool->list_volumes();
+
+ is($#vols, -1, "no storage volumes in new pool");
+
+ my $poolinfo = $pool->get_info();
+
+ ok($poolinfo->{available} > 1000, "there is some space available in the
pool");
+
+ my $volbase = $dev;
+ $volbase =~ s,/dev/,,;
+
+ my $vol1xml = $tck->generic_volume($volbase . "1", undef,
1024*1024*256)->as_xml;
+ my $vol2xml = $tck->generic_volume($volbase . "2", undef,
1024*1024*64)->as_xml;
+
+ diag "Vol $vol1xml $vol2xml";
+ my $vol1;
+ my $vol2;
+ ok_volume(sub { $vol1 = $pool->create_volume($vol1xml) }, "create disk
partition");
+ ok_volume(sub { $vol2 = $pool->create_volume($vol2xml) }, "create disk
partition");
+
+ for my $vol (($vol1, $vol2)) {
+ my $path = xpath($vol, "string(/volume/target/path)");
+ my $st = stat($path);
+
+ ok($st, "path $path exists");
+ }
+
+ @vols = $pool->list_volumes();
+ is($#vols, 1, "two storage volumes in pool");
+
+ lives_ok(sub { $vol1->delete(0) }, "deleted volume");
+
+ @vols = $pool->list_volumes();
+ is($#vols, 0, "one storage volume in pool");
+
+ lives_ok(sub { $vol2->delete(0) }, "deleted volume");
+
+ @vols = $pool->list_volumes();
+ is($#vols, -1, "zero storage volume in pool");
+
+ lives_ok(sub { $pool->destroy() }, "destroyed pool");
+ lives_ok(sub { $pool->delete(0) }, "deleted pool");
+
+ # Since we blew away the partition table we should not be able to
+ # start the pool anymore
+ ok_error(sub { $pool->create }, "unable to start un-built storage
pool");
+
+ lives_ok(sub { $pool->undefine() }, "undefined pool");
+}
--
1.6.5.2