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 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 #for d in darray.firstChild.data.split(','): 175 #steeringparams.AddDependency(d) 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
196 - def LoadTaskDefinitions(self,task_defs,obj):
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 # find relationships where this task is the child 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 # find relationships where this task is the parent 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
280 - def LoadParameters(self,par,obj):
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 # fill Steering Parameter object 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 # fill Steering object 312 obj.AddParameter(stparameter)
313 314
315 - def GetIceTrayConfig(self):
316 return self.i3config
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 # Fetch them from <icetray> 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
372 - def AddMetaProjects(self,i3Element,tray):
373 """ 374 Load meatprojects from icetray configuration file 375 """ 376 logger.debug('ADD METAPROJECTS') 377 378 metaprojects = i3Element.getElementsByTagName('metaproject') 379 380 for mp in metaprojects: 381 metaproject = MetaProject() 382 383 # fill MetaProject object: 384 mpname = mp.getElementsByTagName('name') 385 mpname = mpname[0].firstChild.data 386 mpver = mp.getElementsByTagName('version') 387 mpver = mpver[0].firstChild.data 388 metaproject.SetName(mpname) 389 metaproject.SetVersion(mpver) 390 391 projects = mp.getElementsByTagName('project') 392 393 for p in projects: 394 project = Project() 395 396 # fill Project object: 397 pname = p.getElementsByTagName('name') 398 pname = pname[0].firstChild.data 399 pver = p.getElementsByTagName('version') 400 pver = pver[0].firstChild.data 401 project.SetName(pname) 402 project.SetVersion(pver) 403 404 depends = p.getAttribute('dependencies') 405 if depends: 406 for d in depends.split(','): 407 project.AddDependency(d) 408 409 metaproject.AddProject(pname,project) 410 logger.debug("added project %s" % project.GetName()) 411 412 413 # fill IceTrayConfig object 414 tray.AddMetaProject(mpname,metaproject) 415 logger.debug("added metaproject %s" % metaproject.GetName())
416 417
418 - def AddProjects(self,i3Element,i3tray):
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 # fill Project object: 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 # fill IceTrayConfig object 443 i3tray.AddProject(pname,project) 444 logger.debug("added project %s" % project.GetName())
445
446 - def AddIceProdPre(self,i3Element,i3tray):
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 # fill IceProdPre object 462 pre.SetName(sname) 463 pre.SetClass(sclass) 464 465 parameters = s.getElementsByTagName('parameters') 466 # If there are parameters, continue 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 # fill Parameter object 481 sparameter.SetType(stype) 482 sparameter.SetName(pname) 483 484 value = [] 485 # set I3Units (if any) 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 # fill IceTrayConfig object 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 # fill IceProdPost object 536 post.SetName(sname) 537 post.SetClass(sclass) 538 539 parameters = s.getElementsByTagName('parameters') 540 # If there are parameters, continue 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 # fill Parameter object 555 sparameter.SetType(stype) 556 sparameter.SetName(pname) 557 558 value = [] 559 # set I3Units (if any) 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 # fill IceTrayConfig object 591 i3tray.AddIceProdPost(post)
592
593 - def AddServices(self,i3Element,i3tray):
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 # fill Project object: prname may be a list 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 # fill Service object 623 service.SetName(sname) 624 service.SetClass(sclass) 625 626 parameters = s.getElementsByTagName('parameters') 627 628 629 # If there are parameters, continue 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 # fill Parameter object 644 sparameter.SetType(stype) 645 sparameter.SetName(pname) 646 647 value = [] 648 # set I3Units (if any) 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 # fill IceTrayConfig object 680 i3tray.AddService(service)
681 682
683 - def AddModules(self,i3Element,i3tray):
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 # fill Project object: prname may be a list 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 # fill Module object 712 module.SetName(mname) 713 module.SetClass(mclass) 714 715 parameters = m.getElementsByTagName('parameters') 716 717 # If there are parameters, continue 718 if len(parameters) != 0: 719 for pmtr in parameters: 720 # We have the parameters, now loop over the 721 # supported types and see if there are any 722 # used in the xml file (for example, if there are 723 # <int> tags used) 724 for stype in SupportedTypes + VectorTypes: 725 # This is an array of Type tags for 726 # each supported type 727 ps = pmtr.getElementsByTagName(stype) 728 # If there are any supported types used 729 # iterate over them and add the parameter 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 # fill Parameter object 739 mparameter.SetType(stype) 740 mparameter.SetName(pname) 741 value = [] 742 743 # set I3Units (if any) 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 # fill IceTrayConfig object 774 i3tray.AddModule(module)
775 776
777 - def AddConnections(self,i3Element,i3tray):
778 """ 779 Connect icetray boxes to complete IceTray configuration 780 """ 781 782 logger.debug('CONNECT BOXES') 783 784 connections = i3Element.getElementsByTagName('connection') 785 786 # I've forgotten what was decided regarding the 787 # multiple inbox/outbox issue. For now I'll just 788 # support one of each 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 # fill Connection object 810 connection.From(from_module, outbox) 811 connection.To(to_module, inbox) 812 813 # fill IceTrayConfig object 814 i3tray.AddConnection(connection)
815 816
817 - def ParseFile(self,config_file_name,validate=1):
818 819 # get the DOM tree 820 doc = None 821 try: # try to validate. Will fail with older configurations 822 # open xml file for reading 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
837 - def LoadDocument(self,doc):
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 # Steering: Computing Facility Settings 855 logger.debug("self.LoadSteering(doc)") 856 self.LoadSteering(doc.documentElement,self.i3config) 857 858 # IceTray attribute libraries (should be renamed) 859 logger.debug("self.AddTrays(doc,i3config)") 860 for doctray,tray in self.AddTrays(doc,self.i3config): 861 862 # metaprojects 863 logger.debug("self.AddMetaProjects(doc)") 864 self.AddMetaProjects(doctray,tray) 865 866 # project to be loaded 867 #logger.debug("self.AddProjects(doc)") 868 #self.AddProjects(doctray,tray) 869 870 # IceProdPres # 871 logger.debug("self.AddIceProdPre(doc)") 872 self.AddIceProdPre(doctray,tray) 873 874 # Services ### 875 logger.debug("self.AddServices(doc)") 876 self.AddServices(doctray,tray) 877 878 # Modules ### 879 logger.debug("self.AddModules(doc)") 880 self.AddModules(doctray,tray) 881 882 # Boxes ### 883 logger.debug("self.AddConnections(doc)") 884 self.AddConnections(doctray,tray) 885 886 # IceProdPosts # 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 # Main program ### 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 # Instantiate the IceTrayConfigConfig 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