ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/SchedulerGlite.py
Revision: 1.2
Committed: Fri Oct 6 16:29:12 2006 UTC (18 years, 6 months ago) by spiga
Content type: text/x-python
Branch: MAIN
Changes since 1.1: +246 -0 lines
Log Message:
changes to support bulk (by Fede)

File Contents

# Content
1 #from Scheduler import Scheduler
2 from SchedulerEdg import SchedulerEdg
3 from crab_logger import Logger
4 from crab_exceptions import *
5 from crab_util import *
6 from EdgConfig import *
7 import common
8
9 import os, sys, time
10
11 class SchedulerGlite(SchedulerEdg):
12 def __init__(self):
13 SchedulerEdg.__init__(self)
14 def sched_parameter(self):
15 """
16 Returns file with requirements and scheduler-specific parameters
17 """
18 index = int(common.jobDB.nJobs()) - 1
19 job = common.job_list[index]
20 jbt = job.type()
21
22 lastDest=''
23 first = []
24 last = []
25 for n in range(common.jobDB.nJobs()):
26 currDest=common.jobDB.destination(n)
27 if (currDest!=lastDest):
28 lastDest = currDest
29 first.append(n)
30 if n != 0:last.append(n-1)
31 if len(first)>len(last) :last.append(common.jobDB.nJobs())
32
33 req = ''
34 req = req + jbt.getRequirements()
35
36 if self.EDG_requirements:
37 if (req == ' '):
38 req = req + self.EDG_requirements
39 else:
40 req = req + ' && ' + self.EDG_requirements
41 if self.EDG_ce_white_list:
42 ce_white_list = string.split(self.EDG_ce_white_list,',')
43 for i in range(len(ce_white_list)):
44 if i == 0:
45 if (req == ' '):
46 req = req + '((RegExp("' + ce_white_list[i] + '", other.GlueCEUniqueId))'
47 else:
48 req = req + ' && ((RegExp("' + ce_white_list[i] + '", other.GlueCEUniqueId))'
49 pass
50 else:
51 req = req + ' || (RegExp("' + ce_white_list[i] + '", other.GlueCEUniqueId))'
52 req = req + ')'
53
54 if self.EDG_ce_black_list:
55 ce_black_list = string.split(self.EDG_ce_black_list,',')
56 for ce in ce_black_list:
57 if (req == ' '):
58 req = req + '(!RegExp("' + ce + '", other.GlueCEUniqueId))'
59 else:
60 req = req + ' && (!RegExp("' + ce + '", other.GlueCEUniqueId))'
61 pass
62 if self.EDG_clock_time:
63 if (req == ' '):
64 req = req + 'other.GlueCEPolicyMaxWallClockTime>='+self.EDG_clock_time
65 else:
66 req = req + ' && other.GlueCEPolicyMaxWallClockTime>='+self.EDG_clock_time
67
68 if self.EDG_cpu_time:
69 if (req == ' '):
70 req = req + ' other.GlueCEPolicyMaxCPUTime>='+self.EDG_cpu_time
71 else:
72 req = req + ' && other.GlueCEPolicyMaxCPUTime>='+self.EDG_cpu_time
73
74 for i in range(len(first)): # Add loop DS
75 self.param='sched_param_'+str(i)+'.clad'
76 param_file = open(common.work_space.shareDir()+'/'+self.param, 'w')
77
78 itr4=self.findSites_(first[i])
79 if (itr4 != []):
80 req1=[]
81 j = 0
82 concString = '||'
83 for arg in itr4:
84 print "ITR: ", arg
85 #############
86 # MC Changed matching syntax to avoid gang matching
87 #############
88 req1.append(' Member("'+arg+'" , other.GlueCESEBindGroupSEUniqueID) ')
89 param_file.write('Requirements = ' + req + " && (" + concString.join(req1) + ');\n')
90
91 if (self.edg_config and self.edg_config_vo != ''):
92 param_file.write('RBconfig = "'+self.edg_config+'";\n')
93 param_file.write('RBconfigVO = "'+self.edg_config_vo+'";')
94
95 param_file.close()
96
97 def wsSetupEnvironment(self):
98 """
99 Returns part of a job script which does scheduler-specific work.
100 """
101 txt = ''
102 txt += '# strip arguments\n'
103 txt += 'echo "strip arguments"\n'
104 txt += 'args=("$@")\n'
105 txt += 'nargs=$#\n'
106 txt += 'shift $nargs\n'
107 txt += "# job number (first parameter for job wrapper)\n"
108 txt += "NJob=${args[0]}\n"
109
110 txt += '# job identification to DashBoard \n'
111 txt += 'MonitorJobID=`echo ${NJob}_$GLITE_WMS_JOBID`\n'
112 txt += 'SyncGridJobId=`echo $GLITE_WMS_JOBID`\n'
113 txt += 'MonitorID=`echo ' + self._taskId + '`\n'
114 txt += 'echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
115 txt += 'echo "SyncGridJobId=`echo $SyncGridJobId`" | tee -a $RUNTIME_AREA/$repo \n'
116 txt += 'echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
117
118 txt += 'echo "middleware discovery " \n'
119 txt += 'if [ $VO_CMS_SW_DIR ]; then \n'
120 txt += ' middleware=LCG \n'
121 txt += ' echo "SyncCE=`glite-brokerinfo getCE`" | tee -a $RUNTIME_AREA/$repo \n'
122 txt += ' echo "GridFlavour=`echo $middleware`" | tee -a $RUNTIME_AREA/$repo \n'
123 txt += ' echo "middleware =$middleware" \n'
124 txt += 'elif [ $GRID3_APP_DIR ]; then\n'
125 txt += ' middleware=OSG \n'
126 txt += ' echo "SyncCE=`echo $EDG_WL_LOG_DESTINATION`" | tee -a $RUNTIME_AREA/$repo \n'
127 txt += ' echo "GridFlavour=`echo $middleware`" | tee -a $RUNTIME_AREA/$repo \n'
128 txt += ' echo "middleware =$middleware" \n'
129 txt += 'elif [ $OSG_APP ]; then \n'
130 txt += ' middleware=OSG \n'
131 txt += ' echo "SyncCE=`echo $EDG_WL_LOG_DESTINATION`" | tee -a $RUNTIME_AREA/$repo \n'
132 txt += ' echo "GridFlavour=`echo $middleware`" | tee -a $RUNTIME_AREA/$repo \n'
133 txt += ' echo "middleware =$middleware" \n'
134 txt += 'else \n'
135 txt += ' echo "SET_CMS_ENV 10030 ==> middleware not identified" \n'
136 txt += ' echo "JOB_EXIT_STATUS = 10030" \n'
137 txt += ' echo "JobExitCode=10030" | tee -a $RUNTIME_AREA/$repo \n'
138 txt += ' dumpStatus $RUNTIME_AREA/$repo \n'
139 txt += ' rm -f $RUNTIME_AREA/$repo \n'
140 txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
141 txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
142 txt += ' exit 1 \n'
143 txt += 'fi \n'
144
145 txt += '# report first time to DashBoard \n'
146 txt += 'dumpStatus $RUNTIME_AREA/$repo \n'
147 txt += 'rm -f $RUNTIME_AREA/$repo \n'
148 txt += 'echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
149 txt += 'echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
150
151 txt += '\n\n'
152
153 if int(self.copy_data) == 1:
154 if self.SE:
155 txt += 'export SE='+self.SE+'\n'
156 txt += 'echo "SE = $SE"\n'
157 if self.SE_PATH:
158 if ( self.SE_PATH[-1] != '/' ) : self.SE_PATH = self.SE_PATH + '/'
159 txt += 'export SE_PATH='+self.SE_PATH+'\n'
160 txt += 'echo "SE_PATH = $SE_PATH"\n'
161
162 txt += 'export VO='+self.VO+'\n'
163 ### some line for LFC catalog setting
164 txt += 'if [ $middleware == LCG ]; then \n'
165 txt += ' if [[ $LCG_CATALOG_TYPE != \''+self.lcg_catalog_type+'\' ]]; then\n'
166 txt += ' export LCG_CATALOG_TYPE='+self.lcg_catalog_type+'\n'
167 txt += ' fi\n'
168 txt += ' if [[ $LFC_HOST != \''+self.lfc_host+'\' ]]; then\n'
169 txt += ' export LFC_HOST='+self.lfc_host+'\n'
170 txt += ' fi\n'
171 txt += ' if [[ $LFC_HOME != \''+self.lfc_home+'\' ]]; then\n'
172 txt += ' export LFC_HOME='+self.lfc_home+'\n'
173 txt += ' fi\n'
174 txt += 'elif [ $middleware == OSG ]; then\n'
175 txt += ' echo "LFC catalog setting to be implemented for OSG"\n'
176 txt += 'fi\n'
177 #####
178 if int(self.register_data) == 1:
179 txt += 'if [ $middleware == LCG ]; then \n'
180 txt += ' export LFN='+self.LFN+'\n'
181 txt += ' lfc-ls $LFN\n'
182 txt += ' result=$?\n'
183 txt += ' echo $result\n'
184 ### creation of LFN dir in LFC catalog, under /grid/cms dir
185 txt += ' if [ $result != 0 ]; then\n'
186 txt += ' lfc-mkdir $LFN\n'
187 txt += ' result=$?\n'
188 txt += ' echo $result\n'
189 txt += ' fi\n'
190 txt += 'elif [ $middleware == OSG ]; then\n'
191 txt += ' echo " Files registration to be implemented for OSG"\n'
192 txt += 'fi\n'
193 txt += '\n'
194
195 if self.VO:
196 txt += 'export VO='+self.VO+'\n'
197 if self.LFN:
198 txt += 'if [ $middleware == LCG ]; then \n'
199 txt += ' export LFN='+self.LFN+'\n'
200 txt += 'fi\n'
201 txt += '\n'
202
203 txt += 'if [ $middleware == LCG ]; then\n'
204 txt += ' CloseCEs=`glite-brokerinfo getCE`\n'
205 txt += ' echo "CloseCEs = $CloseCEs"\n'
206 txt += ' CE=`echo $CloseCEs | sed -e "s/:.*//"`\n'
207 txt += ' echo "CE = $CE"\n'
208 txt += 'elif [ $middleware == OSG ]; then \n'
209 txt += ' if [ $OSG_JOB_CONTACT ]; then \n'
210 txt += ' CE=`echo $OSG_JOB_CONTACT | /usr/bin/awk -F\/ \'{print $1}\'` \n'
211 txt += ' else \n'
212 txt += ' echo "SET_CMS_ENV 10099 ==> OSG mode: ERROR in setting CE name from OSG_JOB_CONTACT" \n'
213 txt += ' echo "JOB_EXIT_STATUS = 10099" \n'
214 txt += ' echo "JobExitCode=10099" | tee -a $RUNTIME_AREA/$repo \n'
215 txt += ' dumpStatus $RUNTIME_AREA/$repo \n'
216 txt += ' rm -f $RUNTIME_AREA/$repo \n'
217 txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
218 txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
219 txt += ' exit 1 \n'
220 txt += ' fi \n'
221 txt += 'fi \n'
222
223 return txt
224
225 def loggingInfo(self, id):
226 """
227 retrieve the logging info from logging and bookkeeping and return it
228 """
229 self.checkProxy()
230 cmd = 'glite-job-logging-info -v 2 ' + id
231 cmd_out = runCommand(cmd)
232 return cmd_out
233
234 def queryDetailedStatus(self, id):
235 """ Query a detailed status of the job with id """
236 cmd = 'glite-job-status '+id
237 cmd_out = runCommand(cmd)
238 return cmd_out
239
240 def findSites_(self, n):
241 itr4 =[]
242 sites = common.jobDB.destination(n)
243 if len(sites)>0 and sites[0]=="Any":
244 return itr4
245 if sites != [""]:
246 return sites