Repo cleanup. Move job_server class to lib.

This commit is contained in:
Brett Williams
2022-10-27 10:44:19 -07:00
parent 446f7b81a6
commit 39d6e95e9a
6 changed files with 78 additions and 71 deletions

3
.gitignore vendored
View File

@@ -2,4 +2,5 @@
*.icloud *.icloud
*.fcpxml *.fcpxml
/uploads /uploads
*.pyc *.pyc
/server_state.json

View File

@@ -1,4 +1,4 @@
upload_folder: "/Users/brett/Desktop/zordon-uploads/" upload_folder: "~/zordon-uploads/"
max_content_path: 100000000 max_content_path: 100000000
server_log_level: info server_log_level: info
flask_log_level: error flask_log_level: error

View File

@@ -5,14 +5,10 @@ import logging
import os import os
import pathlib import pathlib
import shutil import shutil
import socket
import threading
import time
from datetime import datetime from datetime import datetime
from zipfile import ZipFile from zipfile import ZipFile
import requests import requests
import yaml
from flask import Flask, request, render_template, send_file, after_this_request from flask import Flask, request, render_template, send_file, after_this_request
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
@@ -21,15 +17,15 @@ from lib.render_queue import RenderQueue
from utilities.render_worker import RenderWorkerFactory, string_to_status from utilities.render_worker import RenderWorkerFactory, string_to_status
logger = logging.getLogger() logger = logging.getLogger()
app = Flask(__name__) server = Flask(__name__)
@app.get('/jobs') @server.get('/jobs')
def jobs_json(): def jobs_json():
return [json.loads(x.json()) for x in RenderQueue.job_queue if not x.archived] return [json.loads(x.json()) for x in RenderQueue.job_queue if not x.archived]
@app.get('/jobs/<status_val>') @server.get('/jobs/<status_val>')
def filtered_jobs_json(status_val): def filtered_jobs_json(status_val):
state = string_to_status(status_val) state = string_to_status(status_val)
jobs = [json.loads(x.json()) for x in RenderQueue.jobs_with_status(state)] jobs = [json.loads(x.json()) for x in RenderQueue.jobs_with_status(state)]
@@ -39,7 +35,7 @@ def filtered_jobs_json(status_val):
return f'Cannot find jobs with status {status_val}', 400 return f'Cannot find jobs with status {status_val}', 400
@app.get('/job_status/<job_id>') @server.get('/job_status/<job_id>')
def get_job_status(job_id): def get_job_status(job_id):
found_job = RenderQueue.job_with_id(job_id) found_job = RenderQueue.job_with_id(job_id)
if found_job: if found_job:
@@ -48,7 +44,7 @@ def get_job_status(job_id):
return f'Cannot find job with ID {job_id}', 400 return f'Cannot find job with ID {job_id}', 400
@app.get('/file_list/<job_id>') @server.get('/file_list/<job_id>')
def get_file_list(job_id): def get_file_list(job_id):
found_job = RenderQueue.job_with_id(job_id) found_job = RenderQueue.job_with_id(job_id)
if found_job: if found_job:
@@ -58,7 +54,7 @@ def get_file_list(job_id):
return f'Cannot find job with ID {job_id}', 400 return f'Cannot find job with ID {job_id}', 400
@app.route('/download_all/<job_id>') @server.route('/download_all/<job_id>')
def download_all(job_id): def download_all(job_id):
zip_filename = None zip_filename = None
@@ -85,26 +81,26 @@ def download_all(job_id):
return f'Cannot find job with ID {job_id}', 400 return f'Cannot find job with ID {job_id}', 400
@app.post('/register_client') @server.post('/register_client')
def register_client(): def register_client():
client_hostname = request.values['hostname'] client_hostname = request.values['hostname']
x = RenderQueue.register_client(client_hostname) x = RenderQueue.register_client(client_hostname)
return "Success" if x else "Fail" return "Success" if x else "Fail"
@app.post('/unregister_client') @server.post('/unregister_client')
def unregister_client(): def unregister_client():
client_hostname = request.values['hostname'] client_hostname = request.values['hostname']
x = RenderQueue.unregister_client(client_hostname) x = RenderQueue.unregister_client(client_hostname)
return "Success" if x else "Fail" return "Success" if x else "Fail"
@app.get('/clients') @server.get('/clients')
def render_clients(): def render_clients():
return RenderQueue.render_clients return RenderQueue.render_clients
@app.get('/full_status') @server.get('/full_status')
def full_status(): def full_status():
full_results = {'timestamp': datetime.now().isoformat(), 'servers': {}} full_results = {'timestamp': datetime.now().isoformat(), 'servers': {}}
@@ -131,7 +127,7 @@ def full_status():
return full_results return full_results
@app.get('/snapshot') @server.get('/snapshot')
def snapshot(): def snapshot():
server_status = RenderQueue.status() server_status = RenderQueue.status()
server_jobs = [json.loads(x.json()) for x in RenderQueue.job_queue if not x.archived] server_jobs = [json.loads(x.json()) for x in RenderQueue.job_queue if not x.archived]
@@ -139,7 +135,7 @@ def snapshot():
return server_data return server_data
@app.post('/add_job') @server.post('/add_job')
def add_job(): def add_job():
def remove_job_dir(): def remove_job_dir():
if job_dir and os.path.exists(job_dir): if job_dir and os.path.exists(job_dir):
@@ -176,7 +172,7 @@ def add_job():
if uploaded_file and uploaded_file.filename: if uploaded_file and uploaded_file.filename:
logger.info(f"Receiving uploaded file {uploaded_file.filename}") logger.info(f"Receiving uploaded file {uploaded_file.filename}")
new_id = RenderJob.generate_id() new_id = RenderJob.generate_id()
job_dir = os.path.join(app.config['UPLOAD_FOLDER'], new_id + "-" + uploaded_file.filename) job_dir = os.path.join(server.config['UPLOAD_FOLDER'], new_id + "-" + uploaded_file.filename)
if not os.path.exists(job_dir): if not os.path.exists(job_dir):
os.makedirs(job_dir) os.makedirs(job_dir)
@@ -245,7 +241,7 @@ def add_job():
return 'unknown error', 500 return 'unknown error', 500
@app.get('/cancel_job') @server.get('/cancel_job')
def cancel_job(): def cancel_job():
job_id = request.args.get('id', None) job_id = request.args.get('id', None)
confirm = request.args.get('confirm', False) confirm = request.args.get('confirm', False)
@@ -264,18 +260,18 @@ def cancel_job():
return 'job not found', 400 return 'job not found', 400
@app.get('/clear_history') @server.get('/clear_history')
def clear_history(): def clear_history():
RenderQueue.clear_history() RenderQueue.clear_history()
return 'success' return 'success'
@app.route('/status') @server.route('/status')
def status(): def status():
return RenderQueue.status() return RenderQueue.status()
@app.get('/renderer_info') @server.get('/renderer_info')
def renderer_info(): def renderer_info():
renderer_data = {} renderer_data = {}
for r in RenderWorkerFactory.supported_renderers(): for r in RenderWorkerFactory.supported_renderers():
@@ -287,12 +283,12 @@ def renderer_info():
return renderer_data return renderer_data
@app.route('/') @server.route('/')
def default(): def default():
return "Server running" return "Server running"
@app.route('/upload') @server.route('/upload')
def upload_file_page(): def upload_file_page():
return render_template('upload.html', render_clients=RenderQueue.render_clients, return render_template('upload.html', render_clients=RenderQueue.render_clients,
supported_renderers=RenderWorkerFactory.supported_renderers()) supported_renderers=RenderWorkerFactory.supported_renderers())
@@ -305,49 +301,3 @@ def post_job_to_server(input_path, job_json, client, server_port=8080):
req = requests.post(f'http://{client}:{server_port}/add_job', files=job_files) req = requests.post(f'http://{client}:{server_port}/add_job', files=job_files)
return req return req
def start_server(background_thread=False):
def eval_loop(delay_sec=1):
while True:
RenderQueue.evaluate_queue()
time.sleep(delay_sec)
with open('config.yaml') as f:
config = yaml.load(f, Loader=yaml.FullLoader)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(module)s: %(message)s', datefmt='%d-%b-%y %H:%M:%S',
level=config.get('server_log_level', 'INFO').upper())
app.config['UPLOAD_FOLDER'] = config['upload_folder']
app.config['MAX_CONTENT_PATH'] = config['max_content_path']
# app.config['RESULT_STATIC_PATH'] = 'static'
# Get hostname and render clients
RenderQueue.host_name = socket.gethostname()
app.config['HOSTNAME'] = RenderQueue.host_name
if not RenderQueue.render_clients:
RenderQueue.render_clients = [RenderQueue.host_name]
# disable most Flask logging
flask_log = logging.getLogger('werkzeug')
flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper())
# Setup the RenderManager object
RenderQueue.load_state()
thread = threading.Thread(target=eval_loop, kwargs={'delay_sec': config.get('queue_eval_seconds', 1)}, daemon=True)
thread.start()
if background_thread:
server_thread = threading.Thread(
target=lambda: app.run(host='0.0.0.0', port=RenderQueue.port, debug=False, use_reloader=False))
server_thread.start()
server_thread.join()
else:
app.run(host='0.0.0.0', port=RenderQueue.port, debug=config.get('flask_debug_enable', False),
use_reloader=False)
if __name__ == '__main__':
start_server()

56
start_server.py Normal file
View File

@@ -0,0 +1,56 @@
#!/usr/bin/env python3
import logging
import os
import socket
import threading
import time
import yaml
from lib.job_server import server
from lib.render_queue import RenderQueue
def start_server(background_thread=False):
def eval_loop(delay_sec=1):
while True:
RenderQueue.evaluate_queue()
time.sleep(delay_sec)
with open('config.yaml') as f:
config = yaml.load(f, Loader=yaml.FullLoader)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(module)s: %(message)s', datefmt='%d-%b-%y %H:%M:%S',
level=config.get('server_log_level', 'INFO').upper())
server.config['UPLOAD_FOLDER'] = os.path.expanduser(config['upload_folder'])
server.config['MAX_CONTENT_PATH'] = config['max_content_path']
# Get hostname and render clients
RenderQueue.host_name = socket.gethostname()
server.config['HOSTNAME'] = RenderQueue.host_name
if not RenderQueue.render_clients:
RenderQueue.render_clients = [RenderQueue.host_name]
# disable most Flask logging
flask_log = logging.getLogger('werkzeug')
flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper())
# Set up the RenderQueue object
RenderQueue.load_state()
thread = threading.Thread(target=eval_loop, kwargs={'delay_sec': config.get('queue_eval_seconds', 1)}, daemon=True)
thread.start()
logging.info("Starting Zordon Render Server")
if background_thread:
server_thread = threading.Thread(
target=lambda: server.run(host='0.0.0.0', port=RenderQueue.port, debug=False, use_reloader=False))
server_thread.start()
server_thread.join()
else:
server.run(host='0.0.0.0', port=RenderQueue.port, debug=config.get('flask_debug_enable', False),
use_reloader=False)
if __name__ == '__main__':
start_server()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 MiB