diff options
Diffstat (limited to 'pyenc/api.py')
-rw-r--r-- | pyenc/api.py | 78 |
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) |