blob: a6d6bede35f96d2e34f67e5adc32aef9ab5c53a8 [file] [log] [blame]
# -*- 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))