SaltStack - Architect integration
Change-Id: I96e16a3b203f9b3c9c150db1cb85e966bd14b573
diff --git a/_engines/architect.py b/_engines/architect.py
new file mode 100644
index 0000000..4096a73
--- /dev/null
+++ b/_engines/architect.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+"""
+Salt engine for intercepting state jobs and forwarding to the Architect
+service.
+"""
+
+# Import python libs
+from __future__ import absolute_import
+import json
+import logging
+
+# Import salt libs
+import salt.utils.event
+import salt.utils.http
+
+log = 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 Salt states
+ '''
+ url = "{}://{}:{}/salt/{}/event/{}".format('http',
+ host,
+ port,
+ 'v1',
+ project)
+ target_functions = ['state.sls', 'state.apply', 'state.highstate']
+
+ 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)
+
+ log.info('Salt Architect engine initialised')
+
+ while True:
+ event = event_bus.get_event()
+ if event and event.get('fun', None) in target_functions:
+ is_test_run = 'test=true' in [arg.lower() for arg in event.get('fun_args', [])]
+ 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))