def monitor(self): """ Monitor whether a process is dead. raises: MessageFailure: when the message thread is dead or exited. RunPayloadFailure: when the payload process is dead or exited. """ if self.__no_more_event_time and time.time() - self.__no_more_event_time > self.__waiting_time: self.__ret_code = -1 raise Exception('Too long time (%s seconds) since "No more events" is injected' % (time.time() - self.__no_more_event_time)) if self.__monitor_log_time is None or self.__monitor_log_time < time.time() - 10 * 60: self.__monitor_log_time = time.time() logger.info('monitor is checking dead process.') if self.__message_thread is None: raise MessageFailure("Message thread has not started.") if not self.__message_thread.is_alive(): raise MessageFailure("Message thread is not alive.") if self.__process is None: raise RunPayloadFailure("Payload process has not started.") if self.__process.poll() is not None: if self.is_no_more_events: logger.info("Payload finished with no more events") else: self.__ret_code = self.__process.poll() raise RunPayloadFailure("Payload process is not alive: %s" % self.__process.poll()) if self.__stop.is_set() and time.time() > self.__stop_set_time + self.__stop_delay: logger.info("Stop has been set for %s seconds, which is more than the stop wait time. Will terminate" % self.__stop_delay) self.terminate()
def test_run_payload_failure(self): """ Make sure that es message thread works as expected. """ try: pass raise RunPayloadFailure(a='message a', b='message b') except PilotException as ex: self.assertIsInstance(ex, PilotException) self.assertEqual(ex.get_error_code(), 1305) logging.info( "\nException: error code: %s\n\nMain message: %s\n\nFullStack: %s" % (ex.get_error_code(), str(ex), ex.get_detail())) try: pass raise RunPayloadFailure("Test message") except PilotException as ex: self.assertIsInstance(ex, PilotException) self.assertEqual(ex.get_error_code(), 1305) logging.info( "\nException: error code: %s\n\nMain message: %s\n\nFullStack: %s" % (ex.get_error_code(), str(ex), ex.get_detail()))
def handle_out_message(self, message): """ Handle output or error messages from payload. Messages from payload will be parsed and the handle_out_message hook is called. :param message: The message string received from payload. :raises: SetupFailure: when handle_out_message_hook is not set. RunPayloadFailure: when failed to handle an output or error message. """ logger.debug('handling out message: %s' % message) if not self.handle_out_message_hook: raise SetupFailure("handle_out_message_hook is not set") try: message_status = self.parse_out_message(message) logger.debug('parsed out message: %s' % message_status) logger.debug('calling handle_out_message hook(%s) to handle parsed message.' % self.handle_out_message_hook) self.handle_out_message_hook(message_status) except Exception as e: raise RunPayloadFailure("Failed to handle out message: %s" % e)