blob: 119cbd0065722b8bd94ce4a61966163221f91f3d [file] [log] [blame]
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03001import logging
koder aka kdanilov73084622016-11-16 21:51:08 +02002import socket
3from typing import Dict, Any, Tuple, List, NamedTuple, Union
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +03004from urllib.parse import urlparse
koder aka kdanilovf86d7af2015-05-06 04:01:54 +03005
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +03006from .. import fuel_rest_api
koder aka kdanilov73084622016-11-16 21:51:08 +02007from ..node_interfaces import NodeInfo, IRPCNode
8from ..ssh_utils import ConnCreds
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +03009from ..utils import parse_creds, check_input_param
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030010
11logger = logging.getLogger("wally.discover")
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030012
13
koder aka kdanilov73084622016-11-16 21:51:08 +020014FuelNodeInfo = NamedTuple("FuelNodeInfo",
15 [("version", List[int]),
16 ("fuel_ext_iface", str),
17 ("openrc", Dict[str, Union[str, bool]])])
18
19
20def discover_fuel_nodes(fuel_master_node: IRPCNode,
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030021 fuel_data: Dict[str, Any],
koder aka kdanilov73084622016-11-16 21:51:08 +020022 discover_nodes: bool = True) -> Tuple[List[NodeInfo], FuelNodeInfo]:
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030023 """Discover nodes in fuel cluster, get openrc for selected cluster"""
24
25 # parse FUEL REST credentials
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030026 username, tenant_name, password = parse_creds(fuel_data['creds'])
27 creds = {"username": username,
28 "tenant_name": tenant_name,
29 "password": password}
30
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030031 # connect to FUEL
32 conn = fuel_rest_api.KeystoneAuth(fuel_data['url'], creds, headers=None)
koder aka kdanilovf86d7af2015-05-06 04:01:54 +030033 msg = "openstack_env should be provided in fuel config"
34 check_input_param('openstack_env' in fuel_data, msg)
35
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030036 # get cluster information from REST API
37 cluster_id = fuel_rest_api.get_cluster_id(conn, fuel_data['openstack_env'])
38 cluster = fuel_rest_api.reflect_cluster(conn, cluster_id)
39 version = fuel_rest_api.FuelInfo(conn).get_version()
koder aka kdanilove87ae652015-04-20 02:14:35 +030040
41 if not discover_nodes:
42 logger.warning("Skip fuel cluster discovery")
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030043 return [], FuelNodeInfo(version, None, cluster.get_openrc())
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030044
45 fuel_nodes = list(cluster.get_nodes())
46
koder aka kdanilov416b87a2015-05-12 00:26:04 +030047 logger.info("Found FUEL {0}".format(".".join(map(str, version))))
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030048
49 network = 'fuelweb_admin' if version >= [6, 0] else 'admin'
50
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030051 fuel_host = urlparse(fuel_data['url']).hostname
52 fuel_ip = socket.gethostbyname(fuel_host)
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030053 fuel_ext_iface = fuel_master_node.get_interface(fuel_ip)
koder aka kdanilovf86d7af2015-05-06 04:01:54 +030054
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030055 # get FUEL master key to connect to cluster nodes via ssh
koder aka kdanilovf86d7af2015-05-06 04:01:54 +030056 logger.debug("Downloading fuel master key")
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030057 fuel_key = fuel_master_node.get_file_content('/root/.ssh/id_rsa')
58
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030059 nodes = []
koder aka kdanilov73084622016-11-16 21:51:08 +020060 for fuel_node in fuel_nodes:
61 ip = str(fuel_node.get_ip(network))
62 nodes.append(NodeInfo(ConnCreds(ip, "root", key=fuel_key), roles=set(fuel_node.get_roles())))
koder aka kdanilovf86d7af2015-05-06 04:01:54 +030063
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030064 logger.debug("Found {} fuel nodes for env {}".format(len(nodes), fuel_data['openstack_env']))
koder aka kdanilovf86d7af2015-05-06 04:01:54 +030065
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030066 return nodes, FuelNodeInfo(version, fuel_ext_iface, cluster.get_openrc())
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030067