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
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())