| """ Collect data about ceph nodes""" |
| import json |
| |
| import sh |
| from node import Node |
| |
| |
| 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].append("ceph-osd") |
| else: |
| ips[url] = ["ceph-osd"] |
| for ip in mon_ips: |
| url = "ssh://%s" % ip |
| if url in ips: |
| ips[url].append("ceph-mon") |
| else: |
| ips[url] = ["ceph-mon"] |
| for ip in mds_ips: |
| url = "ssh://%s" % ip |
| if url in ips: |
| ips[url].append("ceph-mds") |
| else: |
| ips[url] = ["ceph-mds"] |
| |
| res = [] |
| for url, roles in ips: |
| res.append(Node(ip=url, roles=list(roles))) |
| |
| 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") |
| |