[ovs-dev] [PATCH] utilities: Improve ovs-dpctl-top flow parsing

Jaime Caamaño Ruiz jcaamano at suse.com
Mon Aug 12 16:52:27 UTC 2019


* check that expected bytes and packets stats are correctly read from
  every flow.
* check that the expected elements are read for every field type
  aggregation.

Signed-off-by: Jaime Caamaño Ruiz <jcaamano at suse.com>
---
 utilities/ovs-dpctl-top.in | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/utilities/ovs-dpctl-top.in b/utilities/ovs-dpctl-top.in
index 7f0f1f8c2..d8889b932 100755
--- a/utilities/ovs-dpctl-top.in
+++ b/utilities/ovs-dpctl-top.in
@@ -291,8 +291,9 @@ def element_passthrough_get(field_type, element, stats_dict):
 # pylint: disable-msg=R0903
 class OutputFormat:
     """ Holds field_type and function to extract element value. """
-    def __init__(self, field_type, generator):
+    def __init__(self, field_type, elements, generator):
         self.field_type = field_type
+        self.elements = elements
         self.generator = generator
 
 ##
@@ -311,14 +312,14 @@ class OutputFormat:
 # All is added to the end of the OUTPUT_FORMAT list.
 ##
 OUTPUT_FORMAT = [
-    OutputFormat("in_port", element_passthrough_get),
-    OutputFormat("eth", element_eth_get),
-    OutputFormat("eth_type", element_passthrough_get),
-    OutputFormat("ipv4", element_ipv4_get),
-    OutputFormat("ipv6", element_ipv6_get),
-    OutputFormat("udp", element_dst_port_get),
-    OutputFormat("tcp", element_dst_port_get),
-    OutputFormat("tunnel", element_tunnel_get),
+    OutputFormat("in_port", (), element_passthrough_get),
+    OutputFormat("eth", ("src","dst"), element_eth_get),
+    OutputFormat("eth_type", (), element_passthrough_get),
+    OutputFormat("ipv4", ("src","dst"), element_ipv4_get),
+    OutputFormat("ipv6", ("src","dst"), element_ipv6_get),
+    OutputFormat("udp", ("src","dst"), element_dst_port_get),
+    OutputFormat("tcp", ("src","dst"), element_dst_port_get),
+    OutputFormat("tunnel", ("src","dst"), element_tunnel_get),
     ]
 ##
 
@@ -571,7 +572,7 @@ def flow_aggregate(fields_dict, stats_dict):
 
     for output_format in OUTPUT_FORMAT:
         field = fields_dict.get(output_format.field_type, None)
-        if (field):
+        if (field) and all (k in field for k in output_format.elements):
             obj = output_format.generator(output_format.field_type,
                                           field, stats_dict)
             result.append(obj)
@@ -967,7 +968,7 @@ class FlowDB:
                 raise ValueError("flow fields are missing %s", line)
 
             stats_dict = elements_to_dict(stats)
-            if (len(stats_dict) == 0):
+            if not all (k in stats_dict for k in ("packets","bytes")):
                 raise ValueError("statistics are missing %s.", line)
 
             ##
-- 
2.16.4



More information about the dev mailing list