blob: ce4e79256dea17c53747f230acf351d594923472 [file] [log] [blame]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# This file is part of reclass (http://github.com/madduck/reclass)
#
# Copyright © 2007–14 martin f. krafft <madduck@madduck.net>
# Released under the terms of the Artistic Licence 2.0
#
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import os, sys, posix
from six import iteritems
from reclass import get_storage, output, get_path_mangler
from reclass.core import Core
from reclass.errors import ReclassException
from reclass.config import find_and_read_configfile, get_options
from reclass.constants import MODE_NODEINFO
from reclass.defaults import *
from reclass.settings import Settings
from reclass.version import *
def ext_pillar(minion_id, pillar,
storage_type=OPT_STORAGE_TYPE,
inventory_base_uri=OPT_INVENTORY_BASE_URI,
nodes_uri=OPT_NODES_URI,
classes_uri=OPT_CLASSES_URI,
class_mappings=None,
propagate_pillar_data_to_reclass=False,
**kwargs):
path_mangler = get_path_mangler(storage_type)
nodes_uri, classes_uri = path_mangler(inventory_base_uri, nodes_uri, classes_uri)
storage = get_storage(storage_type, nodes_uri, classes_uri)
input_data = None
if propagate_pillar_data_to_reclass:
input_data = pillar
settings = Settings(kwargs)
reclass = Core(storage, class_mappings, settings, input_data=input_data)
data = reclass.nodeinfo(minion_id)
params = data.get('parameters', {})
params['__reclass__'] = {}
params['__reclass__']['nodename'] = minion_id
params['__reclass__']['applications'] = data['applications']
params['__reclass__']['classes'] = data['classes']
params['__reclass__']['environment'] = data['environment']
return params
def top(minion_id, storage_type=OPT_STORAGE_TYPE,
inventory_base_uri=OPT_INVENTORY_BASE_URI, nodes_uri=OPT_NODES_URI,
classes_uri=OPT_CLASSES_URI, class_mappings=None, **kwargs):
path_mangler = get_path_mangler(storage_type)
nodes_uri, classes_uri = path_mangler(inventory_base_uri, nodes_uri, classes_uri)
storage = get_storage(storage_type, nodes_uri, classes_uri)
settings = Settings(kwargs)
reclass = Core(storage, class_mappings, settings, input_data=None)
# if the minion_id is not None, then return just the applications for the
# specific minion, otherwise return the entire top data (which we need for
# CLI invocations of the adapter):
if minion_id is not None:
data = reclass.nodeinfo(minion_id)
applications = data.get('applications', [])
env = data['environment']
return {env: applications}
else:
data = reclass.inventory()
nodes = {}
for (node_id, node_data) in iteritems(data['nodes']):
env = node_data['environment']
if env not in nodes:
nodes[env] = {}
nodes[env][node_id] = node_data['applications']
return nodes
def cli():
try:
inventory_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
defaults = {'pretty_print' : True,
'no_refs' : False,
'output' : 'yaml',
'inventory_base_uri': inventory_dir
}
defaults.update(find_and_read_configfile())
options = get_options(RECLASS_NAME, VERSION, DESCRIPTION,
inventory_shortopt='-t',
inventory_longopt='--top',
inventory_help='output the state tops (inventory)',
nodeinfo_shortopt='-p',
nodeinfo_longopt='--pillar',
nodeinfo_dest='nodename',
nodeinfo_help='output pillar data for a specific node',
defaults=defaults)
class_mappings = defaults.get('class_mappings')
defaults.update(vars(options))
defaults.pop("storage_type", None)
defaults.pop("inventory_base_uri", None)
defaults.pop("nodes_uri", None)
defaults.pop("classes_uri", None)
defaults.pop("class_mappings", None)
if options.mode == MODE_NODEINFO:
data = ext_pillar(options.nodename, {},
storage_type=options.storage_type,
inventory_base_uri=options.inventory_base_uri,
nodes_uri=options.nodes_uri,
classes_uri=options.classes_uri,
class_mappings=class_mappings,
**defaults)
else:
data = top(minion_id=None,
storage_type=options.storage_type,
inventory_base_uri=options.inventory_base_uri,
nodes_uri=options.nodes_uri,
classes_uri=options.classes_uri,
class_mappings=class_mappings,
**defaults)
print(output(data, options.output, options.pretty_print, options.no_refs))
except ReclassException as e:
e.exit_with_message(sys.stderr)
sys.exit(posix.EX_OK)
if __name__ == '__main__':
cli()