68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
# Copyright (C) 2022 Red Hat Inc., Jake Hunsaker <jhunsake@redhat.com>
|
|
|
|
# This file is part of the sos project: https://github.com/sosreport/sos
|
|
#
|
|
# This copyrighted material is made available to anyone wishing to use,
|
|
# modify, copy, or redistribute it subject to the terms and conditions of
|
|
# version 2 of the GNU General Public License.
|
|
#
|
|
# See the LICENSE file in the source distribution for further information.
|
|
|
|
import json
|
|
|
|
from sos.collector.clusters import Cluster
|
|
|
|
|
|
class ceph(Cluster):
|
|
"""
|
|
This cluster profile is for Ceph Storage clusters, and is primarily
|
|
built around Red Hat Ceph Storage 5. Nodes are enumerated via `cephadm`; if
|
|
your Ceph deployment uses cephadm but is not RHCS 5, this profile may work
|
|
as intended, but it is not currently guaranteed to do so. If you are using
|
|
such an environment and this profile does not work for you, please file a
|
|
bug report detailing what is failing.
|
|
|
|
By default, all nodes in the cluster will be returned for collection. This
|
|
may not be desirable, so users are encouraged to use the `labels` option
|
|
to specify a colon-delimited set of ceph node labels to restrict the list
|
|
of nodes to.
|
|
|
|
For example, using `-c ceph.labels=osd:mgr` will return only nodes labeled
|
|
with *either* `osd` or `mgr`.
|
|
"""
|
|
|
|
cluster_name = 'Ceph Storage Cluster'
|
|
sos_plugins = [
|
|
'ceph_common',
|
|
]
|
|
sos_options = {'log-size': 50}
|
|
packages = ('cephadm',)
|
|
option_list = [
|
|
('labels', '', 'Colon delimited list of labels to select nodes with')
|
|
]
|
|
|
|
def get_nodes(self):
|
|
self.nodes = []
|
|
ceph_out = self.exec_primary_cmd(
|
|
'cephadm shell -- ceph orch host ls --format json',
|
|
need_root=True
|
|
)
|
|
|
|
if not ceph_out['status'] == 0:
|
|
self.log_error(
|
|
f"Could not enumerate nodes via cephadm: {ceph_out['output']}"
|
|
)
|
|
return self.nodes
|
|
|
|
nodes = json.loads(ceph_out['output'].splitlines()[-1])
|
|
_labels = [lab for lab in self.get_option('labels').split(':') if lab]
|
|
for node in nodes:
|
|
if _labels and not any(_l in node['labels'] for _l in _labels):
|
|
self.log_debug(f"{node} filtered from list due to labels")
|
|
continue
|
|
self.nodes.append(node['hostname'])
|
|
|
|
return self.nodes
|
|
|
|
# vim: set et ts=4 sw=4 :
|