[libvirt] [tck PATCH v2 3/4] set CTRL_IP_LEARNING and DHCPSERVER in filter during no-ip-spoofing test

Laine Stump laine at laine.org
Fri Mar 2 02:49:59 UTC 2018


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 at 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




More information about the libvir-list mailing list