blob: beca9e505e35f260b7bc2dfb2ac5aa010dc7cae2 [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
Andrew Pickford38f39242017-04-18 16:19:48 +020012from reclass import get_storage, output, get_path_mangler
martin f. krafft5c3c39d2014-01-02 15:57:54 +130013from reclass.core import Core
martin f. krafft30943272013-07-04 08:32:00 +020014from reclass.errors import ReclassException
Andrew Pickford38f39242017-04-18 16:19:48 +020015from reclass.config import find_and_read_configfile, get_options
martin f. krafft30943272013-07-04 08:32:00 +020016from reclass.constants import MODE_NODEINFO
17from reclass.defaults import *
18from reclass.version import *
martin f. krafft42c475d2013-06-26 18:39:06 +020019
martin f. krafft30943272013-07-04 08:32:00 +020020def ext_pillar(minion_id, pillar,
21 storage_type=OPT_STORAGE_TYPE,
22 inventory_base_uri=OPT_INVENTORY_BASE_URI,
23 nodes_uri=OPT_NODES_URI,
Daniel Dehenninc2bb0e52013-12-26 14:16:26 +130024 classes_uri=OPT_CLASSES_URI,
martin f. krafft758e5032014-03-01 14:40:56 +010025 class_mappings=None,
26 propagate_pillar_data_to_reclass=False):
martin f. krafft42c475d2013-06-26 18:39:06 +020027
Andrew Pickford38f39242017-04-18 16:19:48 +020028 path_mangler = get_path_mangler(storage_type)
Andrew Pickfordce3fa3a2017-04-11 15:38:09 +020029 nodes_uri, classes_uri = path_mangler(inventory_base_uri, nodes_uri, classes_uri)
Andrew Pickford3b3681b2017-04-16 11:53:24 +020030 storage = get_storage(storage_type, nodes_uri, classes_uri)
martin f. krafft758e5032014-03-01 14:40:56 +010031 input_data = None
32 if propagate_pillar_data_to_reclass:
33 input_data = pillar
Andrew Pickford3b3681b2017-04-16 11:53:24 +020034 reclass = Core(storage, class_mappings, input_data=input_data, default_environment='base')
martin f. krafft5c3c39d2014-01-02 15:57:54 +130035
36 data = reclass.nodeinfo(minion_id)
martin f. krafft42c475d2013-06-26 18:39:06 +020037 params = data.get('parameters', {})
38 params['__reclass__'] = {}
martin f. krafft15346a12014-03-01 13:45:42 +010039 params['__reclass__']['nodename'] = minion_id
martin f. krafft42c475d2013-06-26 18:39:06 +020040 params['__reclass__']['applications'] = data['applications']
41 params['__reclass__']['classes'] = data['classes']
martin f. krafftd48a46e2014-01-03 14:32:49 +130042 params['__reclass__']['environment'] = data['environment']
martin f. krafft42c475d2013-06-26 18:39:06 +020043 return params
44
45
martin f. krafft6a00fd82013-08-28 10:27:36 +020046def top(minion_id, storage_type=OPT_STORAGE_TYPE,
martin f. krafft30943272013-07-04 08:32:00 +020047 inventory_base_uri=OPT_INVENTORY_BASE_URI, nodes_uri=OPT_NODES_URI,
Andrew Pickford41caee12017-04-11 15:44:35 +020048 classes_uri=OPT_CLASSES_URI, class_mappings=None):
martin f. krafft42c475d2013-06-26 18:39:06 +020049
Andrew Pickford38f39242017-04-18 16:19:48 +020050 path_mangler = get_path_mangler(storage_type)
Andrew Pickfordce3fa3a2017-04-11 15:38:09 +020051 nodes_uri, classes_uri = path_mangler(inventory_base_uri, nodes_uri, classes_uri)
Andrew Pickford3b3681b2017-04-16 11:53:24 +020052 storage = get_storage(storage_type, nodes_uri, classes_uri)
53 reclass = Core(storage, class_mappings, input_data=None, default_environment='base')
martin f. krafft42c475d2013-06-26 18:39:06 +020054
martin f. krafft6a00fd82013-08-28 10:27:36 +020055 # if the minion_id is not None, then return just the applications for the
56 # specific minion, otherwise return the entire top data (which we need for
57 # CLI invocations of the adapter):
58 if minion_id is not None:
martin f. krafft5b17aca2014-01-05 14:59:22 +130059 data = reclass.nodeinfo(minion_id)
martin f. krafft6a00fd82013-08-28 10:27:36 +020060 applications = data.get('applications', [])
martin f. krafftd48a46e2014-01-03 14:32:49 +130061 env = data['environment']
martin f. krafft6a00fd82013-08-28 10:27:36 +020062 return {env: applications}
63
64 else:
martin f. krafft5c3c39d2014-01-02 15:57:54 +130065 data = reclass.inventory()
martin f. krafft6a00fd82013-08-28 10:27:36 +020066 nodes = {}
67 for node_id, node_data in data['nodes'].iteritems():
martin f. krafftd48a46e2014-01-03 14:32:49 +130068 env = node_data['environment']
69 if env not in nodes:
70 nodes[env] = {}
71 nodes[env][node_id] = node_data['applications']
martin f. krafft6a00fd82013-08-28 10:27:36 +020072
martin f. krafftd48a46e2014-01-03 14:32:49 +130073 return nodes
martin f. krafft30943272013-07-04 08:32:00 +020074
75
76def cli():
77 try:
martin f. krafft97c4cd92013-07-19 07:43:27 +020078 inventory_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
martin f. krafft30943272013-07-04 08:32:00 +020079 defaults = {'pretty_print' : True,
AndrewPickford111d0db2017-02-27 14:03:12 +010080 'no_refs' : False,
martin f. krafftf8618132013-07-18 21:13:58 +020081 'output' : 'yaml',
martin f. krafft97c4cd92013-07-19 07:43:27 +020082 'inventory_base_uri': inventory_dir
martin f. krafft30943272013-07-04 08:32:00 +020083 }
84 defaults.update(find_and_read_configfile())
85 options = get_options(RECLASS_NAME, VERSION, DESCRIPTION,
86 inventory_shortopt='-t',
87 inventory_longopt='--top',
88 inventory_help='output the state tops (inventory)',
89 nodeinfo_shortopt='-p',
90 nodeinfo_longopt='--pillar',
91 nodeinfo_dest='nodename',
92 nodeinfo_help='output pillar data for a specific node',
93 defaults=defaults)
martin f. krafftfb02b472013-11-26 15:19:46 +010094 class_mappings = defaults.get('class_mappings')
martin f. krafft30943272013-07-04 08:32:00 +020095
96 if options.mode == MODE_NODEINFO:
97 data = ext_pillar(options.nodename, {},
98 storage_type=options.storage_type,
99 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 else:
martin f. krafft6a00fd82013-08-28 10:27:36 +0200104 data = top(minion_id=None,
105 storage_type=options.storage_type,
martin f. krafft30943272013-07-04 08:32:00 +0200106 inventory_base_uri=options.inventory_base_uri,
107 nodes_uri=options.nodes_uri,
martin f. krafftfb02b472013-11-26 15:19:46 +0100108 classes_uri=options.classes_uri,
109 class_mappings=class_mappings)
martin f. krafft30943272013-07-04 08:32:00 +0200110
AndrewPickford111d0db2017-02-27 14:03:12 +0100111 print output(data, options.output, options.pretty_print, options.no_refs)
martin f. krafft30943272013-07-04 08:32:00 +0200112
113 except ReclassException, e:
114 e.exit_with_message(sys.stderr)
115
116 sys.exit(posix.EX_OK)
117
118if __name__ == '__main__':
119 cli()