From 3f0ec3e55e7dcec89dd7fad10084ea7f16178608 Mon Sep 17 00:00:00 2001 From: Salvatore Daniele 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 --- 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 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 --- 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