aboutsummaryrefslogtreecommitdiff
path: root/pyenc/api.py
blob: 8fea554aa1633beb1508781dc44197f99b034167 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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)