Added support for salt engines, added support for requisite ordering

Change-Id: I772495c38ed5dc21ad833f3c0f351384942e2b23
diff --git a/_modules/modelutils.py b/_modules/modelutils.py
new file mode 100644
index 0000000..6d0ab40
--- /dev/null
+++ b/_modules/modelutils.py
@@ -0,0 +1,75 @@
+
+from collections import OrderedDict
+
+
+def __virtual__():
+    return True
+
+
+def _set_subtree(node, relationships):
+    return {
+        v: _set_subtree(v, relationships)
+        for v in [x['id'] for x in relationships if node in x['require']]
+    }
+
+
+def _traverse_subtree(output, data):
+    for key, value in data.items():
+        output.append(key)
+        _traverse_subtree(output, value)
+    return output
+
+
+def order_by_requisites(data):
+    '''
+    Returns dictionary ordered by require and require_by
+
+    CLI Examples:
+
+    .. code-block:: bash
+
+        salt-call modelutils.order_by_requisites "{'dict':'value'}""
+
+    Sample data
+
+    passed_data:
+      syslog2:
+        pattern: 'syslog.*'
+      syslog_tele1:
+        type: parser
+        require:
+        - syslog1
+      syslog1:
+        pattern: 'syslog.*'
+        require_in:
+        - syslog2
+      syslog_tele2:
+        require:
+        - syslog_tele1
+
+    '''
+    raw_key_list = []
+    ordered_key_list = []
+    output_dict = OrderedDict()
+
+    for datum_id, datum in data.items():
+        if 'require_in' in datum:
+            for req in datum['require_in']:
+                if 'require' not in data[req]:
+                    data[req]['require'] = []
+                data[req]['require'].append(datum_id)
+            datum.pop('require_in')
+
+    for datum_id, datum in data.items():
+        if 'require' not in datum:
+            datum['require'] = ['top']
+        datum['id'] = datum_id
+        raw_key_list.append(datum)
+
+    tree_data = _set_subtree('top', raw_key_list)
+    _traverse_subtree(ordered_key_list, tree_data)
+    for key in ordered_key_list:
+        output_dict[key] = data[key]
+
+    return output_dict
+