blob: 5b132a8a849109ed71d333051cf9198c88b1b712 [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#
6# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
7# 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. krafft30943272013-07-04 08:32:00 +020012from reclass import get_nodeinfo, get_inventory, output
13from reclass.errors import ReclassException
14from reclass.config import find_and_read_configfile, get_options
15from reclass.constants import MODE_NODEINFO
16from reclass.defaults import *
17from reclass.version import *
martin f. krafft42c475d2013-06-26 18:39:06 +020018
martin f. krafft30943272013-07-04 08:32:00 +020019def ext_pillar(minion_id, pillar,
20 storage_type=OPT_STORAGE_TYPE,
21 inventory_base_uri=OPT_INVENTORY_BASE_URI,
22 nodes_uri=OPT_NODES_URI,
23 classes_uri=OPT_CLASSES_URI):
martin f. krafft42c475d2013-06-26 18:39:06 +020024
martin f. krafft30943272013-07-04 08:32:00 +020025 data = get_nodeinfo(storage_type, inventory_base_uri, nodes_uri,
26 classes_uri, minion_id)
martin f. krafft42c475d2013-06-26 18:39:06 +020027 params = data.get('parameters', {})
28 params['__reclass__'] = {}
29 params['__reclass__']['applications'] = data['applications']
30 params['__reclass__']['classes'] = data['classes']
martin f. krafft42c475d2013-06-26 18:39:06 +020031 return params
32
33
martin f. krafft30943272013-07-04 08:32:00 +020034def top(storage_type=OPT_STORAGE_TYPE,
35 inventory_base_uri=OPT_INVENTORY_BASE_URI, nodes_uri=OPT_NODES_URI,
36 classes_uri=OPT_CLASSES_URI):
martin f. krafft42c475d2013-06-26 18:39:06 +020037
martin f. krafft30943272013-07-04 08:32:00 +020038 data = get_inventory(storage_type, inventory_base_uri, nodes_uri,
39 classes_uri)
martin f. krafft42c475d2013-06-26 18:39:06 +020040 env = 'base'
41 top = {env: {}}
42 # TODO: node environments
43 for node_id, node_data in data['nodes'].iteritems():
44 #env = data.environment
45 #if env not in top:
46 # top[env] = {}
47 top[env][node_id] = node_data['applications']
48
49 return top
martin f. krafft30943272013-07-04 08:32:00 +020050
51
52def cli():
53 try:
martin f. krafft97c4cd92013-07-19 07:43:27 +020054 inventory_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
martin f. krafft30943272013-07-04 08:32:00 +020055 defaults = {'pretty_print' : True,
martin f. krafftf8618132013-07-18 21:13:58 +020056 'output' : 'yaml',
martin f. krafft97c4cd92013-07-19 07:43:27 +020057 'inventory_base_uri': inventory_dir
martin f. krafft30943272013-07-04 08:32:00 +020058 }
59 defaults.update(find_and_read_configfile())
60 options = get_options(RECLASS_NAME, VERSION, DESCRIPTION,
61 inventory_shortopt='-t',
62 inventory_longopt='--top',
63 inventory_help='output the state tops (inventory)',
64 nodeinfo_shortopt='-p',
65 nodeinfo_longopt='--pillar',
66 nodeinfo_dest='nodename',
67 nodeinfo_help='output pillar data for a specific node',
68 defaults=defaults)
69
70 if options.mode == MODE_NODEINFO:
71 data = ext_pillar(options.nodename, {},
72 storage_type=options.storage_type,
73 inventory_base_uri=options.inventory_base_uri,
74 nodes_uri=options.nodes_uri,
75 classes_uri=options.classes_uri)
76 else:
77 data = top(storage_type=options.storage_type,
78 inventory_base_uri=options.inventory_base_uri,
79 nodes_uri=options.nodes_uri,
80 classes_uri=options.classes_uri)
81
82 print output(data, options.output, options.pretty_print)
83
84 except ReclassException, e:
85 e.exit_with_message(sys.stderr)
86
87 sys.exit(posix.EX_OK)
88
89if __name__ == '__main__':
90 cli()