Downloadable engines (#34)

* Add blender_downloader.py

* Add engine_manager.py

* Add additional methods to engine_manager.py

* Refactor file layout to make engines on par with workers

* Add system platform info to status response

* Default to using system platform / cpu if none are provided

* Add API to download an engine and some general cleanup

* Add method to delete downloaded engine

* Add API calls to download engines and delete downloads

* Misc fixes
This commit is contained in:
2023-10-20 15:05:29 -05:00
committed by GitHub
parent 4563dcb255
commit 7d1ecf1fa5
21 changed files with 439 additions and 79 deletions

View File

@@ -21,11 +21,12 @@ from flask import Flask, request, render_template, send_file, after_this_request
from werkzeug.utils import secure_filename
from src.distributed_job_manager import DistributedJobManager
from src.engines.engine_manager import EngineManager
from src.render_queue import RenderQueue, JobNotFoundError
from src.server_proxy import RenderServerProxy
from src.utilities.server_helper import generate_thumbnail_for_job
from src.utilities.zeroconf_server import ZeroconfServer
from src.worker_factory import RenderWorkerFactory
from src.workers.worker_factory import RenderWorkerFactory
from src.workers.base_worker import string_to_status, RenderStatus
logger = logging.getLogger()
@@ -499,14 +500,21 @@ def clear_history():
def status():
renderer_data = {}
for render_class in RenderWorkerFactory.supported_classes():
if render_class.engine.renderer_path(): # only return renderers installed on host
if render_class.engine.default_renderer_path(): # only return renderers installed on host
renderer_data[render_class.engine.name()] = \
{'version': render_class.engine.version(),
{'versions': EngineManager.all_versions_for_engine(render_class.engine.name()),
'is_available': RenderQueue.is_available_for_job(render_class.engine.name())
}
# Get system info
system_platform = platform.system().lower().replace('darwin', 'macos')
system_platform_version = platform.mac_ver()[0] if system_platform == 'macos' else platform.release().lower()
system_cpu = platform.machine().lower().replace('amd64', 'x64')
return {"timestamp": datetime.now().isoformat(),
"platform": platform.platform(),
"system_platform": system_platform,
"system_platform_version": system_platform_version,
"system_cpu": system_cpu,
"cpu_percent": psutil.cpu_percent(percpu=False),
"cpu_percent_per_cpu": psutil.cpu_percent(percpu=True),
"cpu_count": psutil.cpu_count(logical=False),
@@ -523,17 +531,36 @@ def status():
@server.get('/api/renderer_info')
def renderer_info():
renderer_data = {}
for r in RenderWorkerFactory.supported_renderers():
engine = RenderWorkerFactory.class_for_name(r).engine
if engine.renderer_path():
renderer_data[r] = {'is_available': RenderQueue.is_available_for_job(engine.name()),
'version': engine.version(),
for engine_name in RenderWorkerFactory.supported_renderers():
engine = RenderWorkerFactory.class_for_name(engine_name).engine
if engine.default_renderer_path():
# Get all installed versions of engine
renderer_data[engine_name] = {'is_available': RenderQueue.is_available_for_job(engine.name()),
'versions': EngineManager.all_versions_for_engine(engine_name),
'supported_extensions': engine.supported_extensions,
'supported_export_formats': engine.get_output_formats(),
'path': engine.renderer_path()}
'supported_export_formats': engine().get_output_formats()}
return renderer_data
@server.post('/api/download_engine')
def download_engine():
download_result = EngineManager.download_engine(request.args.get('engine'),
request.args.get('version'),
request.args.get('system_os'),
request.args.get('cpu'))
return download_result if download_result else ("Error downloading requested engine", 500)
@server.post('/api/delete_engine')
def delete_engine_download():
delete_result = EngineManager.delete_engine_download(request.args.get('engine'),
request.args.get('version'),
request.args.get('system_os'),
request.args.get('cpu'))
return "Success" if delete_result else ("Error deleting requested engine", 500)
@server.route('/upload')
def upload_file_page():
return render_template('upload.html', supported_renderers=RenderWorkerFactory.supported_renderers())
@@ -563,6 +590,10 @@ def start_server(background_thread=False):
server.config['MAX_CONTENT_PATH'] = config['max_content_path']
server.config['enable_split_jobs'] = config.get('enable_split_jobs', False)
# Setup directory for saving engines to
EngineManager.engines_path = os.path.join(os.path.join(os.path.expanduser(config['upload_folder']), 'engines'))
os.makedirs(EngineManager.engines_path, exist_ok=True)
# disable most Flask logging
flask_log = logging.getLogger('werkzeug')
flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper())