1 from __future__
import print_function
10 MAXWORKFLOWLENGTH = 81
14 print(
'Not injecting to wmagent in --show mode. Need to run the worklfows.')
16 if opt.wmcontrol==
'init':
19 if opt.wmcontrol==
'test':
22 if opt.wmcontrol==
'submit' and opt.nProcs==0:
23 print(
'Not injecting to wmagent in -j 0 mode. Need to run the worklfows.')
25 if opt.wmcontrol==
'force':
26 print(
"This is an expert setting, you'd better know what you're doing")
30 from modules.wma
import upload_to_couch
31 (filePath,labelInCouch,user,group,where) = arguments
32 cacheId=upload_to_couch(filePath,
48 for k
in options.split(
','):
49 if k.startswith(
'dqm:'):
50 self.
dqmgui=k.split(
':',1)[-1]
51 elif k.startswith(
'wma:'):
54 self.
testMode=((mode!=
'submit')
and (mode!=
'force'))
71 self.
wmagent = os.getenv(
'WMAGENT_REQMGR')
78 self.
wmagent =
'cmsweb-testbed.cern.ch'
81 if opt.dbsUrl
is not None:
83 elif os.getenv(
'CMS_DBSREADER_URL')
is not None:
84 self.
DbsUrl = os.getenv(
'CMS_DBSREADER_URL')
88 self.
DbsUrl =
"https://cmsweb-prod.cern.ch/dbs/prod/global/DBSReader"
90 self.
DbsUrl =
"https://cmsweb-testbed.cern.ch/dbs/int/global/DBSReader"
93 self.
dqmgui=
"https://cmsweb.cern.ch/dqm/relval"
98 self.
user = os.getenv(
'USER')
106 if not os.getenv(
'WMCORE_ROOT'):
107 print(
'\n\twmclient is not setup properly. Will not be able to upload or submit requests.\n')
112 print(
'\n\tFound wmclient\n')
115 "RequestType" :
"TaskChain",
116 "SubRequestType" :
"RelVal",
117 "RequestPriority": 500000,
118 "Requestor": self.
user,
120 "CMSSWVersion": os.getenv(
'CMSSW_VERSION'),
121 "Campaign": os.getenv(
'CMSSW_VERSION'),
122 "ScramArch": os.getenv(
'SCRAM_ARCH'),
123 "ProcessingVersion": self.
version,
125 "ConfigCacheUrl": self.
couch,
133 "SizePerEvent" : 1234,
135 "PrepID": os.getenv(
'CMSSW_VERSION')
139 "EnableHarvesting" :
"True",
140 "DQMUploadUrl" : self.
dqmgui,
141 "DQMConfigCacheID" :
None,
147 "ConfigCacheID" :
None,
149 "SplittingAlgo" :
"EventBased",
150 "EventsPerJob" :
None,
151 "EventsPerLumi" :
None,
152 "RequestNumEvents" :
None,
153 "Seeding" :
"AutomaticSeeding",
154 "PrimaryDataset" :
None,
156 "Multicore" : opt.nThreads,
161 "TaskName" :
"DigiHLT",
162 "ConfigCacheID" :
None,
164 "InputDataset" :
None,
165 "SplittingAlgo" :
"LumiBased",
168 "Multicore" : opt.nThreads,
175 "InputFromOutputModule" :
None,
176 "ConfigCacheID" :
None,
178 "SplittingAlgo" :
"LumiBased",
181 "Multicore" : opt.nThreads,
191 Return a "wmsplit" dictionary that contain non-default LumisPerJob values
195 wmsplit[
'DIGIHI'] = 5
196 wmsplit[
'RECOHI'] = 5
198 wmsplit[
'RECODreHLT'] = 2
199 wmsplit[
'DIGIPU'] = 4
200 wmsplit[
'DIGIPU1'] = 4
201 wmsplit[
'RECOPU1'] = 1
202 wmsplit[
'DIGIUP15_PU50'] = 1
203 wmsplit[
'RECOUP15_PU50'] = 1
204 wmsplit[
'DIGIUP15_PU25'] = 1
205 wmsplit[
'RECOUP15_PU25'] = 1
206 wmsplit[
'DIGIUP15_PU25HS'] = 1
207 wmsplit[
'RECOUP15_PU25HS'] = 1
208 wmsplit[
'DIGIHIMIX'] = 5
209 wmsplit[
'RECOHIMIX'] = 5
210 wmsplit[
'RECODSplit'] = 1
211 wmsplit[
'SingleMuPt10_UP15_ID'] = 1
212 wmsplit[
'DIGIUP15_ID'] = 1
213 wmsplit[
'RECOUP15_ID'] = 1
214 wmsplit[
'TTbar_13_ID'] = 1
215 wmsplit[
'SingleMuPt10FS_ID'] = 1
216 wmsplit[
'TTbarFS_ID'] = 1
217 wmsplit[
'RECODR2_50nsreHLT'] = 5
218 wmsplit[
'RECODR2_25nsreHLT'] = 5
219 wmsplit[
'RECODR2_2016reHLT'] = 5
220 wmsplit[
'RECODR2_50nsreHLT_HIPM'] = 5
221 wmsplit[
'RECODR2_25nsreHLT_HIPM'] = 5
222 wmsplit[
'RECODR2_2016reHLT_HIPM'] = 1
223 wmsplit[
'RECODR2_2016reHLT_skimSingleMu'] = 1
224 wmsplit[
'RECODR2_2016reHLT_skimDoubleEG'] = 1
225 wmsplit[
'RECODR2_2016reHLT_skimMuonEG'] = 1
226 wmsplit[
'RECODR2_2016reHLT_skimJetHT'] = 1
227 wmsplit[
'RECODR2_2016reHLT_skimMET'] = 1
228 wmsplit[
'RECODR2_2016reHLT_skimSinglePh'] = 1
229 wmsplit[
'RECODR2_2016reHLT_skimMuOnia'] = 1
230 wmsplit[
'RECODR2_2016reHLT_skimSingleMu_HIPM'] = 1
231 wmsplit[
'RECODR2_2016reHLT_skimDoubleEG_HIPM'] = 1
232 wmsplit[
'RECODR2_2016reHLT_skimMuonEG_HIPM'] = 1
233 wmsplit[
'RECODR2_2016reHLT_skimJetHT_HIPM'] = 1
234 wmsplit[
'RECODR2_2016reHLT_skimMET_HIPM'] = 1
235 wmsplit[
'RECODR2_2016reHLT_skimSinglePh_HIPM'] = 1
236 wmsplit[
'RECODR2_2016reHLT_skimMuOnia_HIPM'] = 1
237 wmsplit[
'RECODR2_2017reHLT_Prompt'] = 1
238 wmsplit[
'RECODR2_2017reHLT_skimSingleMu_Prompt_Lumi'] = 1
239 wmsplit[
'RECODR2_2017reHLT_skimDoubleEG_Prompt'] = 1
240 wmsplit[
'RECODR2_2017reHLT_skimMET_Prompt'] = 1
241 wmsplit[
'RECODR2_2017reHLT_skimMuOnia_Prompt'] = 1
242 wmsplit[
'RECODR2_2017reHLT_Prompt_L1TEgDQM'] = 1
243 wmsplit[
'RECODR2_2018reHLT_Prompt'] = 1
244 wmsplit[
'RECODR2_2018reHLT_skimSingleMu_Prompt_Lumi'] = 1
245 wmsplit[
'RECODR2_2018reHLT_skimDoubleEG_Prompt'] = 1
246 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Prompt'] = 1
247 wmsplit[
'RECODR2_2018reHLT_skimMET_Prompt'] = 1
248 wmsplit[
'RECODR2_2018reHLT_skimMuOnia_Prompt'] = 1
249 wmsplit[
'RECODR2_2018reHLT_skimEGamma_Prompt_L1TEgDQM'] = 1
250 wmsplit[
'RECODR2_2018reHLT_skimMuonEG_Prompt'] = 1
251 wmsplit[
'RECODR2_2018reHLT_skimCharmonium_Prompt'] = 1
252 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Prompt_HEfail'] = 1
253 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Prompt_BadHcalMitig'] = 1
254 wmsplit[
'RECODR2_2018reHLTAlCaTkCosmics_Prompt'] = 1
255 wmsplit[
'RECODR2_2018reHLT_skimDisplacedJet_Prompt'] = 1
256 wmsplit[
'RECODR2_2018reHLT_ZBPrompt'] = 1
257 wmsplit[
'RECODR2_2018reHLT_Offline'] = 1
258 wmsplit[
'RECODR2_2018reHLT_skimSingleMu_Offline_Lumi'] = 1
259 wmsplit[
'RECODR2_2018reHLT_skimDoubleEG_Offline'] = 1
260 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Offline'] = 1
261 wmsplit[
'RECODR2_2018reHLT_skimMET_Offline'] = 1
262 wmsplit[
'RECODR2_2018reHLT_skimMuOnia_Offline'] = 1
263 wmsplit[
'RECODR2_2018reHLT_skimEGamma_Offline_L1TEgDQM'] = 1
264 wmsplit[
'RECODR2_2018reHLT_skimMuonEG_Offline'] = 1
265 wmsplit[
'RECODR2_2018reHLT_skimCharmonium_Offline'] = 1
266 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Offline_HEfail'] = 1
267 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Offline_BadHcalMitig'] = 1
268 wmsplit[
'RECODR2_2018reHLTAlCaTkCosmics_Offline'] = 1
269 wmsplit[
'RECODR2_2018reHLT_skimDisplacedJet_Offline'] = 1
270 wmsplit[
'RECODR2_2018reHLT_ZBOffline'] = 1
271 wmsplit[
'HLTDR2_50ns'] = 1
272 wmsplit[
'HLTDR2_25ns'] = 1
273 wmsplit[
'HLTDR2_2016'] = 1
274 wmsplit[
'HLTDR2_2017'] = 1
275 wmsplit[
'HLTDR2_2018'] = 1
276 wmsplit[
'HLTDR2_2018_BadHcalMitig'] = 1
277 wmsplit[
'Hadronizer'] = 1
278 wmsplit[
'DIGIUP15'] = 1
279 wmsplit[
'RECOUP15'] = 1
280 wmsplit[
'RECOAODUP15'] = 5
281 wmsplit[
'DBLMINIAODMCUP15NODQM'] = 5
284 wmsplit[
'DigiPU'] = 1
285 wmsplit[
'RecoPU'] = 1
286 wmsplit[
'RECOHID11'] = 1
287 wmsplit[
'DIGIUP17'] = 1
288 wmsplit[
'RECOUP17'] = 1
289 wmsplit[
'DIGIUP17_PU25'] = 1
290 wmsplit[
'RECOUP17_PU25'] = 1
291 wmsplit[
'DIGICOS_UP16'] = 1
292 wmsplit[
'RECOCOS_UP16'] = 1
293 wmsplit[
'DIGICOS_UP17'] = 1
294 wmsplit[
'RECOCOS_UP17'] = 1
295 wmsplit[
'DIGICOS_UP18'] = 1
296 wmsplit[
'RECOCOS_UP18'] = 1
297 wmsplit[
'DIGICOS_UP21'] = 1
298 wmsplit[
'RECOCOS_UP21'] = 1
299 wmsplit[
'HYBRIDRepackHI2015VR'] = 1
300 wmsplit[
'HYBRIDZSHI2015'] = 1
301 wmsplit[
'RECOHID15'] = 1
302 wmsplit[
'RECOHID18'] = 1
304 from .upgradeWorkflowComponents
import upgradeKeys
305 for key
in upgradeKeys[2026]:
309 wmsplit[
'DigiTriggerPU_' + key] = 1
310 wmsplit[
'RecoGlobalPU_' + key] = 1
312 except Exception
as ex:
313 print(
'Exception while building a wmsplit dictionary: %s' % (
str(ex)))
318 def prepare(self, mReader, directories, mode='init'):
319 wmsplit = MatrixInjector.get_wmsplit()
321 for (n,dir)
in directories.items():
323 print(
"inspecting",dir)
325 for (x,s)
in mReader.workFlowSteps.items():
335 if len( [step
for step
in s[3]
if "HARVESTGEN" in step] )>0:
336 chainDict[
'TimePerEvent']=0.01
337 thisLabel=thisLabel+
"_gen"
339 if len( [step
for step
in s[3]
if "DBLMINIAODMCUP15NODQM" in step] )>0:
340 thisLabel=thisLabel+
"_dblMiniAOD"
346 if 'INPUT' in step
or (
not isinstance(s[2][index],str)):
347 nextHasDSInput=s[2][index]
355 chainDict[
'nowmTasklist'][-1][
'nowmIO']=json.loads(open(
'%s/%s.io'%(dir,step)).
read())
357 print(
"Failed to find",
'%s/%s.io'%(dir,step),
".The workflows were probably not run on cfg not created")
360 chainDict[
'nowmTasklist'][-1][
'PrimaryDataset']=
'RelVal'+s[1].
split(
'+')[0]
361 if not '--relval' in s[2][index]:
362 print(
'Impossible to create task from scratch without splitting information with --relval')
365 arg=s[2][index].
split()
366 ns=list(
map(int,arg[len(arg) - arg[-1::-1].
index(
'--relval')].
split(
',')))
367 chainDict[
'nowmTasklist'][-1][
'RequestNumEvents'] = ns[0]
368 chainDict[
'nowmTasklist'][-1][
'EventsPerJob'] = ns[1]
369 chainDict[
'nowmTasklist'][-1][
'EventsPerLumi'] = ns[1]
371 if 'numberEventsInLuminosityBlock' in s[2][index]:
372 nEventsInLuminosityBlock = re.findall(
'process.source.numberEventsInLuminosityBlock=cms.untracked.uint32\(([ 0-9 ]*)\)', s[2][index],re.DOTALL)
373 if nEventsInLuminosityBlock[-1].isdigit()
and int(nEventsInLuminosityBlock[-1]) < ns[1]:
374 chainDict[
'nowmTasklist'][-1][
'EventsPerLumi'] =
int(nEventsInLuminosityBlock[-1])
377 if 'FASTSIM' in s[2][index]
or '--fast' in s[2][index]:
378 thisLabel+=
'_FastSim'
379 if 'lhe' in s[2][index]
in s[2][index]:
380 chainDict[
'nowmTasklist'][-1][
'LheInputFiles'] =
True
385 chainDict[
'nowmTasklist'][-1][
'nowmIO']=json.loads(open(
'%s/%s.io'%(dir,step)).
read())
387 print(
"Failed to find",
'%s/%s.io'%(dir,step),
".The workflows were probably not run on cfg not created")
389 chainDict[
'nowmTasklist'][-1][
'InputDataset']=nextHasDSInput.dataSet
390 if (
'DQMHLTonRAWAOD' in step) :
391 chainDict[
'nowmTasklist'][-1][
'IncludeParents']=
True
392 splitForThisWf=nextHasDSInput.split
393 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=splitForThisWf
395 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=wmsplit[step]
397 if len(nextHasDSInput.run):
398 chainDict[
'nowmTasklist'][-1][
'RunWhitelist']=nextHasDSInput.run
399 if len(nextHasDSInput.ls):
400 chainDict[
'nowmTasklist'][-1][
'LumiList']=nextHasDSInput.ls
402 if '--data' in s[2][index]
and nextHasDSInput.label:
403 thisLabel+=
'_RelVal_%s'%nextHasDSInput.label
404 if 'filter' in chainDict[
'nowmTasklist'][-1][
'nowmIO']:
405 print(
"This has an input DS and a filter sequence: very likely to be the PyQuen sample")
406 processStrPrefix=
'PU_'
407 setPrimaryDs =
'RelVal'+s[1].
split(
'+')[0]
409 chainDict[
'nowmTasklist'][-1][
'PrimaryDataset']=setPrimaryDs
415 chainDict[
'nowmTasklist'][-1][
'nowmIO']=json.loads(open(
'%s/%s.io'%(dir,step)).
read())
417 print(
"Failed to find",
'%s/%s.io'%(dir,step),
".The workflows were probably not run on cfg not created")
420 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=splitForThisWf
422 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=wmsplit[step]
425 if 'Hadronizer' in step:
426 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=wmsplit[
'Hadronizer']
429 chainDict[
'nowmTasklist'][-1][
'TaskName']=step
431 chainDict[
'nowmTasklist'][-1][
'PrimaryDataset']=setPrimaryDs
432 chainDict[
'nowmTasklist'][-1][
'ConfigCacheID']=
'%s/%s.py'%(dir,step)
433 chainDict[
'nowmTasklist'][-1][
'GlobalTag']=chainDict[
'nowmTasklist'][-1][
'nowmIO'][
'GT']
434 chainDict[
'GlobalTag']=chainDict[
'nowmTasklist'][-1][
'nowmIO'][
'GT']
435 if 'NANOEDM' in step :
436 nanoedmGT = chainDict[
'nowmTasklist'][-1][
'nowmIO'][
'GT']
437 if 'NANOMERGE' in step :
438 chainDict[
'GlobalTag'] = nanoedmGT
439 if 'pileup' in chainDict[
'nowmTasklist'][-1][
'nowmIO']:
440 chainDict[
'nowmTasklist'][-1][
'MCPileup']=chainDict[
'nowmTasklist'][-1][
'nowmIO'][
'pileup']
441 if '--pileup ' in s[2][index]:
442 processStrPrefix=
'PU_'
444 processStrPrefix=
'PU25ns_'
446 processStrPrefix=
'PU50ns_'
447 if 'premix_stage2' in s[2][index]
and '--pileup_input' in s[2][index]:
449 processStrPrefix=
'PUpmx25ns_'
450 elif s[2][index].
split()[ s[2][index].
split().
index(
'--pileup_input')+1 ].
find(
'50ns') > 0 :
451 processStrPrefix=
'PUpmx50ns_'
455 chainDict[
'AcquisitionEra'][step]=chainDict[
'CMSSWVersion']
456 chainDict[
'ProcessingString'][step]=processStrPrefix+chainDict[
'nowmTasklist'][-1][
'GlobalTag'].
replace(
'::All',
'').
replace(
'-',
'_')+thisLabel
457 if 'NANOMERGE' in step :
458 chainDict[
'ProcessingString'][step]=processStrPrefix+nanoedmGT.replace(
'::All',
'').
replace(
'-',
'_')+thisLabel
461 chainDict[
'nowmTasklist'][-1][
'AcquisitionEra']=chainDict[
'CMSSWVersion']
462 chainDict[
'nowmTasklist'][-1][
'ProcessingString']=processStrPrefix+chainDict[
'nowmTasklist'][-1][
'GlobalTag'].
replace(
'::All',
'').
replace(
'-',
'_')+thisLabel
463 if 'NANOMERGE' in step :
464 chainDict[
'nowmTasklist'][-1][
'ProcessingString']=processStrPrefix+nanoedmGT.replace(
'::All',
'').
replace(
'-',
'_')+thisLabel
467 chainDict[
'nowmTasklist'][-1][
'Campaign'] = chainDict[
'nowmTasklist'][-1][
'AcquisitionEra']+self.
batchName
470 if (
'DBLMINIAODMCUP15NODQM' in step):
471 chainDict[
'nowmTasklist'][-1][
'ProcessingString']=chainDict[
'nowmTasklist'][-1][
'ProcessingString']+
'_miniAOD'
473 if( chainDict[
'nowmTasklist'][-1][
'Multicore'] ):
480 chainDict[
'nowmTasklist'][-1][
'Memory'] = self.
memoryOffset +
int( chainDict[
'nowmTasklist'][-1][
'Multicore'] -1 ) * self.
memPerCore
484 chainDict[
'RequestString']=
'RV'+chainDict[
'CMSSWVersion']+s[1].
split(
'+')[0]
485 if processStrPrefix
or thisLabel:
486 chainDict[
'RequestString']+=
'_'+processStrPrefix+thisLabel
493 chainDict[
'PrepID'] = chainDict[
'CMSSWVersion']+
'__'+self.
batchTime+
'-'+s[1].
split(
'+')[0]
495 chainDict[
'PrepID'] = chainDict[
'CMSSWVersion']+self.
batchName+
'-'+s[1].
split(
'+')[0]
497 chainDict[
'SubRequestType'] =
"HIRelVal"
504 for i_second
in reversed(
range(len(chainDict[
'nowmTasklist']))):
505 t_second=chainDict[
'nowmTasklist'][i_second]
507 if 'primary' in t_second[
'nowmIO']:
509 primary=t_second[
'nowmIO'][
'primary'][0].
replace(
'file:',
'')
510 for i_input
in reversed(
range(0,i_second)):
511 t_input=chainDict[
'nowmTasklist'][i_input]
512 for (om,o)
in t_input[
'nowmIO'].
items():
516 if (len(t_input[
'TaskName'])>50):
517 if (t_input[
'TaskName'].
find(
'GenSim') != -1):
518 t_input[
'TaskName'] =
'GenSimFull'
519 if (t_input[
'TaskName'].
find(
'Hadronizer') != -1):
520 t_input[
'TaskName'] =
'HadronizerFull'
521 t_second[
'InputTask'] = t_input[
'TaskName']
522 t_second[
'InputFromOutputModule'] = om
524 if t_second[
'TaskName'].startswith(
'HARVEST'):
526 if "_RD" in t_second[
'TaskName']:
527 chainDict[
'DQMHarvestUnit'] =
"multiRun"
528 chainDict[
'DQMConfigCacheID']=t_second[
'ConfigCacheID']
548 chainDict[
'AcquisitionEra'] = chainDict[
'AcquisitionEra'].
values()[0]
549 chainDict[
'ProcessingString'] = chainDict[
'ProcessingString'].
values()[0]
551 chainDict[
'AcquisitionEra'] = chainDict[
'nowmTasklist'][0][
'AcquisitionEra']
552 chainDict[
'ProcessingString'] = chainDict[
'nowmTasklist'][0][
'ProcessingString']
556 chainDict[
'Campaign'] = chainDict[
'AcquisitionEra']+self.
batchName
562 if isinstance(i, int)
and i < len(chainDict[
'nowmTasklist']):
563 chainDict[
'nowmTasklist'][i][
'KeepOutput']=
True
564 for (i,t)
in enumerate(chainDict[
'nowmTasklist']):
565 if t[
'TaskName'].startswith(
'HARVEST'):
569 elif t[
'TaskName']
in self.
keep:
571 if t[
'TaskName'].startswith(
'HYBRIDRepackHI2015VR'):
572 t[
'KeepOutput']=
False
575 chainDict[
'Task%d'%(itask)]=t
582 chainDict[
'TaskChain']=itask
584 chainDict.pop(
'nowmTasklist')
591 labelInCouch=self.
label+
'_'+label
592 cacheName=filePath.split(
'/')[-1]
595 print(
'\tFake upload of',filePath,
'to couch with label',labelInCouch)
599 from modules.wma
import upload_to_couch,DATABASE_NAME
601 print(
'\n\tUnable to find wmcontrol modules. Please include it in your python path\n')
606 print(
"Not re-uploading",filePath,
"to",where,
"for",label)
609 print(
"Loading",filePath,
"to",where,
"for",label)
611 pool = multiprocessing.Pool(1)
612 cacheIds = pool.map( upload_to_couch_oneArg, [(filePath,labelInCouch,self.
user,self.
group,where)] )
613 cacheId = cacheIds[0]
620 if it.startswith(
"Task")
and it!=
'TaskChain':
622 couchID=self.
uploadConf(d[it][
'ConfigCacheID'],
623 str(n)+d[it][
'TaskName'],
626 print(d[it][
'ConfigCacheID'],
" uploaded to couchDB for",
str(n),
"with ID",couchID)
627 d[it][
'ConfigCacheID']=couchID
628 if it ==
'DQMConfigCacheID':
629 couchID=self.
uploadConf(d[
'DQMConfigCacheID'],
633 print(d[
'DQMConfigCacheID'],
"uploaded to couchDB for",
str(n),
"with ID",couchID)
634 d[
'DQMConfigCacheID']=couchID
639 from modules.wma
import makeRequest,approveRequest
640 from wmcontrol
import random_sleep
641 print(
'\n\tFound wmcontrol\n')
643 print(
'\n\tUnable to find wmcontrol modules. Please include it in your python path\n')
651 print(
"Only viewing request",n)
652 print(pprint.pprint(d))
655 print(
"For eyes before submitting",n)
656 print(pprint.pprint(d))
657 print(
"Submitting",n,
"...........")
658 workFlow=makeRequest(self.
wmagent,d,encodeDict=
True)
659 print(
"...........",n,
"submitted")
662 print(
"\n*** WARNING: "+
str(len(self.
longWFName))+
" workflows have too long names for submission (>"+
str(MAXWORKFLOWLENGTH)+
"characters) ***")