CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
WorkFlowRunner.py
Go to the documentation of this file.
1 
2 from threading import Thread
3 
4 from Configuration.PyReleaseValidation import WorkFlow
5 import os,time
6 from subprocess import Popen
7 
8 class WorkFlowRunner(Thread):
9  def __init__(self, wf, noRun=False,dryRun=False,cafVeto=True):
10  Thread.__init__(self)
11  self.wf = wf
12 
13  self.status=-1
14  self.report=''
15  self.nfail=0
16  self.npass=0
17  self.noRun=noRun
18  self.dryRun=dryRun
19  self.cafVeto=cafVeto
20 
21  self.wfDir=str(self.wf.numId)+'_'+self.wf.nameId
22  return
23 
24  def doCmd(self, cmd):
25 
26  msg = "\n# in: " +os.getcwd()
27  if self.dryRun: msg += " dryRun for '"
28  else: msg += " going to execute "
29  msg += cmd.replace(';','\n')
30  print msg
31 
32  cmdLog = open(self.wfDir+'/cmdLog','a')
33  cmdLog.write(msg+'\n')
34  cmdLog.close()
35 
36  ret = 0
37  if not self.dryRun:
38  p = Popen(cmd, shell=True)
39  ret = os.waitpid(p.pid, 0)[1]
40  if ret != 0:
41  print "ERROR executing ",cmd,'ret=', ret
42 
43  return ret
44 
45  def run(self):
46 
47  startDir = os.getcwd()
48 
49  if not os.path.exists(self.wfDir):
50  os.makedirs(self.wfDir)
51 
52  preamble = 'cd '+self.wfDir+'; '
53 
54  startime='date %s' %time.asctime()
55 
56  # check where we are running:
57  onCAF = False
58  if 'cms/caf/cms' in os.environ['CMS_PATH']:
59  onCAF = True
60 
61  ##needs to set
62  #self.report
63  self.npass = []
64  self.nfail = []
65  self.stat = []
66  self.retStep = []
67 
68  def closeCmd(i,ID):
69  return ' > %s 2>&1; ' % ('step%d_'%(i,)+ID+'.log ',)
70 
71  inFile=None
72  lumiRangeFile=None
73  aborted=False
74  for (istepmone,com) in enumerate(self.wf.cmds):
75  istep=istepmone+1
76  cmd = preamble
77  if aborted:
78  self.npass.append(0)
79  self.nfail.append(0)
80  self.retStep.append(0)
81  self.stat.append('NOTRUN')
82  continue
83  if not isinstance(com,str):
84  if self.cafVeto and (com.location == 'CAF' and not onCAF):
85  print "You need to be no CAF to run",self.wf.numId
86  self.npass.append(0)
87  self.nfail.append(0)
88  self.retStep.append(0)
89  self.stat.append('NOTRUN')
90  aborted=True
91  continue
92  cmd2 = com.lumiRanges()
93  if cmd2:
94  cmd2 =cmd+cmd2+closeCmd(istep,'lumiRanges')
95  lumiRangeFile='step%d_lumiRanges.log'%(istep,)
96  retStep = self.doCmd(cmd2)
97  cmd+=com.das()
98  cmd+=closeCmd(istep,'dasquery')
99  retStep = self.doCmd(cmd)
100  #don't use the file list executed, but use the das command of cmsDriver for next step
101  inFile='filelist:step%d_dasquery.log'%(istep,)
102  print "---"
103  else:
104  #chaining IO , which should be done in WF object already and not using stepX.root but <stepName>.root
105  cmd += com
106  if self.noRun:
107  cmd +=' --no_exec'
108  if inFile: #in case previous step used DAS query (either filelist of das:)
109  cmd += ' --filein '+inFile
110  inFile=None
111  if lumiRangeFile: #DAS query can also restrict lumi range
112  cmd += ' --lumiToProcess '+lumiRangeFile
113  lumiRangeFile=None
114  if 'HARVESTING' in cmd and not '134' in str(self.wf.numId) and not '--filein' in cmd:
115  cmd+=' --filein file:step%d_inDQM.root --fileout file:step%d.root '%(istep-1,istep)
116  else:
117  if istep!=1 and not '--filein' in cmd:
118  cmd+=' --filein file:step%s.root '%(istep-1,)
119  if not '--fileout' in com:
120  cmd+=' --fileout file:step%s.root '%(istep,)
121 
122 
123 
124  cmd+=closeCmd(istep,self.wf.nameId)
125  retStep = self.doCmd(cmd)
126 
127  self.retStep.append(retStep)
128  if (retStep!=0):
129  #error occured
130  self.npass.append(0)
131  self.nfail.append(1)
132  self.stat.append('FAILED')
133  #to skip processing
134  aborted=True
135  else:
136  #things went fine
137  self.npass.append(1)
138  self.nfail.append(0)
139  self.stat.append('PASSED')
140 
141 
142  os.chdir(startDir)
143 
144  endtime='date %s' %time.asctime()
145  tottime='%s-%s'%(endtime,startime)
146 
147 
148  #### wrap up ####
149 
150  logStat=''
151  for i,s in enumerate(self.stat):
152  logStat+='Step%d-%s '%(i,s)
153  self.report='%s_%s %s - time %s; exit: '%(self.wf.numId,self.wf.nameId,logStat,tottime)+' '.join(map(str,self.retStep))+'\n'
154 
155  return
156 
157 
158 
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
npass
needs to set self.report