12
12
from common .utils import Tee , get_datetime
13
13
14
14
from dotenv import load_dotenv
15
- from flask_backend import queue
15
+ from flask_backend import queue , executor_table
16
16
from flask_cors import cross_origin
17
17
from flask import Flask , request , jsonify
18
18
from signal import signal , SIGPIPE , SIG_DFL
@@ -26,12 +26,30 @@ def createApp():
26
26
os .environ ['TZ' ] = 'Asia/Kolkata'
27
27
time .tzset ()
28
28
29
+ config_path = os .path .join (os .getcwd (),"config" , "evaluator.json" )
30
+
31
+ configs = None
32
+ with open (config_path , "r" ) as f :
33
+ configs = json .loads (f .read ())
34
+
29
35
app = Flask (__name__ )
30
36
db = DataBase ()
31
37
32
- f = open (f'./sanity_checker_logs.txt' , 'a+' )
38
+ configs = configs ["backend" ]
39
+ backend_name = configs ["name" ]
40
+ backend_logdir = configs ["log_dir" ]
41
+ backend_config_dir = configs ["config_dir" ]
42
+
43
+ log_path = os .path .join (backend_logdir , backend_name )
44
+ if not os .path .exists (log_path ):
45
+ os .makedirs (log_path )
46
+
47
+ f = open (os .path .join (log_path , f'sanity_checker_logs.txt' ), 'a+' )
33
48
backup = sys .stdout
34
49
sys .stdout = Tee (sys .stdout , f )
50
+
51
+ def is_registered (executor_ip ) -> bool :
52
+ return executor_ip in executor_table
35
53
36
54
def delete_files (path ):
37
55
for file in os .listdir (path ):
@@ -240,13 +258,17 @@ def get_jobs():
240
258
client_addr = request .environ ['REMOTE_ADDR' ]
241
259
else :
242
260
client_addr = request .environ ['HTTP_X_FORWARDED_FOR' ] # if behind a proxy
261
+
262
+ if not is_registered (str (client_addr )):
263
+ res = {"status" : 401 , "msg" : f"This executor has not been registered with backend server. Please register before making request" }
264
+ return jsonify (res )
243
265
244
266
prefetch_factor = int (request .args .get ("prefetch_factor" ))
245
267
246
268
if prefetch_factor is None : prefetch_factor = 1
247
269
248
270
if len (queue ) == 0 :
249
- res = {"msg" : "Submission Queue is currently empty." , "len" : len (queue ), "num_submissions" : 0 }
271
+ res = {"msg" : "Submission Queue is currently empty." , "len" : len (queue ), "num_submissions" : 0 , "status" : 200 }
250
272
return jsonify (res )
251
273
252
274
data = []
@@ -269,11 +291,10 @@ def get_jobs():
269
291
270
292
r = requests .post (request_url , data = data )
271
293
272
- res = {"msg" : f"Dequeued { length } submissions from queue." , "num_submissions" : length , "len" : len (queue )}
294
+ res = {"msg" : f"Dequeued { length } submissions from queue." , "num_submissions" : length , "len" : len (queue ), "status" : 200 }
273
295
# res = {"msg": "dequeued from submission queue", "len": len(queue), "server_response": res}
274
296
return jsonify (res )
275
297
276
-
277
298
@app .route ("/queue-length" , methods = ["GET" ])
278
299
def queue_length ():
279
300
msg = {"length" : len (queue )}
@@ -285,6 +306,57 @@ def empty_queue():
285
306
res = {"msg" : "Queue Emptied" }
286
307
return jsonify (res )
287
308
309
+ @app .route ("/register_executor" , methods = ["POST" ])
310
+ def register_executor ():
311
+ executor_addr = None
312
+ if request .environ .get ('HTTP_X_FORWARDED_FOR' ) is None :
313
+ executor_addr = request .environ ['REMOTE_ADDR' ]
314
+ else :
315
+ executor_addr = request .environ ['HTTP_X_FORWARDED_FOR' ] # if behind a proxy
316
+
317
+ executor_addr = str (executor_addr )
318
+
319
+ data = json .loads (request .data )
320
+
321
+ executor_metadata = {
322
+ 'executor_name' : data ["executor_name" ],
323
+ 'executor_uuid' : data ["executor_uuid" ],
324
+ 'executor_log_dir' : data ["executor_log_dir" ],
325
+ 'num_backends' : data ["num_backends" ],
326
+ 'num_workers' : data ["num_workers" ],
327
+ 'num_threads' : data ["num_threads" ],
328
+ 'num_prefetch_threads' : data ["num_prefetch_threads" ],
329
+ 'prefetch_factor' : data ["prefetch_factor" ],
330
+ 'threshold' : data ["threshold" ],
331
+ 'timeout' : data ["timeout" ],
332
+ 'ipaddr' : executor_addr ,
333
+ }
334
+ executor_table [executor_addr ] = executor_metadata
335
+
336
+ if not os .path .exists (backend_config_dir ):
337
+ os .makedirs (backend_config_dir )
338
+
339
+ with open (os .path .join (backend_config_dir , f'{ data ["executor_name" ]} -{ data ["executor_uuid" ]} .json' ), 'w' , encoding = 'utf-8' ) as _f :
340
+ json .dump (executor_metadata , _f , ensure_ascii = False , indent = 4 )
341
+
342
+ msg = {"status" : 200 , "message" : "Registered!" }
343
+ return jsonify (msg )
344
+
345
+ @app .route ("/executors" , methods = ["GET" ])
346
+ def get_executors ():
347
+ files = list (os .listdir (backend_config_dir ))
348
+ executors = {}
349
+ for filename in files :
350
+ if ".json" not in filename :
351
+ continue
352
+ path = os .path .join (backend_config_dir , filename )
353
+ e = open (path ,"r" )
354
+ executor = json .loads (e .read ())
355
+ e .close ()
356
+ executors [executor ['ipaddr' ]] = executor
357
+
358
+ return jsonify (executors )
359
+
288
360
return app
289
361
290
362
if __name__ == "__main__" :
0 commit comments