1
2
3
4 """
5 A class for parsing an IceTray XML configuration and building a Python
6 IceTrayConfig object.
7
8 copyright (c) 2005 the icecube collaboration
9
10 @version: $Revision: $
11 @date: $Date: 2005/04/06 17:32:56 $
12 @author: T. McCauley <tpmccauley@lbl.gov>
13 @author: Paolo Desiati <paolo.desiati@icecube.wisc.edu>
14 @author: Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu>
15
16 @todo: Validation against schema
17 @todo: Add support for more project content (the "optional" option)
18 @todo: Be a bit more clever about handling of type tags
19 @todo: Commas and whitespace handling in projects attribute
20 @todo: What to do if libraries are included more than once?
21 @todo: Add some overall elegance
22 @todo: Fix the "inbox" problem
23 """
24
25 import sys,os
26 import string,re
27 import logging
28 import iceprod.core.logger
29 from iceprod.core.dataclasses import *
30 from iceprod.core import ipxml
31 from iceprod.core.metadata import *
32
33
34 logger = logging.getLogger('IceTrayXMLParser')
35
36 SupportedTypes = ['bool', 'int', 'long', 'float', 'double', 'string','OMKey']
37 VectorTypes = ['boolv', 'intv', 'longv', 'floatv', 'doublev', 'stringv','OMKeyv']
38 UnmetDependencyException = "Error: Un-met dependency:"
39
40
42
44 self.i3config = i3config
45 self.metadata = None
46 self.deprecated = False
47
50
52 """
53 Read Steering parameters from the XML configuration file
54 fill Steering object for each steering parameter
55 add Steering object to IceTrayConfig steering list
56 """
57
58
59 steering = doc.getElementsByTagName('steering')
60
61 for par in steering:
62
63 category = None
64 try:
65 category = par.getElementsByTagName('category')
66 i3config.SetCategory(category[0].firstChild.data)
67 except:
68 logger.debug("Document contains no category")
69
70 filterElement = par.getElementsByTagName('OF')
71 if filterElement:
72 filt = OfflineFilter()
73 if filterElement[0].hasAttribute('prefix'):
74 filt.SetPrefix(filterElement[0].getAttribute('prefix'))
75 if filterElement[0].hasAttribute('search'):
76 filt.search = False
77 if filterElement[0].getAttribute('search') == "True":
78 filt.search = True
79 for pathElement in filterElement[0].getElementsByTagName('path'):
80 path = Path(pathElement.firstChild.data)
81 if pathElement.hasAttribute('regex'):
82 path.regex = pathElement.getAttribute('regex')
83 filt.AddPath(path)
84 i3config.SetOF(filt)
85
86 xterns = par.getElementsByTagName('external')
87 for x in xterns:
88 ex = Extern()
89
90 name = x.getElementsByTagName('name')
91 ex.SetName(name[0].firstChild.data)
92
93 edesc = x.getElementsByTagName('description')
94 if edesc:
95 ex.SetDescription(edesc[0].firstChild.data)
96
97 executable = x.getElementsByTagName('executable')
98 ex.SetExec(executable[0].firstChild.data)
99
100 args = x.getElementsByTagName('args')
101 if args:
102 ex.SetArgs(args[0].firstChild.data)
103
104 infile = x.getElementsByTagName('in')
105 if infile:
106 ex.SetInFile(infile[0].firstChild.data)
107
108 outfile = x.getElementsByTagName('out')
109 if outfile:
110 ex.SetOutFile(outfile[0].firstChild.data)
111
112 errfile = x.getElementsByTagName('err')
113 if errfile:
114 ex.SetErrFile(errfile[0].firstChild.data)
115
116 esteer = x.getElementsByTagName('extern-steering')
117 for ef in esteer:
118 es = ExternSteering()
119 es_name = ef.getElementsByTagName('name')
120 es.SetName(es_name[0].firstChild.data)
121 es_text = ef.getElementsByTagName('text')
122 es.SetText(es_text[0].firstChild.data)
123 ex.AddSteering(es)
124
125 self.LoadParameters(x,ex)
126
127 i3config.AddExtern(ex)
128 logger.debug('Added external "%s" ' % ex.GetName())
129
130 self.LoadParameters(par,i3config)
131
132 batchopts = par.getElementsByTagName('batchopt')
133 system = par.getElementsByTagName('system')
134 for item in system: batchopts += item.getElementsByTagName('batchopt')
135 for o in batchopts:
136 opt = BatchOpt()
137
138 bname = o.getElementsByTagName('name')
139 bname = bname[0].firstChild.data
140 btype = o.getElementsByTagName('type')
141 if btype:
142 btype = btype[0].firstChild.data
143 else:
144 btype = '*'
145 bvalue = o.getElementsByTagName('value')
146 bvalue = bvalue[0].firstChild.data
147
148 opt.SetName(bname)
149 opt.SetType(btype)
150 opt.SetValue(bvalue)
151 i3config.AddBatchOpt(opt)
152
153 sysopts = []
154 for item in system: sysopts += item.getElementsByTagName('sysopt')
155 for o in sysopts:
156 opt = BatchOpt()
157
158 bname = o.getElementsByTagName('name')
159 bname = bname[0].firstChild.data
160 bvalue = o.getElementsByTagName('value')
161 bvalue = bvalue[0].firstChild.data
162
163 opt.SetName(bname)
164 opt.SetValue(bvalue)
165 i3config.AddSysOpt(opt)
166
167 statistics = par.getElementsByTagName('statistics')
168 if statistics:
169 for stat in statistics[0].getElementsByTagName('item'):
170 i3config.AddStatistic(stat.firstChild.data)
171
172 depends = par.getElementsByTagName('dependency')
173 for darray in depends:
174
175
176 dep = IceTrayFile(darray.firstChild.data)
177 if darray.hasAttribute('unpack') and darray.getAttribute('prefix') == 'true':
178 dep.unpack = True
179 i3config.AddDependency(dep)
180
181 inputs = par.getElementsByTagName('JobDependency')
182 for input in inputs:
183 dataset = input.getElementsByTagName('dataset')[0].firstChild.data
184 job = input.getElementsByTagName('job')[0].firstChild.data
185 i3config.AddJobDependency(dataset,job)
186
187 desc = par.getElementsByTagName('description')
188 if desc:
189 i3config.SetDescription(desc[0].firstChild.data)
190
191 task_defs = par.getElementsByTagName('tasks')
192 if task_defs:
193 logger.debug("tasks section specified in config file")
194 self.LoadTaskDefinitions(task_defs[0],i3config)
195
197 task_defs = task_defs.getElementsByTagName("task")
198 if not task_defs:
199 logger.error("no tasks defined in tasks section")
200 trashcan_parents = []
201 for task_def in task_defs:
202 if task_def.hasAttribute("id"):
203 name = task_def.getAttribute("id")
204 td_obj = TaskDefinition(name)
205 reqs = task_def.getElementsByTagName("taskReqs")
206 opts = task_def.getElementsByTagName("taskOpts")
207 parallel = task_def.getAttribute("parallel") == "true"
208 photonics = task_def.getAttribute("photonics") == "true"
209 td_obj.SetParallelExecution(parallel)
210 td_obj.SetUsesPhotonics(photonics)
211 logger.debug("found task definition %s (parallel=%s)" % (name,parallel))
212 if reqs:
213 reqs = reqs[0].firstChild.data
214 logger.debug("requirements for task definition %s: %s" % (name, reqs))
215 td_obj.SetRequirements(reqs)
216 if opts:
217 opts = opts[0].firstChild.data
218 logger.debug("batch options for task definition %s: %s" % (name, reqs))
219 td_obj.SetBatchOpts(opts)
220
221 grids = task_def.getElementsByTagName("grids")
222 if grids:
223 tgrids = grids[0].getElementsByTagName("gridsite")
224 for tg in tgrids:
225 td_obj.AddGrid(tg.firstChild.data)
226
227 trays = task_def.getElementsByTagName("taskTray")
228 if trays:
229 for tray in trays:
230 idx = tray.getAttribute('tray')
231 iters = tray.getAttribute('iters')
232 externs = tray.getAttribute('externs') == "true"
233 msg = "added tray to task definition %s: (idx=%s, iters=%s,"
234 msg += " externs=%s)"
235 logger.debug(msg % (name,idx,iters,externs))
236 td_obj.AddTray(idx, iters, externs)
237
238 if trays:
239 for taskRelNode in task_def.parentNode.getElementsByTagName('taskRel'):
240
241 childNodes = taskRelNode.getElementsByTagName('taskChild')
242 for node in childNodes:
243 if not node.getAttribute('taskId') == name: continue
244 relNode = node.parentNode
245 parents = relNode.getElementsByTagName('taskParent')
246 for parent in parents:
247 parentName = parent.getAttribute('taskId')
248 logger.debug("task definition %s has parent %s", name, parentName)
249 td_obj.AddParent(parentName)
250
251
252 parentNodes = taskRelNode.getElementsByTagName('taskParent')
253 for node in parentNodes:
254 if not node.getAttribute('taskId') == name: continue
255 relNode = node.parentNode
256 children = relNode.getElementsByTagName('taskChild')
257 for child in children:
258 childName = child.getAttribute('taskId')
259 logger.debug("task definition %s has child %s", name, childName)
260 td_obj.AddChild(childName)
261
262 if not parentNodes and name != TASK_TRASHCAN_NAME:
263 trashcan_parents.append(name)
264
265 obj.AddTaskDefinition(td_obj)
266 else:
267 logger.error("task definition %s has no trays, skipping" % name)
268 else:
269 logger.error("task defined without id, skipping")
270
271 if obj.GetTaskDefinitions().has_key(TASK_TRASHCAN_NAME):
272 trashcan = obj.GetTaskDefinition(TASK_TRASHCAN_NAME)
273 else:
274 trashcan = TaskDefinition(TASK_TRASHCAN_NAME)
275 trashcan.AddTray(0, 0, 0)
276 obj.AddTaskDefinition(trashcan)
277 for parent in trashcan_parents:
278 trashcan.AddParent(parent)
279
281
282 params = par.getElementsByTagName('parameters')
283 if not params:
284 params = par
285 logger.debug("no parameters section found")
286 else:
287 params = params[0]
288
289 for stype in SupportedTypes:
290 ps = params.getElementsByTagName(stype)
291 if len(ps) != 0:
292 for p in ps:
293 stparameter = Parameter()
294
295 pname = p.getElementsByTagName('name')
296 pname = pname[0].firstChild.data
297 pvalues = p.getElementsByTagName('value')
298
299
300 stparameter.SetType(stype)
301 stparameter.SetName(pname)
302 if stype in VectorTypes:
303 valuearray = []
304 pvalue = map(lambda x: x.firstChild.data,pvalues)
305 else:
306 pvalue = pvalues[0].firstChild.data
307 stparameter.SetValue(pvalue)
308
309 logger.debug("steering %s %s %s" % (stype,pname,pvalue))
310
311
312 obj.AddParameter(stparameter)
313
314
317
318
319 - def AddTrays(self,configElement,i3config):
320 """
321 Detects what project is used by IceTray modules and services,
322 by inspecting the <icetray>, <module> and <service> attributes
323 in the icetray configuration file.
324
325 Builds a projects list.
326 """
327
328 logger.debug('ADD LIBRARIES')
329
330
331 i3array = []
332 for icetray in configElement.getElementsByTagName('icetray'):
333 i3tray = IceTrayConfig()
334 tray_name = icetray.getElementsByTagName('name')
335 if tray_name:
336 i3tray.SetName(tray_name[0].firstChild.data)
337 if icetray.hasAttribute('events'):
338 events = icetray.getAttribute('events')
339 i3tray.SetEvents(events)
340 if icetray.hasAttribute('iter'):
341 iter = icetray.getAttribute('iter')
342 i3tray.SetIterations(iter)
343 if icetray.hasAttribute('python'):
344 python = icetray.getAttribute('python')
345 if python: i3tray.SetPython(python)
346 file_types = ('input', 'output')
347 filesnodes = icetray.getElementsByTagName('files')
348 if not filesnodes: continue
349 for file_type in file_types:
350 if file_type == 'input':
351 func = i3tray.AddInputFile
352 else:
353 func = i3tray.AddOutputFile
354 ionodes = filesnodes[0].getElementsByTagName(file_type)
355 if not ionodes: continue
356 nodes = ionodes[0].getElementsByTagName('file')
357 for node in nodes:
358 photonics = False
359 if node.hasAttribute('photonics'):
360 photonics = node.getAttribute('photonics') == "true"
361 logger.debug("Added %s as an %s file" \
362 % (node.firstChild.data, file_type))
363 file = IceTrayFile(node.firstChild.data, photonics)
364 func(file)
365
366
367 i3config.AddTray(i3tray)
368 i3array.append((icetray,i3tray))
369 return i3array
370
371
416
417
419 """
420 Load projects from icetray configuration file
421 """
422 logger.debug('ADD PROJECTS')
423
424 projects = i3Element.getElementsByTagName('project')
425
426 for p in projects:
427 project = Project()
428
429
430 pname = p.getElementsByTagName('name')
431 pname = pname[0].firstChild.data
432 pver = p.getElementsByTagName('version')
433 pver = pver[0].firstChild.data
434 project.SetName(pname)
435 project.SetVersion(pver)
436
437 depends = p.getAttribute('dependencies')
438 if depends:
439 for d in depends.split(','):
440 project.AddDependency(d)
441
442
443 i3tray.AddProject(pname,project)
444 logger.debug("added project %s" % project.GetName())
445
447 """
448 Load services from icetray configuration file
449 """
450 logger.debug('ADD IceProdPre')
451
452 xpre = i3Element.getElementsByTagName('IceProdPre')
453
454 for s in xpre:
455 pre = IceProdPre()
456
457 sclass = s.getAttribute('class')
458 sname = s.getElementsByTagName('name')
459 sname = sname[0].firstChild.data
460
461
462 pre.SetName(sname)
463 pre.SetClass(sclass)
464
465 parameters = s.getElementsByTagName('parameters')
466
467 if len(parameters) != 0:
468 for pmtr in parameters:
469 for stype in SupportedTypes + VectorTypes:
470 ps = pmtr.getElementsByTagName(stype)
471 if len(ps) != 0:
472 for p in ps:
473 sparameter = Parameter()
474
475 pname = p.getElementsByTagName('name')
476 pname = pname[0].firstChild.data
477 pvalues = p.getElementsByTagName('value')
478 pmaps = p.getElementsByTagName('map')
479
480
481 sparameter.SetType(stype)
482 sparameter.SetName(pname)
483
484 value = []
485
486 for pvalue in pvalues:
487 val = Value(pvalue.firstChild.data)
488 if pvalue.getAttribute('unit'):
489 punit = pvalue.getAttribute('unit')
490 val.unit = punit
491 if pvalue.getAttribute('format'):
492 pformat = pvalue.getAttribute('format')
493 val.format = pformat
494 value.append( val )
495
496 for pmap in pmaps:
497 pcvalues = pmap.getElementsByTagName('cvalue')
498 val = pyOMKey("0","0")
499 for pcval in pcvalues:
500 label = pcval.getAttribute('label')
501 if label == 'stringid':
502 val.stringid = pcval.firstChild.data
503 logger.debug("found stringid %s"% val.stringid)
504 elif label == 'omid':
505 val.omid = pcval.firstChild.data
506 logger.debug("found omid %s"% val.omid)
507 value.append( val )
508
509 if stype in VectorTypes: sparameter.SetValue( value )
510 else: sparameter.SetValue( value[0] )
511
512 pre.AddParameter(sparameter)
513 logger.debug("%s %s %s %s" % (sname,stype,pname,sparameter.GetValue()))
514
515
516
517 i3tray.AddIceProdPre(pre)
518
519
520 - def AddIceProdPost(self,i3Element,i3tray):
521 """
522 Load posts from icetray configuration file
523 """
524 logger.debug('ADD IceProdPosts')
525
526 xpost = i3Element.getElementsByTagName('IceProdPost')
527
528 for s in xpost:
529 post = IceProdPost()
530
531 sclass = s.getAttribute('class')
532 sname = s.getElementsByTagName('name')
533 sname = sname[0].firstChild.data
534
535
536 post.SetName(sname)
537 post.SetClass(sclass)
538
539 parameters = s.getElementsByTagName('parameters')
540
541 if len(parameters) != 0:
542 for pmtr in parameters:
543 for stype in SupportedTypes + VectorTypes:
544 ps = pmtr.getElementsByTagName(stype)
545 if len(ps) != 0:
546 for p in ps:
547 sparameter = Parameter()
548
549 pname = p.getElementsByTagName('name')
550 pname = pname[0].firstChild.data
551 pvalues = p.getElementsByTagName('value')
552 pmaps = p.getElementsByTagName('map')
553
554
555 sparameter.SetType(stype)
556 sparameter.SetName(pname)
557
558 value = []
559
560 for pvalue in pvalues:
561 val = Value(pvalue.firstChild.data)
562 if pvalue.getAttribute('unit'):
563 punit = pvalue.getAttribute('unit')
564 val.unit = punit
565 if pvalue.getAttribute('format'):
566 pformat = pvalue.getAttribute('format')
567 val.format = pformat
568 value.append( val )
569
570 for pmap in pmaps:
571 pcvalues = pmap.getElementsByTagName('cvalue')
572 val = pyOMKey("0","0")
573 for pcval in pcvalues:
574 label = pcval.getAttribute('label')
575 if label == 'stringid':
576 val.stringid = pcval.firstChild.data
577 logger.debug("found stringid %s"% val.stringid)
578 elif label == 'omid':
579 val.omid = pcval.firstChild.data
580 logger.debug("found omid %s"% val.omid)
581 value.append( val )
582
583 if stype in VectorTypes: sparameter.SetValue( value )
584 else: sparameter.SetValue( value[0] )
585
586 post.AddParameter(sparameter)
587 logger.debug("%s %s %s %s" % (sname,stype,pname,sparameter.GetValue()))
588
589
590
591 i3tray.AddIceProdPost(post)
592
594 """
595 Load services from icetray configuration file
596 """
597 logger.debug('ADD SERVICES')
598
599 service = i3Element.getElementsByTagName('service')
600
601 for s in service:
602 service = Service()
603
604 sclass = s.getAttribute('class')
605 if s.hasAttribute('projects'):
606 prname = s.getAttribute('projects')
607 prname = string.split(prname, ',')
608
609
610 if prname:
611 for prjname in prname:
612 project = i3tray.GetProject(prjname)
613 if not project:
614 raise UnmetDependencyException, "%s needed by %s"%(prjname,sclass)
615
616 service.AddProject(prjname,project)
617 logger.debug("service '%s' -- added dependency '%s'" % (sclass,project.GetName()))
618
619 sname = s.getElementsByTagName('name')
620 sname = sname[0].firstChild.data
621
622
623 service.SetName(sname)
624 service.SetClass(sclass)
625
626 parameters = s.getElementsByTagName('parameters')
627
628
629
630 if len(parameters) != 0:
631 for pmtr in parameters:
632 for stype in SupportedTypes + VectorTypes:
633 ps = pmtr.getElementsByTagName(stype)
634 if len(ps) != 0:
635 for p in ps:
636 sparameter = Parameter()
637
638 pname = p.getElementsByTagName('name')
639 pname = pname[0].firstChild.data
640 pvalues = p.getElementsByTagName('value')
641 pmaps = p.getElementsByTagName('map')
642
643
644 sparameter.SetType(stype)
645 sparameter.SetName(pname)
646
647 value = []
648
649 for pvalue in pvalues:
650 val = Value(pvalue.firstChild.data)
651 if pvalue.getAttribute('unit'):
652 punit = pvalue.getAttribute('unit')
653 val.unit = punit
654 if pvalue.getAttribute('format'):
655 pformat = pvalue.getAttribute('format')
656 val.format = pformat
657 value.append( val )
658
659 for pmap in pmaps:
660 pcvalues = pmap.getElementsByTagName('cvalue')
661 val = pyOMKey("0","0")
662 for pcval in pcvalues:
663 label = pcval.getAttribute('label')
664 if label == 'stringid':
665 val.stringid = pcval.firstChild.data
666 logger.debug("found stringid %s"% val.stringid)
667 elif label == 'omid':
668 val.omid = pcval.firstChild.data
669 logger.debug("found omid %s"% val.omid)
670 value.append( val )
671
672 if stype in VectorTypes: sparameter.SetValue( value )
673 else: sparameter.SetValue( value[0] )
674
675 service.AddParameter(sparameter)
676 logger.debug("%s %s %s %s" % (sname,stype,pname,sparameter.GetValue()))
677
678
679
680 i3tray.AddService(service)
681
682
684 """
685 Load modules from icetray configuration file
686 """
687
688 logger.debug('ADD MODULES')
689
690 modules = i3Element.getElementsByTagName('module')
691
692 for m in modules:
693 module = Module()
694
695 mclass = m.getAttribute('class')
696 if m.hasAttribute('projects'):
697 prname = m.getAttribute('projects')
698 if prname:
699 prname = string.split(prname, ',')
700
701 for prjname in prname:
702 project = i3tray.GetProject(prjname)
703 if not project:
704 raise UnmetDependencyException, "%s:%s needed by %s"%(m,prjname,mclass)
705
706 module.AddProject(prjname,project)
707
708 mname = m.getElementsByTagName('name')
709 mname = mname[0].firstChild.data
710
711
712 module.SetName(mname)
713 module.SetClass(mclass)
714
715 parameters = m.getElementsByTagName('parameters')
716
717
718 if len(parameters) != 0:
719 for pmtr in parameters:
720
721
722
723
724 for stype in SupportedTypes + VectorTypes:
725
726
727 ps = pmtr.getElementsByTagName(stype)
728
729
730 if len(ps) != 0:
731 for p in ps:
732 mparameter = Parameter()
733
734 pname = p.getElementsByTagName('name')
735 pname = pname[0].firstChild.data
736 pvalues = p.getElementsByTagName('value')
737 pmaps = p.getElementsByTagName('map')
738
739 mparameter.SetType(stype)
740 mparameter.SetName(pname)
741 value = []
742
743
744 for pvalue in pvalues:
745 val = Value(pvalue.firstChild.data)
746 if pvalue.getAttribute('unit'):
747 punit = pvalue.getAttribute('unit')
748 val.unit = punit
749 if pvalue.getAttribute('format'):
750 pformat = pvalue.getAttribute('format')
751 val.format = pformat
752 value.append( val )
753
754 for pmap in pmaps:
755 pcvalues = pmap.getElementsByTagName('cvalue')
756 val = pyOMKey("0","0")
757 for pcval in pcvalues:
758 label = pcval.getAttribute('label')
759 if label == 'stringid':
760 val.stringid = pcval.firstChild.data
761 logger.debug("found stringid %s"% val.stringid)
762 elif label == 'omid':
763 val.omid = pcval.firstChild.data
764 logger.debug("found omid %s"% val.omid)
765 value.append( val )
766
767 if stype in VectorTypes: mparameter.SetValue( value )
768 else: mparameter.SetValue( value[0] )
769
770 module.AddParameter(mparameter)
771 logger.debug("%s %s %s %s" %(mname,stype,pname,mparameter.GetValue()))
772
773
774 i3tray.AddModule(module)
775
776
778 """
779 Connect icetray boxes to complete IceTray configuration
780 """
781
782 logger.debug('CONNECT BOXES')
783
784 connections = i3Element.getElementsByTagName('connection')
785
786
787
788
789
790 for c in connections:
791 connection = Connection()
792
793 cfrom = c.getElementsByTagName('from')
794
795 from_module = cfrom[0].getElementsByTagName('module')
796 from_module = from_module[0].firstChild.data
797
798 outbox = cfrom[0].getElementsByTagName('outbox')
799 outbox = outbox[0].firstChild.data
800
801 cto = c.getElementsByTagName('to')
802
803 to_module = cto[0].getElementsByTagName('module')
804 to_module = to_module[0].firstChild.data
805
806 inbox = cto[0].getElementsByTagName('inbox')
807 inbox = inbox[0].firstChild.data
808
809
810 connection.From(from_module, outbox)
811 connection.To(to_module, inbox)
812
813
814 i3tray.AddConnection(connection)
815
816
817 - def ParseFile(self,config_file_name,validate=1):
818
819
820 doc = None
821 try:
822
823 xmlin = open(config_file_name, 'r')
824 logger.debug("opened %s" % config_file_name)
825 doc = ipxml.Parse(xmlin, validate=validate)
826 xmlin.close()
827
828 except Exception, xe:
829 logger.error("Exception: " + str(xe) )
830 logger.error("Could not validate. Perhaps using an old config file?")
831 sys.excepthook(sys.exc_type,sys.exc_value,sys.exc_traceback)
832 return
833 config = self.LoadDocument(doc)
834 del doc
835 return config
836
838
839 config = doc.getElementsByTagName('configuration')
840 if config[0].hasAttribute('parentid'):
841 self.i3config.SetParentId(int(config[0].getAttribute('parentid')))
842 if config[0].hasAttribute('version'):
843 self.i3config.SetVersion(int(config[0].getAttribute('version')))
844 else:
845 self.i3config.SetVersion(1)
846 print "could not read version"
847 difplus = config[0].getElementsByTagName('DIF_Plus')
848 if difplus:
849 metadataparser = MetadataParser()
850 metadataparser.LoadDIF(difplus[0])
851 metadataparser.LoadPlus(difplus[0])
852 self.i3config.AddDIFPlus(metadataparser.GetDIFPlus())
853
854
855 logger.debug("self.LoadSteering(doc)")
856 self.LoadSteering(doc.documentElement,self.i3config)
857
858
859 logger.debug("self.AddTrays(doc,i3config)")
860 for doctray,tray in self.AddTrays(doc,self.i3config):
861
862
863 logger.debug("self.AddMetaProjects(doc)")
864 self.AddMetaProjects(doctray,tray)
865
866
867
868
869
870
871 logger.debug("self.AddIceProdPre(doc)")
872 self.AddIceProdPre(doctray,tray)
873
874
875 logger.debug("self.AddServices(doc)")
876 self.AddServices(doctray,tray)
877
878
879 logger.debug("self.AddModules(doc)")
880 self.AddModules(doctray,tray)
881
882
883 logger.debug("self.AddConnections(doc)")
884 self.AddConnections(doctray,tray)
885
886
887 logger.debug("self.AddIceProdPost(doc)")
888 self.AddIceProdPost(doctray,tray)
889
890 if self.deprecated:
891 logger.warn("You are using a deprecated XML config. In the future this will not work!")
892
893 return self.i3config
894
895
896
897 if __name__ == '__main__':
898
899 logging.basicConfig()
900 if len(sys.argv) != 2:
901 logger.error('Usage: python config.py <xml config file>')
902 sys.exit()
903
904
905 i3config = Steering()
906 parser = IceTrayXMLParser(i3config)
907 i3config = parser.ParseFile(sys.argv[1],validate=1)
908
909 if i3config:
910 from iceprod.core import xmlwriter
911 writer = xmlwriter.IceTrayXMLWriter(i3config)
912 writer.write_to_file()
913 writer.write_to_file("testconfig-1.xml")
914