Merge "Fix dump flows to ease debugging in UP4 and QoS tests"
diff --git a/TestON/tests/USECASE/SegmentRouting/QOS/QOS.py b/TestON/tests/USECASE/SegmentRouting/QOS/QOS.py
index 315328f..1b20ce8 100644
--- a/TestON/tests/USECASE/SegmentRouting/QOS/QOS.py
+++ b/TestON/tests/USECASE/SegmentRouting/QOS/QOS.py
@@ -28,6 +28,7 @@
         main.step("Start P4rt client and setup TRex")
         # Use the first available ONOS instance CLI
         onos_cli = main.Cluster.active(0).CLI
+        initial_flow_count = onos_cli.checkFlowCount()
         up4 = UP4()
         trex = Trex()
         # Get the P4RT client connected to UP4 in the first available ONOS instance
@@ -40,6 +41,11 @@
         main.step("Verify PDRs and FARs in ONOS")
         up4.verifyUp4Flow(onos_cli)
 
+        run.checkFlows(
+            main,
+            minFlowCount=initial_flow_count+(len(up4.emulated_ues)*2)
+        )
+
         # Load traffic config for the current test case
         main.step("Load test JSON config")
         cfgFile = main.configPath + "/tests/" + "leaf_edge_mobile.json"
@@ -72,6 +78,8 @@
         main.step("Verify removed PDRs and FARs from ONOS")
         up4.verifyNoUesFlow(onos_cli)
 
+        run.checkFlows(main, minFlowCount=initial_flow_count)
+
         main.step("Teardown")
         trex.teardown()
         up4.teardown()
diff --git a/TestON/tests/USECASE/SegmentRouting/UP4/UP4.py b/TestON/tests/USECASE/SegmentRouting/UP4/UP4.py
index 556304b..1395671 100644
--- a/TestON/tests/USECASE/SegmentRouting/UP4/UP4.py
+++ b/TestON/tests/USECASE/SegmentRouting/UP4/UP4.py
@@ -32,6 +32,7 @@
         main.step("Start scapy and p4rt client")
         # Use the first available ONOS instance CLI
         onos_cli = main.Cluster.active(0).CLI
+        initial_flow_count = onos_cli.checkFlowCount()
         up4 = UP4()
         # Get the P4RT client connected to UP4 in the first available ONOS instance
         up4.setup(main.Cluster.active(0).p4rtUp4)
@@ -40,6 +41,11 @@
         up4.attachUes()
         up4.verifyUp4Flow(onos_cli)
 
+        run.checkFlows(
+            main,
+            minFlowCount=initial_flow_count+(len(up4.emulated_ues)*2)
+        )
+
         # ------- Test Upstream traffic (enb->pdn)
         main.step("Test upstream traffic")
         up4.testUpstreamTraffic()
@@ -52,11 +58,13 @@
         up4.detachUes()
         up4.verifyNoUesFlow(onos_cli)
 
+        run.checkFlows(main, minFlowCount=initial_flow_count)
+
         main.step("Stop scapy and p4rt client")
         up4.teardown()
         run.cleanup(main)
 
-    def CASE2(self):
+    def CASE2(self, main):
         main.case("BESS traffic routed")
         """
         Program PDRs and FARs for UEs managed via UP4
@@ -90,6 +98,7 @@
         main.step("Start scapy and p4rt client + Scapy on BESS Host")
         # Use the first available ONOS instance CLI
         onos_cli = main.Cluster.active(0).CLI
+        initial_flow_count = onos_cli.checkFlowCount()
         up4 = UP4()
         # Get the P4RT client connected to UP4 in the first available ONOS instance
         up4.setup(main.Cluster.active(0).p4rtUp4)
@@ -108,6 +117,11 @@
         up4.attachUes()
         up4.verifyUp4Flow(onos_cli)
 
+        run.checkFlows(
+            main,
+            minFlowCount=initial_flow_count+(len(up4.emulated_ues)*2)
+        )
+
         # ------------------- UPSTREAM -------------------
         # ------- eNB -> fabric -> BESS (encapped)
         main.step("Test upstream eNB -> fabric -> BESS")
@@ -237,6 +251,8 @@
         up4.detachUes()
         up4.verifyNoUesFlow(onos_cli)
 
+        run.checkFlows(main, minFlowCount=initial_flow_count)
+
         main.step("Stop scapy and p4rt client")
         up4.teardown()
         bess_host.stopScapy()
@@ -274,6 +290,7 @@
         up4_0 = UP4()
         up4_1 = UP4()
         up4_2 = UP4()
+        initial_flow_count = onos_cli_0.checkFlowCount()
 
         main.step("Program and Verify PDRs and FARs via UP4 on ONOS 0")
         up4_0.setup(main.Cluster.active(0).p4rtUp4, no_host=True)
@@ -281,6 +298,11 @@
         up4_0.verifyUp4Flow(onos_cli_0)
         up4_0.teardown()
 
+        run.checkFlows(
+            main,
+            minFlowCount=initial_flow_count+(len(up4_0.emulated_ues)*2)
+        )
+
         main.step("Verify PDRs and FARs number via UP4 P4RT on ONOS 1")
         up4_1.setup(main.Cluster.active(1).p4rtUp4, no_host=True)
         utilities.assert_equal(
@@ -316,6 +338,8 @@
         up4_2.detachUes()
         up4_2.verifyNoUesFlow(onos_cli_2)
 
+        run.checkFlows(main, minFlowCount=initial_flow_count)
+
         main.step("Verify no PDRs and FARs via UP4 P4RT on ONOS 2")
         utilities.assert_equal(
             expect=True,
@@ -394,12 +418,19 @@
         up4_1 = UP4()
         up4_2 = UP4()
 
+        initial_flow_count = onos_cli_0.checkFlowCount()
+
         main.step("Program and Verify PDRs and FARs via UP4 on ONOS 0")
         up4_0.setup(main.Cluster.active(0).p4rtUp4, no_host=True)
         up4_0.attachUes()
         up4_0.verifyUp4Flow(onos_cli_0)
         up4_0.teardown()
 
+        run.checkFlows(
+            main,
+            minFlowCount=initial_flow_count+(len(up4_0.emulated_ues)*2)
+        )
+
         onosPod = main.params["UP4_delete_pod"]
         # Exit from previous port forwarding, because we need to restore
         # port-forwarding after ONOS reboot.
@@ -439,6 +470,17 @@
         )
         up4_2.teardown()
 
+        main.step("Verify all active ONOS instances have the same number of flows")
+        onos_1_flow_count = onos_cli_1.checkFlowCount()
+        onos_2_flow_count = onos_cli_2.checkFlowCount()
+        utilities.assert_equal(
+            expect=True,
+            actual=onos_1_flow_count == onos_2_flow_count,
+            onpass="All ONOS instances have the same number of flows",
+            onfail="ONOS instances have different number of flows: (%d, %d)" % (
+                onos_1_flow_count, onos_2_flow_count)
+        )
+
         main.step("Verify ONOS 0 has restarted correctly")
         onosStarted = utilities.retry(
             f=kubectl_0.kubectlCheckPodReady,
@@ -498,11 +540,18 @@
             onfail="Stale PDRs and FARs"
         )
 
+        run.checkFlows(main, minFlowCount=initial_flow_count)
+
         main.step("Re-program PDRs and FARs via UP4 on ONOS 0 after restart")
         up4_0.attachUes()
         up4_0.verifyUp4Flow(onos_cli_0)
         up4_0.teardown()
 
+        run.checkFlows(
+            main,
+            minFlowCount=initial_flow_count+(len(up4_0.emulated_ues)*2)
+        )
+
         main.step("Verify PDRs and FARs via UP4 on ONOS 1")
         up4_1.setup(main.Cluster.active(1).p4rtUp4, no_host=True)
         up4_1.verifyUp4Flow(onos_cli_1)
@@ -524,4 +573,6 @@
         up4_1.verifyNoUesFlow(onos_cli_1)
         up4_1.teardown()
 
+        run.checkFlows(main, minFlowCount=initial_flow_count)
+
         run.cleanup(main)