-
Notifications
You must be signed in to change notification settings - Fork 0
/
master.py
executable file
·79 lines (68 loc) · 2.62 KB
/
master.py
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
79
#!/usr/bin/env python3
from __init__ import kitten
from flask import Flask, request
import json
from util import get_db_size
import ast
import requests
app = Flask(__name__)
@app.route('/', methods=['POST'])
def create_master():
ret = kitten.create_master()
return json.dumps(str(ret))
# this is accessed when we PUT a value into a worker
@app.route('/add_worker/<worker_idx>', methods=['POST'])
def add_worker(worker_idx):
if request.method == 'POST':
worker_idx = int(worker_idx) - 1
vals = json.loads(request.json)
key = str(vals['key'])
meta_data = str(vals)
v = kitten.k_in_master(str(worker_idx).encode())
if not v:
# if there is nothing in master, then we start with a
# list of the current values meta data
obj = [meta_data.encode()]
kitten.add_worker_to_master(str(worker_idx).encode(), str(obj).encode())
return json.dumps("Added worker: " + key)
else:
# otherwise we get the previous data
prev = v
# now we handle updating the metadata
prev = prev.decode()
# create our list of dictionaries
obj = ast.literal_eval(prev)
# handles changes in key. if we update a key, then we only want
# to update that key and don't need to add more data to the master
for idx, item in enumerate(obj):
d = item.decode()
d = ast.literal_eval(d)
if d['key'] == key:
obj[idx] = vals # use vals here, bc we want an actual dict data structure
kitten.add_worker_to_master(str(worker_idx).encode(), str(obj).encode())
return json.dumps("Added worker: " + key)
# new data coming into already existing list of dicts, so we can
# just append the new metadata to our list and add it to our
# master and attach it to the appropriate worker index
obj.append(meta_data.encode())
kitten.add_worker_to_master(str(worker_idx).encode(), str(obj).encode())
return json.dumps("Added worker: " + key)
@app.route('/gets')
def gets():
out = {}
for k, v in kitten.master:
out[k.decode()] = v.decode()
return json.dumps(out)
@app.route('/clear', methods=['DELETE'])
def clear():
kitten.clear_master()
return json.dumps("Cleared master...restart server")
@app.route('/delete/<key>', methods=['DELETE'])
def delete(key):
return json.dumps(kitten.delete_from_master(key))
@app.route('/close')
def close():
ret = kitten.close_master()
return json.dumps(ret)
if __name__ == "__main__":
app.run(debug=True)