|
|
|
|
|
|
|
|
# -*- coding: utf-8 -*- |
|
|
# -*- coding: utf-8 -*- |
|
|
""" |
|
|
""" |
|
|
Salt engine for intercepting state jobs and forwarding to the Architect |
|
|
|
|
|
service. |
|
|
|
|
|
|
|
|
Salt engine for intercepting state jobs and forwarding to the Architect. |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
# Import python libs |
|
|
# Import python libs |
|
|
from __future__ import absolute_import |
|
|
from __future__ import absolute_import |
|
|
import json |
|
|
|
|
|
import logging |
|
|
import logging |
|
|
|
|
|
from architect_client.libarchitect import ArchitectClient |
|
|
|
|
|
|
|
|
# Import salt libs |
|
|
# Import salt libs |
|
|
import salt.utils.event |
|
|
import salt.utils.event |
|
|
import salt.utils.http |
|
|
|
|
|
|
|
|
|
|
|
log = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def start(project='default', |
|
|
def start(project='default', |
|
|
|
|
|
|
|
|
username=None, |
|
|
username=None, |
|
|
password=None): |
|
|
password=None): |
|
|
''' |
|
|
''' |
|
|
Listen to state jobs events and forward Salt states |
|
|
|
|
|
|
|
|
Listen to state jobs events and forward state functions and node info |
|
|
''' |
|
|
''' |
|
|
url = "{}://{}:{}/salt/{}/event/{}".format('http', |
|
|
|
|
|
host, |
|
|
|
|
|
port, |
|
|
|
|
|
'v1', |
|
|
|
|
|
project) |
|
|
|
|
|
target_functions = ['state.sls', 'state.apply', 'state.highstate'] |
|
|
|
|
|
|
|
|
state_functions = ['state.sls', 'state.apply', 'state.highstate'] |
|
|
|
|
|
model_functions = ['architect.node_info'] |
|
|
|
|
|
class_tag = 'architect/minion/classify' |
|
|
|
|
|
|
|
|
if __opts__['__role'] == 'master': |
|
|
if __opts__['__role'] == 'master': |
|
|
event_bus = salt.utils.event.get_master_event(__opts__, |
|
|
event_bus = salt.utils.event.get_master_event(__opts__, |
|
|
|
|
|
|
|
|
sock_dir=__opts__['sock_dir'], |
|
|
sock_dir=__opts__['sock_dir'], |
|
|
listen=True) |
|
|
listen=True) |
|
|
|
|
|
|
|
|
log.info('Salt Architect engine initialised') |
|
|
|
|
|
|
|
|
logger.info('Architect Engine initialised') |
|
|
|
|
|
|
|
|
while True: |
|
|
while True: |
|
|
event = event_bus.get_event() |
|
|
event = event_bus.get_event() |
|
|
if event and event.get('fun', None) in target_functions: |
|
|
|
|
|
|
|
|
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', [])] |
|
|
is_test_run = 'test=true' in [arg.lower() for arg in event.get('fun_args', [])] |
|
|
if not is_test_run: |
|
|
if not is_test_run: |
|
|
data = salt.utils.http.query(url=url, |
|
|
|
|
|
method='POST', |
|
|
|
|
|
decode=False, |
|
|
|
|
|
data=json.dumps(event)) |
|
|
|
|
|
if 'OK' in data.get('body', ''): |
|
|
|
|
|
log.info("Architect Engine request to '{}'" |
|
|
|
|
|
" was successful".format(url)) |
|
|
|
|
|
else: |
|
|
|
|
|
log.warning("Problem with Architect Engine" |
|
|
|
|
|
" request to '{}' ({})".format(url, data)) |
|
|
|
|
|
|
|
|
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)) |