Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 1 | """ Collect data about ceph nodes""" |
| 2 | import json |
koder aka kdanilov | 3a6633e | 2015-03-26 18:20:00 +0200 | [diff] [blame] | 3 | import logging |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 4 | from typing import Iterable |
koder aka kdanilov | 3a6633e | 2015-03-26 18:20:00 +0200 | [diff] [blame] | 5 | |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 6 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 7 | from ..node import NodeInfo, Node |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 8 | |
| 9 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 10 | logger = logging.getLogger("wally.discover") |
koder aka kdanilov | 3a6633e | 2015-03-26 18:20:00 +0200 | [diff] [blame] | 11 | |
| 12 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 13 | def discover_ceph_nodes(node: Node) -> Iterable[NodeInfo]: |
| 14 | """Return list of ceph's nodes NodeInfo""" |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 15 | ips = {} |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 16 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 17 | 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 kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 20 | |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 21 | for ip in osd_ips: |
| 22 | url = "ssh://%s" % ip |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 23 | ips.setdefault(url, []).append("ceph-osd") |
| 24 | |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 25 | for ip in mon_ips: |
| 26 | url = "ssh://%s" % ip |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 27 | ips.setdefault(url, []).append("ceph-mon") |
| 28 | |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 29 | for ip in mds_ips: |
| 30 | url = "ssh://%s" % ip |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 31 | ips.setdefault(url, []).append("ceph-mds") |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 32 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 33 | return [NodeInfo(url, set(roles)) for url, roles in ips.items()] |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 34 | |
| 35 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 36 | def 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-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 39 | |
| 40 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 41 | def 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-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 45 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 46 | line_res = node.run("ceph {0} dump".format(who)).split("\n") |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 47 | |
koder aka kdanilov | 2c47309 | 2015-03-29 17:12:13 +0300 | [diff] [blame] | 48 | ips = set() |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 49 | for line in line_res: |
| 50 | fields = line.split() |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 51 | if len(fields) > 2 and who in fields[2]: |
| 52 | ips.add(fields[1].split(":")[0]) |
| 53 | |
| 54 | return ips |
Ved-vampir | a915a01 | 2015-03-18 14:38:52 +0300 | [diff] [blame] | 55 | |
| 56 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 57 | def 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 kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 59 | ips = set() |
| 60 | for osd_id in osd_list: |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 61 | out = node.run("ceph osd find {0}".format(osd_id)) |
koder aka kdanilov | 2c47309 | 2015-03-29 17:12:13 +0300 | [diff] [blame] | 62 | ip = json.loads(out)["ip"] |
| 63 | ips.add(str(ip.split(":")[0])) |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 64 | return ips |