ceph discovering
diff --git a/nodes/ceph.py b/nodes/ceph.py
index e69de29..a2036b2 100644
--- a/nodes/ceph.py
+++ b/nodes/ceph.py
@@ -0,0 +1,114 @@
+""" Collect data about ceph nodes"""
+import json
+
+import sh
+from connection import Connection
+
+
+def discover_ceph_node():
+ """ Return list of ceph's nodes ips """
+
+ ips = {}
+ osd_list = get_osds_list()
+ osd_ips = get_osds_ips(osd_list)
+ mon_ips = get_mons_or_mds_ips("mon")
+ mds_ips = get_mons_or_mds_ips("mds")
+ for ip in osd_ips:
+ url = "ssh://%s" % ip
+ if url in ips:
+ ips[url].add("ceph-osd")
+ else:
+ ips[url] = ("ceph-osd")
+ for ip in mon_ips:
+ url = "ssh://%s" % ip
+ if url in ips:
+ ips[url].add("ceph-mon")
+ else:
+ ips[url] = ("ceph-mon")
+ for ip in mds_ips:
+ url = "ssh://%s" % ip
+ if url in ips:
+ ips[url].add("ceph-mds")
+ else:
+ ips[url] = ("ceph-mds")
+
+ res = []
+ for url, roles in ips:
+ item = Connection()
+ item.url = url
+ item.roles = list(roles)
+ res.append(item)
+
+ return res
+
+
+# internal services
+
+
+class CephException(Exception):
+ """ Exceptions from ceph call"""
+ pass
+
+class ParameterException(Exception):
+ """ Bad parameter in function"""
+ pass
+
+
+def get_osds_list():
+ """ Get list of osds id"""
+ try:
+ res = sh.ceph.osd.ls()
+ osd_list = [osd_id
+ for osd_id in res.split("\n") if osd_id != '']
+ return osd_list
+ except sh.CommandNotFound:
+ raise CephException("Ceph command not found")
+ except:
+ raise CephException("Ceph command 'osd ls' execution error")
+
+
+def get_mons_or_mds_ips(who):
+ """ Return mon ip list
+ :param who - "mon" or "mds" """
+ try:
+ ips = set()
+ if who == "mon":
+ res = sh.ceph.mon.dump()
+ elif who == "mds":
+ res = sh.ceph.mds.dump()
+ else:
+ raise ParameterException("'%s' in get_mons_or_mds_ips instead of mon/mds" % who)
+
+ line_res = res.split("\n")
+ for line in line_res:
+ fields = line.split()
+ if len(fields) > 2 and who in fields[2]:
+ ips.add(fields[1].split(":")[0])
+
+ return ips
+
+ except sh.CommandNotFound:
+ raise CephException("Ceph command not found")
+ except ParameterException as e:
+ raise e
+ except:
+ mes = "Ceph command '%s dump' execution error" % who
+ raise CephException(mes)
+
+
+def get_osds_ips(osd_list):
+ """ Get osd's ips
+ :param osd_list - list of osd names from osd ls command"""
+ try:
+ ips = set()
+ for osd_id in osd_list:
+ res = sh.ceph.osd.find(osd_id)
+ ip = json.loads(str(res))["ip"]
+ ips.add(ip.split(":")[0])
+ return ips
+
+ except sh.CommandNotFound:
+ raise CephException("Ceph command not found")
+ except:
+ raise CephException("Ceph command 'osd find' execution error")
+