- # -*- 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))
|