mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 16:58:12 +00:00
Add ability to add multiple jobs with same source file
This commit is contained in:
@@ -141,81 +141,124 @@ def add_job_handler():
|
||||
try:
|
||||
"""Create new job and add to server render queue"""
|
||||
json_string = request.form.get('json', None)
|
||||
uploaded_file = request.files.get('file', None)
|
||||
if not json_string:
|
||||
return 'missing json data', 400
|
||||
|
||||
print(json_string)
|
||||
|
||||
# handle uploaded files
|
||||
uploaded_file_local_path = None
|
||||
job_dir = None
|
||||
if uploaded_file and uploaded_file.filename:
|
||||
logger.info(f"Receiving uploaded file {uploaded_file.filename}")
|
||||
new_id = RenderJob.generate_id()
|
||||
job_dir = os.path.join(server.config['UPLOAD_FOLDER'], new_id + "-" + uploaded_file.filename)
|
||||
if not os.path.exists(job_dir):
|
||||
os.makedirs(job_dir)
|
||||
uploaded_file_local_path = os.path.join(job_dir, secure_filename(uploaded_file.filename))
|
||||
uploaded_file.save(uploaded_file_local_path)
|
||||
|
||||
local_path = os.path.join(job_dir, secure_filename(uploaded_file.filename))
|
||||
uploaded_file.save(local_path)
|
||||
input_path = local_path
|
||||
output_dir = os.path.join(job_dir, 'output')
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
output_path = os.path.join(output_dir, os.path.basename(output_path))
|
||||
# convert job input paths for uploaded files and add jobs
|
||||
jobs_list = json.loads(json_string)
|
||||
results = []
|
||||
for job in jobs_list:
|
||||
if uploaded_file_local_path:
|
||||
job['input_path'] = uploaded_file_local_path
|
||||
output_dir = os.path.join(job_dir, job.get('name', 'output'))
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
job['output_path'] = os.path.join(output_dir, os.path.basename(job['output_path']))
|
||||
remove_job_dir = len(jobs_list) == 1 # remove failed job dir for single file uploads only
|
||||
add_result = add_job(job, remove_job_dir_on_failure=remove_job_dir)
|
||||
results.append(add_result)
|
||||
|
||||
# local renders
|
||||
if client == RenderQueue.host_name:
|
||||
logger.info(f"Creating job locally - {input_path}")
|
||||
try:
|
||||
render_job = RenderJob(renderer, input_path, output_path, args, priority, job_owner, client,
|
||||
notify=False, custom_id=custom_id)
|
||||
RenderQueue.add_to_render_queue(render_job, force_start=force_start)
|
||||
return render_job.json()
|
||||
except Exception as e:
|
||||
err_msg = f"Error creating job: {str(e)}"
|
||||
logger.exception(err_msg)
|
||||
remove_job_dir()
|
||||
return err_msg, 400
|
||||
|
||||
# client renders
|
||||
elif client in RenderQueue.render_clients:
|
||||
|
||||
# see if host is available
|
||||
if RenderQueue.is_client_available(client):
|
||||
|
||||
# call uploader on remote client
|
||||
try:
|
||||
logger.info(f"Uploading file {input_path} to client {client}")
|
||||
job_data = request.json
|
||||
response = post_job_to_server(input_path, job_data)
|
||||
if response.ok:
|
||||
logger.info("Job submitted successfully!")
|
||||
return response.json() if response.json() else "Job ok"
|
||||
else:
|
||||
remove_job_dir()
|
||||
return 'Job rejected by client', 403
|
||||
except requests.ConnectionError as e:
|
||||
err_msg = f"Error submitting job to client: {client}"
|
||||
logger.error(err_msg)
|
||||
remove_job_dir()
|
||||
return err_msg, 500
|
||||
else:
|
||||
# client is not available
|
||||
err_msg = f"Render client '{client}' is unreachable"
|
||||
logger.error(err_msg)
|
||||
remove_job_dir()
|
||||
return err_msg, 503
|
||||
|
||||
else:
|
||||
err_msg = f"Unknown render client: '{client}'"
|
||||
logger.error(err_msg)
|
||||
remove_job_dir()
|
||||
return err_msg, 400
|
||||
# return any errors from results list
|
||||
for response in results:
|
||||
if response.get('error', None):
|
||||
if len(results) == 1:
|
||||
return results, response.get('code', 500)
|
||||
else:
|
||||
return results, 400
|
||||
return results
|
||||
|
||||
except Exception as e:
|
||||
logger.exception(f"Unknown error adding job: {e}")
|
||||
remove_job_dir()
|
||||
return 'unknown error', 500
|
||||
|
||||
|
||||
def add_job(job_params, remove_job_dir_on_failure=False):
|
||||
|
||||
def remove_job_dir():
|
||||
if remove_job_dir_on_failure and job_dir and os.path.exists(job_dir):
|
||||
logger.debug(f"Removing job dir: {job_dir}")
|
||||
shutil.rmtree(job_dir)
|
||||
|
||||
name = job_params.get("name", None)
|
||||
job_owner = job_params.get("owner", None)
|
||||
renderer = job_params.get("renderer", None)
|
||||
input_path = job_params.get("input_path", None)
|
||||
output_path = job_params.get("output_path", None)
|
||||
priority = int(job_params.get('priority', 2))
|
||||
args = job_params.get('args', {})
|
||||
client = job_params.get('client', RenderQueue.host_name)
|
||||
force_start = job_params.get('force_start', False)
|
||||
custom_id = None
|
||||
job_dir = None
|
||||
|
||||
# check for minimum render requirements
|
||||
if None in [renderer, input_path, output_path]:
|
||||
err_msg = 'Cannot add job: Missing required parameters'
|
||||
logger.error(err_msg)
|
||||
return {'error': err_msg, 'code': 400}
|
||||
|
||||
# local renders
|
||||
if client == RenderQueue.host_name:
|
||||
logger.info(f"Creating job locally - {name if name else input_path}")
|
||||
try:
|
||||
render_job = RenderJob(renderer, input_path, output_path, args, priority, job_owner, client,
|
||||
notify=False, custom_id=custom_id, name=name)
|
||||
RenderQueue.add_to_render_queue(render_job, force_start=force_start)
|
||||
return render_job.json_safe_copy()
|
||||
except Exception as e:
|
||||
err_msg = f"Error creating job: {str(e)}"
|
||||
logger.exception(err_msg)
|
||||
remove_job_dir()
|
||||
return {'error': err_msg, 'code': 400}
|
||||
|
||||
# client renders
|
||||
elif client in RenderQueue.render_clients:
|
||||
|
||||
# see if host is available
|
||||
if RenderQueue.is_client_available(client):
|
||||
|
||||
# call uploader on remote client
|
||||
try:
|
||||
logger.info(f"Uploading file {input_path} to client {client}")
|
||||
job_data = request.json
|
||||
response = post_job_to_server(input_path, job_data, client)
|
||||
if response.ok:
|
||||
logger.info("Job submitted successfully!")
|
||||
return response.json() if response.json() else "Job ok"
|
||||
else:
|
||||
remove_job_dir()
|
||||
return {'error': "Job rejected by client", 'code': 400}
|
||||
except requests.ConnectionError as e:
|
||||
err_msg = f"Error submitting job to client: {client}"
|
||||
logger.error(err_msg)
|
||||
remove_job_dir()
|
||||
return {'error': err_msg, 'code': 500}
|
||||
else:
|
||||
# client is not available
|
||||
err_msg = f"Render client '{client}' is unreachable"
|
||||
logger.error(err_msg)
|
||||
remove_job_dir()
|
||||
return {'error': err_msg, 'code': 503}
|
||||
|
||||
else:
|
||||
err_msg = f"Unknown render client: '{client}'"
|
||||
logger.error(err_msg)
|
||||
remove_job_dir()
|
||||
return {'error': err_msg, 'code': 400}
|
||||
|
||||
|
||||
@server.get('/cancel_job')
|
||||
def cancel_job():
|
||||
job_id = request.args.get('id', None)
|
||||
@@ -269,10 +312,11 @@ def upload_file_page():
|
||||
supported_renderers=RenderWorkerFactory.supported_renderers())
|
||||
|
||||
|
||||
def post_job_to_server(input_path, job_json, client, server_port=8080):
|
||||
#todo: move this to a helper file
|
||||
def post_job_to_server(input_path, job_list, client, server_port=8080):
|
||||
# Pack job data and submit to server
|
||||
job_files = {'file': (os.path.basename(input_path), open(input_path, 'rb'), 'application/octet-stream'),
|
||||
'json': (None, json.dumps(job_json), 'application/json')}
|
||||
'json': (None, json.dumps(job_list), 'application/json')}
|
||||
|
||||
req = requests.post(f'http://{client}:{server_port}/add_job', files=job_files)
|
||||
return req
|
||||
|
||||
Reference in New Issue
Block a user