Save registered clients to server_state.json

This commit is contained in:
Brett Williams
2022-10-10 10:10:23 -07:00
parent cbc326f224
commit fe95a3b760

View File

@@ -23,7 +23,7 @@ app = Flask(__name__)
logger = logging.getLogger() logger = logging.getLogger()
local_hostname = socket.gethostname() local_hostname = socket.gethostname()
JSON_FILE = 'job_history.json' JSON_FILE = 'server_state.json'
#todo: move history to sqlite db #todo: move history to sqlite db
@@ -142,63 +142,67 @@ class RenderServer:
RenderStatus.COMPLETED, RenderStatus.ERROR]] RenderStatus.COMPLETED, RenderStatus.ERROR]]
for x in to_remove: for x in to_remove:
x.archived = True x.archived = True
cls.save_state()
@classmethod @classmethod
def load_history(cls, json_path=None): def load_state(cls, json_path=None):
"""Load state history from JSON file"""
input_path = json_path or JSON_FILE input_path = json_path or JSON_FILE
if os.path.exists(input_path): if os.path.exists(input_path):
f = open(input_path) with open(input_path) as f:
job_list = json.load(f)
for job in job_list:
# Identify renderer type and recreate Renderer object # load saved data
job_render_object = RenderWorkerFactory.create_worker(job['renderer'], input_path=job['render']['input'], output_path=job['render']['output']) saved_state = json.load(f)
cls.render_clients = saved_state.get('clients', {})
# Load Renderer values for job in saved_state.get('jobs', []):
for key, val in job['render'].items():
if val and key in ['start_time', 'end_time']: # convert date strings back into date objects
job_render_object.__dict__[key] = datetime.fromisoformat(val)
else:
job_render_object.__dict__[key] = val
job_render_object.status = RenderStatus[job['status'].upper()] # Identify renderer type and recreate Renderer object
job.pop('render', None) job_render_object = RenderWorkerFactory.create_worker(job['renderer'], input_path=job['render']['input'], output_path=job['render']['output'])
# Create RenderJob with re-created Renderer object # Load Renderer values
new_job = RenderJob(job_render_object, job['priority'], job['client']) for key, val in job['render'].items():
for key, val in job.items(): if val and key in ['start_time', 'end_time']: # convert date strings back into date objects
if key in ['date_created']: # convert date strings back to datetime objects job_render_object.__dict__[key] = datetime.fromisoformat(val)
new_job.__dict__[key] = datetime.fromisoformat(val) else:
else: job_render_object.__dict__[key] = val
new_job.__dict__[key] = val
new_job.__delattr__('status')
# Handle older loaded jobs that were cancelled before closing job_render_object.status = RenderStatus[job['status'].upper()]
if new_job.render_status() == RenderStatus.RUNNING: job.pop('render', None)
new_job.render.status = RenderStatus.CANCELLED
# finally add back to render queue # Create RenderJob with re-created Renderer object
cls.render_queue.append(new_job) new_job = RenderJob(job_render_object, job['priority'], job['client'])
f.close() for key, val in job.items():
if key in ['date_created']: # convert date strings back to datetime objects
new_job.__dict__[key] = datetime.fromisoformat(val)
else:
new_job.__dict__[key] = val
new_job.__delattr__('status')
cls.last_saved_counts = cls.job_counts() # Handle older loaded jobs that were cancelled before closing
if new_job.render_status() == RenderStatus.RUNNING:
new_job.render.status = RenderStatus.CANCELLED
# finally add back to render queue
cls.render_queue.append(new_job)
cls.last_saved_counts = cls.job_counts()
@classmethod @classmethod
def save_history(cls, json_path=None): def save_state(cls, json_path=None):
"""Save job history to JSON file""" """Save state history to JSON file"""
try: try:
logger.debug("Saving Render History") logger.debug("Saving Render History")
new_list = [] output = {'timestamp': datetime.now().isoformat(),
for job in cls.render_queue: 'jobs': [json.loads(j.json()) for j in cls.render_queue],
new_list.append(json.loads(job.json())) 'clients': cls.render_clients}
output_path = json_path or JSON_FILE output_path = json_path or JSON_FILE
with open(output_path, 'w') as f: with open(output_path, 'w') as f:
json.dump(new_list, f, indent=4) json.dump(output, f, indent=4)
cls.last_saved_counts = cls.job_counts() cls.last_saved_counts = cls.job_counts()
except Exception as e: except Exception as e:
logger.error("Error saving jobs JSON: {}".format(e)) logger.error("Error saving state JSON: {}".format(e))
@classmethod @classmethod
def evaluate_queue(cls): def evaluate_queue(cls):
@@ -222,7 +226,7 @@ class RenderServer:
cls.start_job(job) cls.start_job(job)
if cls.last_saved_counts != cls.job_counts(): if cls.last_saved_counts != cls.job_counts():
cls.save_history() cls.save_state()
@classmethod @classmethod
def start_job(cls, job): def start_job(cls, job):
@@ -289,6 +293,7 @@ class RenderServer:
cls.render_clients.append(hostname) cls.render_clients.append(hostname)
logger.info(f"Client '{hostname}' successfully registered") logger.info(f"Client '{hostname}' successfully registered")
success = True success = True
cls.save_state()
except requests.ConnectionError as e: except requests.ConnectionError as e:
logger.error(f"Cannot connect to client at hostname: {hostname}") logger.error(f"Cannot connect to client at hostname: {hostname}")
return success return success
@@ -329,7 +334,7 @@ class RenderServer:
flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper()) flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper())
# Setup the RenderServer object # Setup the RenderServer object
cls.load_history() cls.load_state()
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.get('queue_eval_seconds', 1)}, daemon=True)
thread.start() thread.start()