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