# -*- coding: utf-8 -*- """ Salt engine for intercepting state jobs and forwarding to the Architect. """ # Import python libs from __future__ import absolute_import import logging from architect_client.libarchitect import ArchitectClient # Import salt libs import salt.utils.event logger = logging.getLogger(__name__) def start(project='default', host='127.0.0.1', port=8181, username=None, password=None): ''' Listen to state jobs events and forward state functions and node info ''' state_functions = ['state.sls', 'state.apply', 'state.highstate'] model_functions = ['architect.node_info'] class_tag = 'architect/minion/classify' if __opts__['__role'] == 'master': event_bus = salt.utils.event.get_master_event(__opts__, __opts__['sock_dir'], listen=True) else: event_bus = salt.utils.event.get_event( 'minion', transport=__opts__['transport'], opts=__opts__, sock_dir=__opts__['sock_dir'], listen=True) logger.info('Architect Engine initialised') while True: event = event_bus.get_event() if event and event.get('fun', None) in state_functions: is_test_run = 'test=true' in [arg.lower() for arg in event.get('fun_args', [])] if not is_test_run: output = ArchitectClient().push_event(event) logger.info("Sent Architect state function {}".format(output)) if event and event.get('fun', None) in model_functions: output = ArchitectClient().push_node_info({event['id']: event['return']}) logger.info("Sent Architect node info function {}".format(output)) if event and event.get('tag', None) == class_tag: output = ArchitectClient().classify_node({ 'name': event['id'], 'data': event['data'] }) logger.info("Sent Architect node classification {}".format(output))