diff --git a/obs_proxy/server.py b/obs_proxy/server.py index dd84b670fe2b24846b8db354094697c7ac662a47..5780373270496aabde9c1cf380b3a414c36aff8c 100755 --- a/obs_proxy/server.py +++ b/obs_proxy/server.py @@ -423,19 +423,13 @@ async def worker_state(worker_id: str = None): return workers[worker_id].state -@app.route('/worker') -@ext_resources.route('/worker/<path:worker_id>/info') -@require_auth -@per_worker -async def worker_info(worker_id: str = None): - if worker_id not in ws_connections: - return 'not found', 404 - params = dict(request.args) +async def update_worker_info(params): + worker_id = params['worker_id'] orig_job_id = params.get('jobid', None) params['jobid'] = map_jobid_to_internal(worker_id, orig_job_id) - params['worker_id'] = worker_id job_trace("server", orig_job_id, worker_id, f"=> info {params['jobid']}") + logger.debug("=> info", params=params) resp = await ws_connections[worker_id].call( JSONRPC20Request( method='worker_info', @@ -444,14 +438,33 @@ async def worker_info(worker_id: str = None): ) job_trace("server", orig_job_id, worker_id, f"<= {resp.data}") if resp.error: - return resp.error, 500 + logger.error("error in worker update", error=resp.error) + return w = Worker.fromdict(resp.result['worker']) + logger.debug("updating worker", info=w) workers[worker_id].update(w) + + +@app.route('/worker') +@ext_resources.route('/worker/<path:worker_id>/info') +@require_auth +@per_worker +async def worker_info(worker_id: str = None): + if worker_id not in ws_connections: + return 'not found', 404 + params = dict(request.args) + + if worker_id not in workers: + logger.warning("worker in ws_connections but not in workers?!") + return 'not found', 404 + + params['worker_id'] = worker_id + + logger.debug("updating worker in background", params=params) + app.add_background_task(update_worker_info, params) + w = workers[worker_id] - if resp.result['code'] == 200: - return f"{w.external().asxml(pure=True, meta=False)}", {'content-type': 'text/xml'} - else: - return resp.result.get('content', ''), resp.result['code'] + return w.external().asxml(pure=True, meta=False), {'content-type': 'text/xml'} @app.route('/worker/<path:worker_id>/status')