-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
149 lines (117 loc) · 4.5 KB
/
server.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import atexit
from multiprocessing import Process
from threading import Timer
from celery import Celery
from flask import Flask, jsonify, request, send_file
from model.UserParameters import UserParameters
from server.BackgroundMonitor import BackgroundMonitor
from server.EventProcessor import EventProcessor
from server.DefaultComputeManager import DefaultComputeManager
from server.DefaultWorkerManager import DefaultWorkerManager
from storage.DatabaseStorage import DatabaseStorage
from celery.task.control import discard_all
from model.Config import Config
from flask import session, redirect, url_for, \
render_template, flash
import json
from utils import DBUtil
app = Flask(__name__, template_folder="web/templates", static_folder="web/static")
config = Config()
SECRET_KEY = config.secret_key
app.config.from_object(__name__)
kv_storage = DatabaseStorage(config.db_name)
worker_manager = DefaultWorkerManager(config, config.db_name)
comp_manager = DefaultComputeManager(worker_manager,kv_storage, config)
@app.route('/interface', methods=['GET'])
def web_interface():
return send_file("interface.html")
@app.route("/job", methods=['POST', 'GET'])
def create_job():
user_params = UserParameters()
user_params.naca4[0] = int(request.form["n0"])
user_params.naca4[1] = int(request.form["n1"])
user_params.naca4[2] = int(request.form["n2"])
user_params.naca4[3] = int(request.form["n3"])
user_params.min_angle = float(request.form["min_angle"])
user_params.max_angle = float(request.form["max_angle"])
user_params.step = float(request.form["step"])
user_params.num_nodes = int(request.form["num_nodes"])
user_params.refinement_level = int(request.form["refinement_level"])
user_params.num_samples = int(request.form["num_samples"])
user_params.viscosity = float(request.form["viscosity"])
user_params.speed = float(request.form["speed"])
user_params.time = float(request.form["time"])
return jsonify({"job_id": comp_manager.start_computation(user_params)})
@app.route("/job/<job_id>", methods=['DELETE'])
def delete_job(job_id):
comp_manager.stop_computation(job_id)
return jsonify("")
@app.route("/status")
def get_status():
return jsonify({"num_workers": worker_manager.get_number_of_workers(),
"running_tasks": DBUtil.execute_command(config.db_name, "SELECT COUNT(*) FROM Results WHERE value = 'null'",
None, "ONE")[0]})
p = None
b = None
@app.route("/job/<job_id>/result")
def get_result(job_id):
return jsonify(comp_manager.get_result(job_id))
# Login view - login options
@app.route('/')
def show_login():
return render_template('main_login.html', error=None)
# Main view - the user dashboard
@app.route('/dashboard')
def show_dashboard():
return render_template('dashboard.html')
# Logging in - fix to setup user DB and management
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != config.username:
error = 'Username not valid'
elif request.form['password'] != config.password:
error = 'Password not valid'
else:
session['logged_in'] = True
flash('You are now logged in')
return redirect(url_for('jobs'))
return render_template('main_login.html', error=error)
# Logging out - fix to adhere to updated user management
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('You are now logged out')
return redirect(url_for('show_login'))
@app.route('/service_status')
def service_status():
return render_template('service_status.html')
@app.route('/existing_jobs', methods=['GET'])
def existing_jobs():
ids = []
jobs = comp_manager.get_jobs()
for job in jobs:
print job
ids.append(job)
return json.dumps(ids)
@app.route('/job/<job_id>/parameters')
def job_parameters(job_id):
jobs = comp_manager.get_jobs()
job = jobs.get(job_id)
return render_template("job_parameters.html", user_params=job.user_params)
@app.route('/jobs', methods=['GET'])
def jobs():
return render_template('jobs.html')
if __name__ == '__main__':
c = Celery(broker=config.broker, backend=config.backend)
p = Process(target=EventProcessor, args=(c, config))
b = Process(target=BackgroundMonitor)
p.start()
b.start()
app.run(host='0.0.0.0', debug=config.debug, port=5000)
@atexit.register
def cleanup():
p.terminate()
b.terminate()
discard_all()