large commit. new code, with sensors, line count dropped, etc
diff --git a/nodes/ceph.py b/nodes/ceph.py
index 38ce177..793c021 100644
--- a/nodes/ceph.py
+++ b/nodes/ceph.py
@@ -1,6 +1,7 @@
""" Collect data about ceph nodes"""
import json
import logging
+import subprocess
from node import Node
@@ -10,14 +11,29 @@
logger = logging.getLogger("io-perf-tool")
-def discover_ceph_node(ip):
+def local_execute(cmd):
+ return subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
+
+
+def ssh_execute(ssh):
+ def closure(cmd):
+ _, chan, _ = ssh.exec_command(cmd)
+ return chan.read()
+ return closure
+
+
+def discover_ceph_nodes(ip):
""" Return list of ceph's nodes ips """
ips = {}
- ssh = connect(ip)
- osd_ips = get_osds_ips(ssh, get_osds_list(ssh))
- mon_ips = get_mons_or_mds_ips(ssh, "mon")
- mds_ips = get_mons_or_mds_ips(ssh, "mds")
+ if ip != 'local':
+ executor = ssh_execute(connect(ip))
+ else:
+ executor = local_execute
+
+ osd_ips = get_osds_ips(executor, get_osds_list(executor))
+ mon_ips = get_mons_or_mds_ips(executor, "mon")
+ mds_ips = get_mons_or_mds_ips(executor, "mds")
for ip in osd_ips:
url = "ssh://%s" % ip
@@ -31,29 +47,24 @@
url = "ssh://%s" % ip
ips.setdefault(url, []).append("ceph-mds")
- return [Node(ip=url, roles=list(roles)) for url, roles in ips.items()]
+ return [Node(url, list(roles)) for url, roles in ips.items()]
-def get_osds_list(ssh):
+def get_osds_list(executor):
""" Get list of osds id"""
- _, chan, _ = ssh.exec_command("ceph osd ls")
- return filter(None, chan.read().split("\n"))
+ return filter(None, executor("ceph osd ls").split("\n"))
-def get_mons_or_mds_ips(ssh, who):
+def get_mons_or_mds_ips(executor, who):
""" Return mon ip list
:param who - "mon" or "mds" """
- if who == "mon":
- _, chan, _ = ssh.exec_command("ceph mon dump")
- elif who == "mds":
- _, chan, _ = ssh.exec_command("ceph mds dump")
- else:
+ if who not in ("mon", "mds"):
raise ValueError(("'%s' in get_mons_or_mds_ips instead" +
"of mon/mds") % who)
- line_res = chan.read().split("\n")
- ips = set()
+ line_res = executor("ceph {0} dump".format(who)).split("\n")
+ ips = set()
for line in line_res:
fields = line.split()
@@ -67,12 +78,12 @@
return ips
-def get_osds_ips(ssh, osd_list):
+def get_osds_ips(executor, osd_list):
""" Get osd's ips
:param osd_list - list of osd names from osd ls command"""
ips = set()
for osd_id in osd_list:
- _, chan, _ = ssh.exec_command("ceph osd find {0}".format(osd_id))
- ip = json.loads(chan.read())["ip"]
- ips.add(ip.split(":")[0])
+ out = executor("ceph osd find {0}".format(osd_id))
+ ip = json.loads(out)["ip"]
+ ips.add(str(ip.split(":")[0]))
return ips