koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 1 | import logging |
koder aka kdanilov | 7308462 | 2016-11-16 21:51:08 +0200 | [diff] [blame^] | 2 | import socket |
| 3 | from typing import Dict, Any, Tuple, List, NamedTuple, Union |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 4 | from urllib.parse import urlparse |
koder aka kdanilov | f86d7af | 2015-05-06 04:01:54 +0300 | [diff] [blame] | 5 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 6 | from .. import fuel_rest_api |
koder aka kdanilov | 7308462 | 2016-11-16 21:51:08 +0200 | [diff] [blame^] | 7 | from ..node_interfaces import NodeInfo, IRPCNode |
| 8 | from ..ssh_utils import ConnCreds |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 9 | from ..utils import parse_creds, check_input_param |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 10 | |
| 11 | logger = logging.getLogger("wally.discover") |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 12 | |
| 13 | |
koder aka kdanilov | 7308462 | 2016-11-16 21:51:08 +0200 | [diff] [blame^] | 14 | FuelNodeInfo = NamedTuple("FuelNodeInfo", |
| 15 | [("version", List[int]), |
| 16 | ("fuel_ext_iface", str), |
| 17 | ("openrc", Dict[str, Union[str, bool]])]) |
| 18 | |
| 19 | |
| 20 | def discover_fuel_nodes(fuel_master_node: IRPCNode, |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 21 | fuel_data: Dict[str, Any], |
koder aka kdanilov | 7308462 | 2016-11-16 21:51:08 +0200 | [diff] [blame^] | 22 | discover_nodes: bool = True) -> Tuple[List[NodeInfo], FuelNodeInfo]: |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 23 | """Discover nodes in fuel cluster, get openrc for selected cluster""" |
| 24 | |
| 25 | # parse FUEL REST credentials |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 26 | username, tenant_name, password = parse_creds(fuel_data['creds']) |
| 27 | creds = {"username": username, |
| 28 | "tenant_name": tenant_name, |
| 29 | "password": password} |
| 30 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 31 | # connect to FUEL |
| 32 | conn = fuel_rest_api.KeystoneAuth(fuel_data['url'], creds, headers=None) |
koder aka kdanilov | f86d7af | 2015-05-06 04:01:54 +0300 | [diff] [blame] | 33 | msg = "openstack_env should be provided in fuel config" |
| 34 | check_input_param('openstack_env' in fuel_data, msg) |
| 35 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 36 | # 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 kdanilov | e87ae65 | 2015-04-20 02:14:35 +0300 | [diff] [blame] | 40 | |
| 41 | if not discover_nodes: |
| 42 | logger.warning("Skip fuel cluster discovery") |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 43 | return [], FuelNodeInfo(version, None, cluster.get_openrc()) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 44 | |
| 45 | fuel_nodes = list(cluster.get_nodes()) |
| 46 | |
koder aka kdanilov | 416b87a | 2015-05-12 00:26:04 +0300 | [diff] [blame] | 47 | logger.info("Found FUEL {0}".format(".".join(map(str, version)))) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 48 | |
| 49 | network = 'fuelweb_admin' if version >= [6, 0] else 'admin' |
| 50 | |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 51 | fuel_host = urlparse(fuel_data['url']).hostname |
| 52 | fuel_ip = socket.gethostbyname(fuel_host) |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 53 | fuel_ext_iface = fuel_master_node.get_interface(fuel_ip) |
koder aka kdanilov | f86d7af | 2015-05-06 04:01:54 +0300 | [diff] [blame] | 54 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 55 | # get FUEL master key to connect to cluster nodes via ssh |
koder aka kdanilov | f86d7af | 2015-05-06 04:01:54 +0300 | [diff] [blame] | 56 | logger.debug("Downloading fuel master key") |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 57 | fuel_key = fuel_master_node.get_file_content('/root/.ssh/id_rsa') |
| 58 | |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 59 | nodes = [] |
koder aka kdanilov | 7308462 | 2016-11-16 21:51:08 +0200 | [diff] [blame^] | 60 | 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 kdanilov | f86d7af | 2015-05-06 04:01:54 +0300 | [diff] [blame] | 63 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 64 | logger.debug("Found {} fuel nodes for env {}".format(len(nodes), fuel_data['openstack_env'])) |
koder aka kdanilov | f86d7af | 2015-05-06 04:01:54 +0300 | [diff] [blame] | 65 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 66 | return nodes, FuelNodeInfo(version, fuel_ext_iface, cluster.get_openrc()) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 67 | |