koder aka kdanilov | 168f609 | 2015-04-19 02:33:38 +0300 | [diff] [blame] | 1 | import os.path |
Yulia Portnova | 0e64ea2 | 2015-03-20 17:27:22 +0200 | [diff] [blame] | 2 | import logging |
koder aka kdanilov | cee4334 | 2015-04-14 22:52:53 +0300 | [diff] [blame] | 3 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 4 | from paramiko import AuthenticationException |
| 5 | |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 6 | from . import ceph |
| 7 | from . import fuel |
| 8 | from . import openstack |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 9 | from ..utils import parse_creds, StopTestError |
| 10 | from ..test_run_class import TestRun |
koder aka kdanilov | 3d2bc4f | 2016-11-12 18:31:18 +0200 | [diff] [blame^] | 11 | from ..node import Node |
Yulia Portnova | 0e64ea2 | 2015-03-20 17:27:22 +0200 | [diff] [blame] | 12 | |
| 13 | |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 14 | logger = logging.getLogger("wally.discover") |
| 15 | |
| 16 | |
koder aka kdanilov | 168f609 | 2015-04-19 02:33:38 +0300 | [diff] [blame] | 17 | openrc_templ = """#!/bin/sh |
| 18 | export LC_ALL=C |
| 19 | export OS_NO_CACHE='true' |
| 20 | export OS_TENANT_NAME='{tenant}' |
| 21 | export OS_USERNAME='{name}' |
| 22 | export OS_PASSWORD='{passwd}' |
| 23 | export OS_AUTH_URL='{auth_url}' |
Michael Semenov | 8d6c057 | 2015-08-25 12:59:05 +0300 | [diff] [blame] | 24 | export OS_INSECURE={insecure} |
koder aka kdanilov | 168f609 | 2015-04-19 02:33:38 +0300 | [diff] [blame] | 25 | export OS_AUTH_STRATEGY='keystone' |
| 26 | export OS_REGION_NAME='RegionOne' |
| 27 | export CINDER_ENDPOINT_TYPE='publicURL' |
| 28 | export GLANCE_ENDPOINT_TYPE='publicURL' |
| 29 | export KEYSTONE_ENDPOINT_TYPE='publicURL' |
| 30 | export NOVA_ENDPOINT_TYPE='publicURL' |
| 31 | export NEUTRON_ENDPOINT_TYPE='publicURL' |
| 32 | """ |
| 33 | |
| 34 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 35 | def discover(testrun: TestRun, discover_cfg, clusters_info, var_dir, discover_nodes=True): |
| 36 | """Discover nodes in clusters""" |
Yulia Portnova | 0e64ea2 | 2015-03-20 17:27:22 +0200 | [diff] [blame] | 37 | nodes_to_run = [] |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 38 | clean_data = None |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 39 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 40 | for cluster in discover_cfg: |
koder aka kdanilov | e87ae65 | 2015-04-20 02:14:35 +0300 | [diff] [blame] | 41 | if cluster == "openstack" and not discover_nodes: |
| 42 | logger.warning("Skip openstack cluster discovery") |
| 43 | elif cluster == "openstack" and discover_nodes: |
koder aka kdanilov | da45e88 | 2015-04-06 02:24:42 +0300 | [diff] [blame] | 44 | cluster_info = clusters_info["openstack"] |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 45 | conn = cluster_info['connection'] |
| 46 | user, passwd, tenant = parse_creds(conn['creds']) |
| 47 | |
| 48 | auth_data = dict( |
| 49 | auth_url=conn['auth_url'], |
| 50 | username=user, |
| 51 | api_key=passwd, |
| 52 | project_id=tenant) |
| 53 | |
Yulia Portnova | 0e64ea2 | 2015-03-20 17:27:22 +0200 | [diff] [blame] | 54 | if not conn: |
| 55 | logger.error("No connection provided for %s. Skipping" |
| 56 | % cluster) |
| 57 | continue |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 58 | |
Yulia Portnova | 0e64ea2 | 2015-03-20 17:27:22 +0200 | [diff] [blame] | 59 | logger.debug("Discovering openstack nodes " |
| 60 | "with connection details: %r" % |
| 61 | conn) |
| 62 | |
koder aka kdanilov | e06762a | 2015-03-22 23:32:09 +0200 | [diff] [blame] | 63 | os_nodes = openstack.discover_openstack_nodes(auth_data, |
| 64 | cluster_info) |
| 65 | nodes_to_run.extend(os_nodes) |
| 66 | |
koder aka kdanilov | c368eb6 | 2015-04-28 18:22:01 +0300 | [diff] [blame] | 67 | elif cluster == "fuel" or cluster == "fuel_openrc_only": |
| 68 | if cluster == "fuel_openrc_only": |
| 69 | discover_nodes = False |
| 70 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 71 | ssh_creds = clusters_info['fuel']['ssh_creds'] |
| 72 | fuel_node = Node(NodeInfo(ssh_creds, {'fuel_master'})) |
| 73 | |
| 74 | try: |
| 75 | fuel_node.connect_ssh() |
| 76 | except AuthenticationException: |
| 77 | raise StopTestError("Wrong fuel credentials") |
| 78 | except Exception: |
| 79 | logger.exception("While connection to FUEL") |
| 80 | raise StopTestError("Failed to connect to FUEL") |
| 81 | |
| 82 | fuel_node.connect_rpc() |
| 83 | |
| 84 | res = fuel.discover_fuel_nodes(fuel_node, |
| 85 | clusters_info['fuel'], |
koder aka kdanilov | e87ae65 | 2015-04-20 02:14:35 +0300 | [diff] [blame] | 86 | discover_nodes) |
koder aka kdanilov | 05e15b9 | 2016-02-07 19:32:46 +0200 | [diff] [blame] | 87 | nodes, clean_data, openrc_dict, version = res |
gstepanov | 59d80f7 | 2015-04-10 17:24:27 +0300 | [diff] [blame] | 88 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 89 | if openrc_dict: |
koder aka kdanilov | 05e15b9 | 2016-02-07 19:32:46 +0200 | [diff] [blame] | 90 | if version >= [8, 0] and openrc_dict['os_auth_url'].startswith("https://"): |
| 91 | logger.warning("Fixing FUEL 8.0 AUTH url - replace https://->http://") |
| 92 | openrc_dict['os_auth_url'] = "http" + openrc_dict['os_auth_url'][5:] |
| 93 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 94 | testrun.fuel_openstack_creds = { |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 95 | 'name': openrc_dict['username'], |
| 96 | 'passwd': openrc_dict['password'], |
| 97 | 'tenant': openrc_dict['tenant_name'], |
koder aka kdanilov | b719743 | 2015-07-15 00:40:43 +0300 | [diff] [blame] | 98 | 'auth_url': openrc_dict['os_auth_url'], |
Michael Semenov | 8d6c057 | 2015-08-25 12:59:05 +0300 | [diff] [blame] | 99 | 'insecure': openrc_dict['insecure']} |
gstepanov | 59d80f7 | 2015-04-10 17:24:27 +0300 | [diff] [blame] | 100 | |
koder aka kdanilov | 168f609 | 2015-04-19 02:33:38 +0300 | [diff] [blame] | 101 | env_name = clusters_info['fuel']['openstack_env'] |
| 102 | env_f_name = env_name |
| 103 | for char in "-+ {}()[]": |
| 104 | env_f_name = env_f_name.replace(char, '_') |
| 105 | |
| 106 | fuel_openrc_fname = os.path.join(var_dir, |
| 107 | env_f_name + "_openrc") |
koder aka kdanilov | e87ae65 | 2015-04-20 02:14:35 +0300 | [diff] [blame] | 108 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 109 | if testrun.fuel_openstack_creds is not None: |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 110 | with open(fuel_openrc_fname, "w") as fd: |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame] | 111 | fd.write(openrc_templ.format(**testrun.fuel_openstack_creds)) |
| 112 | msg = "Openrc for cluster {0} saves into {1}" |
| 113 | logger.info(msg.format(env_name, fuel_openrc_fname)) |
gstepanov | 59d80f7 | 2015-04-10 17:24:27 +0300 | [diff] [blame] | 114 | nodes_to_run.extend(nodes) |
koder aka kdanilov | da45e88 | 2015-04-06 02:24:42 +0300 | [diff] [blame] | 115 | |
| 116 | elif cluster == "ceph": |
koder aka kdanilov | e87ae65 | 2015-04-20 02:14:35 +0300 | [diff] [blame] | 117 | if discover_nodes: |
| 118 | cluster_info = clusters_info["ceph"] |
| 119 | nodes_to_run.extend(ceph.discover_ceph_nodes(cluster_info)) |
| 120 | else: |
| 121 | logger.warning("Skip ceph cluster discovery") |
koder aka kdanilov | da45e88 | 2015-04-06 02:24:42 +0300 | [diff] [blame] | 122 | else: |
| 123 | msg_templ = "Unknown cluster type in 'discover' parameter: {0!r}" |
| 124 | raise ValueError(msg_templ.format(cluster)) |
koder aka kdanilov | 2c47309 | 2015-03-29 17:12:13 +0300 | [diff] [blame] | 125 | |
koder aka kdanilov | f86d7af | 2015-05-06 04:01:54 +0300 | [diff] [blame] | 126 | return nodes_to_run |