On 11/2/18 11:52 AM, Daniel P. Berrangé wrote:
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
lib/Sys/Virt/TCK.pm | 33 ++++++++
lib/Sys/Virt/TCK/NetworkBuilder.pm | 33 +++++++-
scripts/networks/300-guest-network-isolated.t | 82 ++++++++++++++++++
scripts/networks/310-guest-network-nat.t | 83 +++++++++++++++++++
scripts/networks/320-guest-network-route.t | 83 +++++++++++++++++++
scripts/networks/330-guest-network-open.t | 83 +++++++++++++++++++
scripts/networks/340-guest-network-bridge.t | 79 ++++++++++++++++++
scripts/networks/350-guest-network-private.t | 81 ++++++++++++++++++
scripts/networks/360-guest-network-vepa.t | 81 ++++++++++++++++++
.../networks/370-guest-network-passthrough.t | 81 ++++++++++++++++++
scripts/networks/380-guest-network-hostdev.t | 82 ++++++++++++++++++
t/080-network-builder.t | 2 +-
12 files changed, 800 insertions(+), 3 deletions(-)
create mode 100644 scripts/networks/300-guest-network-isolated.t
create mode 100644 scripts/networks/310-guest-network-nat.t
create mode 100644 scripts/networks/320-guest-network-route.t
create mode 100644 scripts/networks/330-guest-network-open.t
create mode 100644 scripts/networks/340-guest-network-bridge.t
create mode 100644 scripts/networks/350-guest-network-private.t
create mode 100644 scripts/networks/360-guest-network-vepa.t
create mode 100644 scripts/networks/370-guest-network-passthrough.t
create mode 100644 scripts/networks/380-guest-network-hostdev.t
You added all these new tests, but forgot that you made the MANIFEST
file static/manually edited in commit a140e4f61 back in May, so the new
tests don't get installed.
Also, the tests don't actually boot up an OS and try to pass traffic; I
guess that's something you're counting on someone adding later? :-)
(Same comment for adding the proper iptables rules, but we need to
consider what to do about that, because what gets added will in the
*very near* future be different depending on version of libvirt and/or
whether or not firewalld is using nftables).
Those last two shouldn't keep you from pushing the patch though (see my
list at the end for the few things that do need to be changed before
pushing)
diff --git a/lib/Sys/Virt/TCK.pm b/lib/Sys/Virt/TCK.pm
index 04244bd..9457836 100644
--- a/lib/Sys/Virt/TCK.pm
+++ b/lib/Sys/Virt/TCK.pm
@@ -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()) {
This works to eliminate conflicts with active interfaces, but doesn't
take into account any routes that have the same destination
address/prefix as the desired network. For example, you may have a
static route for 192.168.125.0/25 pointing to another host that has a
routed virtual network with that address. If that's the case, the test
will fail.
I don't have a quick alternative at hand to suggest though, and the
likelyhood of a host having a static route that conflicts with the
lowest numbered available 192.168.blah.0/24 network is probably pretty
low, so I'm going to overlook this :-)
+ 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;
diff --git a/lib/Sys/Virt/TCK/NetworkBuilder.pm b/lib/Sys/Virt/TCK/NetworkBuilder.pm
index 09ca6b7..ad0cab8 100644
--- a/lib/Sys/Virt/TCK/NetworkBuilder.pm
+++ b/lib/Sys/Virt/TCK/NetworkBuilder.pm
@@ -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",
diff --git a/scripts/networks/300-guest-network-isolated.t
b/scripts/networks/300-guest-network-isolated.t
new file mode 100644
index 0000000..487e864
--- /dev/null
+++ b/scripts/networks/300-guest-network-isolated.t
@@ -0,0 +1,82 @@
+# -*- 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");
In the past (so long ago I don't remember the details) there has been
different behavior between transient and persistent networks and
domains. If we wanted to be pedantic, we could test it both/all ways. It
would be overkill to do all the combinations for *every test* though.
Since there are multiple tests here doing almost the same thing, we
could make one of them with a persistent network/transient domain, one
with transient/persistent, etc (or maybe just be sure there's one of
each type, not necessarily all combinations)
+
+ $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
diff --git a/scripts/networks/310-guest-network-nat.t
b/scripts/networks/310-guest-network-nat.t
new file mode 100644
index 0000000..fe1a926
--- /dev/null
+++ b/scripts/networks/310-guest-network-nat.t
@@ -0,0 +1,83 @@
+# -*- 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
diff --git a/scripts/networks/320-guest-network-route.t
b/scripts/networks/320-guest-network-route.t
new file mode 100644
index 0000000..91f0b70
--- /dev/null
+++ b/scripts/networks/320-guest-network-route.t
@@ -0,0 +1,83 @@
+# -*- 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
diff --git a/scripts/networks/330-guest-network-open.t
b/scripts/networks/330-guest-network-open.t
new file mode 100644
index 0000000..113f4cc
--- /dev/null
+++ b/scripts/networks/330-guest-network-open.t
@@ -0,0 +1,83 @@
+# -*- 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
diff --git a/scripts/networks/340-guest-network-bridge.t
b/scripts/networks/340-guest-network-bridge.t
new file mode 100644
index 0000000..e5db0ff
--- /dev/null
+++ b/scripts/networks/340-guest-network-bridge.t
@@ -0,0 +1,79 @@
+# -*- 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
diff --git a/scripts/networks/350-guest-network-private.t
b/scripts/networks/350-guest-network-private.t
new file mode 100644
index 0000000..0b98149
--- /dev/null
+++ b/scripts/networks/350-guest-network-private.t
@@ -0,0 +1,81 @@
+# -*- 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
diff --git a/scripts/networks/360-guest-network-vepa.t
b/scripts/networks/360-guest-network-vepa.t
new file mode 100644
index 0000000..f32ad28
--- /dev/null
+++ b/scripts/networks/360-guest-network-vepa.t
@@ -0,0 +1,81 @@
+# -*- 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
diff --git a/scripts/networks/370-guest-network-passthrough.t
b/scripts/networks/370-guest-network-passthrough.t
new file mode 100644
index 0000000..ebd210d
--- /dev/null
+++ b/scripts/networks/370-guest-network-passthrough.t
@@ -0,0 +1,81 @@
+# -*- 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
diff --git a/scripts/networks/380-guest-network-hostdev.t
b/scripts/networks/380-guest-network-hostdev.t
new file mode 100644
index 0000000..63fa0c9
--- /dev/null
+++ b/scripts/networks/380-guest-network-hostdev.t
@@ -0,0 +1,82 @@
+# -*- 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->bridge("tck");
There shouldn't be a bridge device for a hostdev network. Removing the
line above is sufficient.
+ $b->forward(mode => "hostdev");
This should also have 'managed => "yes"' for maximum ease of use
(you
have to go to the trouble of blacklisting things or explicitly running
nodedev-detach to get the VFs pre-detached from the hostside VF net driver).
+ $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");
Sigh.
(That has nothing to do with this bit of code. I just happened to type
it in for some reason while this review email was up on my screen.
Probably it was meant for another window, I'm not sure. I was just kind
of amused to find it sitting here as I scanned through the message
before sending it, so thought I'd leave it in for comic relief).
+ $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
diff --git a/t/080-network-builder.t b/t/080-network-builder.t
index ec2b70c..a99bc63 100644
--- a/t/080-network-builder.t
+++ b/t/080-network-builder.t
@@ -23,7 +23,7 @@ my $xml = <<EOF;
<network>
<name>tck</name>
<bridge name="virbr0" />
- <forward dev="eth0" />
+ <forward dev="eth0"></forward>
Is the above some odd requirement of the way things are added into
existing XML?
<ip address="192.168.100.1"
netmask="255.255.255.0">
<dhcp>
<range start="192.168.100.50" end="192.168.100.70" />
Assuming the following:
* add new test files to MANIFEST
* remove $b->bridge("tck") from hostdev test
* add 'managed => "yes"' to the $b->forward(...) in hostdev test
Tested-by: Laine Stump <laine(a)laine.org>
Reviewed-by: Laine Stump <laine(a)laine.org>
(Yes, I actually added hostdevs and nics to the config file and ran
*all* the tests :-)