ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/WorkSpace.py
Revision: 1.44
Committed: Fri Mar 16 15:02:26 2012 UTC (13 years, 1 month ago) by belforte
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_9_1, CRAB_2_9_1_pre2, CRAB_2_9_1_pre1, CRAB_2_9_0, CRAB_2_9_0_pre2, CRAB_2_9_0_pre1, CRAB_2_8_8, CRAB_2_8_8_pre1, CRAB_2_8_7_patch3, CRAB_2_8_7_patch2, CRAB_2_8_7_patch1, CRAB_2_8_7, CRAB_2_8_7_pre2, CRAB_2_8_7_pre1, CRAB_2_8_6, CRAB_2_8_6_pre1, CRAB_2_8_5_patch3, CRAB_2_8_5_patch2, CRAB_2_8_5_patch1, CRAB_2_8_5, CRAB_2_8_5_pre5, CRAB_2_8_5_pre4, CRAB_2_8_5_pre3, CRAB_2_8_4_patch3, CRAB_2_8_5_pre2, CRAB_2_8_4_patch2, CRAB_2_8_5_pre1, CRAB_2_8_4_patch1, CRAB_2_8_4, CRAB_2_8_4_pre5, CRAB_2_8_4_pre4, CRAB_2_8_4_pre3, CRAB_2_8_4_pre2, CRAB_2_8_4_pre1, CRAB_2_8_3, CRAB_2_8_3_pre4, CRAB_2_8_3_pre3, CRAB_2_8_3_pre2, CRAB_2_8_3_pre1, CRAB_2_8_2_patch1, CRAB_2_8_2, CRAB_2_8_2_pre5, CRAB_2_8_2_pre4, CRAB_2_8_2_pre3, CRAB_2_8_2_pre2, CRAB_2_8_2_pre1, CRAB_2_8_1, HEAD
Changes since 1.43: +4 -0 lines
Log Message:
do not allow outputdir for CAF https://savannah.cern.ch/bugs/index.php?88510

File Contents

# User Rev Content
1 nsmirnov 1.1 from crab_exceptions import *
2 slacapra 1.33 import logging
3 nsmirnov 1.1 import common
4 slacapra 1.33 import os, string, time
5 spiga 1.40 from crab_util import loadConfig
6 nsmirnov 1.1
7     class WorkSpace:
8 fanzago 1.10 def __init__(self, top_dir, cfg_params):
9 farinafa 1.21
10 spiga 1.6 self._cwd_dir = os.getcwd()+'/'
11 farinafa 1.21 self._top_dir = top_dir # top working directory
12 farinafa 1.20
13 spiga 1.26 self._user_out_dir = ''
14     self._user_log_dir = ''
15     if 'USER.outputdir' in cfg_params.keys():
16     self._user_out_dir = os.path.abspath(cfg_params['USER.outputdir'])
17 belforte 1.44 if cfg_params['CRAB.scheduler'].upper() == 'CAF' :
18     msg = "Cannot use 'outputdir' parameter with CAF scheduler\n"
19     msg += 'please remove it from your crab.cfg\n'
20     raise CrabException(msg)
21 spiga 1.26 if 'USER.logdir' in cfg_params.keys():
22     self._user_log_dir = os.path.abspath(cfg_params['USER.logdir'])
23 farinafa 1.20 #Matteo: Necessary to manage user ui_working_dir
24     if 'USER.ui_working_dir' in cfg_params.keys():
25 spiga 1.25 self._top_dir = os.path.abspath(cfg_params['USER.ui_working_dir'])
26 farinafa 1.20
27 spiga 1.26 # self._res_dir = cfg_params.get("USER.outputdir", self._top_dir + '/res') # dir to store job results
28     # self._log_dir = ("USER.logdir",self._top_dir + '/log') # log-directory
29     self._log_dir = self._top_dir + '/log' # log-directory
30 nsmirnov 1.1 self._job_dir = self._top_dir + '/job' # job pars, scripts, jdl's
31 spiga 1.26 self._res_dir = self._top_dir + '/res' # dir to store job results
32 nsmirnov 1.1 self._share_dir = self._top_dir + '/share' # directory for common stuff
33 farinafa 1.20
34 slacapra 1.30 #self._pathForTgz = string.split(top_dir, '/')[-1]
35     self._pathForTgz = self._share_dir
36 farinafa 1.20
37 spiga 1.31 self.uuid = self.uuidGen()
38    
39     def uuidGen(self):
40     import random
41    
42     letters = "abcdefghijklmnopqrstuvwxyz"
43     numbers = "0123456789"
44     genid_bits = random.sample(letters, 3) + random.sample(numbers, 3)
45     random.shuffle(genid_bits)
46     combination = ''.join(genid_bits)
47    
48     return combination
49 nsmirnov 1.1
50     def create(self):
51 farinafa 1.21 # Matteo change in order to ban only "data" in "CMSSW" dir and
52     # not crash when short path is given
53     subpath = self._top_dir.split('CMSSW')
54 spiga 1.43 if len(subpath)!=1 and ("data" in subpath[-1].split("/")):
55     msg = 'Cannot run CRAB from "data" directory.\n'
56     msg += 'please change direcotry\n'
57     raise CrabException(msg)
58 slacapra 1.18
59 nsmirnov 1.1 if not os.path.exists(self._top_dir):
60 slacapra 1.22 try:
61 slacapra 1.38 os.makedirs(self._top_dir)
62 slacapra 1.22 except OSError:
63     msg = 'Cannot create '+str(self._top_dir) +' directory.\n'
64     raise CrabException(msg)
65 fanzago 1.9 pass
66     if not os.listdir(self._top_dir):
67 nsmirnov 1.1 os.mkdir(self._job_dir)
68     os.mkdir(self._share_dir)
69 spiga 1.26 os.mkdir(self._res_dir)
70     os.mkdir(self._log_dir)
71 nsmirnov 1.1 pass
72 fanzago 1.10
73 slacapra 1.24 # Some more check for _res_dir, since it can be user defined
74 spiga 1.26 if self._user_out_dir != '':
75     if not os.path.exists(self._user_out_dir):
76     try:
77 slacapra 1.38 os.makedirs(self._user_out_dir)
78 spiga 1.26 except:
79     msg = 'Cannot mkdir ' + self._user_out_dir + ' Check permission'
80     raise CrabException(msg)
81     if os.listdir(self._user_out_dir):
82     msg = self._user_out_dir + ' already exists and is not empty. Please remove it before create new task'
83 fanzago 1.11 raise CrabException(msg)
84 slacapra 1.24 # ditto for _log_dir
85 spiga 1.26 if self._user_log_dir != '':
86     if not os.path.exists(self._user_log_dir):
87     try:
88 slacapra 1.38 os.makedirs(self._user_log_dir)
89 spiga 1.26 except:
90     msg = 'Cannot mkdir ' + self._user_log_dir + ' Check permission'
91     raise CrabException(msg)
92     pass
93     if os.listdir(self._user_log_dir):
94     msg = self._user_log_dir + ' already exists and is not empty. Please remove it before create new task'
95 fanzago 1.11 raise CrabException(msg)
96 nsmirnov 1.1 return
97    
98 slacapra 1.4 def delete(self):
99     """
100     delete the whole workspace without doing any test!!!
101     """
102 slacapra 1.35 common.logger.delete()
103     common.logger = None
104    
105 slacapra 1.4 if os.path.exists(self._top_dir):
106 slacapra 1.33 import shutil
107 farinafa 1.36 try:
108     shutil.rmtree(self._top_dir)
109     except :
110     msg = 'Problem removing whole workspace. Please remove the remaining files manually.'
111     raise CrabException(msg)
112 slacapra 1.4 return
113    
114 spiga 1.6 def cwdDir(self):
115 fanzago 1.37 if (self._cwd_dir[-1] != '/'):
116     self._cwd_dir = self._cwd_dir + '/'
117     return self._cwd_dir
118 spiga 1.6
119 nsmirnov 1.1 def topDir(self):
120 fanzago 1.37 if (self._top_dir[-1] != '/'):
121     self._top_dir = self._top_dir + '/'
122     return self._top_dir
123 nsmirnov 1.1
124     def logDir(self):
125 fanzago 1.37 if (self._log_dir[-1] != '/'):
126     self._log_dir = self._log_dir + '/'
127     return self._log_dir
128 nsmirnov 1.1
129     def jobDir(self):
130 fanzago 1.37 if (self._job_dir[-1] != '/'):
131     self._job_dir = self._job_dir + '/'
132     return self._job_dir
133 nsmirnov 1.1
134     def resDir(self):
135 fanzago 1.37 if (self._res_dir[-1] != '/'):
136     self._res_dir = self._res_dir + '/'
137     return self._res_dir
138 nsmirnov 1.1
139     def shareDir(self):
140 fanzago 1.37 if (self._share_dir[-1] != '/'):
141     self._share_dir = self._share_dir + '/'
142     return self._share_dir
143 corvo 1.14
144     def pathForTgz(self):
145 fanzago 1.37 if (self._pathForTgz[-1] != '/'):
146     self._pathForTgz = self._pathForTgz + '/'
147     return self._pathForTgz
148 corvo 1.14
149 spiga 1.32 def task_uuid(self):
150     return self.uuid
151 nsmirnov 1.1
152     def setResDir(self, dir):
153     self._res_dir = dir
154     return
155    
156     def saveFileName(self):
157     return self.shareDir() + common.prog_name + '.sav'
158    
159     def cfgFileName(self):
160     return self.shareDir() + common.prog_name + '.cfg'
161    
162 slacapra 1.28 def saveConfiguration(self, opts, pars):
163 nsmirnov 1.1
164     # Save options
165    
166     save_file = open(self.saveFileName(), 'w')
167    
168     for k in opts.keys():
169 nsmirnov 1.2 if opts[k] : save_file.write(k+'='+opts[k]+'\n')
170     else : save_file.write(k+'\n')
171 nsmirnov 1.1 pass
172    
173     save_file.close()
174    
175     # Save cfg-file
176    
177 slacapra 1.28 secs={}
178     for k in pars.keys():
179     sec, value = string.split(k,".")
180     if sec not in secs.keys():
181     secs[sec]={}
182     secs[sec][value]=pars[k]
183     pass
184    
185     config_file = open(self.cfgFileName(), 'w')
186     for k in secs.keys():
187     config_file.write('['+k+']\n')
188     for v in secs[k].keys():
189 spiga 1.39 if v!='debug': config_file.write(v+'='+secs[k][v]+'\n')
190 slacapra 1.28 else : config_file.write('\n')
191     config_file.close()
192 nsmirnov 1.1
193     return
194    
195 spiga 1.41 def addToSavedCfg(self, opt):
196     pars={}
197     pars = loadConfig(self.shareDir() + common.prog_name + '.cfg', pars)
198     pars[opt.keys()[0]]=opt.values()[0]
199    
200     secs={}
201     for k in pars.keys():
202     sec, value = string.split(k,".")
203     if sec not in secs.keys():
204     secs[sec]={}
205     secs[sec][value]=pars[k]
206     pass
207    
208     config_file = open(self.cfgFileName(), 'w')
209     for k in secs.keys():
210     config_file.write('['+k+']\n')
211     for v in secs[k].keys():
212     if v!='debug': config_file.write(v+'='+secs[k][v]+'\n')
213     else : config_file.write('\n')
214     config_file.close()
215    
216     return
217 nsmirnov 1.1 def loadSavedOptions(self):
218    
219     # Open save-file
220    
221     try:
222     save_file = open(self.saveFileName(), 'r')
223     except IOError, e:
224     msg = 'Misconfigured continuation directory:\n'
225     msg += str(e)
226     raise CrabException(msg)
227    
228     # Read saved options
229    
230     save_opts = {}
231     for line in save_file:
232     line = line[:-1] # drop '\n'
233 slacapra 1.3 try:
234     (k, v) = string.split(line, '=')
235     except:
236     k=line
237     v=''
238     pass
239 nsmirnov 1.1 save_opts[k] = v
240     pass
241    
242     save_file.close()
243     return save_opts
244