martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 2 | # -*- coding: utf-8 -*- |
| 3 | # |
| 4 | # This file is part of reclass (http://github.com/madduck/reclass) |
| 5 | # |
martin f. krafft | 1ba35c5 | 2014-01-02 11:10:58 +1300 | [diff] [blame] | 6 | # Copyright © 2007–14 martin f. krafft <madduck@madduck.net> |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 7 | # Released under the terms of the Artistic Licence 2.0 |
| 8 | # |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 9 | |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 10 | import os, sys, posix |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 11 | |
Andrew Pickford | 38f3924 | 2017-04-18 16:19:48 +0200 | [diff] [blame] | 12 | from reclass import get_storage, output, get_path_mangler |
martin f. krafft | 5c3c39d | 2014-01-02 15:57:54 +1300 | [diff] [blame] | 13 | from reclass.core import Core |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 14 | from reclass.errors import ReclassException |
Andrew Pickford | 38f3924 | 2017-04-18 16:19:48 +0200 | [diff] [blame] | 15 | from reclass.config import find_and_read_configfile, get_options |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 16 | from reclass.constants import MODE_NODEINFO |
| 17 | from reclass.defaults import * |
| 18 | from reclass.version import * |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 19 | |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 20 | def 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 Dehennin | c2bb0e5 | 2013-12-26 14:16:26 +1300 | [diff] [blame] | 24 | classes_uri=OPT_CLASSES_URI, |
martin f. krafft | 758e503 | 2014-03-01 14:40:56 +0100 | [diff] [blame] | 25 | class_mappings=None, |
| 26 | propagate_pillar_data_to_reclass=False): |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 27 | |
Andrew Pickford | 38f3924 | 2017-04-18 16:19:48 +0200 | [diff] [blame] | 28 | path_mangler = get_path_mangler(storage_type) |
Andrew Pickford | ce3fa3a | 2017-04-11 15:38:09 +0200 | [diff] [blame] | 29 | nodes_uri, classes_uri = path_mangler(inventory_base_uri, nodes_uri, classes_uri) |
Andrew Pickford | 3b3681b | 2017-04-16 11:53:24 +0200 | [diff] [blame] | 30 | storage = get_storage(storage_type, nodes_uri, classes_uri) |
martin f. krafft | 758e503 | 2014-03-01 14:40:56 +0100 | [diff] [blame] | 31 | input_data = None |
| 32 | if propagate_pillar_data_to_reclass: |
| 33 | input_data = pillar |
Andrew Pickford | 3b3681b | 2017-04-16 11:53:24 +0200 | [diff] [blame] | 34 | reclass = Core(storage, class_mappings, input_data=input_data, default_environment='base') |
martin f. krafft | 5c3c39d | 2014-01-02 15:57:54 +1300 | [diff] [blame] | 35 | |
| 36 | data = reclass.nodeinfo(minion_id) |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 37 | params = data.get('parameters', {}) |
| 38 | params['__reclass__'] = {} |
martin f. krafft | 15346a1 | 2014-03-01 13:45:42 +0100 | [diff] [blame] | 39 | params['__reclass__']['nodename'] = minion_id |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 40 | params['__reclass__']['applications'] = data['applications'] |
| 41 | params['__reclass__']['classes'] = data['classes'] |
martin f. krafft | d48a46e | 2014-01-03 14:32:49 +1300 | [diff] [blame] | 42 | params['__reclass__']['environment'] = data['environment'] |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 43 | return params |
| 44 | |
| 45 | |
martin f. krafft | 6a00fd8 | 2013-08-28 10:27:36 +0200 | [diff] [blame] | 46 | def top(minion_id, storage_type=OPT_STORAGE_TYPE, |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 47 | inventory_base_uri=OPT_INVENTORY_BASE_URI, nodes_uri=OPT_NODES_URI, |
Andrew Pickford | 41caee1 | 2017-04-11 15:44:35 +0200 | [diff] [blame] | 48 | classes_uri=OPT_CLASSES_URI, class_mappings=None): |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 49 | |
Andrew Pickford | 38f3924 | 2017-04-18 16:19:48 +0200 | [diff] [blame] | 50 | path_mangler = get_path_mangler(storage_type) |
Andrew Pickford | ce3fa3a | 2017-04-11 15:38:09 +0200 | [diff] [blame] | 51 | nodes_uri, classes_uri = path_mangler(inventory_base_uri, nodes_uri, classes_uri) |
Andrew Pickford | 3b3681b | 2017-04-16 11:53:24 +0200 | [diff] [blame] | 52 | storage = get_storage(storage_type, nodes_uri, classes_uri) |
| 53 | reclass = Core(storage, class_mappings, input_data=None, default_environment='base') |
martin f. krafft | 42c475d | 2013-06-26 18:39:06 +0200 | [diff] [blame] | 54 | |
martin f. krafft | 6a00fd8 | 2013-08-28 10:27:36 +0200 | [diff] [blame] | 55 | # 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. krafft | 5b17aca | 2014-01-05 14:59:22 +1300 | [diff] [blame] | 59 | data = reclass.nodeinfo(minion_id) |
martin f. krafft | 6a00fd8 | 2013-08-28 10:27:36 +0200 | [diff] [blame] | 60 | applications = data.get('applications', []) |
martin f. krafft | d48a46e | 2014-01-03 14:32:49 +1300 | [diff] [blame] | 61 | env = data['environment'] |
martin f. krafft | 6a00fd8 | 2013-08-28 10:27:36 +0200 | [diff] [blame] | 62 | return {env: applications} |
| 63 | |
| 64 | else: |
martin f. krafft | 5c3c39d | 2014-01-02 15:57:54 +1300 | [diff] [blame] | 65 | data = reclass.inventory() |
martin f. krafft | 6a00fd8 | 2013-08-28 10:27:36 +0200 | [diff] [blame] | 66 | nodes = {} |
| 67 | for node_id, node_data in data['nodes'].iteritems(): |
martin f. krafft | d48a46e | 2014-01-03 14:32:49 +1300 | [diff] [blame] | 68 | env = node_data['environment'] |
| 69 | if env not in nodes: |
| 70 | nodes[env] = {} |
| 71 | nodes[env][node_id] = node_data['applications'] |
martin f. krafft | 6a00fd8 | 2013-08-28 10:27:36 +0200 | [diff] [blame] | 72 | |
martin f. krafft | d48a46e | 2014-01-03 14:32:49 +1300 | [diff] [blame] | 73 | return nodes |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 74 | |
| 75 | |
| 76 | def cli(): |
| 77 | try: |
martin f. krafft | 97c4cd9 | 2013-07-19 07:43:27 +0200 | [diff] [blame] | 78 | inventory_dir = os.path.abspath(os.path.dirname(sys.argv[0])) |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 79 | defaults = {'pretty_print' : True, |
AndrewPickford | 111d0db | 2017-02-27 14:03:12 +0100 | [diff] [blame] | 80 | 'no_refs' : False, |
martin f. krafft | f861813 | 2013-07-18 21:13:58 +0200 | [diff] [blame] | 81 | 'output' : 'yaml', |
martin f. krafft | 97c4cd9 | 2013-07-19 07:43:27 +0200 | [diff] [blame] | 82 | 'inventory_base_uri': inventory_dir |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 83 | } |
| 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. krafft | fb02b47 | 2013-11-26 15:19:46 +0100 | [diff] [blame] | 94 | class_mappings = defaults.get('class_mappings') |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 95 | |
| 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. krafft | fb02b47 | 2013-11-26 15:19:46 +0100 | [diff] [blame] | 101 | classes_uri=options.classes_uri, |
| 102 | class_mappings=class_mappings) |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 103 | else: |
martin f. krafft | 6a00fd8 | 2013-08-28 10:27:36 +0200 | [diff] [blame] | 104 | data = top(minion_id=None, |
| 105 | storage_type=options.storage_type, |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 106 | inventory_base_uri=options.inventory_base_uri, |
| 107 | nodes_uri=options.nodes_uri, |
martin f. krafft | fb02b47 | 2013-11-26 15:19:46 +0100 | [diff] [blame] | 108 | classes_uri=options.classes_uri, |
| 109 | class_mappings=class_mappings) |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 110 | |
AndrewPickford | 111d0db | 2017-02-27 14:03:12 +0100 | [diff] [blame] | 111 | print output(data, options.output, options.pretty_print, options.no_refs) |
martin f. krafft | 3094327 | 2013-07-04 08:32:00 +0200 | [diff] [blame] | 112 | |
| 113 | except ReclassException, e: |
| 114 | e.exit_with_message(sys.stderr) |
| 115 | |
| 116 | sys.exit(posix.EX_OK) |
| 117 | |
| 118 | if __name__ == '__main__': |
| 119 | cli() |