/
controller.py
57 lines (46 loc) · 1.24 KB
/
controller.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
import httputil
import sys
import socket
import util
if (len(sys.argv) <= 3):
print("Usage: " + sys.argv[0] + " <connect port> <#nodes> <redundancy>")
sys.exit(1)
port = int(sys.argv[1])
N = int(sys.argv[2])
K = int(sys.argv[3])
nodeindex = 0
nodes = {}
frontendnodes = {}
def notify(node, index, receivers):
for receiver in receivers:
httputil.request(receiver, "/addnode?host=" + node + "&index=" + str(index))
def addnode(request):
host = request.args.get("host")
if host == None:
return 501, "Missing parameter: host"
if nodes.get(host) == None:
global nodeindex
index = nodeindex
nodeindex = index + 1
nodes[host] = index
notify(host, index, frontendnodes.keys())
return 200, "Ok"
def addfrontend(request):
host = request.args.get("host")
if host == None:
return 501, "Missing parameter: host"
frontendnodes[host] = True
nodelist = str(N) + "\n" + str(K) + "\n"
for node, index in nodes.iteritems():
nodelist += node + "," + str(index) + "\n"
return 200, nodelist
try:
server = httputil.createserver(port, {
"addnode" : addnode,
"addfrontend" : addfrontend,
})
except socket.error:
print("Could not bind on port: " + str(port))
else:
print("Controller serving on port: " + str(port))
server.serve_forever()