[libvirt] [PATCH] Add TCK script for verifying disk based storage pools

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

According to Daniel P. Berrange on 3/3/2010 11:46 AM: High-level review nits below. However, I still count myself as too inexperienced to offer either an ACK or NAK on this.
This adds a reasonably comprehensive test script for working with disk based storage pools. It checks
- Prevent re-formating an existing partition table (currently
s/formating/formatting/ (multiple instances)
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
s/Deleteing/Deleting/
+# List of host block devices that the test suite can trash all +# data on, for purposes of testing. You have been warned !
Indeed!
@@ -0,0 +1,127 @@ +# -*- perl -*- +# +# Copyright (C) 2009-2010 Red Hat +# Copyright (C) 2009-2010 Daniel P. Berrange
Shouldn't the canonical copyright be "Red Hat, Inc.", and not just "Red Hat"? -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

Eric Blake wrote: ...
+# List of host block devices that the test suite can trash all +# data on, for purposes of testing. You have been warned !
Indeed!
The intrepid souls who run these tests might appreciate a crosscheck. Let them specify more than just a block device name, where it's way too easy to introduce a typo and clobber something important. Potential crosscheck-able data: - device size - device "model" Both are reported by parted -s $device. In clobbering a device via Parted's test suite, I require a <device_name,size> pair. Then, when I clobber things on my 1 or 2GB USB key, there's no risk I'll accidentally destroy data on "real" disks, since the real ones are all far larger.

On Wed, Mar 03, 2010 at 11:54:28AM -0700, Eric Blake wrote:
According to Daniel P. Berrange on 3/3/2010 11:46 AM:
High-level review nits below. However, I still count myself as too inexperienced to offer either an ACK or NAK on this.
This adds a reasonably comprehensive test script for working with disk based storage pools. It checks
- Prevent re-formating an existing partition table (currently
s/formating/formatting/ (multiple instances)
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
s/Deleteing/Deleting/
+# List of host block devices that the test suite can trash all +# data on, for purposes of testing. You have been warned !
Indeed!
@@ -0,0 +1,127 @@ +# -*- perl -*- +# +# Copyright (C) 2009-2010 Red Hat +# Copyright (C) 2009-2010 Daniel P. Berrange
Shouldn't the canonical copyright be "Red Hat, Inc.", and not just "Red Hat"?
Yep, you're right Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
participants (3)
-
Daniel P. Berrange
-
Eric Blake
-
Jim Meyering