Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list