Config class (#51)

* Add new Config class to handle loading config files

* Use new config class in api_server.py
This commit is contained in:
2023-10-29 22:22:40 -05:00
committed by GitHub
parent 6ce69c8d35
commit bc8e88ea59
3 changed files with 55 additions and 21 deletions

View File

@@ -2,6 +2,7 @@ upload_folder: "~/zordon-uploads/"
update_engines_on_launch: true update_engines_on_launch: true
max_content_path: 100000000 max_content_path: 100000000
server_log_level: info server_log_level: info
log_buffer_length: 250
flask_log_level: error flask_log_level: error
flask_debug_enable: false flask_debug_enable: false
queue_eval_seconds: 1 queue_eval_seconds: 1

View File

@@ -23,6 +23,7 @@ from src.distributed_job_manager import DistributedJobManager
from src.engines.core.base_worker import string_to_status, RenderStatus from src.engines.core.base_worker import string_to_status, RenderStatus
from src.engines.engine_manager import EngineManager from src.engines.engine_manager import EngineManager
from src.render_queue import RenderQueue, JobNotFoundError from src.render_queue import RenderQueue, JobNotFoundError
from src.utilities.config import Config
from src.utilities.misc_helper import system_safe_path, current_system_os, current_system_cpu, current_system_os_version from src.utilities.misc_helper import system_safe_path, current_system_os, current_system_cpu, current_system_os_version
from src.utilities.server_helper import generate_thumbnail_for_job from src.utilities.server_helper import generate_thumbnail_for_job
from src.utilities.zeroconf_server import ZeroconfServer from src.utilities.zeroconf_server import ZeroconfServer
@@ -492,17 +493,18 @@ def upload_file_page():
return render_template('upload.html', supported_renderers=EngineManager.supported_engines()) return render_template('upload.html', supported_renderers=EngineManager.supported_engines())
def start_server(background_thread=False): def start_server():
def eval_loop(delay_sec=1): def eval_loop(delay_sec=1):
while True: while True:
RenderQueue.evaluate_queue() RenderQueue.evaluate_queue()
time.sleep(delay_sec) time.sleep(delay_sec)
with open(system_safe_path('config/config.yaml')) as f: # Load Config YAML
config = yaml.load(f, Loader=yaml.FullLoader) config_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'config')
Config.load_config(system_safe_path(os.path.join(config_dir, 'config.yaml')))
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(module)s: %(message)s', datefmt='%d-%b-%y %H:%M:%S', 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()) level=Config.server_log_level.upper())
# get hostname # get hostname
local_hostname = socket.gethostname() local_hostname = socket.gethostname()
@@ -510,14 +512,15 @@ def start_server(background_thread=False):
# load flask settings # load flask settings
server.config['HOSTNAME'] = local_hostname server.config['HOSTNAME'] = local_hostname
server.config['PORT'] = int(config.get('port_number', 8080)) server.config['PORT'] = int(Config.port_number)
server.config['UPLOAD_FOLDER'] = system_safe_path(os.path.expanduser(config['upload_folder'])) server.config['UPLOAD_FOLDER'] = system_safe_path(os.path.expanduser(Config.upload_folder))
server.config['THUMBS_FOLDER'] = system_safe_path(os.path.join(os.path.expanduser(config['upload_folder']), 'thumbs')) server.config['THUMBS_FOLDER'] = system_safe_path(os.path.join(os.path.expanduser(Config.upload_folder), 'thumbs'))
server.config['MAX_CONTENT_PATH'] = config['max_content_path'] server.config['MAX_CONTENT_PATH'] = Config.max_content_path
server.config['enable_split_jobs'] = config.get('enable_split_jobs', False) server.config['enable_split_jobs'] = Config.enable_split_jobs
# Setup directory for saving engines to # Setup directory for saving engines to
EngineManager.engines_path = system_safe_path(os.path.join(os.path.join(os.path.expanduser(config['upload_folder']), 'engines'))) EngineManager.engines_path = system_safe_path(os.path.join(os.path.join(os.path.expanduser(Config.upload_folder),
'engines')))
os.makedirs(EngineManager.engines_path, exist_ok=True) os.makedirs(EngineManager.engines_path, exist_ok=True)
# Debug info # Debug info
@@ -527,17 +530,17 @@ def start_server(background_thread=False):
# disable most Flask logging # disable most Flask logging
flask_log = logging.getLogger('werkzeug') flask_log = logging.getLogger('werkzeug')
flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper()) flask_log.setLevel(Config.flask_log_level.upper())
# check for updates for render engines if config'd or on first launch # check for updates for render engines if config'd or on first launch
if config.get('update_engines_on_launch', False) or not EngineManager.all_engines(): if Config.update_engines_on_launch or not EngineManager.all_engines():
EngineManager.update_all_engines() EngineManager.update_all_engines()
# Set up the RenderQueue object # Set up the RenderQueue object
RenderQueue.load_state(database_directory=server.config['UPLOAD_FOLDER']) RenderQueue.load_state(database_directory=server.config['UPLOAD_FOLDER'])
DistributedJobManager.start() DistributedJobManager.start()
thread = threading.Thread(target=eval_loop, kwargs={'delay_sec': config.get('queue_eval_seconds', 1)}, daemon=True) thread = threading.Thread(target=eval_loop, kwargs={'delay_sec': Config.queue_eval_seconds}, daemon=True)
thread.start() thread.start()
logger.info(f"Starting Zordon Render Server - Hostname: '{server.config['HOSTNAME']}:'") logger.info(f"Starting Zordon Render Server - Hostname: '{server.config['HOSTNAME']}:'")
@@ -545,14 +548,8 @@ def start_server(background_thread=False):
ZeroconfServer.start() ZeroconfServer.start()
try: try:
if background_thread: server.run(host='0.0.0.0', port=server.config['PORT'], debug=Config.flask_debug_enable,
server_thread = threading.Thread( use_reloader=False, threaded=True)
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=server.config['PORT'], debug=config.get('flask_debug_enable', False),
use_reloader=False, threaded=True)
finally: finally:
RenderQueue.save_state() RenderQueue.save_state()
ZeroconfServer.stop() ZeroconfServer.stop()

36
src/utilities/config.py Normal file
View File

@@ -0,0 +1,36 @@
import os
import yaml
class Config:
# Initialize class variables with default values
upload_folder = "~/zordon-uploads/"
update_engines_on_launch = True
max_content_path = 100000000
server_log_level = 'debug'
log_buffer_length = 250
subjob_connection_timeout = 120
flask_log_level = 'error'
flask_debug_enable = False
queue_eval_seconds = 1
port_number = 8080
enable_split_jobs = True
download_timeout_seconds = 120
@classmethod
def load_config(cls, config_path):
with open(config_path, 'r') as ymlfile:
cfg = yaml.safe_load(ymlfile)
cls.upload_folder = os.path.expanduser(cfg.get('upload_folder', cls.upload_folder))
cls.update_engines_on_launch = cfg.get('update_engines_on_launch', cls.update_engines_on_launch)
cls.max_content_path = cfg.get('max_content_path', cls.max_content_path)
cls.server_log_level = cfg.get('server_log_level', cls.server_log_level)
cls.log_buffer_length = cfg.get('log_buffer_length', cls.log_buffer_length)
cls.subjob_connection_timeout = cfg.get('subjob_connection_timeout', cls.subjob_connection_timeout)
cls.flask_log_level = cfg.get('flask_log_level', cls.flask_log_level)
cls.flask_debug_enable = cfg.get('flask_debug_enable', cls.flask_debug_enable)
cls.queue_eval_seconds = cfg.get('queue_eval_seconds', cls.queue_eval_seconds)
cls.port_number = cfg.get('port_number', cls.port_number)
cls.enable_split_jobs = cfg.get('enable_split_jobs', cls.enable_split_jobs)
cls.download_timeout_seconds = cfg.get('download_timeout_seconds', cls.download_timeout_seconds)