blob: eec2ac3d30de7dc87e937b12aa1170a709a31afc [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)
30 storage = get_storage(storage_type, nodes_uri, classes_uri)
31 reclass = Core(storage, class_mappings)
32
33 data = reclass.nodeinfo(minion_id)
martin f. krafft42c475d2013-06-26 18:39:06 +020034 params = data.get('parameters', {})
35 params['__reclass__'] = {}
36 params['__reclass__']['applications'] = data['applications']
37 params['__reclass__']['classes'] = data['classes']
martin f. krafft42c475d2013-06-26 18:39:06 +020038 return params
39
40
martin f. krafft6a00fd82013-08-28 10:27:36 +020041def top(minion_id, storage_type=OPT_STORAGE_TYPE,
martin f. krafft30943272013-07-04 08:32:00 +020042 inventory_base_uri=OPT_INVENTORY_BASE_URI, nodes_uri=OPT_NODES_URI,
Daniel Dehenninc2bb0e52013-12-26 14:16:26 +130043 classes_uri=OPT_CLASSES_URI,
44 class_mappings=None):
martin f. krafft42c475d2013-06-26 18:39:06 +020045
martin f. krafft42c475d2013-06-26 18:39:06 +020046 env = 'base'
martin f. krafft42c475d2013-06-26 18:39:06 +020047 # TODO: node environments
martin f. krafft5c3c39d2014-01-02 15:57:54 +130048 nodes_uri, classes_uri = path_mangler(inventory_base_uri,
49 nodes_uri, classes_uri)
50 storage = get_storage(storage_type, nodes_uri, classes_uri)
51 reclass = Core(storage, class_mappings)
martin f. krafft42c475d2013-06-26 18:39:06 +020052
martin f. krafft6a00fd82013-08-28 10:27:36 +020053 # if the minion_id is not None, then return just the applications for the
54 # specific minion, otherwise return the entire top data (which we need for
55 # CLI invocations of the adapter):
56 if minion_id is not None:
martin f. krafft5b17aca2014-01-05 14:59:22 +130057 data = reclass.nodeinfo(minion_id)
martin f. krafft6a00fd82013-08-28 10:27:36 +020058 applications = data.get('applications', [])
59 return {env: applications}
60
61 else:
martin f. krafft5c3c39d2014-01-02 15:57:54 +130062 data = reclass.inventory()
martin f. krafft6a00fd82013-08-28 10:27:36 +020063 nodes = {}
64 for node_id, node_data in data['nodes'].iteritems():
65 nodes[node_id] = node_data['applications']
66
67 return {env: nodes}
martin f. krafft30943272013-07-04 08:32:00 +020068
69
70def cli():
71 try:
martin f. krafft97c4cd92013-07-19 07:43:27 +020072 inventory_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
martin f. krafft30943272013-07-04 08:32:00 +020073 defaults = {'pretty_print' : True,
martin f. krafftf8618132013-07-18 21:13:58 +020074 'output' : 'yaml',
martin f. krafft97c4cd92013-07-19 07:43:27 +020075 'inventory_base_uri': inventory_dir
martin f. krafft30943272013-07-04 08:32:00 +020076 }
77 defaults.update(find_and_read_configfile())
78 options = get_options(RECLASS_NAME, VERSION, DESCRIPTION,
79 inventory_shortopt='-t',
80 inventory_longopt='--top',
81 inventory_help='output the state tops (inventory)',
82 nodeinfo_shortopt='-p',
83 nodeinfo_longopt='--pillar',
84 nodeinfo_dest='nodename',
85 nodeinfo_help='output pillar data for a specific node',
86 defaults=defaults)
martin f. krafftfb02b472013-11-26 15:19:46 +010087 class_mappings = defaults.get('class_mappings')
martin f. krafft30943272013-07-04 08:32:00 +020088
89 if options.mode == MODE_NODEINFO:
90 data = ext_pillar(options.nodename, {},
91 storage_type=options.storage_type,
92 inventory_base_uri=options.inventory_base_uri,
93 nodes_uri=options.nodes_uri,
martin f. krafftfb02b472013-11-26 15:19:46 +010094 classes_uri=options.classes_uri,
95 class_mappings=class_mappings)
martin f. krafft30943272013-07-04 08:32:00 +020096 else:
martin f. krafft6a00fd82013-08-28 10:27:36 +020097 data = top(minion_id=None,
98 storage_type=options.storage_type,
martin f. krafft30943272013-07-04 08:32:00 +020099 inventory_base_uri=options.inventory_base_uri,
100 nodes_uri=options.nodes_uri,
martin f. krafftfb02b472013-11-26 15:19:46 +0100101 classes_uri=options.classes_uri,
102 class_mappings=class_mappings)
martin f. krafft30943272013-07-04 08:32:00 +0200103
104 print output(data, options.output, options.pretty_print)
105
106 except ReclassException, e:
107 e.exit_with_message(sys.stderr)
108
109 sys.exit(posix.EX_OK)
110
111if __name__ == '__main__':
112 cli()