ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/WorkSpace.py
Revision: 1.37
Committed: Wed Oct 14 13:50:06 2009 UTC (15 years, 6 months ago) by fanzago
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_7_0_pre8, CRAB_2_7_0_pre7, CRAB_2_7_0_pre6, CRAB_2_7_0_pre5
Branch point for: Lumi2_8
Changes since 1.36: +21 -7 lines
Log Message:
added a check for the final / in the top_dir path, savannah bug 56973

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