CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/RecoLuminosity/LumiDB/python/connectstrParser.py

Go to the documentation of this file.
00001 import re
00002 class connectstrParser(object):
00003     def __init__(self,connectstr):
00004         self.__connectstr=connectstr
00005         self.__pattern=re.compile('(^[\w]+)(://)(.+)(/)(.+)')
00006         self.__protocol=''
00007         self.__schemaname=''
00008         self.__servicename=''
00009         self.__servlettotranslate=[]
00010     def parse(self):
00011         result=re.match(self.__pattern,self.__connectstr)
00012         if result is not None:
00013             protocol=result.group(1)
00014             if protocol!='frontier' and protocol!='oracle':
00015                 raise 'unsupported technology',protocol
00016             self.__protocol=protocol
00017             self.__schemaname=result.group(5)
00018             self.__servicename=result.group(3)
00019             if self.__protocol=='frontier':
00020                 if self.__servicename.find('(')==-1:
00021                     if self.__servicename.find('/')==-1:
00022                         self.__servlettotranslate.append(self.__servicename)
00023                 elif self.__servicename.find('/') == -1:
00024                     self.__servlettotranslate.append(self.__servicename.split('(',1)[0])
00025                     self.__servlettotranslate.append('('+self.__servicename.split('(',1)[1])
00026                     
00027     def protocol(self):
00028         return self.__protocol
00029     def schemaname(self):
00030         return self.__schemaname
00031     def service(self):
00032         return self.__servicename
00033     def needsitelocalinfo(self):
00034         if self.__protocol=='frontier':
00035             if len(self.__servlettotranslate)==0:
00036                 return False
00037             else :
00038                 return True
00039         else:
00040             return False
00041     def servlettotranslate(self):
00042         """return a list, first is the servlet name, second is whatever additional parameter, if any.
00043         """
00044         return self.__servlettotranslate
00045     def fullfrontierStr(self,schemaname,parameterDict):
00046         if len(parameterDict)==0:
00047             raise 'empty frontier parameters, cannot construct full connect string'
00048         result='frontier://'
00049         for k,v in parameterDict.items():
00050             ##if attr name=url, concatenate; if attrname=value discard
00051             if k=='load' and v[0][0]=='balance':
00052                 result+='(loadbalance='+v[0][1]+')'
00053                 continue
00054             for (attrname,attrvalue) in v:
00055                 if attrname=='url':
00056                     if k=='server':
00057                         fields=attrvalue.rsplit('/')
00058                         if len(fields)>3:
00059                             fields[-1]=self.servlettotranslate()[0]
00060                             attrvalue='/'.join(fields)
00061                     result+='('+k+'url='+attrvalue+')'
00062                 else:
00063                     result+='('+k+'='+attrvalue+')'
00064         if len(self.servlettotranslate())>1:
00065             result+=self.servlettotranslate()[1]
00066         result+='/'+schemaname
00067         return result
00068 if __name__ == '__main__':
00069     import cacheconfigParser
00070     o='oracle://cms_orcoff_prep/CMS_LUMI_DEV_OFFLINE'
00071     parser=connectstrParser(o)
00072     parser.parse()
00073     print parser.protocol(),parser.service(),parser.schemaname(),parser.needsitelocalinfo()
00074     print 'case 1'
00075     f1='frontier://cmsfrontier.cern.ch:8000/LumiPrep/CMS_LUMI_DEV_OFFLINE'
00076     parser=connectstrParser(f1)
00077     parser.parse()
00078     print parser.protocol(),parser.service(),parser.schemaname(),parser.needsitelocalinfo()
00079     print 'case 2'
00080     f2='frontier://(serverurl=cmsfrontier.cern.ch:8000/LumiPrep/CMS_LUMI_DEV_OFFLINE)'
00081     parser=connectstrParser(f2)
00082     parser.parse()
00083     print parser.protocol(),parser.service(),parser.schemaname(),parser.needsitelocalinfo()
00084     print 'case 3'
00085     f3='frontier://(proxyurl=https://cmst0frontier.cern.ch:3128)(proxyurl=https://cmst0frontier.cern.ch:3128)(proxyurl=https://cmst0frontier1.cern.ch:3128)(proxyurl=https://cmst0frontier2.cern.ch:3128)(serverurl=https://cmsfrontier.cern.ch:8000/LumiPrep)(serverurl=https://cmsfrontier.cern.ch:8000)/LumiPrep)(serverurl=https://cmsfrontier1.cern.ch:8000/LumiPrep)(serverurl=https://cmsfrontier2.cern.ch:8000/LumiPrep)(serverurl=https://cmsfrontier3.cern.ch:8000/LumiPrep)(serverurl=https://cmsfrontier4.cern.ch:8000/LumiPrep)/CMS_LUMI_DEV_OFFLINE'
00086     parser=connectstrParser(f3)
00087     parser.parse()
00088     print parser.protocol(),parser.service(),parser.schemaname(),parser.needsitelocalinfo()
00089     print 'case 4'
00090     f4='frontier://LumiPrep/CMS_LUMI_DEV_OFFLINE'
00091     parser=connectstrParser(f4)
00092     parser.parse()
00093     print parser.protocol(),parser.service(),parser.schemaname(),parser.needsitelocalinfo(),parser.servlettotranslate()
00094     if parser.needsitelocalinfo():
00095         sitelocalconfig='/afs/cern.ch/user/x/xiezhen/w1/site-local-config.xml'
00096         frontierparser=cacheconfigParser.cacheconfigParser()
00097         frontierparser.parse(sitelocalconfig)
00098         print 'full frontier string'
00099         print parser.fullfrontierStr(parser.schemaname(),frontierparser.parameterdict())
00100     print 'case 5'
00101     f5='frontier://LumiPrep(otherparameter=value)/CMS_LUMI_DEV_OFFLINE'
00102     parser=connectstrParser(f5)
00103     parser.parse()
00104     print parser.protocol(),parser.service(),parser.schemaname(),parser.needsitelocalinfo(),parser.servlettotranslate()
00105     print  parser.fullfrontierStr(parser.schemaname(),frontierparser.parameterdict())
00106     print 'case 6'
00107     f6='frontier://LumiCalc/CMS_LUMI_PROD'
00108     parser=connectstrParser(f6)
00109     parser.parse()
00110     print parser.protocol(),parser.service(),parser.schemaname(),parser.needsitelocalinfo(),parser.servlettotranslate()
00111     print  parser.fullfrontierStr(parser.schemaname(),frontierparser.parameterdict())