aboutsummaryrefslogtreecommitdiff
path: root/pyenc/api.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyenc/api.py')
-rw-r--r--pyenc/api.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/pyenc/api.py b/pyenc/api.py
new file mode 100644
index 0000000..8fea554
--- /dev/null
+++ b/pyenc/api.py
@@ -0,0 +1,78 @@
+import json
+
+import flask
+from flask import (
+ Blueprint,
+ Response,
+ request,
+ url_for
+ )
+from . import model
+# from . import db
+
+api = Blueprint('api', __name__)
+# API
+@api.route('/list-classes')
+def list_classes():
+ """Return all classes fuzzy matching q."""
+ query = request.args.get('q', '')
+ wildcarded_query = '%{}%'.format('%'.join(query.split(' ')))
+
+ results = \
+ model \
+ .PuppetClass \
+ .query \
+ .where(model.PuppetClass.class_name.like(wildcarded_query)) \
+ .all()
+ print(wildcarded_query)
+ return Response(json.dumps([x.class_name for x in results]),
+ mimetype='application/json')
+
+@api.route('/classes-for')
+def classes_for():
+ """Return classes mapped to host `fqdn'."""
+ fqdn = request.args.get('fqdn')
+ classes = [cls.class_name
+ for cls in model.Host.query.where(model.Host.fqdn == fqdn)
+ .first().classes]
+ return Response(json.dumps(classes),
+ mimetype='application/json')
+
+@api.route('/change-classes', methods=['POST'])
+def change_classes():
+ """
+ Update set of active classes for node.
+
+ Takes a json object as the POST body, which should have the keys
+ - fqdn :: which host to operate on
+ - removed :: classes which should be removed
+ - added :: classes which should be added
+ """
+ j = request.json
+ host = model.Host.query.where(model.Host.fqdn == j['fqdn']).first()
+ remove_set = set(j['removed'])
+
+ new_cls = []
+ for cls in host.classes:
+ if cls.class_name in remove_set:
+ continue
+ new_cls.append(cls)
+ host.classes = new_cls
+
+ cls = model.PuppetClass.query \
+ .where(model.PuppetClass.class_name.in_(j['added'])) \
+ .all()
+ host.classes.extend(cls)
+ # print(remove_set, db.db.session.dirty)
+ return flask.redirect(url_for('classes_for', fqdn=j['fqdn']))
+
+@api.route('/hosts')
+def list_hosts():
+ """Return all hosts."""
+ data = [x.serialize() for x in model.Host.query.all()]
+ return Response(json.dumps(data),
+ mimetype='application/json')
+
+def init_app(app):
+ """Register blueprint to app."""
+ app.register_blueprint(api)