import logging import os import json import requests from lib.render_workers.base_worker import RenderStatus status_colors = {RenderStatus.ERROR: "red", RenderStatus.CANCELLED: 'orange1', RenderStatus.COMPLETED: 'green', RenderStatus.NOT_STARTED: "yellow", RenderStatus.SCHEDULED: 'purple', RenderStatus.RUNNING: 'cyan'} categories = [RenderStatus.RUNNING, RenderStatus.ERROR, RenderStatus.NOT_STARTED, RenderStatus.SCHEDULED, RenderStatus.COMPLETED, RenderStatus.CANCELLED, RenderStatus.UNDEFINED] logger = logging.getLogger() class RenderServerProxy: def __init__(self, hostname=None, server_port="8080"): self._hostname = hostname self.port = server_port self.fetched_status_data = None self.__jobs_cache_token = None @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 def request_data(self, payload, timeout=5): try: req = self.request(payload, timeout) if req.ok and req.status_code == 200: return req.json() except json.JSONDecodeError as e: logger.debug(f"JSON decode error: {e}") except requests.ConnectionError as e: logger.error(f"Connection error: {e}") except Exception as e: logger.exception(f"Uncaught exception: {e}") return None def request(self, payload, timeout=5): return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout) def get_jobs(self, timeout=5): url = f'jobs?token={self.__jobs_cache_token}' if self.__jobs_cache_token else 'jobs' status_result = self.request_data(url, timeout=timeout) all_jobs = None if status_result is not None: sorted_jobs = [] for status_category in categories: found_jobs = [x for x in status_result['jobs'] if x['status'] == status_category.value] if found_jobs: sorted_jobs.extend(found_jobs) all_jobs = sorted_jobs self.__jobs_cache_token = status_result['token'] return all_jobs def get_data(self, timeout=5): all_data = self.request_data('full_status', timeout=timeout) return all_data def post_job_to_server(self, input_path, job_list): # 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_list), 'application/json')} req = requests.post(f'http://{self.hostname}:{self.port}/api/add_job', files=job_files) return req