Adding these parameters to the clean-traffic filter causes a
significant extra piece of code to be executed (a separate thread is
started up, which uses libpcap to capture DHCP traffic and learn the
IP address of the guest / test appliance), so let's get some test
coverage on that code.
Signed-off-by: Laine Stump <laine(a)laine.org>
---
Change from V1:
* set %filterparams to () instead of undef when not specified. (undef
caused a runtime error that I hadn't noticed, since the result was
the same)
* adjust to use NetAddr::IP object instead of string for networkip.
lib/Sys/Virt/TCK.pm | 11 ++++++++---
lib/Sys/Virt/TCK/DomainBuilder.pm | 8 +++++++-
scripts/nwfilter/220-no-ip-spoofing.t | 11 ++++++++++-
3 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/lib/Sys/Virt/TCK.pm b/lib/Sys/Virt/TCK.pm
index 3f650a8..f9d9f30 100644
--- a/lib/Sys/Virt/TCK.pm
+++ b/lib/Sys/Virt/TCK.pm
@@ -767,6 +767,7 @@ sub generic_machine_domain {
my $ostype = exists $params{ostype} ? $params{ostype} : "hvm";
my $fullos = exists $params{fullos} ? $params{fullos} : 0;
my $filterref = exists $params{filterref} ? $params{filterref} : undef;
+ my %filterparams = exists $params{filterparams} ? %{$params{filterparams}} : ();
if ($fullos) {
my %config = $self->get_image($caps, $ostype);
@@ -793,7 +794,8 @@ sub generic_machine_domain {
source => "default",
model => "virtio",
mac => "52:54:00:11:11:11",
- filterref => $filterref);
+ filterref => $filterref,
+ filterparams => \%filterparams);
my $xml = $b->as_xml();
# Cleanup the temporary interface
$b->rminterface();
@@ -898,6 +900,7 @@ sub generic_domain {
my $fullos = exists $params{fullos} ? $params{fullos} : 0;
my $netmode = exists $params{netmode} ? $params{netmode} : undef;
my $filterref = exists $params{filterref} ? $params{filterref} : undef;
+ my %filterparams = exists $params{filterparams} ? %{$params{filterparams}} : ();
my $caps = Sys::Virt::TCK::Capabilities->new(xml =>
$self->conn->get_capabilities);
@@ -918,7 +921,8 @@ sub generic_domain {
caps => $caps,
ostype => $ostype,
fullos => $fullos,
- filterref => $filterref);
+ filterref => $filterref,
+ filterparams => \%filterparams);
}
if ($netmode) {
if ($netmode eq "vepa") {
@@ -934,7 +938,8 @@ sub generic_domain {
source => "default",
model => "virtio",
mac => "52:54:00:11:11:11",
- filterref => $filterref);
+ filterref => $filterref,
+ filterparams => \%filterparams);
}
}
return $b;
diff --git a/lib/Sys/Virt/TCK/DomainBuilder.pm b/lib/Sys/Virt/TCK/DomainBuilder.pm
index fb9a31f..83cea15 100644
--- a/lib/Sys/Virt/TCK/DomainBuilder.pm
+++ b/lib/Sys/Virt/TCK/DomainBuilder.pm
@@ -459,8 +459,14 @@ sub as_xml {
type => $interface->{model});
}
if ($interface->{filterref}) {
- $w->emptyTag("filterref",
+ $w->startTag("filterref",
filter => $interface->{filterref});
+ foreach my $paramname (keys %{$interface->{filterparams}}) {
+ $w->emptyTag("parameter",
+ name => $paramname,
+ value =>
$interface->{filterparams}->{$paramname});
+ }
+ $w->endTag("filterref");
}
$w->endTag("interface");
}
diff --git a/scripts/nwfilter/220-no-ip-spoofing.t
b/scripts/nwfilter/220-no-ip-spoofing.t
index 09bd51c..2f454c5 100644
--- a/scripts/nwfilter/220-no-ip-spoofing.t
+++ b/scripts/nwfilter/220-no-ip-spoofing.t
@@ -42,10 +42,19 @@ END {
$tck->cleanup if $tck;
}
+my $networkip = get_network_ip($conn, "default");
+my $networkipaddr = $networkip->addr();
+diag "network ip is $networkip, individual ip is $networkipaddr";
+
+
# create first domain and start it
my $xml = $tck->generic_domain(name => "tck", fullos => 1,
netmode => "network",
- filterref => "clean-traffic")->as_xml();
+ filterref => "clean-traffic",
+ filterparams => {
+ CTRL_IP_LEARNING => "dhcp",
+ DHCPSERVER => $networkipaddr
+ })->as_xml();
my $dom;
ok_domain(sub { $dom = $conn->define_domain($xml) }, "created persistent domain
object");
--
2.14.3