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