aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Alvarez <dalvarez@redhat.com>2019-07-23 12:44:07 +0200
committerBryn M. Reeves <bmr@redhat.com>2019-09-11 16:20:04 +0100
commit3c842046e9c4c5b371566347f51e5e242daf4f8d (patch)
tree9cabe48bfe4438fd5cb0310e6f80e77010325418
parent5fd4e850ad9a6636d0fb206954e8ab016584974d (diff)
downloadsos-3c842046e9c4c5b371566347f51e5e242daf4f8d.tar.gz
[ovn_central] Add support to containerized setups
This patch is adding support in ovn_central plugin to containerized setups. Now it's detecting if the OVN central services are running in container and execute the relevant commands inside it. The support covers both podman and docker runtimes. Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
-rw-r--r--sos/plugins/ovn_central.py94
1 files changed, 69 insertions, 25 deletions
diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
index 2d252625..a9fcdf33 100644
--- a/sos/plugins/ovn_central.py
+++ b/sos/plugins/ovn_central.py
@@ -19,30 +19,64 @@ class OVNCentral(Plugin):
"""
plugin_name = "ovn_central"
profiles = ('network', 'virt')
-
- def add_database_output(self, filename, cmds, ovn_cmd, skip=[]):
+ _container_runtime = None
+ _container_name = None
+
+ def get_tables_from_schema(self, filename, skip=[]):
+ if self._container_name:
+ cmd = "%s exec %s cat %s" % (
+ self._container_runtime, self._container_name, filename)
+ res = self.get_command_output(cmd)
+ if res['status'] != 0:
+ self._log_error("Could not retrieve DB schema file from "
+ "container %s" % self._container_name)
+ return
+ try:
+ db = json.loads(res['output'])
+ except Exception:
+ self._log_error("Cannot parse JSON file %s" % filename)
+ return
+ else:
+ try:
+ with open(filename, 'r') as f:
+ try:
+ db = json.load(f)
+ except Exception:
+ self._log_error(
+ "Cannot parse JSON file %s" % filename)
+ return
+ except IOError as ex:
+ self._log_error(
+ "Could not open DB schema file %s: %s" % (filename, ex))
+ return
try:
- with open(filename, 'r') as f:
- try:
- db = json.load(f)
- except Exception:
- # If json can't be parsed, then exit early
- self._log_error("Cannot parse JSON file %s" % filename)
- return
- try:
- for table in six.iterkeys(db['tables']):
- if table not in skip:
- cmds.append('%s list %s' % (ovn_cmd, table))
- except AttributeError:
- self._log_error("DB schema %s has no 'tables' key" %
- filename)
- return
- except IOError as ex:
- self._log_error("Could not open DB schema file %s: %s" % (filename,
- ex))
- return
+ return [table for table in six.iterkeys(
+ db['tables']) if table not in skip]
+ except AttributeError:
+ self._log_error("DB schema %s has no 'tables' key" % filename)
+
+ def add_database_output(self, tables, cmds, ovn_cmd):
+ for table in tables:
+ cmds.append('%s list %s' % (ovn_cmd, table))
+
+ def running_in_container(self):
+ for runtime in ["podman", "docker"]:
+ container_status = self.get_command_output(runtime + " ps")
+ if container_status['status'] == 0:
+ for line in container_status['output'].splitlines():
+ if "ovn-dbs-bundle" in line:
+ self._container_name = line.split()[-1]
+ self._container_runtime = runtime
+ return True
+ return False
+
+ def check_enabled(self):
+ return (self.running_in_container() or
+ super(OVNCentral, self).check_enabled())
def setup(self):
+ containerized = self.running_in_container()
+
ovs_rundir = os.environ.get('OVS_RUNDIR')
for pidfile in ['ovnnb_db.pid', 'ovnsb_db.pid', 'ovn-northd.pid']:
self.add_copy_spec([
@@ -68,10 +102,20 @@ class OVNCentral(Plugin):
schema_dir = '/usr/share/openvswitch'
- self.add_database_output(os.path.join(schema_dir, 'ovn-nb.ovsschema'),
- cmds, 'ovn-nbctl')
- self.add_database_output(os.path.join(schema_dir, 'ovn-sb.ovsschema'),
- cmds, 'ovn-sbctl', ['Logical_Flow'])
+ nb_tables = self.get_tables_from_schema(os.path.join(
+ schema_dir, 'ovn-nb.ovsschema'))
+ sb_tables = self.get_tables_from_schema(os.path.join(
+ schema_dir, 'ovn-sb.ovsschema'), ['Logical_Flow'])
+
+ self.add_database_output(nb_tables, cmds, 'ovn-nbctl')
+ self.add_database_output(sb_tables, cmds, 'ovn-sbctl')
+
+ # If OVN is containerized, we need to run the above commands inside
+ # the container.
+ if containerized:
+ cmds = ['%s exec %s %s' % (self._container_runtime,
+ self._container_name,
+ cmd) for cmd in cmds]
self.add_cmd_output(cmds)