Package iceprod :: Package core :: Module xmlparser
[hide private]
[frames] | no frames]

Source Code for Module iceprod.core.xmlparser

  1  #! /usr/bin/env python 
  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   
41 -class IceTrayXMLParser:
42
43 - def __init__(self,i3config=Steering()):
44 self.i3config = i3config 45 self.metadata = None 46 self.deprecated = False
47
48 - def GetConfig(self):
49 return self.i3config
50
51 - def LoadSteering(self,doc,i3config):
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 # fetch them from <steering> 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 = '*' # any 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 168 depends = par.getElementsByTagName('dependency') 169 for darray in depends: 170 #for d in darray.firstChild.data.split(','): 171 #steeringparams.AddDependency(d) 172 i3config.AddDependency(darray.firstChild.data) 173 174 desc = par.getElementsByTagName('description') 175 if desc: 176 i3config.SetDescription(desc[0].firstChild.data) 177 178 task_defs = par.getElementsByTagName('tasks') 179 if task_defs: 180 logger.debug("tasks section specified in config file") 181 self.LoadTaskDefinitions(task_defs[0],i3config)
182
183 - def LoadTaskDefinitions(self,task_defs,obj):
184 task_defs = task_defs.getElementsByTagName("task") 185 if not task_defs: 186 logger.error("no tasks defined in tasks section") 187 trashcan_parents = [] 188 for task_def in task_defs: 189 if task_def.hasAttribute("id"): 190 name = task_def.getAttribute("id") 191 td_obj = TaskDefinition(name) 192 reqs = task_def.getElementsByTagName("taskReqs") 193 parallel = task_def.getAttribute("parallel") == "true" 194 photonics = task_def.getAttribute("photonics") == "true" 195 td_obj.SetParallelExecution(parallel) 196 td_obj.SetUsesPhotonics(photonics) 197 logger.debug("found task definition %s (parallel=%s)" % (name,parallel)) 198 if reqs: 199 reqs = reqs[0].firstChild.data 200 logger.debug("requirements for task definition %s: %s" % (name, reqs)) 201 td_obj.SetRequirements(reqs) 202 trays = task_def.getElementsByTagName("taskTray") 203 if trays: 204 for tray in trays: 205 idx = tray.getAttribute('tray') 206 iters = tray.getAttribute('iters') 207 externs = tray.getAttribute('externs') == "true" 208 msg = "added tray to task definition %s: (idx=%s, iters=%s," 209 msg += " externs=%s)" 210 logger.debug(msg % (name,idx,iters,externs)) 211 td_obj.AddTray(idx, iters, externs) 212 213 if trays: 214 # find relationships where this task is the child 215 childNodes = ipxml.Evaluate('taskRel/taskChild[@taskId="%s"]' % name, task_def.parentNode) 216 for node in childNodes: 217 relNode = node.parentNode 218 parents = relNode.getElementsByTagName('taskParent') 219 for parent in parents: 220 parentName = parent.getAttribute('taskId') 221 logger.debug("task definition %s has parent %s", name, parentName) 222 td_obj.AddParent(parentName) 223 224 # find relationships where this task is the parent 225 parentNodes = ipxml.Evaluate('taskRel/taskParent[@taskId="%s"]' % name, task_def.parentNode) 226 for node in parentNodes: 227 relNode = node.parentNode 228 children = relNode.getElementsByTagName('taskChild') 229 for child in children: 230 childName = child.getAttribute('taskId') 231 logger.debug("task definition %s has child %s", name, childName) 232 td_obj.AddChild(childName) 233 234 if not parentNodes and name != TASK_TRASHCAN_NAME: 235 trashcan_parents.append(name) 236 237 obj.AddTaskDefinition(td_obj) 238 else: 239 logger.error("task definition %s has no trays, skipping" % name) 240 else: 241 logger.error("task defined without id, skipping") 242 243 if obj.GetTaskDefinitions().has_key(TASK_TRASHCAN_NAME): 244 trashcan = obj.GetTaskDefinition(TASK_TRASHCAN_NAME) 245 else: 246 trashcan = TaskDefinition(TASK_TRASHCAN_NAME) 247 trashcan.AddTray(0, 0, 0) 248 obj.AddTaskDefinition(trashcan) 249 for parent in trashcan_parents: 250 trashcan.AddParent(parent)
251
252 - def LoadParameters(self,par,obj):
253 254 params = par.getElementsByTagName('parameters') 255 if not params: 256 params = par 257 logger.debug("no parameters section found") 258 else: 259 params = params[0] 260 261 for stype in SupportedTypes: 262 ps = params.getElementsByTagName(stype) 263 if len(ps) != 0: 264 for p in ps: 265 stparameter = Parameter() 266 267 pname = p.getElementsByTagName('name') 268 pname = pname[0].firstChild.data 269 pvalues = p.getElementsByTagName('value') 270 271 # fill Steering Parameter object 272 stparameter.SetType(stype) 273 stparameter.SetName(pname) 274 if stype in VectorTypes: 275 valuearray = [] 276 pvalue = map(lambda x: x.firstChild.data,pvalues) 277 else: 278 pvalue = pvalues[0].firstChild.data 279 stparameter.SetValue(pvalue) 280 281 logger.debug("steering %s %s %s" % (stype,pname,pvalue)) 282 283 # fill Steering object 284 obj.AddParameter(stparameter)
285 286
287 - def GetIceTrayConfig(self):
288 return self.i3config
289 290
291 - def AddTrays(self,configElement,i3config):
292 """ 293 Detects what project is used by IceTray modules and services, 294 by inspecting the <icetray>, <module> and <service> attributes 295 in the icetray configuration file. 296 297 Builds a projects list. 298 """ 299 300 logger.debug('ADD LIBRARIES') 301 302 # Fetch them from <icetray> 303 i3array = [] 304 for icetray in configElement.getElementsByTagName('icetray'): 305 i3tray = IceTrayConfig() 306 tray_name = icetray.getElementsByTagName('name') 307 if tray_name: 308 i3tray.SetName(tray_name[0].firstChild.data) 309 if icetray.hasAttribute('events'): 310 events = icetray.getAttribute('events') 311 i3tray.SetEvents(events) 312 if icetray.hasAttribute('iter'): 313 iter = icetray.getAttribute('iter') 314 i3tray.SetIterations(iter) 315 file_types = ('input', 'output') 316 for file_type in file_types: 317 if file_type == 'input': 318 func = i3tray.AddInputFile 319 else: 320 func = i3tray.AddOutputFile 321 nodes = ipxml.Evaluate('files/%s/file' % file_type, icetray) 322 for node in nodes: 323 photonics = False 324 if node.hasAttribute('photonics'): 325 photonics = node.getAttribute('photonics') == "true" 326 logger.debug("Added %s as an %s file" \ 327 % (node.firstChild.data, file_type)) 328 file = IceTrayFile(node.firstChild.data, photonics) 329 func(file) 330 331 332 i3config.AddTray(i3tray) 333 i3array.append((icetray,i3tray)) 334 return i3array
335
336 - def AddMetaProjects(self,i3Element,tray):
337 """ 338 Load meatprojects from icetray configuration file 339 """ 340 logger.debug('ADD METAPROJECTS') 341 342 metaprojects = i3Element.getElementsByTagName('metaproject') 343 344 for mp in metaprojects: 345 metaproject = MetaProject() 346 347 # fill MetaProject object: 348 mpname = mp.getElementsByTagName('name') 349 mpname = mpname[0].firstChild.data 350 mpver = mp.getElementsByTagName('version') 351 mpver = mpver[0].firstChild.data 352 metaproject.SetName(mpname) 353 metaproject.SetVersion(mpver) 354 355 projects = mp.getElementsByTagName('project') 356 357 for p in projects: 358 project = Project() 359 360 # fill Project object: 361 pname = p.getElementsByTagName('name') 362 pname = pname[0].firstChild.data 363 pver = p.getElementsByTagName('version') 364 pver = pver[0].firstChild.data 365 project.SetName(pname) 366 project.SetVersion(pver) 367 368 depends = p.getAttribute('dependencies') 369 if depends: 370 for d in depends.split(','): 371 project.AddDependency(d) 372 373 metaproject.AddProject(pname,project) 374 logger.debug("added project %s" % project.GetName()) 375 376 377 # fill IceTrayConfig object 378 tray.AddMetaProject(mpname,metaproject) 379 logger.debug("added metaproject %s" % metaproject.GetName())
380 381
382 - def AddProjects(self,i3Element,i3tray):
383 """ 384 Load projects from icetray configuration file 385 """ 386 logger.debug('ADD PROJECTS') 387 388 projects = i3Element.getElementsByTagName('project') 389 390 for p in projects: 391 project = Project() 392 393 # fill Project object: 394 pname = p.getElementsByTagName('name') 395 pname = pname[0].firstChild.data 396 pver = p.Evaluate('version') 397 pver = pver[0].firstChild.data 398 project.SetName(pname) 399 project.SetVersion(pver) 400 401 depends = p.getAttribute('dependencies') 402 if depends: 403 for d in depends.split(','): 404 project.AddDependency(d) 405 406 # fill IceTrayConfig object 407 i3tray.AddProject(pname,project) 408 logger.debug("added project %s" % project.GetName())
409
410 - def AddIceProdPre(self,i3Element,i3tray):
411 """ 412 Load services from icetray configuration file 413 """ 414 logger.debug('ADD IceProdPre') 415 416 xpre = i3Element.getElementsByTagName('IceProdPre') 417 418 for s in xpre: 419 pre = IceProdPre() 420 421 sclass = s.getAttribute('class') 422 sname = s.getElementsByTagName('name') 423 sname = sname[0].firstChild.data 424 425 # fill IceProdPre object 426 pre.SetName(sname) 427 pre.SetClass(sclass) 428 429 parameters = s.getElementsByTagName('parameters') 430 # If there are parameters, continue 431 if len(parameters) != 0: 432 for pmtr in parameters: 433 for stype in SupportedTypes + VectorTypes: 434 ps = pmtr.getElementsByTagName(stype) 435 if len(ps) != 0: 436 for p in ps: 437 sparameter = Parameter() 438 439 pname = p.getElementsByTagName('name') 440 pname = pname[0].firstChild.data 441 pvalues = p.getElementsByTagName('value') 442 pmaps = p.getElementsByTagName('map') 443 444 # fill Parameter object 445 sparameter.SetType(stype) 446 sparameter.SetName(pname) 447 448 value = [] 449 # set I3Units (if any) 450 for pvalue in pvalues: 451 val = Value(pvalue.firstChild.data) 452 if pvalue.getAttribute('unit'): 453 punit = pvalue.getAttribute('unit') 454 val.unit = punit 455 if pvalue.getAttribute('format'): 456 pformat = pvalue.getAttribute('format') 457 val.format = pformat 458 value.append( val ) 459 460 for pmap in pmaps: 461 pcvalues = pmap.getElementsByTagName('cvalue') 462 val = pyOMKey("0","0") 463 for pcval in pcvalues: 464 label = pcval.getAttribute('label') 465 if label == 'stringid': 466 val.stringid = pcval.firstChild.data 467 logger.debug("found stringid %s"% val.stringid) 468 elif label == 'omid': 469 val.omid = pcval.firstChild.data 470 logger.debug("found omid %s"% val.omid) 471 value.append( val ) 472 473 if stype in VectorTypes: sparameter.SetValue( value ) 474 else: sparameter.SetValue( value[0] ) 475 476 pre.AddParameter(sparameter) 477 logger.debug("%s %s %s %s" % (sname,stype,pname,sparameter.GetValue())) 478 479 480 # fill IceTrayConfig object 481 i3tray.AddIceProdPre(pre)
482 483
484 - def AddIceProdPost(self,i3Element,i3tray):
485 """ 486 Load posts from icetray configuration file 487 """ 488 logger.debug('ADD IceProdPosts') 489 490 xpost = i3Element.getElementsByTagName('IceProdPost') 491 492 for s in xpost: 493 post = IceProdPost() 494 495 sclass = s.getAttribute('class') 496 sname = s.getElementsByTagName('name') 497 sname = sname[0].firstChild.data 498 499 # fill IceProdPost object 500 post.SetName(sname) 501 post.SetClass(sclass) 502 503 parameters = s.getElementsByTagName('parameters') 504 # If there are parameters, continue 505 if len(parameters) != 0: 506 for pmtr in parameters: 507 for stype in SupportedTypes + VectorTypes: 508 ps = pmtr.getElementsByTagName(stype) 509 if len(ps) != 0: 510 for p in ps: 511 sparameter = Parameter() 512 513 pname = p.getElementsByTagName('name') 514 pname = pname[0].firstChild.data 515 pvalues = p.getElementsByTagName('value') 516 pmaps = p.getElementsByTagName('map') 517 518 # fill Parameter object 519 sparameter.SetType(stype) 520 sparameter.SetName(pname) 521 522 value = [] 523 # set I3Units (if any) 524 for pvalue in pvalues: 525 val = Value(pvalue.firstChild.data) 526 if pvalue.getAttribute('unit'): 527 punit = pvalue.getAttribute('unit') 528 val.unit = punit 529 if pvalue.getAttribute('format'): 530 pformat = pvalue.getAttribute('format') 531 val.format = pformat 532 value.append( val ) 533 534 for pmap in pmaps: 535 pcvalues = pmap.getElementsByTagName('cvalue') 536 val = pyOMKey("0","0") 537 for pcval in pcvalues: 538 label = pcval.getAttribute('label') 539 if label == 'stringid': 540 val.stringid = pcval.firstChild.data 541 logger.debug("found stringid %s"% val.stringid) 542 elif label == 'omid': 543 val.omid = pcval.firstChild.data 544 logger.debug("found omid %s"% val.omid) 545 value.append( val ) 546 547 if stype in VectorTypes: sparameter.SetValue( value ) 548 else: sparameter.SetValue( value[0] ) 549 550 post.AddParameter(sparameter) 551 logger.debug("%s %s %s %s" % (sname,stype,pname,sparameter.GetValue())) 552 553 554 # fill IceTrayConfig object 555 i3tray.AddIceProdPost(post)
556
557 - def AddServices(self,i3Element,i3tray):
558 """ 559 Load services from icetray configuration file 560 """ 561 logger.debug('ADD SERVICES') 562 563 service = i3Element.getElementsByTagName('service') 564 565 for s in service: 566 service = Service() 567 568 sclass = s.getAttribute('class') 569 if s.hasAttribute('projects'): 570 prname = s.getAttribute('projects') 571 prname = string.split(prname, ',') 572 573 # fill Project object: prname may be a list 574 if prname: 575 for prjname in prname: 576 project = i3tray.GetProject(prjname) 577 if not project: 578 raise UnmetDependencyException, "%s needed by %s"%(prjname,sclass) 579 580 service.AddProject(prjname,project) 581 logger.debug("service '%s' -- added dependency '%s'" % (sclass,project.GetName())) 582 583 sname = s.getElementsByTagName('name') 584 sname = sname[0].firstChild.data 585 586 # fill Service object 587 service.SetName(sname) 588 service.SetClass(sclass) 589 590 parameters = s.getElementsByTagName('parameters') 591 592 593 # If there are parameters, continue 594 if len(parameters) != 0: 595 for pmtr in parameters: 596 for stype in SupportedTypes + VectorTypes: 597 ps = pmtr.getElementsByTagName(stype) 598 if len(ps) != 0: 599 for p in ps: 600 sparameter = Parameter() 601 602 pname = p.getElementsByTagName('name') 603 pname = pname[0].firstChild.data 604 pvalues = p.getElementsByTagName('value') 605 pmaps = p.getElementsByTagName('map') 606 607 # fill Parameter object 608 sparameter.SetType(stype) 609 sparameter.SetName(pname) 610 611 value = [] 612 # set I3Units (if any) 613 for pvalue in pvalues: 614 val = Value(pvalue.firstChild.data) 615 if pvalue.getAttribute('unit'): 616 punit = pvalue.getAttribute('unit') 617 val.unit = punit 618 if pvalue.getAttribute('format'): 619 pformat = pvalue.getAttribute('format') 620 val.format = pformat 621 value.append( val ) 622 623 for pmap in pmaps: 624 pcvalues = pmap.getElementsByTagName('cvalue') 625 val = pyOMKey("0","0") 626 for pcval in pcvalues: 627 label = pcval.getAttribute('label') 628 if label == 'stringid': 629 val.stringid = pcval.firstChild.data 630 logger.debug("found stringid %s"% val.stringid) 631 elif label == 'omid': 632 val.omid = pcval.firstChild.data 633 logger.debug("found omid %s"% val.omid) 634 value.append( val ) 635 636 if stype in VectorTypes: sparameter.SetValue( value ) 637 else: sparameter.SetValue( value[0] ) 638 639 service.AddParameter(sparameter) 640 logger.debug("%s %s %s %s" % (sname,stype,pname,sparameter.GetValue())) 641 642 643 # fill IceTrayConfig object 644 i3tray.AddService(service)
645 646
647 - def AddModules(self,i3Element,i3tray):
648 """ 649 Load modules from icetray configuration file 650 """ 651 652 logger.debug('ADD MODULES') 653 654 modules = i3Element.getElementsByTagName('module') 655 656 for m in modules: 657 module = Module() 658 659 mclass = m.getAttribute('class') 660 if m.hasAttribute('projects'): 661 prname = m.getAttribute('projects') 662 if prname: 663 prname = string.split(prname, ',') 664 # fill Project object: prname may be a list 665 for prjname in prname: 666 project = i3tray.GetProject(prjname) 667 if not project: 668 raise UnmetDependencyException, "%s:%s needed by %s"%(m,prjname,mclass) 669 670 module.AddProject(prjname,project) 671 672 mname = m.getElementsByTagName('name') 673 mname = mname[0].firstChild.data 674 675 # fill Module object 676 module.SetName(mname) 677 module.SetClass(mclass) 678 679 parameters = m.getElementsByTagName('parameters') 680 681 # If there are parameters, continue 682 if len(parameters) != 0: 683 for pmtr in parameters: 684 # We have the parameters, now loop over the 685 # supported types and see if there are any 686 # used in the xml file (for example, if there are 687 # <int> tags used) 688 for stype in SupportedTypes + VectorTypes: 689 # This is an array of Type tags for 690 # each supported type 691 ps = pmtr.getElementsByTagName(stype) 692 # If there are any supported types used 693 # iterate over them and add the parameter 694 if len(ps) != 0: 695 for p in ps: 696 mparameter = Parameter() 697 698 pname = p.getElementsByTagName('name') 699 pname = pname[0].firstChild.data 700 pvalues = p.getElementsByTagName('value') 701 pmaps = p.getElementsByTagName('map') 702 # fill Parameter object 703 mparameter.SetType(stype) 704 mparameter.SetName(pname) 705 value = [] 706 707 # set I3Units (if any) 708 for pvalue in pvalues: 709 val = Value(pvalue.firstChild.data) 710 if pvalue.getAttribute('unit'): 711 punit = pvalue.getAttribute('unit') 712 val.unit = punit 713 if pvalue.getAttribute('format'): 714 pformat = pvalue.getAttribute('format') 715 val.format = pformat 716 value.append( val ) 717 718 for pmap in pmaps: 719 pcvalues = pmap.getElementsByTagName('cvalue') 720 val = pyOMKey("0","0") 721 for pcval in pcvalues: 722 label = pcval.getAttribute('label') 723 if label == 'stringid': 724 val.stringid = pcval.firstChild.data 725 logger.debug("found stringid %s"% val.stringid) 726 elif label == 'omid': 727 val.omid = pcval.firstChild.data 728 logger.debug("found omid %s"% val.omid) 729 value.append( val ) 730 731 if stype in VectorTypes: mparameter.SetValue( value ) 732 else: mparameter.SetValue( value[0] ) 733 734 module.AddParameter(mparameter) 735 logger.debug("%s %s %s %s" %(mname,stype,pname,mparameter.GetValue())) 736 737 # fill IceTrayConfig object 738 i3tray.AddModule(module)
739 740
741 - def AddConnections(self,i3Element,i3tray):
742 """ 743 Connect icetray boxes to complete IceTray configuration 744 """ 745 746 logger.debug('CONNECT BOXES') 747 748 connections = i3Element.getElementsByTagName('connection') 749 750 # I've forgotten what was decided regarding the 751 # multiple inbox/outbox issue. For now I'll just 752 # support one of each 753 754 for c in connections: 755 connection = Connection() 756 757 cfrom = c.getElementsByTagName('from') 758 759 from_module = cfrom[0].getElementsByTagName('module') 760 from_module = from_module[0].firstChild.data 761 762 outbox = cfrom[0].getElementsByTagName('outbox') 763 outbox = outbox[0].firstChild.data 764 765 cto = c.getElementsByTagName('to') 766 767 to_module = cto[0].getElementsByTagName('module') 768 to_module = to_module[0].firstChild.data 769 770 inbox = cto[0].getElementsByTagName('inbox') 771 inbox = inbox[0].firstChild.data 772 773 # fill Connection object 774 connection.From(from_module, outbox) 775 connection.To(to_module, inbox) 776 777 # fill IceTrayConfig object 778 i3tray.AddConnection(connection)
779 780
781 - def ParseFile(self,config_file_name,validate=1):
782 783 # get the DOM tree 784 doc = None 785 try: # try to validate. Will fail with older configurations 786 # open xml file for reading 787 xmlin = open(config_file_name, 'r') 788 logger.debug("opened %s" % config_file_name) 789 doc = ipxml.Parse(xmlin, validate=validate) 790 xmlin.close() 791 792 except Exception, xe: 793 logger.error("Exception: " + str(xe) ) 794 logger.error("Could not validate. Perhaps using an old config file?") 795 sys.excepthook(sys.exc_type,sys.exc_value,sys.exc_traceback) 796 return 797 config = self.LoadDocument(doc) 798 del doc 799 return config
800
801 - def LoadDocument(self,doc):
802 803 config = doc.getElementsByTagName('configuration') 804 if config[0].hasAttribute('parentid'): 805 self.i3config.SetParentId(int(config[0].getAttribute('parentid'))) 806 if config[0].hasAttribute('version'): 807 self.i3config.SetVersion(int(config[0].getAttribute('version'))) 808 else: 809 self.i3config.SetVersion(1) 810 print "could not read version" 811 difplus = config[0].getElementsByTagName('DIF_Plus') 812 if difplus: 813 metadataparser = MetadataParser() 814 metadataparser.LoadDIF(difplus[0]) 815 metadataparser.LoadPlus(difplus[0]) 816 self.i3config.AddDIFPlus(metadataparser.GetDIFPlus()) 817 818 # Steering: Computing Facility Settings 819 logger.debug("self.LoadSteering(doc)") 820 self.LoadSteering(doc.documentElement,self.i3config) 821 822 # IceTray attribute libraries (should be renamed) 823 logger.debug("self.AddTrays(doc,i3config)") 824 for doctray,tray in self.AddTrays(doc,self.i3config): 825 826 # metaprojects 827 logger.debug("self.AddMetaProjects(doc)") 828 self.AddMetaProjects(doctray,tray) 829 830 # project to be loaded 831 #logger.debug("self.AddProjects(doc)") 832 #self.AddProjects(doctray,tray) 833 834 # IceProdPres # 835 logger.debug("self.AddIceProdPre(doc)") 836 self.AddIceProdPre(doctray,tray) 837 838 # Services ### 839 logger.debug("self.AddServices(doc)") 840 self.AddServices(doctray,tray) 841 842 # Modules ### 843 logger.debug("self.AddModules(doc)") 844 self.AddModules(doctray,tray) 845 846 # Boxes ### 847 logger.debug("self.AddConnections(doc)") 848 self.AddConnections(doctray,tray) 849 850 # IceProdPosts # 851 logger.debug("self.AddIceProdPost(doc)") 852 self.AddIceProdPost(doctray,tray) 853 854 if self.deprecated: 855 logger.warn("You are using a deprecated XML config. In the future this will not work!") 856 857 return self.i3config 858 859 # Main program ### 860 861 if __name__ == '__main__': 862 863 logging.basicConfig() 864 if len(sys.argv) != 2: 865 logger.error('Usage: python config.py <xml config file>') 866 sys.exit() 867 868 # Instantiate the IceTrayConfigConfig 869 i3config = Steering() 870 parser = IceTrayXMLParser(i3config) 871 i3config = parser.ParseFile(sys.argv[1],validate=1) 872 873 if i3config: 874 from iceprod.core import xmlwriter 875 writer = xmlwriter.IceTrayXMLWriter(i3config) 876 writer.write_to_file() 877 writer.write_to_file("testconfig-1.xml") 878