diff options
author | Jake Hunsaker <jhunsake@redhat.com> | 2022-10-05 14:30:30 -0400 |
---|---|---|
committer | Jake Hunsaker <jhunsake@redhat.com> | 2022-10-18 11:16:18 -0400 |
commit | 28f7eceb0eea69956584938145bc0bbae87f486b (patch) | |
tree | cee9f351182e50498c0a241139635e3829924314 | |
parent | f202b3ad1a18d555d2affa8d61bff34627b4b79c (diff) | |
download | sos-28f7eceb0eea69956584938145bc0bbae87f486b.tar.gz |
[etcd] Update plugin for containerized deployment
Today, etcd is almost exclusively deployed in a container for
kubernetes/OCP clusters. This commit serves to update the plugin to be
primarily designed for those types of deployments, and removes the v1
and v2 collections.
Resolves: #2906
Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
-rw-r--r-- | sos/report/plugins/etcd.py | 73 |
1 files changed, 30 insertions, 43 deletions
diff --git a/sos/report/plugins/etcd.py b/sos/report/plugins/etcd.py index d1b7ff90..6b76674b 100644 --- a/sos/report/plugins/etcd.py +++ b/sos/report/plugins/etcd.py @@ -13,71 +13,58 @@ from sos.report.plugins import Plugin, RedHatPlugin class etcd(Plugin, RedHatPlugin): + """The etcd plugin collects information from the etcd key-value store. It + is primarily used by Kubernetes/OpenShift clusters and is often run inside + a container within the cluster. + + Collections will default to executing within an `etcdctl` container, if one + is present, and only execute on the host if such a container is not + currently running. The `etcdctl` name preference is adopted from OpenShift + Container Platform deployments. + + This plugin is written for etcd v3 and later. + """ short_desc = 'etcd plugin' plugin_name = 'etcd' packages = ('etcd',) profiles = ('container', 'system', 'services', 'cluster') - files = ('/etc/origin/node/pods/etcd.yaml',) + files = ('/etc/etcd/etcd.conf',) + containers = ('etcdctl', 'etcd') services = ('etcd',) def setup(self): - if self.path_exists('/etc/origin/node/pods/etcd.yaml'): - etcd_cmd = 'master-exec etcd etcd etcdctl' - else: - etcd_cmd = 'etcdctl' + + etcd_con = None + for con in self.containers: + if self.get_container_by_name(con): + etcd_con = con + break self.add_file_tags({ '/etc/etcd/etcd.conf': 'etcd_conf' }) - etcd_url = self.get_etcd_url() - self.add_forbidden_path([ '/etc/etcd/ca', '/etc/etcd/*.key' ]) - self.add_copy_spec('/etc/etcd') + + self.add_cmd_output('ls -lR /var/lib/etcd/', container=etcd_con) + self.add_copy_spec('/etc/etcd', container=etcd_con) subcmds = [ - '--version', + 'version', 'member list', - 'cluster-health', - 'ls --recursive', - ] - - self.add_cmd_output(['%s %s' % (etcd_cmd, sub) for sub in subcmds]) - - urls = [ - '/v2/stats/leader', - '/v2/stats/self', - '/v2/stats/store', + 'alarm list', + 'endpoint status', + 'endpoint health' ] - if etcd_url: - self.add_cmd_output(['curl -s %s%s' % (etcd_url, u) for u in urls]) - - self.add_cmd_output("ls -lR /var/lib/etcd/") - - def get_etcd_url(self): - try: - with open(self.path_join('/etc/etcd/etcd.conf'), 'r') as ef: - for line in ef: - if line.startswith('ETCD_LISTEN_CLIENT_URLS'): - return line.split('=')[1].replace('"', '').strip() - # If we can't read etcd.conf, assume defaults by etcd version - except IOError: - # assume v3 is the default - url = 'http://localhost:2379' - try: - ver = self.policy.package_manager.packages['etcd'] - ver = ver['version'][0] - if ver == '2': - url = 'http://localhost:4001' - except Exception: - # fallback when etcd is not installed - pass - return url + self.add_cmd_output( + [f"etcdctl {sub}" for sub in subcmds], + container=etcd_con + ) # vim: et ts=5 sw=4 |