ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/WorkSpace.py
Revision: 1.42
Committed: Thu May 19 09:15:55 2011 UTC (13 years, 11 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.41: +0 -4 lines
Log Message:
remove "data" dir check

File Contents

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