def parse_record(self, record): '''parse an individual job record''' job = None resource_specs = {} resources_used = {} state = None host_str = None for line in record.split('\n'): line = line.strip() if state == 'exec_host': if not line.startswith('exec_port'): host_str += line continue else: hosts = {} for host in host_str.split('+'): node, core = host.split('/') if node not in hosts: hosts[node] = [] hosts[node].append(core) job.exec_host = hosts state = None host_str = None if line.startswith('Job Id:'): _, job_id = line.split(':', 1) job = PbsJob(self._config, job_id.strip()) elif line.startswith('Job_Name ='): job.name = self._get_value(line) elif line.startswith('euser ='******'job_state = '): job.state = self._get_value(line) elif line.startswith('queue ='): job.queue = self._get_value(line) elif line.startswith('Account_Name ='): job.project = self._get_value(line) elif line.startswith('resources_used.walltime ='): walltime = self._get_value(line) resources_used['walltime'] = walltime2seconds(walltime) elif line.startswith('Resource_List.walltime ='): walltime = self._get_value(line) resource_specs['walltime'] = walltime2seconds(walltime) elif line.startswith('Resource_List.nodect = '): nodect = int(self._get_value(line)) resource_specs['nodect'] = nodect elif line.startswith('exec_host ='): host_strs = self._get_value(line).split('+') exec_host = dict() for host_str in host_strs: if '/' in host_str: host, cores = host_str.split('/') exec_host[host] = cores else: exec_host[host_str] = None job.exec_host = exec_host elif line.startswith('Resource_List.partition ='): job.partition = self._get_value(line) job.add_resource_specs(resource_specs) job.add_resources_used(resources_used) return job
def __init__(self, config, event_defs, pbs_directive='#PBS'): '''Constructor''' super(PbsScriptParser, self).__init__(event_defs) self._config = config self._job = PbsJob(self._config) self._pbs_directive = pbs_directive regex = r'\s*{0}\s+(.+)$'.format(pbs_directive) self._pbs_re = re.compile(regex) regex = r'\s+{0}\s+(.+)$'.format(pbs_directive) self._pbs_indented_re = re.compile(regex) regex = r'\s*{0}\s+(.+)$'.format(pbs_directive) self._pbs_extract_re = re.compile(regex) self._pbs_option_parser = PbsOptionParser(self._config, event_defs, self._job) self._state = None self._line_nr = 0 self._pbs = []
def parse_file(self, file_name): '''Parse the specified log''' with open(file_name, 'r') as pbs_file: line_nr = 0 for line in pbs_file: line_nr += 1 line = line.rstrip() if not line: continue try: time_stamp, event_type, job_id, info_str = line.split(';') if job_id not in self._jobs: self._jobs[job_id] = PbsJob(self._config, job_id) event = PbsJobEvent(time_stamp, event_type, info_str) self._jobs[job_id].add_event(event) except: msg = 'problem on line {0} in {1}'.format(line, file_name) raise PbsLogParserError(msg)