1#!/usr/local/bin/python3.8
2
3# (c) 2013, Michael Scherer <misc@zarb.org>
4#
5# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
6
7from __future__ import (absolute_import, division, print_function)
8__metaclass__ = type
9
10DOCUMENTATION = '''
11---
12inventory: openshift
13short_description: Openshift gears external inventory script
14description:
15  - Generates inventory of Openshift gears using the REST interface
16  - this permit to reuse playbook to setup an Openshift gear
17author: Michael Scherer
18'''
19
20import json
21import os
22import os.path
23import sys
24import StringIO
25
26from ansible.module_utils.urls import open_url
27from ansible.module_utils.six.moves import configparser as ConfigParser
28
29configparser = None
30
31
32def get_from_rhc_config(variable):
33    global configparser
34    CONF_FILE = os.path.expanduser('~/.openshift/express.conf')
35    if os.path.exists(CONF_FILE):
36        if not configparser:
37            ini_str = '[root]\n' + open(CONF_FILE, 'r').read()
38            configparser = ConfigParser.SafeConfigParser()
39            configparser.readfp(StringIO.StringIO(ini_str))
40        try:
41            return configparser.get('root', variable)
42        except ConfigParser.NoOptionError:
43            return None
44
45
46def get_config(env_var, config_var):
47    result = os.getenv(env_var)
48    if not result:
49        result = get_from_rhc_config(config_var)
50    if not result:
51        sys.exit("failed=True msg='missing %s'" % env_var)
52    return result
53
54
55def get_json_from_api(url, username, password):
56    headers = {'Accept': 'application/json; version=1.5'}
57    response = open_url(url, headers=headers, url_username=username, url_password=password)
58    return json.loads(response.read())['data']
59
60
61username = get_config('ANSIBLE_OPENSHIFT_USERNAME', 'default_rhlogin')
62password = get_config('ANSIBLE_OPENSHIFT_PASSWORD', 'password')
63broker_url = 'https://%s/broker/rest/' % get_config('ANSIBLE_OPENSHIFT_BROKER', 'libra_server')
64
65
66response = get_json_from_api(broker_url + '/domains', username, password)
67
68response = get_json_from_api("%s/domains/%s/applications" %
69                             (broker_url, response[0]['id']), username, password)
70
71result = {}
72for app in response:
73
74    # ssh://520311404832ce3e570000ff@blog-johndoe.example.org
75    (user, host) = app['ssh_url'][6:].split('@')
76    app_name = host.split('-')[0]
77
78    result[app_name] = {}
79    result[app_name]['hosts'] = []
80    result[app_name]['hosts'].append(host)
81    result[app_name]['vars'] = {}
82    result[app_name]['vars']['ansible_ssh_user'] = user
83
84if len(sys.argv) == 2 and sys.argv[1] == '--list':
85    print(json.dumps(result))
86elif len(sys.argv) == 3 and sys.argv[1] == '--host':
87    print(json.dumps({}))
88else:
89    print("Need an argument, either --list or --host <host>")
90