Remove Old Multi-Client Code / Refactoring (#13)

* Remove a lot of old code from render_queue regarding clients

* More code cleanup

* More code cleanup

* Move everything around

* Minor log change
This commit is contained in:
2023-06-11 14:50:20 -05:00
committed by GitHub
parent 86a1dae5b6
commit 94bb1e4362
22 changed files with 66 additions and 210 deletions

View File

@@ -3,28 +3,27 @@ import json
import logging
import os
import pathlib
import platform
import shutil
import socket
import threading
import time
import zipfile
from datetime import datetime
from urllib.request import urlretrieve
from zipfile import ZipFile
import json2html
import requests
import psutil
import yaml
from flask import Flask, request, render_template, send_file, after_this_request, Response, redirect, url_for, abort
from urllib.parse import urlparse
from urllib.request import urlretrieve
from werkzeug.utils import secure_filename
from lib.server.zeroconf_server import ZeroconfServer
from lib.render_queue import RenderQueue, JobNotFoundError
from lib.render_workers.worker_factory import RenderWorkerFactory
from lib.render_workers.base_worker import string_to_status, RenderStatus
from lib.workers.base_worker import string_to_status, RenderStatus
from lib.workers.worker_factory import RenderWorkerFactory
from lib.server.zeroconf_server import ZeroconfServer
from lib.utilities.server_helper import generate_thumbnail_for_job
from lib.server.server_proxy import RenderServerProxy
logger = logging.getLogger()
server = Flask(__name__, template_folder='templates', static_folder='static')
@@ -55,8 +54,8 @@ def index():
presets = yaml.load(f, Loader=yaml.FullLoader)
return render_template('index.html', all_jobs=sorted_jobs(RenderQueue.all_jobs()),
hostname=RenderQueue.hostname, renderer_info=renderer_info(),
render_clients=render_clients(), preset_list=presets)
hostname=server.config['HOSTNAME'], renderer_info=renderer_info(),
render_clients=[server.config['HOSTNAME']], preset_list=presets)
@server.get('/api/jobs')
@@ -85,7 +84,7 @@ def job_detail(job_id):
media_basename = os.path.basename(found_job.file_list()[0])
media_url = f"/api/job/{job_id}/file/{media_basename}"
return render_template('details.html', detail_table=table_html, media_url=media_url,
hostname=RenderQueue.hostname, job_status=found_job.status.value.title(),
hostname=server.config['HOSTNAME'], job_status=found_job.status.value.title(),
job=found_job, renderer_info=renderer_info())
@@ -210,23 +209,6 @@ def download_all(job_id):
return f'Cannot find project files for job {job_id}', 500
@server.post('/api/register_client')
def register_client():
client_hostname = request.values['hostname']
return RenderQueue.register_client(client_hostname)
@server.post('/api/unregister_client')
def unregister_client():
client_hostname = request.values['hostname']
return RenderQueue.unregister_client(client_hostname)
@server.get('/api/clients')
def render_clients():
return [c.hostname for c in RenderQueue.render_clients()]
@server.get('/api/presets')
def presets():
with open('config/presets.yaml') as f:
@@ -239,22 +221,10 @@ def full_status():
full_results = {'timestamp': datetime.now().isoformat(), 'servers': {}}
try:
for client_hostname in render_clients():
is_online = False
if client_hostname == RenderQueue.hostname:
snapshot_results = snapshot()
is_online = True
else:
snapshot_results = {}
try:
snapshot_request = requests.get(f'http://{client_hostname}:8080/snapshot', timeout=1)
snapshot_results = snapshot_request.json()
is_online = snapshot_request.ok
except requests.ConnectionError as e:
pass
server_data = {'status': snapshot_results.get('status', {}), 'jobs': snapshot_results.get('jobs', {}),
'is_online': is_online}
full_results['servers'][client_hostname] = server_data
snapshot_results = snapshot()
server_data = {'status': snapshot_results.get('status', {}), 'jobs': snapshot_results.get('jobs', {}),
'is_online': True}
full_results['servers'][server.config['HOSTNAME']] = server_data
except Exception as e:
logger.error(f"Exception fetching full status: {e}")
@@ -263,7 +233,7 @@ def full_status():
@server.get('/api/snapshot')
def snapshot():
server_status = RenderQueue.status()
server_status = status()
server_jobs = [x.json() for x in RenderQueue.all_jobs()]
server_data = {'status': server_status, 'jobs': server_jobs, 'timestamp': datetime.now().isoformat()}
return server_data
@@ -385,7 +355,7 @@ def add_job_handler():
input_path=loaded_project_local_path,
output_path=job["output_path"],
args=job.get('args', {}))
render_job.client = job.get('client', None) or RenderQueue.hostname
render_job.client = server.config['HOSTNAME']
render_job.owner = job.get("owner", None)
render_job.name = job.get("name", None)
render_job.priority = int(job.get('priority', render_job.priority))
@@ -476,7 +446,18 @@ def clear_history():
@server.route('/api/status')
def status():
return RenderQueue.status()
return {"timestamp": datetime.now().isoformat(),
"platform": platform.platform(),
"cpu_percent": psutil.cpu_percent(percpu=False),
"cpu_percent_per_cpu": psutil.cpu_percent(percpu=True),
"cpu_count": psutil.cpu_count(),
"memory_total": psutil.virtual_memory().total,
"memory_available": psutil.virtual_memory().available,
"memory_percent": psutil.virtual_memory().percent,
"job_counts": RenderQueue.job_counts(),
"hostname": server.config['HOSTNAME'],
"port": server.config['PORT']
}
@server.get('/api/renderer_info')
@@ -495,8 +476,7 @@ def renderer_info():
@server.route('/upload')
def upload_file_page():
return render_template('upload.html', render_clients=render_clients(),
supported_renderers=RenderWorkerFactory.supported_renderers())
return render_template('upload.html', supported_renderers=RenderWorkerFactory.supported_renderers())
def start_server(background_thread=False):
@@ -511,15 +491,17 @@ def start_server(background_thread=False):
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())
# get hostname
local_hostname = socket.gethostname()
local_hostname = local_hostname + (".local" if not local_hostname.endswith(".local") else "")
# load flask settings
server.config['HOSTNAME'] = local_hostname
server.config['PORT'] = int(config.get('port_number', 8080))
server.config['UPLOAD_FOLDER'] = os.path.expanduser(config['upload_folder'])
server.config['THUMBS_FOLDER'] = os.path.join(os.path.expanduser(config['upload_folder']), 'thumbs')
server.config['MAX_CONTENT_PATH'] = config['max_content_path']
# Get hostname and render clients
local_hostname = socket.gethostname()
RenderQueue.hostname = local_hostname + (".local" if not local_hostname.endswith(".local") else "")
server.config['HOSTNAME'] = RenderQueue.hostname
# disable most Flask logging
flask_log = logging.getLogger('werkzeug')
flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper())
@@ -530,19 +512,18 @@ def start_server(background_thread=False):
thread = threading.Thread(target=eval_loop, kwargs={'delay_sec': config.get('queue_eval_seconds', 1)}, daemon=True)
thread.start()
logging.info(f"Starting Zordon Render Server - Hostname: '{RenderQueue.hostname}'")
zeroconf_server = ZeroconfServer("_zordon._tcp.local.", RenderQueue.hostname, RenderQueue.port)
logging.info(f"Starting Zordon Render Server - Hostname: '{server.config['HOSTNAME']}:'")
zeroconf_server = ZeroconfServer("_zordon._tcp.local.", server.config['HOSTNAME'], server.config['PORT'])
zeroconf_server.start()
try:
if background_thread:
server_thread = threading.Thread(
target=lambda: server.run(host='0.0.0.0', port=RenderQueue.port, debug=False, use_reloader=False))
target=lambda: server.run(host='0.0.0.0', port=server.config['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),
server.run(host='0.0.0.0', port=server.config['PORT'], debug=config.get('flask_debug_enable', False),
use_reloader=False, threaded=True)
finally:
zeroconf_server.stop()

View File

@@ -4,7 +4,7 @@ import json
import requests
import time
import threading
from lib.render_workers.base_worker import RenderStatus
from lib.workers.base_worker import RenderStatus
from requests_toolbelt.multipart import MultipartEncoder, MultipartEncoderMonitor
status_colors = {RenderStatus.ERROR: "red", RenderStatus.CANCELLED: 'orange1', RenderStatus.COMPLETED: 'green',
@@ -21,7 +21,7 @@ OFFLINE_MAX = 2
class RenderServerProxy:
def __init__(self, hostname, server_port="8080"):
self._hostname = hostname
self.hostname = hostname
self.port = server_port
self.fetched_status_data = None
self.__jobs_cache_token = None
@@ -31,15 +31,6 @@ class RenderServerProxy:
self.__offline_flags = 0
self.update_cadence = 5
@property
def hostname(self):
return self._hostname
@hostname.setter
def hostname(self, value):
self._hostname = value
self.__jobs_cache_token = None
def connect(self):
status = self.request_data('status')
return status