def init_payload_process(self): """ init payload process. :raise SetupFailure: when failed to init payload process. """ logger.info("start to init payload process") try: try: workdir = self.get_workdir() except Exception as e: raise e executable = self.get_executable(workdir) output_file_fd = self.get_file(workdir, file_label='output_file', file_name='ES_payload_output.txt') error_file_fd = self.get_file(workdir, file_label='error_file', file_name='ES_payload_error.txt') # containerise executable if required if 'job' in self.__payload and self.__payload['job']: try: executable, diagnostics = containerise_executable(executable, job=self.__payload['job'], workdir=workdir) if diagnostics: msg = 'containerisation of executable failed: %s' % diagnostics logger.warning(msg) raise SetupFailure(msg) except Exception as e: msg = 'exception caught while preparing container command: %s' % e logger.warning(msg) raise SetupFailure(msg) else: logger.warning('could not containerise executable') # get the process self.__process = subprocess.Popen(executable, stdout=output_file_fd, stderr=error_file_fd, shell=True) self.pid = self.__process.pid self.__payload['job'].pid = self.pid self.__is_payload_started = True logger.debug("Started new processs (executable: %s, stdout: %s, stderr: %s, pid: %s)" % (executable, output_file_fd, error_file_fd, self.__process.pid)) if 'job' in self.__payload and self.__payload['job'] and self.__payload['job'].corecount: self.corecount = int(self.__payload['job'].corecount) except PilotException as e: logger.error("Failed to start payload process: %s, %s" % (e.get_detail(), traceback.format_exc())) self.__ret_code = -1 except Exception as e: logger.error("Failed to start payload process: %s, %s" % (str(e), traceback.format_exc())) self.__ret_code = -1 raise SetupFailure(e) logger.info("finished initializing payload process")
def get_event_ranges(self, num_ranges=None): """ Calling get_event_ranges hook to get event ranges. :param num_ranges: number of event ranges to get. :raises: SetupFailure: If get_event_ranges_hook is not set. MessageFailure: when failed to get event ranges. """ if not num_ranges: num_ranges = self.corecount logger.debug('getting event ranges(num_ranges=%s)' % num_ranges) if not self.get_event_ranges_hook: raise SetupFailure("get_event_ranges_hook is not set") try: logger.debug( 'calling get_event_ranges hook(%s) to get event ranges.' % self.get_event_ranges_hook) event_ranges = self.get_event_ranges_hook(num_ranges) logger.debug('got event ranges: %s' % event_ranges) return event_ranges except Exception as e: raise MessageFailure("Failed to get event ranges: %s" % e)
def get_workdir(self): """ Return the workdir. If the workdir is set but is not a directory, return None. :return: workdir (string or None). :raises SetupFailure: in case workdir is not a directory. """ workdir = '' if 'workdir' in self.__payload: workdir = self.__payload['workdir'] if not os.path.exists(workdir): os.makedirs(workdir) elif not os.path.isdir(workdir): raise SetupFailure('workdir exists but is not a directory') return workdir
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)
def init_payload_process(self): """ init payload process. :raise SetupFailure: when failed to init payload process. """ logger.info("start to init payload process") try: executable = self.__payload['executable'] executable = self.init_yampl_socket(executable) workdir = '' if 'workdir' in self.__payload: workdir = self.__payload['workdir'] if not os.path.exists(workdir): os.makedirs(workdir) elif not os.path.isdir(workdir): raise SetupFailure( 'Workdir exists but it is not a directory.') executable = 'cd %s; %s' % (workdir, executable) if 'output_file' in self.__payload: if type(self.__payload['output_file']) in [file]: output_file_fd = self.__payload['output_file'] else: if '/' in self.__payload['output_file']: output_file = self.__payload['output_file'] else: output_file = os.path.join( workdir, self.__payload['output_file']) output_file_fd = open(output_file, 'w') else: output_file = os.path.join(workdir, "ES_payload_output.txt") output_file_fd = open(output_file, 'w') if 'error_file' in self.__payload: if type(self.__payload['error_file']) in [file]: error_file_fd = self.__payload['error_file'] else: if '/' in self.__payload['error_file']: error_file = self.__payload['error_file'] else: error_file = os.path.join(workdir, self.__payload['error_file']) error_file_fd = open(error_file, 'w') else: error_file = os.path.join(workdir, "ES_payload_error.txt") error_file_fd = open(error_file, 'w') self.__process = subprocess.Popen(executable, stdout=output_file_fd, stderr=error_file_fd, shell=True) self.pid = self.__process.pid self.__is_payload_started = True logger.debug( "Started new processs(executable: %s, stdout: %s, stderr: %s, pid: %s)" % (executable, output_file_fd, error_file_fd, self.__process.pid)) if 'job' in self.__payload and self.__payload[ 'job'] and self.__payload['job'].corecount: self.corecount = int(self.__payload['job'].corecount) except PilotException as e: logger.error("Failed to start payload process: %s, %s" % (e.get_detail(), traceback.format_exc())) self.__ret_code = -1 except Exception as e: logger.error("Failed to start payload process: %s, %s" % (str(e), traceback.format_exc())) self.__ret_code = -1 raise SetupFailure(e) logger.info("finished to init payload process")