blob: 6483268f9e839ec0b91bbab143c2cbba633ab75d [file] [log] [blame]
martin f. krafft30943272013-07-04 08:32:00 +02001#!/usr/bin/env python
martin f. krafft42c475d2013-06-26 18:39:06 +02002# -*- coding: utf-8 -*-
3#
4# This file is part of reclass (http://github.com/madduck/reclass)
5#
martin f. krafft1ba35c52014-01-02 11:10:58 +13006# Copyright © 2007–14 martin f. krafft <madduck@madduck.net>
martin f. krafft42c475d2013-06-26 18:39:06 +02007# Released under the terms of the Artistic Licence 2.0
8#
martin f. krafft42c475d2013-06-26 18:39:06 +02009
martin f. krafft30943272013-07-04 08:32:00 +020010import os, sys, posix
martin f. krafft42c475d2013-06-26 18:39:06 +020011
martin f. krafft5c3c39d2014-01-02 15:57:54 +130012from reclass import get_storage, output
13from reclass.core import Core
martin f. krafft30943272013-07-04 08:32:00 +020014from reclass.errors import ReclassException
martin f. krafft5c3c39d2014-01-02 15:57:54 +130015from reclass.config import find_and_read_configfile, get_options, \
16 path_mangler
martin f. krafft30943272013-07-04 08:32:00 +020017from reclass.constants import MODE_NODEINFO
18from reclass.defaults import *
19from reclass.version import *
martin f. krafft42c475d2013-06-26 18:39:06 +020020
martin f. krafft30943272013-07-04 08:32:00 +020021def ext_pillar(minion_id, pillar,
22 storage_type=OPT_STORAGE_TYPE,
23 inventory_base_uri=OPT_INVENTORY_BASE_URI,
24 nodes_uri=OPT_NODES_URI,
Daniel Dehenninc2bb0e52013-12-26 14:16:26 +130025 classes_uri=OPT_CLASSES_URI,
26 class_mappings=None):
martin f. krafft42c475d2013-06-26 18:39:06 +020027
martin f. krafft5c3c39d2014-01-02 15:57:54 +130028 nodes_uri, classes_uri = path_mangler(inventory_base_uri,
29 nodes_uri, classes_uri)
martin f. krafftd48a46e2014-01-03 14:32:49 +130030 storage = get_storage(storage_type, nodes_uri, classes_uri,
31 default_environment='base')
martin f. krafft5c3c39d2014-01-02 15:57:54 +130032 reclass = Core(storage, class_mappings)
33
34 data = reclass.nodeinfo(minion_id)
martin f. krafft42c475d2013-06-26 18:39:06 +020035 params = data.get('parameters', {})
36 params['__reclass__'] = {}
37 params['__reclass__']['applications'] = data['applications']
38 params['__reclass__']['classes'] = data['classes']
martin f. krafftd48a46e2014-01-03 14:32:49 +130039 params['__reclass__']['environment'] = data['environment']
martin f. krafft42c475d2013-06-26 18:39:06 +020040 return params
41
42
martin f. krafft6a00fd82013-08-28 10:27:36 +020043def top(minion_id, storage_type=OPT_STORAGE_TYPE,
martin f. krafft30943272013-07-04 08:32:00 +020044 inventory_base_uri=OPT_INVENTORY_BASE_URI, nodes_uri=OPT_NODES_URI,
Daniel Dehenninc2bb0e52013-12-26 14:16:26 +130045 classes_uri=OPT_CLASSES_URI,
46 class_mappings=None):
martin f. krafft42c475d2013-06-26 18:39:06 +020047
martin f. krafft5c3c39d2014-01-02 15:57:54 +130048 nodes_uri, classes_uri = path_mangler(inventory_base_uri,
49 nodes_uri, classes_uri)
martin f. krafftd48a46e2014-01-03 14:32:49 +130050 storage = get_storage(storage_type, nodes_uri, classes_uri,
51 default_environment='base')
martin f. krafft5c3c39d2014-01-02 15:57:54 +130052 reclass = Core(storage, class_mappings)
martin f. krafft42c475d2013-06-26 18:39:06 +020053
martin f. krafft6a00fd82013-08-28 10:27:36 +020054 # if the minion_id is not None, then return just the applications for the
55 # specific minion, otherwise return the entire top data (which we need for
56 # CLI invocations of the adapter):
57 if minion_id is not None:
martin f. krafft5b17aca2014-01-05 14:59:22 +130058 data = reclass.nodeinfo(minion_id)
martin f. krafft6a00fd82013-08-28 10:27:36 +020059 applications = data.get('applications', [])
martin f. krafftd48a46e2014-01-03 14:32:49 +130060 env = data['environment']
martin f. krafft6a00fd82013-08-28 10:27:36 +020061 return {env: applications}
62
63 else:
martin f. krafft5c3c39d2014-01-02 15:57:54 +130064 data = reclass.inventory()
martin f. krafft6a00fd82013-08-28 10:27:36 +020065 nodes = {}
66 for node_id, node_data in data['nodes'].iteritems():
martin f. krafftd48a46e2014-01-03 14:32:49 +130067 env = node_data['environment']
68 if env not in nodes:
69 nodes[env] = {}
70 nodes[env][node_id] = node_data['applications']
martin f. krafft6a00fd82013-08-28 10:27:36 +020071
martin f. krafftd48a46e2014-01-03 14:32:49 +130072 return nodes
martin f. krafft30943272013-07-04 08:32:00 +020073
74
75def cli():
76 try:
martin f. krafft97c4cd92013-07-19 07:43:27 +020077 inventory_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
martin f. krafft30943272013-07-04 08:32:00 +020078 defaults = {'pretty_print' : True,
martin f. krafftf8618132013-07-18 21:13:58 +020079 'output' : 'yaml',
martin f. krafft97c4cd92013-07-19 07:43:27 +020080 'inventory_base_uri': inventory_dir
martin f. krafft30943272013-07-04 08:32:00 +020081 }
82 defaults.update(find_and_read_configfile())
83 options = get_options(RECLASS_NAME, VERSION, DESCRIPTION,
84 inventory_shortopt='-t',
85 inventory_longopt='--top',
86 inventory_help='output the state tops (inventory)',
87 nodeinfo_shortopt='-p',
88 nodeinfo_longopt='--pillar',
89 nodeinfo_dest='nodename',
90 nodeinfo_help='output pillar data for a specific node',
91 defaults=defaults)
martin f. krafftfb02b472013-11-26 15:19:46 +010092 class_mappings = defaults.get('class_mappings')
martin f. krafft30943272013-07-04 08:32:00 +020093
94 if options.mode == MODE_NODEINFO:
95 data = ext_pillar(options.nodename, {},
96 storage_type=options.storage_type,
97 inventory_base_uri=options.inventory_base_uri,
98 nodes_uri=options.nodes_uri,
martin f. krafftfb02b472013-11-26 15:19:46 +010099 classes_uri=options.classes_uri,
100 class_mappings=class_mappings)
martin f. krafft30943272013-07-04 08:32:00 +0200101 else:
martin f. krafft6a00fd82013-08-28 10:27:36 +0200102 data = top(minion_id=None,
103 storage_type=options.storage_type,
martin f. krafft30943272013-07-04 08:32:00 +0200104 inventory_base_uri=options.inventory_base_uri,
105 nodes_uri=options.nodes_uri,
martin f. krafftfb02b472013-11-26 15:19:46 +0100106 classes_uri=options.classes_uri,
107 class_mappings=class_mappings)
martin f. krafft30943272013-07-04 08:32:00 +0200108
109 print output(data, options.output, options.pretty_print)
110
111 except ReclassException, e:
112 e.exit_with_message(sys.stderr)
113
114 sys.exit(posix.EX_OK)
115
116if __name__ == '__main__':
117 cli()