...
 
Commits (3)
......@@ -8,7 +8,7 @@ libvirt-tck - libvirt Technology Compatability Kit
=head1 SYNOPSIS
# libvirt-tck [OPTIONS]
# libvirt-tck [OPTIONS] [TESTS..]
Run with default config, probing for URI to use
......@@ -38,20 +38,22 @@ test suite for libvirt drivers.
=head2 WARNING
There now follows a few words of warning
The test suite is intended to be moderately safe to run on arbitrary
hosts and takes steps to avoid intentionally breaking things.
The test suite needs to have a completely 'clean' initial
starting state. If your host already has virtual machines
defined and/or running this will cause problems. The test
suite will detect this and refuse to run, allowing you to
remove any preexisting guests. Alternatively you can pass
the --force option and libvirt will DELETE EVERYTHING it
finds.
All objects (guests, networks, storage pools, etc) that are created
will have a name prefix of "tck" to minimize risk of clashes. The
test suite will only ever (intentionally) delete objects with a
"tck" name prefix.
To repeat: ALL YOUR EXISTING DOMAINS, NETWORKS, STORAGE POOLS
WILL BE DELETED IF YOU USE THE --force OPTION.
Where a test suite needs access to a precious host resource (physical
NIC, PCI device, USB device, block device), execution will be skipped
until the admin has white listed one or more suitable resources in
the C</etc/libvirt-tck/default.cfg> configuration file.
The warning is now complete, continue reading
Despite these precautions, running automated tests always carries some
degree of risk to the host system. It is thus advisable to avoid
executing this test suite on hosts with precious state.
=head2 OPTIONS
......@@ -60,8 +62,15 @@ the default configuration file from C</etc/libvirt-tck/default.cfg>
and will allow libvirt to probe for the hypervisor driver to
run. If a reliably repeatable test result set is desired, it is
recommended to always give an explicit libvirt connection URI
to choose the driver. The following options are available when
running the C<libvirt-tck> command
to choose the driver.
Any command line arguments that are not parsed as options will
be considered paths to test scripts to invoke. If no paths are
given, all tests under C</usr/share/libvirt-tck/tests> will be
executed.
The following options are available when running the C<libvirt-tck>
command
=over 4
......@@ -90,18 +99,11 @@ C<xml> option generates a formal XML document of results.
=item --force
Forcably remove all running guest domains and all persistent guest
domain configuration files before running any tests. The test suite
requires a pristine install, so all existing managed objects must
be removed before running. This switch will instruct libvirt-tck
to automatically remove all guest domains. YOU WILL NOT GET YOUR
EXISTING GUEST DOMAINS BACK IF THIS HAPPENS. THEY WILL BE GONE
FOREVER. USE AT YOUR OWN RISK.
=item -t, --testdir PATH
Forcably remove all previously created objects, including guests,
networks, storage pools, etc which have a "tck" name prefix.
Specify an alternate directory path in which to find the test
scripts to be run. If omitted, defaults to C</usr/share/libvirt-tck/tests>
User created objects whose name does not start with "tck" will be
left untouched.
=item -a, --archive FILE
......@@ -144,7 +146,6 @@ my $timer = 0;
my $archive;
my $config = catfile($confdir, "default.cfg");
my $format = "text";
my $testdir = catdir($datadir, "tests");
if (!GetOptions("verbose" => \$verbose,
"debug" => \$debug,
......@@ -154,7 +155,6 @@ if (!GetOptions("verbose" => \$verbose,
"config=s" => \$config,
"force" => \$force,
"format=s" => \$format,
"testdir=s" => \$testdir,
"timer" => \$timer) || $help) {
pod2usage(-verbose => $help,
-output => $help ? \*STDOUT : \*STDERR,
......@@ -181,12 +181,19 @@ if ($verbose && $quiet) {
-output => \*STDERR);
}
unless (-e $testdir) {
print STDERR "$0: test directory '$testdir' does not exist\n";
exit 2;
my @testdirs = @ARGV;
unless (@testdirs) {
push @testdirs, catdir($datadir, "tests");
}
foreach (@testdirs) {
unless (-e $_) {
print STDERR "$0: test path '$_' does not exist\n";
exit 2;
}
}
my @newargv = ("-r", "--norc", "--merge", $testdir);
my @newargv = ("-r", "--norc", "--merge", @testdirs);
if ($archive) {
push @newargv, "-a", $archive;
......
......@@ -29,6 +29,7 @@ use File::Path qw(mkpath);
use File::Spec::Functions qw(catfile catdir rootdir);
use Cwd qw(cwd);
use LWP::UserAgent;
use IO::Interface::Simple;
use IO::Uncompress::Gunzip qw(gunzip);
use IO::Uncompress::Bunzip2 qw(bunzip2);
use XML::XPath;
......@@ -1285,6 +1286,38 @@ sub get_ip_from_leases{
}
sub find_free_ipv4_subnet {
my $index;
my %used;
foreach my $iface (IO::Interface::Simple->interfaces()) {
if ($iface->netmask eq "255.255.255.0" &&
$iface->address =~ /^192.168.(\d+).\d+/) {
$used{"$1"} = 1;
print "Used $1\n";
} else {
print "Not used ", $iface->address, "\n";
}
}
for (my $i = 1; $i < 255; $i++) {
if (!exists $used{"$i"}) {
$index = $i;
last;
}
}
return () unless defined $index;
return (
address => "192.168.$index.1",
netmask => "255.255.255.0",
dhcpstart => "192.168.$index.100",
dhcpend => "192.168.$index.200"
);
}
sub shutdown_vm_gracefully {
my $dom = shift;
......
......@@ -61,6 +61,22 @@ sub forward {
return $self;
}
sub interfaces {
my $self = shift;
$self->{interfaces} = [@_];
return $self;
}
sub host_devices {
my $self = shift;
$self->{host_devices} = [@_];
return $self;
}
sub ipaddr {
my $self = shift;
my $address = shift;
......@@ -98,8 +114,21 @@ sub as_xml {
$w->emptyTag("bridge", %{$self->{bridge}})
if $self->{bridge};
$w->emptyTag("forward", %{$self->{forward}})
if exists $self->{forward};
if (exists $self->{forward}) {
$w->startTag("forward", %{$self->{forward}});
foreach (@{$self->{interfaces}}) {
$w->emptyTag("interface", dev => $_);
}
foreach (@{$self->{host_devices}}) {
$w->emptyTag("address",
type => "pci",
domain => $_->[0],
bus => $_->[1],
slot => $_->[2],
function => $_->[3]);
}
$w->endTag("forward");
}
if ($self->{ipaddr}) {
$w->startTag("ip",
......
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/300-guest-network-isolated.t - guest connect to isolated network
=head1 DESCRIPTION
This test case validates that a guest is connected to an isolated
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
my %subnet = Sys::Virt::TCK->find_free_ipv4_subnet();
SKIP: {
skip "No available IPv4 subnet", 4 unless defined $subnet{address};
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->bridge("tck");
$b->ipaddr($subnet{address}, $subnet{netmask});
$b->dhcp_range($subnet{dhcpstart}, $subnet{dhcpend});
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
}
# end
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/310-guest-network-nat.t - guest connect to nat network
=head1 DESCRIPTION
This test case validates that a guest is connected to a nat
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
my %subnet = Sys::Virt::TCK->find_free_ipv4_subnet();
SKIP: {
skip "No available IPv4 subnet", 4 unless defined $subnet{address};
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->bridge("tck");
$b->forward(mode => "nat");
$b->ipaddr($subnet{address}, $subnet{netmask});
$b->dhcp_range($subnet{dhcpstart}, $subnet{dhcpend});
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
}
# end
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/320-guest-network-route.t - guest connect to routed network
=head1 DESCRIPTION
This test case validates that a guest is connected to a routed
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
my %subnet = Sys::Virt::TCK->find_free_ipv4_subnet();
SKIP: {
skip "No available IPv4 subnet", 4 unless defined $subnet{address};
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->bridge("tck");
$b->forward(mode => "route");
$b->ipaddr($subnet{address}, $subnet{netmask});
$b->dhcp_range($subnet{dhcpstart}, $subnet{dhcpend});
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
}
# end
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/330-guest-network-open.t - guest connect to open network
=head1 DESCRIPTION
This test case validates that a guest is connected to an open
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
my %subnet = Sys::Virt::TCK->find_free_ipv4_subnet();
SKIP: {
skip "No available IPv4 subnet", 4 unless defined $subnet{address};
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->bridge("tck");
$b->forward(mode => "open");
$b->ipaddr($subnet{address}, $subnet{netmask});
$b->dhcp_range($subnet{dhcpstart}, $subnet{dhcpend});
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
}
# end
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/340-guest-network-bridge.t - guest connect to bridge network
=head1 DESCRIPTION
This test case validates that a guest is connected to a bridge
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
((system "brctl addbr tck") == 0) or die "cannot create bridge 'tck'";
END { system "brctl delbr tck" }
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->bridge("tck");
$b->forward(mode => "bridge");
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
# end
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/350-guest-network-private.t - guest connect to private network
=head1 DESCRIPTION
This test case validates that a guest is connected to a private
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
my $hostnet = $tck->get_host_network_device();
SKIP: {
skip "No host device available", 4 unless $hostnet;
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->forward(mode => "private");
$b->interfaces($hostnet);
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
}
# end
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/360-guest-network-vepa.t - guest connect to vepa network
=head1 DESCRIPTION
This test case validates that a guest is connected to a VEPA
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
my $hostnet = $tck->get_host_network_device();
SKIP: {
skip "No host device available", 4 unless $hostnet;
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->forward(mode => "vepa");
$b->interfaces($hostnet);
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
}
# end
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/370-guest-network-passthrough.t - guest connect to passthrough network
=head1 DESCRIPTION
This test case validates that a guest is connected to a passthrough
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
my $hostnet = $tck->get_host_network_device();
SKIP: {
skip "No host device available", 4 unless $hostnet;
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->forward(mode => "passthrough");
$b->interfaces($hostnet);
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
}
# end
# -*- perl -*-
#
# Copyright (C) 2018 Red Hat, Inc.
#
# 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
network/380-guest-network-hostdev.t - guest connect to a hostdev network
=head1 DESCRIPTION
This test case validates that a guest is connected to a hostdev
virtual network
=cut
use strict;
use warnings;
use Test::More tests => 4;
use Sys::Virt::TCK;
my $tck = Sys::Virt::TCK->new();
my $conn = eval { $tck->setup(); };
BAIL_OUT "failed to setup test harness: $@" if $@;
END { $tck->cleanup if $tck; }
my ($domain, $bus, $slot, $func) = $tck->get_host_pci_device();
SKIP: {
skip "No available PCI device", 4 unless defined $domain;
my $b = Sys::Virt::TCK::NetworkBuilder->new(name => "tck");
$b->forward(mode => "hostdev", managed => "yes");
$b->host_devices([$domain, $bus, $slot, $func]);
my $xml = $b->as_xml();
diag "Creating a new transient network";
diag $xml;
my $net;
ok_network(sub { $net = $conn->create_network($xml) }, "created transient network object");
$b = $tck->generic_domain(name => "tck");
$b->interface(type => "network",
source => "tck",
model => "virtio",
mac => "52:54:00:11:11:11");
$xml = $b->as_xml();
diag "Creating a new transient domain";
diag $xml;
my $dom;
ok_domain(sub { $dom = $conn->create_domain($xml) }, "created transient domain object");
diag "Destroying the transient guest";
$dom->destroy;
diag "Checking that transient domain has gone away";
ok_error(sub { $conn->get_domain_by_name("tck") }, "NO_DOMAIN error raised from missing domain",
Sys::Virt::Error::ERR_NO_DOMAIN);
diag "Destroying the transient network";
$net->destroy;
diag "Checking that transient network has gone away";
ok_error(sub { $conn->get_network_by_name("tck") }, "NO_network error raised from missing network",
Sys::Virt::Error::ERR_NO_NETWORK);
}
# end
......@@ -23,7 +23,7 @@ my $xml = <<EOF;
<network>
<name>tck</name>
<bridge name="virbr0" />
<forward dev="eth0" />
<forward dev="eth0"></forward>
<ip address="192.168.100.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.100.50" end="192.168.100.70" />
......