예제 #1
0
    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")
예제 #2
0
파일: esprocess.py 프로젝트: ptrlv/pilot2
    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)
예제 #3
0
    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
예제 #4
0
    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)
예제 #5
0
파일: esprocess.py 프로젝트: ptrlv/pilot2
    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")