ATLAS Offline Software
Loading...
Searching...
No Matches
JobDetails.py
Go to the documentation of this file.
1# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2
3
4"""
5ATLAS beam spot web page for displaying details of beam spot jobs.
6"""
7
8__author__ = 'Juerg Beringer'
9__version__ = 'JobDetails.py atlas/athena'
10
11from BeamSpotWebPage import BeamSpotWebPage
13from InDetBeamSpotExample.Utils import fileListSnippet
14from InDetBeamSpotExample.Utils import blankIfNone
15import time
16
17error = """\
18<div class="errormsg">
19%s
20</div>
21"""
22
23tableRow = '<tr><td class="header">%s</td><td>%s</td></tr>\n'
24tableRowStatus = '<tr><td class="header">%s</td><td class="%s">%s</td></tr>\n'
25
26tableSorter = """\
27<script type="text/javascript" src="../js/jquery-latest.js"></script>
28<script type="text/javascript" src="../js/jquery.tablesorter.js"></script>
29<script type="text/javascript" id="js">
30$(document).ready(function() {
31 $("table").tablesorter({
32 headers: { 0: { sorter: "shortDate" } },
33 sortList: [[0,1]]
34 });
35});
36</script>
37"""
38
39tableHeader = """<table cellspacing="0" class="tablesorter">
40<thead>
41<tr>
42<th>Job</th>
43<th>Status</th>
44<th>Exit code</th>
45<th>Files</th>
46</tr>
47</thead>
48<tbody>
49"""
50
51
53
54 def __init__(self):
55 BeamSpotWebPage.__init__(self)
56 self.pageConfig['pageTitle'] = 'ATLAS Beam Spot Job Details'
57 self.addToPageHeader(tableSorter)
58
59 def content(self,**args):
60 if not 'd' in args:
61 return error % ('CONFIGURATION ERROR: No data set name specified')
62 if not 't' in args:
63 return error % ('CONFIGURATION ERROR: No task name specified')
64 with TaskManager(self.globalConfig['taskDb']) as taskman:
65 t = taskman.getTaskDict(args['d'],args['t'])
66 if not t:
67 return error % ('ERROR: Task %s/%s not found' % (args['d'],args['t']))
68
69 p = '<div class="text"><h3>Summary for task %s/%s (task id %s):</h3></div>\n' % (args['d'],args['t'],t['TASKID'])
70 p += '<table>\n'
71 p += tableRow % ('Dataset name',t['DSNAME'])
72 p += tableRow % ('Run number',blankIfNone(t['RUNNR']))
73 p += tableRow % ('Task name',t['TASKNAME'])
74 stat = t['STATUS']
75 p += tableRowStatus % ('Task status',getStatusClass(stat),getKey(TaskManager.StatusCodes,stat))
76 p += tableRow % ('On-disk status',getKey(TaskManager.OnDiskCodes,t['ONDISK']))
77 p += tableRow % ('Template',t['TEMPLATE'])
78 p += tableRow % ('Postprocessing steps',t['TASKPOSTPROCSTEPS'])
79 p += tableRow % ('ATLAS release',t['ATLREL'])
80 p += tableRow % ('# result files',t['NRESULTFILES'])
81 p += tableRow % ('Result files',fileListSnippet(t['RESULTFILES'],t['DSNAME'],t['TASKNAME'],self.globalConfig['jobDir']))
82 p += tableRow % ('Result links',t['RESULTLINKS'])
83 cooltags = t['COOLTAGS'] or ''
84 p += tableRow % ('COOL tags','<br>'.join(cooltags.split()))
85 p += tableRow % ('# jobs',t['NJOBS'])
86 p += tableRow % ('# jobs submitted',t['NJOBS_SUBMITTED'])
87 p += tableRow % ('# jobs running',t['NJOBS_RUNNING'])
88 p += tableRow % ('# jobs postprocessing',t['NJOBS_POSTPROC'])
89 p += tableRow % ('# jobs failed',t['NJOBS_FAILED'])
90 p += tableRow % ('# jobs completed',t['NJOBS_COMPLETED'])
91 p += tableRow % ('Comment',t['TASKCOMMENT'])
92 p += tableRow % ('Created','%s by %s on host %s' % (time.ctime(t['CREATED']),t['CREATED_USER'],t['CREATED_HOST']))
93 p += tableRow % ('Last update',time.ctime(t['UPDATED']))
94 p += '</table>\n'
95
96 p += '<div class="text"><h3>Job details (may be more up-to-date than summary data above):</h3></div>\n'
97 p += tableHeader;
98 a = JobAnalyzer(self.globalConfig['jobDir'],t['DSNAME'],t['TASKNAME'])
99 for j in a.jobList():
100 p += "<tr>"
101 p += "<td>%s</td>" % (j)
102 (stat,exitcode) = a.jobStatus(j)
103 p += '<td class="%s">%s</td>' % (getStatusClass(stat),getKey(TaskManager.StatusCodes,stat))
104 p += "<td>%s</td>" % (exitcode)
105 p += '<td><a href="../files?u=%s/%s/%s">Files</a></td>' %(t['DSNAME'],t['TASKNAME'],j)
106 p += "</tr>\n"
107 p += "</tbody></table>\n"
108 return p
109
110
111# Code to test or run locally
112if __name__ == '__main__':
114 print (p.index())
content(self, **args)
Definition JobDetails.py:59
addToPageHeader(self, snippet)
Definition WebPage.py:320