annotate commons/pyRepetUnit/components/AbstractClusterLauncher.py @ 31:0ab839023fe4

Uploaded
author m-zytnicki
date Tue, 30 Apr 2013 14:33:21 -0400
parents 94ab73e8a190
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
1 #!/usr/bin/env python
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
2
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
3 # Copyright INRA (Institut National de la Recherche Agronomique)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
4 # http://www.inra.fr
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
5 # http://urgi.versailles.inra.fr
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
6 #
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
7 # This software is governed by the CeCILL license under French law and
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
8 # abiding by the rules of distribution of free software. You can use,
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
9 # modify and/ or redistribute the software under the terms of the CeCILL
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
10 # license as circulated by CEA, CNRS and INRIA at the following URL
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
11 # "http://www.cecill.info".
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
12 #
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
13 # As a counterpart to the access to the source code and rights to copy,
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
14 # modify and redistribute granted by the license, users are provided only
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
15 # with a limited warranty and the software's author, the holder of the
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
16 # economic rights, and the successive licensors have only limited
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
17 # liability.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
18 #
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
19 # In this respect, the user's attention is drawn to the risks associated
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
20 # with loading, using, modifying and/or developing or reproducing the
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
21 # software by the user in light of its specific status of free software,
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
22 # that may mean that it is complicated to manipulate, and that also
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
23 # therefore means that it is reserved for developers and experienced
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
24 # professionals having in-depth computer knowledge. Users are therefore
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
25 # encouraged to load and test the software's suitability as regards their
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
26 # requirements in conditions enabling the security of their systems and/or
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
27 # data to be ensured and, more generally, to use and operate it in the
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
28 # same conditions as regards security.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
29 #
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
30 # The fact that you are presently reading this means that you have had
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
31 # knowledge of the CeCILL license and that you accept its terms.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
32
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
33 import getopt
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
34 import time
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
35 import glob
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
36 import sys
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
37 import os
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
38
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
39 from commons.core.checker.CheckerException import CheckerException
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
40 from commons.core.sql.RepetJob import RepetJob
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
41 from commons.core.sql.Job import Job
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
42 from commons.core.stat.Stat import Stat
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
43 from pyRepet.launcher.AbstractProgramLauncher import AbstractProgramLauncher
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
44
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
45 GENERIC_IN_FILE = "zDUMMYz"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
46
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
47
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
48 ## Abstract class to launch a program in parallel on a cluster.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
49 #
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
50 class AbstractClusterLauncher( object ): #( IClusterLauncher )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
51
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
52 def __init__( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
53 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
54 Constructor.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
55 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
56 self._inputDir = "" # path to the directory with input files
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
57 self._queueName = "" # name of the queue on the cluster
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
58 self._groupId = "" # identifier of the group of jobs (groupid)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
59 self._inputFileSuffix = "fa" # suffix of the input files (default='fa')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
60 self._prgAcronym = "" # acronym of the program to launch
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
61 self._configFile = "" # name of the configuration file (connect to MySQL)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
62 self._currentDir = os.getcwd() # path to the current directory
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
63 self._tmpDir = "" # path to the temporary directory
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
64 self._jobTable = "jobs" # name of the table recording the jobs
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
65 self._catOutFiles = False # concatenate output files of all jobs
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
66 self._clean = False # clean job file, job stdout, job table...
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
67 self._verbose = 1 # verbosity level
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
68 self.jobdb = None # RepetJob instance
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
69 self.job = Job() # Job instance
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
70
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
71 self._nbJobs = 0
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
72 self._cmdLineGenericOptions = "hi:Q:g:S:a:C:d:j:Zcv:"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
73 self._cmdLineSpecificOptions = ""
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
74
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
75 self._exeWrapper = "AbstractProgramLauncher.py"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
76 self._prgLauncher = None
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
77 # list of instances derived from AbstractProgramLauncher()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
78 # If several program are launched successively in the same job,
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
79 # 'lPrgLaunchers' has to be filled before run().
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
80 self.lPrgLaunchers = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
81
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
82 def setProgramLauncherAttributeFromCmdLine(self, o, a=""):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
83 self.getProgramLauncherInstance().setASpecificAttributeFromCmdLine(o, a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
84
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
85 def setClusterLauncherAttributeFromCmdLine(self, o, a=""):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
86 if o == "-h":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
87 print self.getHelpAsString()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
88 sys.exit(0)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
89 elif o == "-i":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
90 self.setInputDirectory(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
91 elif o == "-Q":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
92 self.setQueueName(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
93 elif o == "-g":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
94 self.setGroupIdentifier(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
95 elif o == "-S":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
96 self.setInputFileSuffix(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
97 elif o == "-a":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
98 self.setAcronym(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
99 elif o == "-C":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
100 self.setConfigFile(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
101 elif o == "-d":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
102 self.setTemporaryDirectory(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
103 elif o == "-j":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
104 self.setJobTableName(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
105 elif o == "-Z":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
106 self.setCatOutputFiles()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
107 elif o == "-c":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
108 self.setClean()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
109 elif o == "-v":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
110 self.setVerbosityLevel(a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
111
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
112 def setAttributesFromCmdLine(self):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
113 try:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
114 opts, args = getopt.getopt(sys.argv[1:], self.getCmdLineOptions())
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
115 except getopt.GetoptError, err:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
116 print str(err);
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
117 print self.getHelpAsString()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
118 sys.exit(1)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
119 for o, a in opts:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
120 self.setClusterLauncherAttributeFromCmdLine(o, a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
121 self.setProgramLauncherAttributeFromCmdLine(o, a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
122
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
123 def setAGenericAttributeFromCmdLine( self, o, a="" ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
124 self.setClusterLauncherAttributeFromCmdLine(o, a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
125
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
126 def setASpecificAttributeFromCmdLine( self, o, a="" ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
127 self.setProgramLauncherAttributeFromCmdLine(o, a)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
128
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
129 def setInputDirectory( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
130 self._inputDir = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
131
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
132 def setQueueName( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
133 self._queueName = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
134
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
135 def setGroupIdentifier( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
136 self._groupId = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
137
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
138 def setInputFileSuffix( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
139 self._inputFileSuffix = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
140
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
141 def setAcronym( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
142 self._prgAcronym = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
143
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
144 def setConfigFile( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
145 if os.path.dirname( arg ) == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
146 self._configFile = "%s/%s" % ( os.getcwd(), arg )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
147 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
148 self._configFile = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
149
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
150 def setCurrentDirectory( self, arg =os.getcwd()):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
151 self._currentDir = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
152
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
153 def setTemporaryDirectory( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
154 self._tmpDir = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
155
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
156 def setJobTableName( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
157 self._jobTable = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
158
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
159 def setCatOutputFiles( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
160 self._catOutFiles = True
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
161
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
162 def setClean( self):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
163 self._clean = True
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
164
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
165 def setVerbosityLevel( self, arg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
166 self._verbose = int(arg)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
167
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
168 def setExecutableWrapper( self, arg = "AbstractProgramLauncher.py" ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
169 self._exeWrapper = arg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
170
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
171 def setSingleProgramLauncher( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
172 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
173 Set the wrapper and program command-lines of the program launcher.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
174 Append the program launcher to 'self.lPrgLaunchers'.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
175 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
176 self.getProgramLauncherInstance().setWrapperCommandLine()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
177 self.getProgramLauncherInstance().setProgramCommandLine()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
178 self.lPrgLaunchers.append( self.getProgramLauncherInstance() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
179
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
180 def getGenericHelpAsString( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
181 string = ""
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
182 string += "usage: %s.py [options]" % (type(self).__name__ )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
183 string += "\ngeneric options:"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
184 string += "\n -h: this help"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
185 string += "\n -i: directory with input files (absolute path)"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
186 string += "\n -Q: name of the queue on the cluster"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
187 string += "\n -g: identifier of the group of jobs (groupid)"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
188 string += "\n -S: suffix of the input files (default='fa')"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
189 string += "\n -a: acronym of the program to be launched (default='%s')" % ( self.getAcronym() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
190 string += "\n -C: configuration file to connect to MySQL (absolute path or in current dir)"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
191 string += "\n -d: temporary directory (absolute path, default=None)"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
192 string += "\n -j: table recording the jobs (default='jobs')"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
193 string += "\n -c: clean the temporary data"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
194 string += "\n -v: verbosity level (default=0/1/2)"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
195 return string
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
196
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
197 def getSpecificHelpAsString( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
198 pass
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
199
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
200 def getHelpAsString(self):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
201 return self.getGenericHelpAsString() + self.getSpecificHelpAsString()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
202
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
203 def getInputDirectory( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
204 return self._inputDir
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
205
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
206 def getQueueName( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
207 return self._queueName
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
208
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
209 def getGroupIdentifier( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
210 return self._groupId
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
211
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
212 def getInputFileSuffix( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
213 return self._inputFileSuffix
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
214
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
215 def getAcronym( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
216 return self._prgAcronym
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
217
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
218 def getConfigFile( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
219 return self._configFile
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
220
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
221 def getCurrentDirectory( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
222 return self._currentDir
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
223
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
224 def getTemporaryDirectory( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
225 return self._tmpDir
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
226
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
227 def getJobTableName( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
228 return self._jobTable
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
229
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
230 def getCatOutputFiles( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
231 return self._catOutFiles
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
232
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
233 def getClean( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
234 return self._clean
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
235
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
236 def getVerbosityLevel( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
237 return self._verbose
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
238
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
239 def getWrapperName( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
240 return self.getProgramLauncherInstance().getWrapperName()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
241
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
242 def getProgramName( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
243 return self.getProgramLauncherInstance().getProgramName()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
244
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
245 def getPatternToConcatenate( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
246 return self.getProgramLauncherInstance().getOutputFile().replace( GENERIC_IN_FILE, "*" )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
247
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
248 def getProgramLauncherInstance( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
249 if self._prgLauncher == None:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
250 self._prgLauncher = AbstractProgramLauncher()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
251 return self._prgLauncher
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
252
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
253 def getInputFilesList(self):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
254 lInFiles = glob.glob("%s/*.%s" % (self._inputDir, self._inputFileSuffix))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
255 return lInFiles
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
256
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
257 def getCmdLineOptions(self):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
258 return "hi:Q:g:S:a:C:d:j:Zcv:"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
259
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
260
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
261 def getProgramCommandLineAsString( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
262 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
263 Return the command-line to launch in each job.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
264 Specified in each wrapper.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
265 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
266 pass
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
267
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
268
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
269 def getListFilesToKeep( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
270 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
271 Return the list of files to keep at the end of each job.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
272 Specified in each wrapper.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
273 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
274 pass
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
275
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
276
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
277 def getListFilesToRemove( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
278 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
279 Return the list of files to remove at the end of each job.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
280 Specified in each wrapper.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
281 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
282 pass
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
283
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
284
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
285 def getJobFileNameAsString( self, count ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
286 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
287 Return the name of the job file as a string.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
288 @param count: job number (e.g. '1') or '*'
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
289 @type count: integer or string
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
290 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
291 jobFile = "ClusterLauncher"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
292 jobFile += "_groupid%s" % ( self.getGroupIdentifier() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
293 if count != "*":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
294 jobFile += "_job%i" % ( count )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
295 jobFile += "_time%s" % ( time.strftime("%Y-%m-%d-%H-%M-%S") )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
296 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
297 jobFile += "_job*"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
298 jobFile += "_time%s-*" % ( time.strftime("%Y-%m") )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
299 jobFile += ".py"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
300 return jobFile
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
301
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
302
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
303 def getCmdUpdateJobStatusAsString( self, newStatus ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
304 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
305 Return the command to update the job status in the table.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
306 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
307 prg = os.environ["REPET_PATH"] + "/bin/srptChangeJobStatus.py"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
308 cmd = prg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
309 cmd += " -t %s" % ( self.job.tablename )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
310 if str(self.job.jobid).isdigit():
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
311 cmd += " -j %s" % ( self.job.jobname )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
312 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
313 cmd += " -j %s" % ( self.job.jobid )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
314 cmd += " -g %s" % ( self.job.groupid )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
315 if self.job.queue != "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
316 cmd += " -q %s" % ( self.job.queue )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
317 cmd += " -s %s" % ( newStatus )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
318 cmd += " -c %s" % ( self.getConfigFile() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
319 cmd += " -v %i" % ( self._verbose )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
320 return "os.system( \"%s\" )\n" % ( cmd )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
321
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
322
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
323 def getCmdToLaunchWrapper( self, fileName, genericCmd, exeWrapper ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
324 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
325 Return the launching command as a string.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
326 Launch the wrapper, retrieve its exit status, update status if error.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
327 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
328 specificCmd = genericCmd.replace( GENERIC_IN_FILE, fileName )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
329 cmd = ""
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
330 cmd += "print \"LAUNCH: %s\"\n" % ( specificCmd )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
331 cmd += "sys.stdout.flush()\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
332 cmd += "exitStatus = os.system ( \"%s\" )\n" % ( specificCmd )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
333 cmd += "if exitStatus != 0:\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
334 cmd += "\tprint \"ERROR: wrapper '%s'" % ( exeWrapper )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
335 cmd += " returned exit status '%i'\" % ( exitStatus )\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
336 cmd += "\tos.chdir( \"%s\" )\n" % ( self.getTemporaryDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
337 cmd += "\tshutil.move( newDir, '%s' )\n" % ( self.getCurrentDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
338 cmd += "\t%s" % ( self.getCmdUpdateJobStatusAsString( "error" ) )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
339 cmd += "\tsys.exit(1)\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
340 return cmd
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
341
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
342
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
343 def getCmdToKeepFiles( self, fileName, lFilesToKeep ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
344 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
345 Return the commands to keep the output files.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
346 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
347 cmd = ""
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
348 for f in lFilesToKeep:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
349 f = f.replace( GENERIC_IN_FILE, fileName )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
350 cmd += "if not os.path.exists( \"%s\" ):\n" % ( f )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
351 cmd += "\tprint \"ERROR: output file '%s' doesn't exist\"\n" % ( f )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
352 cmd += "\t%s" % ( self.getCmdUpdateJobStatusAsString( "error" ) )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
353 cmd += "\tsys.exit(1)\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
354 cmd += "if not os.path.exists( \"%s/%s\" ):\n" \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
355 % ( self._currentDir, f )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
356 cmd += "\tshutil.copy( \"%s\", \"%s/%s\" )\n" % ( f, self.getCurrentDirectory(), f )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
357 return cmd
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
358
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
359
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
360 def getCmdToRemoveFiles( self, fileName, lFilesToRemove ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
361 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
362 Return the commands to remove the temporary files.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
363 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
364 cmd = ""
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
365 if lFilesToRemove != []:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
366 for f in lFilesToRemove:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
367 f = f.replace( GENERIC_IN_FILE, fileName )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
368 cmd += "if os.path.exists( \"%s\" ):\n" % ( f )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
369 cmd += "\tos.remove( \"%s\" )\n" % ( f )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
370 return cmd
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
371
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
372
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
373 def getJobCommandsAsString( self, fileName, jobName, minFreeGigaInTmpDir=1 ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
374 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
375 Return all the job commands as a string.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
376 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
377 cmd = "#!/usr/bin/env python\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
378 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
379 cmd += "import os\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
380 cmd += "import sys\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
381 cmd += "import shutil\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
382 cmd += "import time\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
383 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
384 cmd += "print \"system:\", os.uname()\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
385 cmd += "beginTime = time.time()\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
386 cmd += "print 'beginTime=%f' % ( beginTime )\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
387 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
388 cmd += self.getCmdUpdateJobStatusAsString( "running" )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
389 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
390 cmd += "if not os.path.exists( \"%s\" ):\n" % ( self.getTemporaryDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
391 cmd += "\tprint \"ERROR: working dir '%s' doesn't exist\"\n" % ( \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
392 self.getTemporaryDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
393 cmd += "\t%s" % ( self.getCmdUpdateJobStatusAsString( "error" ) )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
394 cmd += "\tsys.exit(1)\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
395 cmd += "freeSpace = os.statvfs( \"%s\" )\n" % ( self.getTemporaryDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
396 cmd += "if ( freeSpace.f_bavail * freeSpace.f_frsize ) / 1073741824.0 < %i:\n" % ( minFreeGigaInTmpDir ) # nb blocs * bloc size in bytes > 1 GigaByte ?
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
397 cmd += "\tprint \"ERROR: less than %iGb in '%s'\"\n" % ( minFreeGigaInTmpDir, self.getTemporaryDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
398 cmd += "\t%s" % ( self.getCmdUpdateJobStatusAsString( "error" ) )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
399 cmd += "\tsys.exit(1)\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
400 cmd += "print \"working dir: %s\"\n" % ( self.getTemporaryDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
401 cmd += "sys.stdout.flush()\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
402 cmd += "os.chdir( \"%s\" )\n" % ( self.getTemporaryDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
403 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
404 cmd += "newDir = \"%s_%s_%s\"\n" % ( self.getGroupIdentifier(), jobName, time.strftime("%Y%m%d-%H%M%S") )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
405 cmd += "if os.path.exists( newDir ):\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
406 cmd += "\tshutil.rmtree( newDir )\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
407 cmd += "os.mkdir( newDir )\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
408 cmd += "os.chdir( newDir )\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
409 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
410 cmd += "if not os.path.exists( \"%s\" ):\n" % ( fileName )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
411 cmd += "\tos.symlink( \"%s/%s\", \"%s\" )\n" % \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
412 ( self._inputDir, fileName, fileName )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
413 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
414
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
415 for pL in self.lPrgLaunchers:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
416 cmd += self.getCmdToLaunchWrapper( \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
417 fileName, \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
418 pL.getWrapperCommandLine(), \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
419 "%s.py" % ( type(pL).__name__ ) )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
420 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
421 cmd += self.getCmdToKeepFiles( fileName, pL.getListFilesToKeep() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
422 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
423 cmd += self.getCmdToRemoveFiles( fileName, \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
424 pL.getListFilesToRemove() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
425
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
426 cmd += "if os.path.exists( \"%s\" ):\n" % ( fileName )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
427 cmd += "\tos.remove( \"%s\" )\n" % ( fileName )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
428 cmd += "os.chdir( \"..\" )\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
429 cmd += "shutil.rmtree( newDir )\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
430 cmd += self.getCmdUpdateJobStatusAsString( "finished" )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
431 cmd += "\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
432 cmd += "endTime = time.time()\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
433 cmd += "print 'endTime=%f' % ( endTime)\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
434 cmd += "print 'executionTime=%f' % ( endTime - beginTime )\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
435 cmd += "print \"system:\", os.uname()\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
436 cmd += "sys.exit(0)\n"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
437 return cmd
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
438
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
439 def getStatsOfExecutionTime( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
440 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
441 Return a Stat object about the execution time of each job as a
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
442 float expressed in seconds since the epoch, in UTC.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
443 """
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
444 stat = Stat()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
445 pattern = "%s/%s*.o*" % ( self.getCurrentDirectory(), \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
446 self.getAcronym() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
447 lJobFiles = glob.glob( pattern )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
448 for f in lJobFiles:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
449 fH = open( f, "r" )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
450 while True:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
451 line = fH.readline()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
452 if line == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
453 break
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
454 if "executionTime" in line:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
455 stat.add( float(line[:-1].split("=")[1] ) )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
456 break
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
457 fH.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
458 return stat
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
459
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
460
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
461 def formatGroupidAndTime(self):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
462 return self.job.groupid + " " + time.strftime("%Y-%m-%d %H:%M:%S") + ""
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
463
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
464 def submitJob(self, lInFiles):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
465 count = 0
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
466 for inFile in lInFiles:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
467 count += 1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
468 fileName = os.path.basename(inFile)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
469 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
470 print "processing '%s' # %i..." % (fileName, count)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
471 sys.stdout.flush()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
472
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
473 self.initializeJob(fileName, count)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
474 time.sleep(0.5)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
475 exitStatus = self.jobdb.submitJob(self.job)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
476 if exitStatus != 0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
477 print "ERROR while submitting job '%i' to the cluster" % (count)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
478 sys.exit(1)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
479
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
480 def checkClusterLauncherAttributes( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
481 if self.getInputDirectory() == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
482 message = "ERROR: missing input directory"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
483 raise CheckerException(message)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
484 if not os.path.exists( self.getInputDirectory() ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
485 message = "ERROR: input directory '%s' doesn't exist" % ( self.getInputDirectory() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
486 raise CheckerException(message)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
487 if self.getGroupIdentifier() == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
488 message = "ERROR: missing group identifier"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
489 raise CheckerException(message)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
490 if self.getAcronym() == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
491 message = "ERROR: missing program acronym"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
492 raise CheckerException(message)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
493 if self.getConfigFile() == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
494 message = "ERROR: missing config file to access MySQL"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
495 raise CheckerException(message)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
496 if not os.path.exists( self.getConfigFile() ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
497 message = "ERROR: config file '%s' doesn't exist" % ( self.getConfigFile() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
498 raise CheckerException(message)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
499 if self.getTemporaryDirectory() == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
500 self.setTemporaryDirectory(self._currentDir)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
501
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
502 def checkGenericAttributes( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
503 self.checkClusterLauncherAttributes()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
504
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
505 def checkProgramLauncherAttributes( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
506 self.getProgramLauncherInstance().checkSpecificAttributes()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
507
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
508 def checkSpecificAttributes( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
509 self.checkProgramLauncherAttributes()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
510
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
511 def start( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
512
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
513 if self.lPrgLaunchers == []:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
514 self.setSingleProgramLauncher()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
515 for pL in self.lPrgLaunchers:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
516 if pL.getWrapperCommandLine() == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
517 string = "ERROR: wrapper command is empty !"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
518 print string
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
519 sys.exit(1)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
520 if pL.getProgramCommandLine() == "":
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
521 string = "ERROR: program command is empty !"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
522 print string
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
523 sys.exit(1)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
524 self.checkProgramAvailability()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
525
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
526 try:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
527 self.checkProgramLauncherAttributes()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
528 except CheckerException, msg:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
529 print msg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
530 print self.getHelpAsString()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
531 sys.exit(1)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
532
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
533 if self.getVerbosityLevel() > 0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
534 string = "START %s" % ( type(self).__name__ )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
535 print string
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
536 self.job.tablename = self.getJobTableName()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
537 self.job.groupid = self.getGroupIdentifier()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
538 tokens = self.getQueueName().replace("'","").split(" ")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
539 self.job.setQueue( tokens[0] )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
540 if len(tokens) > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
541 lResources = tokens[1:]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
542 self.job.lResources = lResources
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
543 if self.getVerbosityLevel() > 0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
544 print "groupid: %s" % ( self.getGroupIdentifier() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
545 self.jobdb = RepetJob( cfgFileName=self.getConfigFile() )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
546 if self.jobdb.hasUnfinishedJob( self.job.tablename, \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
547 self.job.groupid ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
548 self.jobdb.waitJobGroup( self.job.tablename, self.job.groupid )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
549 return
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
550 self.jobdb.cleanJobGroup( self.job.tablename, self.job.groupid )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
551 sys.stdout.flush()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
552
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
553 def end( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
554 if self.getClean():
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
555 self.removeAllJobFiles()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
556 self.removeAllJobStdouts()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
557 self.removeAllJobStderrs()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
558
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
559 if self.getCatOutputFiles():
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
560 self.catOutputFiles()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
561
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
562 self.jobdb.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
563
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
564 if self.getVerbosityLevel() > 0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
565 string = "END %s" % ( type(self).__name__ )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
566 print string
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
567 sys.stdout.flush()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
568
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
569 def run( self ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
570 try:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
571 self.checkClusterLauncherAttributes()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
572 except CheckerException, msg:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
573 print msg
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
574 print self.getHelpAsString()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
575 sys.exit(1)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
576
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
577 self.start()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
578
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
579 lInFiles = self.getInputFilesList()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
580 self._nbJobs = len(lInFiles)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
581
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
582 if self._verbose > 0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
583 string = "submitting " + str(self._nbJobs) + " jobs... " + self.formatGroupidAndTime()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
584 print string; sys.stdout.flush()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
585
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
586 self.submitJob(lInFiles)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
587
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
588 if self._verbose > 0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
589 string = "waiting for jobs... " + self.formatGroupidAndTime()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
590 print string; sys.stdout.flush()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
591
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
592 self.jobdb.waitJobGroup( self.job.tablename, self.job.groupid )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
593
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
594 if self._verbose > 0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
595 string = "all jobs completed ! " + self.formatGroupidAndTime()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
596 print string; sys.stdout.flush()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
597 statsExecutionTime = self.getStatsOfExecutionTime()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
598 print "execution time of all jobs (seconds): %f" % statsExecutionTime.getSum()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
599 print "execution time per job: %s" % statsExecutionTime.string()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
600 sys.stdout.flush()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
601
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
602 self.jobdb.cleanJobGroup( self.job.tablename, self.job.groupid )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
603
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
604 self.end()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
605
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
606