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
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()) {
+ 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");
+
+ $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");
+ $b->forward(mode => "hostdev");
+ $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
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>
<ip address="192.168.100.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.100.50" end="192.168.100.70" />
--
2.19.1