1 |
mcinquil |
1.1 |
from Actor import *
|
2 |
|
|
import common
|
3 |
|
|
from datetime import datetime
|
4 |
|
|
from crab_report import run_upload
|
5 |
|
|
from crab_util import *
|
6 |
|
|
import os
|
7 |
|
|
import socket
|
8 |
|
|
|
9 |
|
|
class ReportUploader( Actor ):
|
10 |
|
|
|
11 |
|
|
uploadFileServer = "http://gangamon.cern.ch/django/cmserrorreports/"
|
12 |
|
|
dashbtaskmon = 'http://dashb-cms-job-task.cern.ch/taskmon.html'
|
13 |
mcinquil |
1.2 |
centralservermon = 'http://glidein-mon.t2.ucsd.edu:8080/dashboard/ajaxproxy.jsp?p='
|
14 |
mcinquil |
1.1 |
|
15 |
|
|
def __init__(self, cfg_params, jobid = -1):
|
16 |
|
|
"""
|
17 |
|
|
init class variables
|
18 |
|
|
|
19 |
|
|
- checking if task exists
|
20 |
|
|
- adding task generic files
|
21 |
|
|
- adding job specific files
|
22 |
|
|
"""
|
23 |
|
|
|
24 |
|
|
common.logger.debug('Initializing uploader...')
|
25 |
|
|
|
26 |
|
|
self.cfg_params = cfg_params
|
27 |
|
|
|
28 |
|
|
CliServerParams(self)
|
29 |
|
|
|
30 |
|
|
self.taskpath = common.work_space.topDir()
|
31 |
|
|
|
32 |
|
|
if os.path.exists( self.taskpath ) is True:
|
33 |
|
|
|
34 |
|
|
self.filetoup = [ \
|
35 |
|
|
common.work_space.shareDir() + '/crab.cfg', \
|
36 |
|
|
common.work_space.logDir() + '/crab.log' \
|
37 |
|
|
]
|
38 |
|
|
|
39 |
|
|
if jobid > -1:
|
40 |
|
|
self.filetoup.append( common.work_space.resDir() + 'CMSSW_%i.stdout' % jobid )
|
41 |
|
|
self.filetoup.append( common.work_space.jobDir() + 'CMSSW_%i.LoggingInfo' % jobid )
|
42 |
|
|
self.filetoup.append( common.work_space.resDir() + 'crab_fjr_%i.xml' % jobid )
|
43 |
|
|
|
44 |
|
|
else:
|
45 |
|
|
raise CrabException( 'Error: task [%s] not found in the path!' % self.taskname )
|
46 |
|
|
|
47 |
|
|
|
48 |
|
|
self.taskname = common._db.queryTask('name')
|
49 |
|
|
|
50 |
|
|
self.hostname = socket.getfqdn()
|
51 |
|
|
|
52 |
|
|
self.username = getUserName()
|
53 |
|
|
|
54 |
|
|
self.requestedserver = 'default'
|
55 |
|
|
if self.cfg_params.has_key("server_name"):
|
56 |
|
|
self.requestedserver = elf.cfg_params['server_name']
|
57 |
|
|
|
58 |
|
|
self.scheduler = common.scheduler.name()
|
59 |
|
|
|
60 |
mcinquil |
1.2 |
val = getCentralConfigLink('reportLogURL', 'http://cms.pg.infn.it/~cinquilli/files/crab2/')
|
61 |
mcinquil |
1.1 |
if val is not None and len(val) > 0:
|
62 |
|
|
self.uploadFileServer = val
|
63 |
|
|
common.logger.debug('Using %s as remote repository server for uploading logs' % self )
|
64 |
|
|
|
65 |
mcinquil |
1.2 |
val = getCentralConfigLink('dashbTaskMon', 'http://cms.pg.infn.it/~cinquilli/files/crab2/')
|
66 |
mcinquil |
1.1 |
if val is not None and len(val) > 0:
|
67 |
|
|
self.dashbtaskmon = val
|
68 |
|
|
common.logger.debug('Using %s as link for dashboard task monitoring' % self.dashbtaskmon )
|
69 |
|
|
|
70 |
mcinquil |
1.2 |
val = getCentralConfigLink('servTaskMon', 'http://cms.pg.infn.it/~cinquilli/files/crab2/')
|
71 |
mcinquil |
1.1 |
if val is not None and len(val) > 0:
|
72 |
|
|
self.centralservermon = val
|
73 |
|
|
common.logger.debug('Using %s as link for central server monitoring (it allows to bypass cern firewall)' % self.centralservermon )
|
74 |
|
|
|
75 |
|
|
|
76 |
|
|
def __prepareMetadata( self, datafile ):
|
77 |
|
|
"""
|
78 |
|
|
__prepareMetadata
|
79 |
|
|
|
80 |
|
|
preparing metadata file content for errorreport server
|
81 |
|
|
"""
|
82 |
|
|
|
83 |
|
|
cservermon = 'http://%s:8888/visualog/?logtype=Status&taskname=%s\n' % (self.server_name, self.taskname)
|
84 |
|
|
fmeta = open(datafile, 'w')
|
85 |
|
|
fmeta.write(
|
86 |
|
|
'username:%s\n' % self.username + \
|
87 |
|
|
'version:%s\n' % os.path.basename(os.path.normpath(os.getenv('CRABDIR'))) + \
|
88 |
|
|
'jobuuid:%s\n' % self.taskname + \
|
89 |
mcinquil |
1.2 |
'monitoringlink:Dashboard monitoring,%s%s \n' %(self.dashbtaskmon,self.taskname) + \
|
90 |
mcinquil |
1.1 |
'monitoringlink:CentralServer monitoring,%s%s\n' % (self.centralservermon, cservermon.replace('logtype=Status&', 'logtype=Status|')) + \
|
91 |
|
|
'monitoringlink:CrabServer monitoring,%s\n' % cservermon
|
92 |
|
|
)
|
93 |
|
|
fmeta.close()
|
94 |
|
|
|
95 |
|
|
common.logger.debug( "Metadatafile created as %s " % fmeta.name )
|
96 |
|
|
|
97 |
|
|
return fmeta.name
|
98 |
|
|
|
99 |
|
|
|
100 |
|
|
def __prepareSummary( self, datafile ):
|
101 |
|
|
"""
|
102 |
|
|
__prepareSummary
|
103 |
|
|
|
104 |
|
|
preparing Summary file for errorreport server
|
105 |
|
|
"""
|
106 |
|
|
|
107 |
|
|
fsummary = open(datafile, 'w')
|
108 |
|
|
## version could be replaced by common.prog_name + common.prog_version_str
|
109 |
|
|
fsummary.write(
|
110 |
|
|
'username: %s\n' % self.username + \
|
111 |
|
|
'running on: %s\n' % self.hostname + \
|
112 |
|
|
'version: %s\n' % os.path.basename(os.path.normpath(os.getenv('CRABDIR'))) + \
|
113 |
|
|
'user working dir: %s\n' % self.taskname + \
|
114 |
|
|
'scheduler: %s\n' % self.scheduler + \
|
115 |
|
|
'requested server: %s\n' % self.requestedserver + \
|
116 |
|
|
'used server: %s\n' % self.server_name + \
|
117 |
|
|
'task: %s\n' % self.taskname
|
118 |
|
|
)
|
119 |
|
|
fsummary.close()
|
120 |
|
|
|
121 |
|
|
common.logger.debug( "Summary file created as %s " % fsummary.name )
|
122 |
|
|
|
123 |
|
|
return fsummary.name
|
124 |
|
|
|
125 |
|
|
def run( self ):
|
126 |
|
|
"""
|
127 |
|
|
_run_
|
128 |
|
|
|
129 |
|
|
Method that performs the upload with the various steps:
|
130 |
|
|
- prepares metadata file
|
131 |
|
|
- prepare summary info file
|
132 |
|
|
- checks if the input files exists
|
133 |
|
|
- prepares the package
|
134 |
|
|
- uploads the package
|
135 |
|
|
"""
|
136 |
|
|
|
137 |
|
|
common.logger.info("Preparing directory and files to report...")
|
138 |
|
|
|
139 |
|
|
archivereport = self.username + '-' + 'uploader.zip'
|
140 |
|
|
common.logger.debug("Archivereport %s" % archivereport)
|
141 |
|
|
|
142 |
|
|
basename = os.path.basename(os.path.normpath(self.taskpath))
|
143 |
|
|
dirname = 'crabreport_' + (str(datetime.today())).replace(' ', '-')
|
144 |
|
|
self.crabreportdir = self.taskpath + '/' + dirname
|
145 |
|
|
|
146 |
|
|
cmd = 'cd %s; mkdir %s; cd %s; ' % (self.taskpath, dirname, dirname)
|
147 |
|
|
common.logger.debug("Running '%s' " % cmd)
|
148 |
|
|
out = runCommand( cmd )
|
149 |
|
|
common.logger.debug("Result '%s'" % str(out))
|
150 |
|
|
|
151 |
|
|
metadataFile = self.__prepareMetadata(self.crabreportdir + '/__metadata.txt')
|
152 |
|
|
summaryFile = self.__prepareSummary(self.crabreportdir + '/_summary.txt')
|
153 |
|
|
|
154 |
|
|
cmd = "cd %s;" % self.crabreportdir
|
155 |
|
|
for filetemp in self.filetoup:
|
156 |
|
|
if os.path.exists( filetemp ) is True :
|
157 |
|
|
cmd += 'ln -s %s %s.txt; ' % ( filetemp, os.path.basename( filetemp ) )
|
158 |
|
|
common.logger.debug("File %s found and added" % filetemp)
|
159 |
|
|
else:
|
160 |
|
|
common.logger.debug("File %s not found, skipping it!" % filetemp)
|
161 |
|
|
|
162 |
|
|
common.logger.debug("Running '%s' " % cmd)
|
163 |
|
|
out = runCommand( cmd )
|
164 |
|
|
common.logger.debug("Result '%s'" % str(out))
|
165 |
|
|
|
166 |
|
|
common.logger.debug("Zipping...")
|
167 |
|
|
cmd = 'cd %s; zip -l %s %s/*' % (self.taskpath, archivereport, self.crabreportdir)
|
168 |
|
|
common.logger.debug("Running '%s' " % cmd)
|
169 |
|
|
out = runCommand( cmd )
|
170 |
|
|
common.logger.debug("Result '%s'" % str(out))
|
171 |
|
|
|
172 |
|
|
try:
|
173 |
|
|
common.logger.info("Starting to upload the report...")
|
174 |
|
|
link_result = run_upload(server = self.uploadFileServer, path = '%s/%s' % (self.taskpath, archivereport) )
|
175 |
|
|
if link_result is not None and len(link_result) > 0:
|
176 |
|
|
common.logger.info("Your report was uploaded to the central repository")
|
177 |
|
|
common.logger.info("Please include this URL in your bug report or in the support e-mail")
|
178 |
|
|
common.logger.info( "\t %s\n" % str(link_result))
|
179 |
|
|
else:
|
180 |
|
|
common.logger.error("A problem occurred while uploading your report to the central repository!")
|
181 |
|
|
except Exception, ex:
|
182 |
|
|
raise CrabException("Problem %s uploading log files to %s" % (str(ex), self.uploadFileServer) )
|
183 |
|
|
finally:
|
184 |
|
|
common.logger.debug("Start cleaning report...")
|
185 |
|
|
cmd = 'rm -rf %s %s/%s' % (self.crabreportdir, self.taskpath, archivereport)
|
186 |
|
|
common.logger.debug("Running '%s' " % cmd)
|
187 |
|
|
out = runCommand( cmd )
|
188 |
|
|
common.logger.debug("Result '%s'" % str(out))
|
189 |
|
|
|
190 |
|
|
common.logger.info("Report upload finished.")
|
191 |
|
|
|