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