def getStatus( self, rid: str ) -> Dict[str,str]: workflow = self.app.getWorkflow(rid) if workflow is None: if rid in self.app.registeredRequests: return { "status": Status.str( Status.IDLE ), "rid": rid } else: return { "status": Status.str( Status.ERROR ), "rid": rid, "message": "Unknown request: " + rid } else: status = workflow.status() result = { "status": Status.str( status ), "rid": rid } if status == Status.ERROR: result["message"] = str( workflow.getResult().exception() ) self.logger.info( f"REST-SERVER: getStatus(rid={rid}): {str(result)}, all tasks: {self.app.getWorkflows().keys()}" ) return result
def processNextResponse(self, socket: zmq.Socket): try: self.log("Awaiting responses") response = socket.recv_multipart() sId = b2s(response[0]) header = json.loads(b2s(response[1])) type = header["type"] self._status = Status.decode(header["status"]) if type == "xarray" and len(response) > 2: dataset = pickle.loads(response[2]) self.cacheResult(header, dataset) elif self._status == Status.ERROR: self._exception = Exception(header["error"]) else: self.cacheResult(header, None) self.log(f"[{sId}]: Received response: " + str(header) + ", new status = " + str(self._status) + ", exception = " + str(self._exception)) except Exception as err: self.log("EDAS error: {0}\n{1}\n".format(err, traceback.format_exc())) self._exception = err
def updateStatus(self, message: Dict) -> Dict: if "status" in message: rid = message["rid"] status = Status.decode(message["status"]) self.statusMap[rid] = status message["status"] = status if self.debug: self.logger.info(f"REST_CLIENT: Update Status Map[{rid}]: " + str(status)) return message
def getStatusMap(self) -> Dict: response = {} for rid, workflow in self.app.getWorkflows().items(): status = workflow.status() result = {"status": Status.str(status), "rid": rid} if status == Status.ERROR: result["message"] = str(workflow.getResult().exception()) self.logger.info( f"REST-SERVER: getStatus(rid={rid}): {str(result)}, all tasks: {self.app.getWorkflows().keys()}" ) response[rid] = result return response
def updateStatus(self, message: Dict) -> Dict: if "status" in message: rid = message.get("rid") if rid is not None: status = Status.decode(message["status"]) self.statusMap[rid] = status message["status"] = status if self.debug or status == Status.ERROR: self.logger.info( f"REST_CLIENT: Update Status Map[{rid}]: " + str(status)) return message
def request(self, requestSpec: Dict, inputs: List[TaskResult] = None, **kwargs) -> TaskHandle: response = self.sendMessage("exe", requestSpec, **kwargs) self.log(f"Got exe response: {response}") if "error" in response: raise Exception(f"Server Error: {response['error']}") status = Status.decode(response.get('status')) self.log(str(response)) response_manager = ResponseManager(self.context, self.connector, response["rid"], self.host_address, self.response_port, status, self.cache_dir, **kwargs) response_manager.start() return zmqTask(self.cid, response_manager)
def run(self): debug = False try: self.log("Run RM thread") while (self.active): if len(self.active_requests) > 0: statMap = self._getStatusMap() for key, value in statMap.items(): self.statusMap[key] = Status.decode(value) if debug: self.logger.info("Server Job Status: " + str(statMap) + "; Client Job Status: " + str(self.statusMap)) time.sleep(self.poll_freq) except Exception as err: self.log("ResponseManager error: " + str(err)) self.log(traceback.format_exc()) self.statusMap.clear()