1 """
2 Class paramdb is an abstract interface to the parameter database
3 copyright (c) 2008 the icecube collaboration
4
5 @version: $Revision: $
6 @date: $Date: $
7 @author: Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu>
8 """
9
10 from iceprod.core.dataclasses import *
11 import logging
12 import logger
13 import xmlrpclib
14 import copy
15 import iceprod.core.logger
16 from cPickle import loads,dumps
17 import sys,os
18 import types
19 from iceprod.core import ipxml
20
21
22
24
25 logger = logging.getLogger('paramdb')
26
28 self.metaprojects = {}
29 self.projects = {}
30 self.modules = {}
31 self.parameters = {}
32 self.cached = True
33 return
34
35
36 - def load(self,metaproject):
37 """
38 load contents of metaproject tree to database
39 @param metaproject: metaproject object
40 """
41 self.metaproject = metaproject
42 return
43
51
66
67
77
148
149
150
152 return self.metaprojects.values()
153
155 return self.GetProjectsMM(module,metaproj,'service')
156
158 for m in self.metaprojects.values():
159 if m.GetName() == metaproj.GetName() and m.GetVersion() == metaproj.GetVersion():
160 mp = m
161 metaproj.SetId(m.GetId())
162 return metaproj
163 raise Exception,"Could not find %s %s in metaprojects" %(metaproj.GetName(),metaproj.GetVersion())
164
166
167 if metaproj.GetId() > 0:
168 mp = self.metaprojects[metaproj.GetId()]
169 else:
170 self.SetMetaProjectId(metaproj)
171 mp = self.metaprojects[metaproj.GetId()]
172 for p in mp.GetProjectList():
173 if modtype == 'module':
174 mods = p.GetModules()
175 elif modtype == 'service':
176 mods = p.GetServices()
177 for mod in mods:
178 if mod.GetClass() == module.GetClass():
179 deps = []
180 for d in [p] + p.GetDependencies():
181 newproj = Project()
182 newproj.SetName(d.GetName())
183 newproj.SetVersion(d.GetVersion())
184 newproj.SetId(d.GetId())
185 deps.append(newproj)
186 return deps
187 return []
188
189
191 plist = []
192 if self.metaprojects.has_key(metaproject_id):
193 plist = self.metaprojects[metaproject_id].GetProjectList()
194 return plist
195
196
198 dlist = []
199 if self.projects.has_key(project_id):
200 dlist = self.projects[project_id].GetDependencies()
201 return dlist
202
203
205 slist = []
206 for s in self.projects[project_id].GetServices():
207 service = Service()
208 service.SetName(s.GetName())
209 service.SetClass(s.GetClass())
210 service.SetId(s.GetId())
211 slist.append(service)
212 return slist
213
215 slist = []
216 for p in self.projects.values():
217 if p.GetName() == name and p.GetVersion() == version:
218 return self.GetServices(p.GetId())
219 return slist
220
222 mlist = []
223 for m in self.projects[project_id].GetModules():
224 module = Module()
225 module.SetName(m.GetName())
226 module.SetClass(m.GetClass())
227 module.SetId(m.GetId())
228 mlist.append(module)
229 return mlist
230
232 mlist = []
233 for p in self.projects.values():
234 if p.GetName() == name and p.GetVersion() == version:
235 self.logger.debug("return self.GetModules(%d)" % p.GetId())
236 return self.GetModules(p.GetId())
237 return mlist
238
240 plist = []
241 for param in self.modules[module_id].GetParameters():
242 parameter = Parameter()
243 parameter.SetName(param.GetName())
244 parameter.SetType(param.GetType())
245 parameter.SetValue(copy.copy(param.GetValue()))
246 plist.append(parameter)
247 return plist
248
249
250
251
252 SupportedTypes = ['bool', 'int', 'long', 'float', 'double', 'string','OMKey']
253 VectorTypes = ['boolv', 'intv', 'longv', 'floatv', 'doublev', 'stringv','OMKeyv']
254
255
257
258 logger = logging.getLogger('XMLParamDB')
259
260 - def __init__(self,uri='http://x2100.icecube.wisc.edu/dtd/i3paramdb.dtd'):
261 """
262 Initialize and build DOM tree
263 from IceTrayConfig object
264 """
265 ParamDb.__init__(self)
266 self.cached = False
267
268 dom = ipxml.getDOMImplementation()
269 doctype = dom.createDocumentType("i3paramdb", "-//W3C//DTD XML 1.0 Strict//EN", uri)
270 self.doc = dom.createDocument( None, "i3paramdb", doctype )
271 config = self.doc.documentElement
272 config.setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
273 config.setAttribute('xsi:noNamespaceSchemaLocation','config.xsd')
274
275
279
339
340
342 """
343 Create a value element depending on the type
344 """
345 if ptype.startswith("OMKey"):
346 pValueElement = self.doc.createElement( 'map' )
347 pEntryElement0 = self.doc.createElement( 'cvalue' )
348 pEntryElement0.appendChild(self.doc.createTextNode(str(pvalue.stringid)))
349 pEntryElement0.setAttribute('label', 'stringid' )
350 pValueElement.appendChild(pEntryElement0)
351 pEntryElement1 = self.doc.createElement( 'cvalue' )
352 pEntryElement1.appendChild(self.doc.createTextNode(str(pvalue.omid)))
353 pEntryElement1.setAttribute('label', 'omid' )
354 pValueElement.appendChild(pEntryElement1)
355 else:
356 pValueElement = self.doc.createElement( 'value' )
357 pValueElement.appendChild(self.doc.createTextNode(str(pvalue.value)))
358 if pvalue.unit:
359 pValueElement.setAttribute('unit', pvalue.unit )
360 return pValueElement
361
363 """
364 Load services from IceTrayConfig and add the to DOM tree
365 """
366
367 services = project.GetServices()
368
369 for s in services:
370
371 servElement = self.doc.createElement( 'service' )
372 servElement.setAttribute('class',s.GetClass())
373 servElement.setAttribute('id',str(s.GetId()))
374 projects = ','.join( [p.GetName() for p in s.GetProjectList()] )
375 servElement.setAttribute('projects',projects)
376 docElement.appendChild(servElement)
377
378 nameElement = self.doc.createElement( 'name' )
379 nameNode = self.doc.createTextNode( s.GetName() )
380 nameElement.appendChild(nameNode)
381 servElement.appendChild(nameElement)
382
383 paramsElement = self.doc.createElement( 'parameters' )
384 servElement.appendChild(paramsElement)
385
386 for param in s.GetParameters():
387
388 pNameElement = self.doc.createElement( 'name' )
389 pNameNode = self.doc.createTextNode( param.GetName() )
390 pNameElement.appendChild(pNameNode)
391 pTypeElement = self.doc.createElement( param.GetType() )
392 pTypeElement.setAttribute('id',str(param.GetId()))
393 pTypeElement.appendChild(pNameElement)
394 paramsElement.appendChild(pTypeElement)
395 ptype = param.GetType()
396
397 if ptype in VectorTypes:
398 for pvalue in param.GetValue():
399 pValueElement = self.mkValueElement(ptype,pvalue,self.doc)
400 pTypeElement.appendChild(pValueElement)
401 else:
402 pValueElement = self.mkValueElement(ptype,param.GetValue(),self.doc)
403 pTypeElement.appendChild(pValueElement)
404
405
406
408 """
409 Load modules from IceTrayConfig and add the to DOM tree
410 """
411
412 modules = project.GetModules()
413
414 for m in modules:
415
416 modElement = self.doc.createElement( 'module' )
417 modElement.setAttribute('class',m.GetClass())
418 modElement.setAttribute('id',str(m.GetId()))
419 projects = ','.join( [p.GetName() for p in m.GetProjectList()] )
420 modElement.setAttribute('projects',projects)
421 docElement.appendChild(modElement)
422
423 nameElement = self.doc.createElement( 'name' )
424 nameNode = self.doc.createTextNode( m.GetName() )
425 nameElement.appendChild(nameNode)
426 modElement.appendChild(nameElement)
427
428 paramsElement = self.doc.createElement( 'parameters' )
429 modElement.appendChild(paramsElement)
430
431 for param in m.GetParameters():
432
433 pNameElement = self.doc.createElement( 'name' )
434 pNameNode = self.doc.createTextNode( param.GetName() )
435 pNameElement.appendChild(pNameNode)
436 pTypeElement = self.doc.createElement( param.GetType() )
437 pTypeElement.setAttribute('id',str(param.GetId()))
438 pTypeElement.appendChild(pNameElement)
439 paramsElement.appendChild(pTypeElement)
440 ptype = param.GetType()
441
442 if ptype in VectorTypes:
443 for pvalue in param.GetValue():
444 pValueElement = self.mkValueElement(ptype,pvalue,self.doc)
445 pTypeElement.appendChild(pValueElement)
446 else:
447 pValueElement = self.mkValueElement(ptype,param.GetValue(),self.doc)
448 pTypeElement.appendChild(pValueElement)
449
450
452 return self.doc
453
455 """
456 Write DOM tree as human readable xml to a file
457 """
458 if fname:
459 file_object = open(fname, "w")
460 ipxml.PrettyPrint(self.doc, file_object)
461 file_object.close()
462 else:
463 ipxml.PrettyPrint(self.doc)
464
466
467 logger = logging.getLogger('XMLParamDBParser')
468
472
535
536
538 return self.projects.values()
539
540
542 """
543 Load services from icetray configuration file
544 """
545 self.logger.debug('ADD SERVICES')
546
547 service = projectElement.getElementsByTagName('service')
548 for s in service:
549 service = Service()
550
551 sclass = s.getAttribute('class')
552 id = int(s.getAttribute('id'))
553
554
555 service.AddProject(project.GetName(),project)
556 sname = s.getElementsByTagName('name')
557 sname = sname[0].firstChild.data
558
559
560 service.SetName(sname)
561 service.SetClass(sclass)
562 service.SetId(id)
563 project.AddService(service)
564
565 parameters = s.getElementsByTagName('parameters')
566
567 if len(parameters) != 0:
568 for pmtr in parameters:
569 for stype in SupportedTypes + VectorTypes:
570 ps = pmtr.getElementsByTagName(stype)
571 if len(ps) != 0:
572 for p in ps:
573 sparameter = Parameter()
574
575 pname = p.getElementsByTagName('name')
576 pname = pname[0].firstChild.data
577 pvalues = p.getElementsByTagName('value')
578 pmaps = p.getElementsByTagName('map')
579
580
581 sparameter.SetType(stype)
582 sparameter.SetName(pname)
583
584 value = []
585
586 for pvalue in pvalues:
587 val = Value(pvalue.firstChild.data)
588 if pvalue.getAttribute('unit'):
589 punit = pvalue.getAttribute('unit')
590 val.unit = punit
591 if pvalue.getAttribute('format'):
592 pformat = pvalue.getAttribute('format')
593 val.format = pformat
594 value.append( val )
595
596 for pmap in pmaps:
597 pcvalues = pmap.getElementsByTagName('cvalue')
598 val = pyOMKey("0","0")
599 for pcval in pcvalues:
600 label = pcval.getAttribute('label')
601 if label == 'stringid':
602 val.stringid = pcval.firstChild.data
603 elif label == 'omid':
604 val.omid = pcval.firstChild.data
605 value.append( val )
606
607 if stype in VectorTypes: sparameter.SetValue( value )
608 else: sparameter.SetValue( value[0] )
609
610 service.AddParameter(sparameter)
611 self.logger.debug("%s %s %s %s" % (sname,stype,pname,sparameter.GetValue()))
612 project.AddService(service)
613
614
615
617 """
618 Load modules from icetray configuration file
619 """
620 self.logger.debug('ADD MODULES')
621
622 modules = projectElement.getElementsByTagName('module')
623
624 for m in modules:
625 module = Module()
626
627 mclass = m.getAttribute('class')
628 module.AddProject(project.GetName(),project)
629
630 mname = m.getElementsByTagName('name')
631 mname = mname[0].firstChild.data
632 id = int(m.getAttribute('id'))
633
634
635 module.SetName(mname)
636 module.SetClass(mclass)
637 module.SetId(id)
638 project.AddModule(module)
639
640 parameters = m.getElementsByTagName('parameters')
641
642
643 if len(parameters) != 0:
644 for pmtr in parameters:
645
646
647
648
649 for stype in SupportedTypes + VectorTypes:
650
651
652 ps = pmtr.getElementsByTagName(stype)
653
654
655 if len(ps) != 0:
656 for p in ps:
657 mparameter = Parameter()
658
659 pname = p.getElementsByTagName('name')
660 pname = pname[0].firstChild.data
661 pvalues = p.getElementsByTagName('value')
662 pmaps = p.getElementsByTagName('map')
663 id = int(p.getAttribute('id'))
664
665 mparameter.SetType(stype)
666 mparameter.SetName(pname)
667 mparameter.SetId(id)
668 value = []
669
670
671 for pvalue in pvalues:
672 val = Value(pvalue.firstChild.data)
673 if pvalue.getAttribute('unit'):
674 punit = pvalue.getAttribute('unit')
675 val.unit = punit
676 if pvalue.getAttribute('format'):
677 pformat = pvalue.getAttribute('format')
678 val.format = pformat
679 value.append( val )
680
681 for pmap in pmaps:
682 pcvalues = pmap.getElementsByTagName('cvalue')
683 val = pyOMKey("0","0")
684 for pcval in pcvalues:
685 label = pcval.getAttribute('label')
686 if label == 'stringid':
687 val.stringid = pcval.firstChild.data
688 elif label == 'omid':
689 val.omid = pcval.firstChild.data
690 value.append( val )
691
692 if stype in VectorTypes: mparameter.SetValue( value )
693 else: mparameter.SetValue( value[0] )
694
695 module.AddParameter(mparameter)
696 self.logger.debug("%s %s %s %s" %(mname,stype,pname,mparameter.GetValue()))
697 project.AddModule(module)
698
699
700 - def ParseFile(self,config_file_name,validate=0):
701
702
703 doc = None
704 try:
705
706
707 xmlin = open(config_file_name, 'r')
708 self.logger.debug("opened %s" % config_file_name)
709
710 sys.stdout.write('loading pdb ')
711 sys.stdout.write('...')
712 doc = ipxml.Parse(xmlin, validate=validate)
713 self.logger.debug("doc = ipxml.Parse(xmlin, validate=%s)" % validate)
714 xmlin.close()
715
716 except SAXParseException, xe:
717 sys.excepthook(excinfo[0],excinfo[1],excinfo[2])
718 self.logger.error("Exception: " + str(xe) )
719 return
720
721
722 self.logger.debug("self.ParseMetaProjects(doc)")
723 self.ParseMetaProjects(doc)
724
725 self.cached = True
726 return self.metaprojects
727
729
730 - def __init__(self,url=None,geturl=lambda:''):
731 """
732 Initialize and build DOM tree
733 from IceTrayConfig object
734 """
735 ParamDb.__init__(self)
736 self.url = url
737 self.geturl = geturl
738 self.server = None
739 self.connected = False
740 self.printtext = lambda x: sys.stdout.write(x+"\n")
741 self.cached = True
742
743 - def loadfile(self,filename,username,password):
752
753
754 - def setURL(self,url='http://condor.icecube.wisc.edu:9080'):
756
758 if not self.connected:
759 if not self.url:
760 self.url = self.geturl()
761 if self.url.startswith('http'):
762 self.server = xmlrpclib.ServerProxy(self.url)
763 self.connected = True
764 else:
765 self.printtext("Please specify a valid url: %s" % self.url)
766 return self.connected
767
769 self.printtext = printer
770
772 if self.printtext:
773 self.printtext(text)
774 else:
775 print text
776
777 - def load(self,metaproject,username,password):
778 """
779 load contents of metaproject tree to database
780 @param metaproject: metaproject object
781 """
782 if not self.connect(): return None
783 return self.server.LoadParams(dumps(metaproject),username,password)
784
786 if not self.connect(): return None
787 self.loadcache(loads(self.server.DownloadParams()))
788
789
793
795 if not self.connect(): return None
796 try:
797 return self.server.authenticate(username,password)
798 except Exception, e:
799 self._print("Caught exception: %s " % str(e))
800 return False
801
802
804 if not self.connect(): return None
805 return loads(self.server.SwitchMetaProject(dumps(iconfig),id,name,dumps(version)))
806
808 if not self.connect(): return None
809 return loads(self.server.GetMetaProjects())
810
814
818
822
824 if not self.connect(): return None
825 return loads(self.server.GetProjectDependencies(project_id,metaproject_id))
826
828 if not self.connect(): return None
829 return loads(self.server.GetServices(project_id))
830
832 if not self.connect(): return None
833 return loads(self.server.GetServicesP(name,dumps(version)))
834
836 if not self.connect(): return None
837 return loads(self.server.GetModules(project_id))
838
840 if not self.connect(): return None
841 return loads(self.server.GetModulesP(name,dumps(version)))
842
844 if not self.connect(): return None
845 return loads(self.server.GetIceProdModules())
846
848 if not self.connect(): return None
849 return loads(self.server.GetParameters(module_id))
850
852 metaproj.SetId(self.fetch_metaproject_id(metaproj.GetName(),metaproj.GetVersion()))
853
857
859 if not self.connect(): return None
860 return loads(self.server.fetch_metaproject_list())
861
863 if not self.connect(): return None
864 return loads(self.server.fetch_project_list(metaproject_id))
865
869
873
875 if not self.connect(): return None
876 return self.server.fetch_service_id(dumps(service),pid)
877
879 if not self.connect(): return None
880 return self.server.fetch_module_id(dumps(module),mid)
881
883 if not self.connect(): return None
884 return loads(self.server.fetch_project_dependencies(project_id,metaproject_id))
885
889
891 if not self.connect(): return None
892 return loads(self.server.fetch_modules_for_project(name,dumps(version)))
893
895 if not self.connect(): return None
896 return loads(self.server.fetch_services_for_project(name,dumps(version)))
897
899 if not self.connect(): return None
900 return loads(self.server.fetch_module_parameters(module_id))
901
903 if not self.connect(): return None
904 return loads(self.server.fetch_service_parameters(module_id))
905
907 if not self.connect(): return None
908 try:
909 return loads(self.server.showrunlist(search_string))
910 except Exception,e:
911 self._print("Caught exception: %s " % str(e))
912 return []
913
914
915
916 if __name__ == '__main__':
917
918 if len(sys.argv) != 2:
919 sys.exit()
920
921 parser = XMLParamDBParser()
922 metaprojects = parser.ParseFile(sys.argv[1],validate=1)
923
924 if metaprojects:
925 writer = XMLParamDB(metaprojects)
926 writer.write_to_file()
927