blob: ae06cbc8ef34e0f9ff346e9b7519dd7314396974 [file] [log] [blame]
Ved-vampira915a012015-03-18 14:38:52 +03001""" Collect data about ceph nodes"""
2import json
koder aka kdanilov3a6633e2015-03-26 18:20:00 +02003import logging
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +03004from typing import Iterable
koder aka kdanilov3a6633e2015-03-26 18:20:00 +02005
Ved-vampira915a012015-03-18 14:38:52 +03006
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +03007from ..node import NodeInfo, Node
Ved-vampira915a012015-03-18 14:38:52 +03008
9
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030010logger = logging.getLogger("wally.discover")
koder aka kdanilov3a6633e2015-03-26 18:20:00 +020011
12
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030013def discover_ceph_nodes(node: Node) -> Iterable[NodeInfo]:
14 """Return list of ceph's nodes NodeInfo"""
Ved-vampira915a012015-03-18 14:38:52 +030015 ips = {}
koder aka kdanilove06762a2015-03-22 23:32:09 +020016
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030017 osd_ips = get_osds_ips(node, get_osds_list(node))
18 mon_ips = get_mons_or_mds_ips(node, "mon")
19 mds_ips = get_mons_or_mds_ips(node, "mds")
koder aka kdanilove06762a2015-03-22 23:32:09 +020020
Ved-vampira915a012015-03-18 14:38:52 +030021 for ip in osd_ips:
22 url = "ssh://%s" % ip
koder aka kdanilove06762a2015-03-22 23:32:09 +020023 ips.setdefault(url, []).append("ceph-osd")
24
Ved-vampira915a012015-03-18 14:38:52 +030025 for ip in mon_ips:
26 url = "ssh://%s" % ip
koder aka kdanilove06762a2015-03-22 23:32:09 +020027 ips.setdefault(url, []).append("ceph-mon")
28
Ved-vampira915a012015-03-18 14:38:52 +030029 for ip in mds_ips:
30 url = "ssh://%s" % ip
koder aka kdanilove06762a2015-03-22 23:32:09 +020031 ips.setdefault(url, []).append("ceph-mds")
Ved-vampira915a012015-03-18 14:38:52 +030032
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030033 return [NodeInfo(url, set(roles)) for url, roles in ips.items()]
Ved-vampira915a012015-03-18 14:38:52 +030034
35
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030036def get_osds_list(node: Node) -> Iterable[str]:
37 """Get list of osd's id"""
38 return filter(None, node.run("ceph osd ls").split("\n"))
Ved-vampira915a012015-03-18 14:38:52 +030039
40
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030041def get_mons_or_mds_ips(node: Node, who: str) -> Iterable[str]:
42 """Return mon ip list. who - mon/mds"""
43 assert who in ("mon", "mds"), \
44 "{!r} in get_mons_or_mds_ips instead of mon/mds".format(who)
Ved-vampira915a012015-03-18 14:38:52 +030045
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030046 line_res = node.run("ceph {0} dump".format(who)).split("\n")
Ved-vampira915a012015-03-18 14:38:52 +030047
koder aka kdanilov2c473092015-03-29 17:12:13 +030048 ips = set()
koder aka kdanilove06762a2015-03-22 23:32:09 +020049 for line in line_res:
50 fields = line.split()
koder aka kdanilove06762a2015-03-22 23:32:09 +020051 if len(fields) > 2 and who in fields[2]:
52 ips.add(fields[1].split(":")[0])
53
54 return ips
Ved-vampira915a012015-03-18 14:38:52 +030055
56
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030057def get_osds_ips(node: Node, osd_list: Iterable[str]) -> Iterable[str]:
58 """Get osd's ips. osd_list - list of osd names from osd ls command"""
koder aka kdanilove06762a2015-03-22 23:32:09 +020059 ips = set()
60 for osd_id in osd_list:
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030061 out = node.run("ceph osd find {0}".format(osd_id))
koder aka kdanilov2c473092015-03-29 17:12:13 +030062 ip = json.loads(out)["ip"]
63 ips.add(str(ip.split(":")[0]))
koder aka kdanilove06762a2015-03-22 23:32:09 +020064 return ips