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