Blob Blame History Raw
From 3f0ec3e55e7dcec89dd7fad10084ea7f16178608 Mon Sep 17 00:00:00 2001
From: Salvatore Daniele <sdaniele@redhat.com>
Date: Tue, 7 Sep 2021 13:48:22 -0400
Subject: [PATCH 1/2] [openvswitch] add ovs default OpenFlow protocols

ovs-vsctl list bridge can return an empty 'protocol' column even when
there are OpenFlow protocols in place by default.

ovs-ofctl --version will return the range of supported ofp and should
also be used to ensure flow information for relevant protocol versions
is collected.

OpenFlow default versions:
https://docs.openvswitch.org/en/latest/faq/openflow/

Signed-off-by: Salvatore Daniele <sdaniele@redhat.com>
---
 sos/report/plugins/openvswitch.py | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/sos/report/plugins/openvswitch.py b/sos/report/plugins/openvswitch.py
index cd897db2..92cc7259 100644
--- a/sos/report/plugins/openvswitch.py
+++ b/sos/report/plugins/openvswitch.py
@@ -206,6 +206,7 @@ class OpenVSwitch(Plugin):
 
         # Gather additional output for each OVS bridge on the host.
         br_list_result = self.collect_cmd_output("ovs-vsctl -t 5 list-br")
+        ofp_ver_result = self.collect_cmd_output("ovs-ofctl -t 5 --version")
         if br_list_result['status'] == 0:
             for br in br_list_result['output'].splitlines():
                 self.add_cmd_output([
@@ -232,6 +233,16 @@ class OpenVSwitch(Plugin):
                     "OpenFlow15"
                 ]
 
+                # Flow protocol hex identifiers
+                ofp_versions = {
+                    0x01: "OpenFlow10",
+                    0x02: "OpenFlow11",
+                    0x03: "OpenFlow12",
+                    0x04: "OpenFlow13",
+                    0x05: "OpenFlow14",
+                    0x06: "OpenFlow15",
+                }
+
                 # List protocols currently in use, if any
                 ovs_list_bridge_cmd = "ovs-vsctl -t 5 list bridge %s" % br
                 br_info = self.collect_cmd_output(ovs_list_bridge_cmd)
@@ -242,6 +253,21 @@ class OpenVSwitch(Plugin):
                         br_protos_ln = line[line.find("[")+1:line.find("]")]
                         br_protos = br_protos_ln.replace('"', '').split(", ")
 
+                # If 'list bridge' yeilded no protocols, use the range of
+                # protocols enabled by default on this version of ovs.
+                if br_protos == [''] and ofp_ver_result['output']:
+                    ofp_version_range = ofp_ver_result['output'].splitlines()
+                    ver_range = []
+
+                    for line in ofp_version_range:
+                        if "OpenFlow versions" in line:
+                            v = line.split("OpenFlow versions ")[1].split(":")
+                            ver_range = range(int(v[0], 16), int(v[1], 16)+1)
+
+                    for protocol in ver_range:
+                        if protocol in ofp_versions:
+                            br_protos.append(ofp_versions[protocol])
+
                 # Collect flow information for relevant protocol versions only
                 for flow in flow_versions:
                     if flow in br_protos:
-- 
2.31.1


From 5a006024f730213a726c70e82c5ecd2daf685b2b Mon Sep 17 00:00:00 2001
From: Salvatore Daniele <sdaniele@redhat.com>
Date: Tue, 7 Sep 2021 14:17:19 -0400
Subject: [PATCH 2/2] [openvswitch] add commands for offline analysis

Replicas of ovs-vswitchd and ovsdb-server can be recreated offline
using flow, group, and tlv dumps, and ovs conf.db. This allows for
offline anaylsis and the use of tools such as ovs-appctl
ofproto/trace and ovs-ofctl for debugging.

This patch ensures this information is available in the sos report.
The db is copied rather than collected using ovsdb-client list dump
for two reasons:

ovsdb-client requires interacting with the ovsdb-server which could
take it 'down' for some time, and impact large, busy clusters.

The list-dump is not in a format that can be used to restore the db
offline. All of the information in the list dump is available and more
by copying the db.

Signed-off-by: Salvatore Daniele <sdaniele@redhat.com>
---
 sos/report/plugins/openvswitch.py | 12 ++++++++++--
 sos/report/plugins/ovn_central.py |  1 +
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/sos/report/plugins/openvswitch.py b/sos/report/plugins/openvswitch.py
index 92cc7259..003596c6 100644
--- a/sos/report/plugins/openvswitch.py
+++ b/sos/report/plugins/openvswitch.py
@@ -75,12 +75,19 @@ class OpenVSwitch(Plugin):
             "/run/openvswitch/ovs-monitor-ipsec.pid"
         ])
 
+        self.add_copy_spec([
+            path_join('/usr/local/etc/openvswitch', 'conf.db'),
+            path_join('/etc/openvswitch', 'conf.db'),
+            path_join('/var/lib/openvswitch', 'conf.db'),
+        ])
+        ovs_dbdir = environ.get('OVS_DBDIR')
+        if ovs_dbdir:
+            self.add_copy_spec(path_join(ovs_dbdir, 'conf.db'))
+
         self.add_cmd_output([
             # The '-t 5' adds an upper bound on how long to wait to connect
             # to the Open vSwitch server, avoiding hangs when running sos.
             "ovs-vsctl -t 5 show",
-            # Gather the database.
-            "ovsdb-client -f list dump",
             # List the contents of important runtime directories
             "ls -laZ /run/openvswitch",
             "ls -laZ /dev/hugepages/",
@@ -276,6 +283,7 @@ class OpenVSwitch(Plugin):
                             "ovs-ofctl -O %s dump-groups %s" % (flow, br),
                             "ovs-ofctl -O %s dump-group-stats %s" % (flow, br),
                             "ovs-ofctl -O %s dump-flows %s" % (flow, br),
+                            "ovs-ofctl -O %s dump-tlv-map %s" % (flow, br),
                             "ovs-ofctl -O %s dump-ports-desc %s" % (flow, br)
                         ])
 
diff --git a/sos/report/plugins/ovn_central.py b/sos/report/plugins/ovn_central.py
index a4c483a9..d6647aad 100644
--- a/sos/report/plugins/ovn_central.py
+++ b/sos/report/plugins/ovn_central.py
@@ -138,6 +138,7 @@ class OVNCentral(Plugin):
                 os.path.join('/usr/local/etc/openvswitch', dbfile),
                 os.path.join('/etc/openvswitch', dbfile),
                 os.path.join('/var/lib/openvswitch', dbfile),
+                os.path.join('/var/lib/ovn/etc', dbfile),
             ])
             if ovs_dbdir:
                 self.add_copy_spec(os.path.join(ovs_dbdir, dbfile))
-- 
2.31.1