diff mbox series

[ovs-dev] tests: Fix frequent failure of "4 HV, 1 LS, 1 LR, packet test with HA distributed router gateway port:".

Message ID 20210417203952.1447048-1-numans@ovn.org
State Accepted
Headers show
Series [ovs-dev] tests: Fix frequent failure of "4 HV, 1 LS, 1 LR, packet test with HA distributed router gateway port:". | expand

Commit Message

Numan Siddique April 17, 2021, 8:39 p.m. UTC
From: Numan Siddique <numans@ovn.org>

This test is failing quite often due to timing issues.  The failures are
mainly due to the packet not received by the other side of the tunnel.
The test case resets the pcap file and then injects the packet.  And
this packet gets lost sometimes if the pcap files are not reset yet.
To fix this issue the test now ensures that ovs-vswitchd resets the
pcap file before injecting the packet.  The test also now adds
some waits to make sure flows related to tunnels are programmed
when the chassisresident port moves from one gw chassis to other.

Signed-off-by: Numan Siddique <numans@ovn.org>
---
 tests/ovn-macros.at | 18 ++++++++++++++++++
 tests/ovn.at        | 31 +++++++++++++++++++------------
 2 files changed, 37 insertions(+), 12 deletions(-)

Comments

Mark Michelson April 20, 2021, 5:54 p.m. UTC | #1
Looks good and passes for me regularly. I'm curious if this issue with 
the pcap file is common across other failing tests.

Acked-by: Mark Michelson <mmichels@redhat.com>

On 4/17/21 4:39 PM, numans@ovn.org wrote:
> From: Numan Siddique <numans@ovn.org>
> 
> This test is failing quite often due to timing issues.  The failures are
> mainly due to the packet not received by the other side of the tunnel.
> The test case resets the pcap file and then injects the packet.  And
> this packet gets lost sometimes if the pcap files are not reset yet.
> To fix this issue the test now ensures that ovs-vswitchd resets the
> pcap file before injecting the packet.  The test also now adds
> some waits to make sure flows related to tunnels are programmed
> when the chassisresident port moves from one gw chassis to other.
> 
> Signed-off-by: Numan Siddique <numans@ovn.org>
> ---
>   tests/ovn-macros.at | 18 ++++++++++++++++++
>   tests/ovn.at        | 31 +++++++++++++++++++------------
>   2 files changed, 37 insertions(+), 12 deletions(-)
> 
> diff --git a/tests/ovn-macros.at b/tests/ovn-macros.at
> index 25f3dbe348..9a05359ba5 100644
> --- a/tests/ovn-macros.at
> +++ b/tests/ovn-macros.at
> @@ -487,6 +487,24 @@ wait_for_ports_up() {
>           done
>       fi
>   }
> +
> +# reset_pcap_file iface pcap_file
> +# Resets the pcap file associates with OVS interface.  should be used
> +# with dummy datapath.
> +reset_iface_pcap_file() {
> +    local iface=$1
> +    local pcap_file=$2
> +    check rm -f dummy-*.pcap
> +    check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
> +options:rxq_pcap=dummy-rx.pcap
> +    OVS_WAIT_WHILE([test 24 = $(wc -c dummy-tx.pcap | cut -d " " -f1)])
> +    check rm -f ${pcap_file}*.pcap
> +    check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
> +options:rxq_pcap=${pcap_file}-rx.pcap
> +
> +    OVS_WAIT_WHILE([test 24 = $(wc -c ${pcap_file}-tx.pcap | cut -d " " -f1)])
> +}
> +
>   OVS_END_SHELL_HELPERS
>   
>   m4_define([OVN_POPULATE_ARP], [AT_CHECK(ovn_populate_arp__, [0], [ignore])])
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 4c3d76d573..71cc7118ba 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -10096,15 +10096,12 @@ AT_CHECK([ovn-nbctl --wait=sb sync], [0], [ignore])
>   ovn-sbctl dump-flows > sbflows
>   AT_CAPTURE_FILE([sbflows])
>   
> -reset_pcap_file() {
> -    local iface=$1
> -    local pcap_file=$2
> -    check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
> -options:rxq_pcap=dummy-rx.pcap
> -    rm -f ${pcap_file}*.pcap
> -    check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
> -options:rxq_pcap=${pcap_file}-rx.pcap
> -}
> +hv1_gw1_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-gw1-0)
> +hv1_gw2_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-gw2-0)
> +
> +OVS_WAIT_UNTIL([
> +    test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw1_ofport,$hv1_gw2_ofport")
> +])
>   
>   test_ip_packet()
>   {
> @@ -10150,13 +10147,13 @@ test_ip_packet()
>       echo $expected > ext1-vif1.expected
>       exp_gw_ip_garp=ffffffffffff00000201020308060001080006040001000002010203ac100101000000000000ac100101
>       echo $exp_gw_ip_garp >> ext1-vif1.expected
> -    as $active_gw reset_pcap_file br-phys_n1 $active_gw/br-phys_n1
> +    as $active_gw reset_iface_pcap_file br-phys_n1 $active_gw/br-phys_n1
>   
>       if test $backup_vswitchd_dead != 1; then
>           # Reset the file only if vswitchd in backup gw is alive
> -        as $backup_gw reset_pcap_file br-phys_n1 $backup_gw/br-phys_n1
> +        as $backup_gw reset_iface_pcap_file br-phys_n1 $backup_gw/br-phys_n1
>       fi
> -    as ext1 reset_pcap_file ext1-vif1 ext1/vif1
> +    as ext1 reset_iface_pcap_file ext1-vif1 ext1/vif1
>   
>       # Resend packet from foo1 to outside1
>       check as hv1 ovs-appctl netdev-dummy/receive hv1-vif1 $packet
> @@ -10208,6 +10205,10 @@ AT_CHECK(
>   <1>
>   ])
>   
> +OVS_WAIT_UNTIL([
> +    test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw2_ofport,$hv1_gw1_ofport")
> +])
> +
>   test_ip_packet gw2 gw1 0
>   
>   # Get the claim count of both gw1 and gw2.
> @@ -10228,6 +10229,12 @@ OVS_WAIT_UNTIL([test $gw1_claim_ct = `cat gw1/ovn-controller.log \
>   AT_CHECK([test $gw2_claim_ct = `cat gw2/ovn-controller.log | \
>   grep -c "cr-alice: Claiming"`])
>   
> +OVS_WAIT_UNTIL([
> +    bfd_status=$(as hv1 ovs-vsctl get interface ovn-gw2-0 bfd_status:state)
> +    echo "bfd status = $bfd_status"
> +    test "$bfd_status" = "down"
> +])
> +
>   test_ip_packet gw1 gw2 1
>   
>   as gw2
>
Numan Siddique April 20, 2021, 10:54 p.m. UTC | #2
On Tue, Apr 20, 2021 at 1:55 PM Mark Michelson <mmichels@redhat.com> wrote:
>
> Looks good and passes for me regularly. I'm curious if this issue with
> the pcap file is common across other failing tests.

It could be.  That's why I thought adding the reset pcap file function
as a common
function. We should change the existing tests to use this new function.
>
> Acked-by: Mark Michelson <mmichels@redhat.com>

Thanks. I applied this patch to the main branch.

Numan

>
> On 4/17/21 4:39 PM, numans@ovn.org wrote:
> > From: Numan Siddique <numans@ovn.org>
> >
> > This test is failing quite often due to timing issues.  The failures are
> > mainly due to the packet not received by the other side of the tunnel.
> > The test case resets the pcap file and then injects the packet.  And
> > this packet gets lost sometimes if the pcap files are not reset yet.
> > To fix this issue the test now ensures that ovs-vswitchd resets the
> > pcap file before injecting the packet.  The test also now adds
> > some waits to make sure flows related to tunnels are programmed
> > when the chassisresident port moves from one gw chassis to other.
> >
> > Signed-off-by: Numan Siddique <numans@ovn.org>
> > ---
> >   tests/ovn-macros.at | 18 ++++++++++++++++++
> >   tests/ovn.at        | 31 +++++++++++++++++++------------
> >   2 files changed, 37 insertions(+), 12 deletions(-)
> >
> > diff --git a/tests/ovn-macros.at b/tests/ovn-macros.at
> > index 25f3dbe348..9a05359ba5 100644
> > --- a/tests/ovn-macros.at
> > +++ b/tests/ovn-macros.at
> > @@ -487,6 +487,24 @@ wait_for_ports_up() {
> >           done
> >       fi
> >   }
> > +
> > +# reset_pcap_file iface pcap_file
> > +# Resets the pcap file associates with OVS interface.  should be used
> > +# with dummy datapath.
> > +reset_iface_pcap_file() {
> > +    local iface=$1
> > +    local pcap_file=$2
> > +    check rm -f dummy-*.pcap
> > +    check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
> > +options:rxq_pcap=dummy-rx.pcap
> > +    OVS_WAIT_WHILE([test 24 = $(wc -c dummy-tx.pcap | cut -d " " -f1)])
> > +    check rm -f ${pcap_file}*.pcap
> > +    check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
> > +options:rxq_pcap=${pcap_file}-rx.pcap
> > +
> > +    OVS_WAIT_WHILE([test 24 = $(wc -c ${pcap_file}-tx.pcap | cut -d " " -f1)])
> > +}
> > +
> >   OVS_END_SHELL_HELPERS
> >
> >   m4_define([OVN_POPULATE_ARP], [AT_CHECK(ovn_populate_arp__, [0], [ignore])])
> > diff --git a/tests/ovn.at b/tests/ovn.at
> > index 4c3d76d573..71cc7118ba 100644
> > --- a/tests/ovn.at
> > +++ b/tests/ovn.at
> > @@ -10096,15 +10096,12 @@ AT_CHECK([ovn-nbctl --wait=sb sync], [0], [ignore])
> >   ovn-sbctl dump-flows > sbflows
> >   AT_CAPTURE_FILE([sbflows])
> >
> > -reset_pcap_file() {
> > -    local iface=$1
> > -    local pcap_file=$2
> > -    check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
> > -options:rxq_pcap=dummy-rx.pcap
> > -    rm -f ${pcap_file}*.pcap
> > -    check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
> > -options:rxq_pcap=${pcap_file}-rx.pcap
> > -}
> > +hv1_gw1_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-gw1-0)
> > +hv1_gw2_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-gw2-0)
> > +
> > +OVS_WAIT_UNTIL([
> > +    test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw1_ofport,$hv1_gw2_ofport")
> > +])
> >
> >   test_ip_packet()
> >   {
> > @@ -10150,13 +10147,13 @@ test_ip_packet()
> >       echo $expected > ext1-vif1.expected
> >       exp_gw_ip_garp=ffffffffffff00000201020308060001080006040001000002010203ac100101000000000000ac100101
> >       echo $exp_gw_ip_garp >> ext1-vif1.expected
> > -    as $active_gw reset_pcap_file br-phys_n1 $active_gw/br-phys_n1
> > +    as $active_gw reset_iface_pcap_file br-phys_n1 $active_gw/br-phys_n1
> >
> >       if test $backup_vswitchd_dead != 1; then
> >           # Reset the file only if vswitchd in backup gw is alive
> > -        as $backup_gw reset_pcap_file br-phys_n1 $backup_gw/br-phys_n1
> > +        as $backup_gw reset_iface_pcap_file br-phys_n1 $backup_gw/br-phys_n1
> >       fi
> > -    as ext1 reset_pcap_file ext1-vif1 ext1/vif1
> > +    as ext1 reset_iface_pcap_file ext1-vif1 ext1/vif1
> >
> >       # Resend packet from foo1 to outside1
> >       check as hv1 ovs-appctl netdev-dummy/receive hv1-vif1 $packet
> > @@ -10208,6 +10205,10 @@ AT_CHECK(
> >   <1>
> >   ])
> >
> > +OVS_WAIT_UNTIL([
> > +    test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw2_ofport,$hv1_gw1_ofport")
> > +])
> > +
> >   test_ip_packet gw2 gw1 0
> >
> >   # Get the claim count of both gw1 and gw2.
> > @@ -10228,6 +10229,12 @@ OVS_WAIT_UNTIL([test $gw1_claim_ct = `cat gw1/ovn-controller.log \
> >   AT_CHECK([test $gw2_claim_ct = `cat gw2/ovn-controller.log | \
> >   grep -c "cr-alice: Claiming"`])
> >
> > +OVS_WAIT_UNTIL([
> > +    bfd_status=$(as hv1 ovs-vsctl get interface ovn-gw2-0 bfd_status:state)
> > +    echo "bfd status = $bfd_status"
> > +    test "$bfd_status" = "down"
> > +])
> > +
> >   test_ip_packet gw1 gw2 1
> >
> >   as gw2
> >
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
diff mbox series

Patch

diff --git a/tests/ovn-macros.at b/tests/ovn-macros.at
index 25f3dbe348..9a05359ba5 100644
--- a/tests/ovn-macros.at
+++ b/tests/ovn-macros.at
@@ -487,6 +487,24 @@  wait_for_ports_up() {
         done
     fi
 }
+
+# reset_pcap_file iface pcap_file
+# Resets the pcap file associates with OVS interface.  should be used
+# with dummy datapath.
+reset_iface_pcap_file() {
+    local iface=$1
+    local pcap_file=$2
+    check rm -f dummy-*.pcap
+    check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
+options:rxq_pcap=dummy-rx.pcap
+    OVS_WAIT_WHILE([test 24 = $(wc -c dummy-tx.pcap | cut -d " " -f1)])
+    check rm -f ${pcap_file}*.pcap
+    check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
+options:rxq_pcap=${pcap_file}-rx.pcap
+
+    OVS_WAIT_WHILE([test 24 = $(wc -c ${pcap_file}-tx.pcap | cut -d " " -f1)])
+}
+
 OVS_END_SHELL_HELPERS
 
 m4_define([OVN_POPULATE_ARP], [AT_CHECK(ovn_populate_arp__, [0], [ignore])])
diff --git a/tests/ovn.at b/tests/ovn.at
index 4c3d76d573..71cc7118ba 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -10096,15 +10096,12 @@  AT_CHECK([ovn-nbctl --wait=sb sync], [0], [ignore])
 ovn-sbctl dump-flows > sbflows
 AT_CAPTURE_FILE([sbflows])
 
-reset_pcap_file() {
-    local iface=$1
-    local pcap_file=$2
-    check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
-options:rxq_pcap=dummy-rx.pcap
-    rm -f ${pcap_file}*.pcap
-    check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
-options:rxq_pcap=${pcap_file}-rx.pcap
-}
+hv1_gw1_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-gw1-0)
+hv1_gw2_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-gw2-0)
+
+OVS_WAIT_UNTIL([
+    test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw1_ofport,$hv1_gw2_ofport")
+])
 
 test_ip_packet()
 {
@@ -10150,13 +10147,13 @@  test_ip_packet()
     echo $expected > ext1-vif1.expected
     exp_gw_ip_garp=ffffffffffff00000201020308060001080006040001000002010203ac100101000000000000ac100101
     echo $exp_gw_ip_garp >> ext1-vif1.expected
-    as $active_gw reset_pcap_file br-phys_n1 $active_gw/br-phys_n1
+    as $active_gw reset_iface_pcap_file br-phys_n1 $active_gw/br-phys_n1
 
     if test $backup_vswitchd_dead != 1; then
         # Reset the file only if vswitchd in backup gw is alive
-        as $backup_gw reset_pcap_file br-phys_n1 $backup_gw/br-phys_n1
+        as $backup_gw reset_iface_pcap_file br-phys_n1 $backup_gw/br-phys_n1
     fi
-    as ext1 reset_pcap_file ext1-vif1 ext1/vif1
+    as ext1 reset_iface_pcap_file ext1-vif1 ext1/vif1
 
     # Resend packet from foo1 to outside1
     check as hv1 ovs-appctl netdev-dummy/receive hv1-vif1 $packet
@@ -10208,6 +10205,10 @@  AT_CHECK(
 <1>
 ])
 
+OVS_WAIT_UNTIL([
+    test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw2_ofport,$hv1_gw1_ofport")
+])
+
 test_ip_packet gw2 gw1 0
 
 # Get the claim count of both gw1 and gw2.
@@ -10228,6 +10229,12 @@  OVS_WAIT_UNTIL([test $gw1_claim_ct = `cat gw1/ovn-controller.log \
 AT_CHECK([test $gw2_claim_ct = `cat gw2/ovn-controller.log | \
 grep -c "cr-alice: Claiming"`])
 
+OVS_WAIT_UNTIL([
+    bfd_status=$(as hv1 ovs-vsctl get interface ovn-gw2-0 bfd_status:state)
+    echo "bfd status = $bfd_status"
+    test "$bfd_status" = "down"
+])
+
 test_ip_packet gw1 gw2 1
 
 as gw2