00001
00002 import sys
00003 import re
00004 import os
00005 import shlex, subprocess
00006 import getopt
00007 import random
00008 import time
00009 from xml.dom.minidom import parse, parseString
00010 import string
00011 try:
00012 import cx_Oracle
00013 except ImportError, e:
00014 print "Cannot import cx_Oracle:", e
00015
00016
00017 resCount = 0
00018 resNames = []
00019 mLabel = ''
00020 DATABASE = "cms_orcoff_prep"
00021 USERNAME = "CMS_COND_REGRESSION"
00022 AUTH_PATH = "/afs/cern.ch/cms/DB/conddb/test/authentication.xml"
00023
00024
00025 def getText(nodelist):
00026 rc = []
00027 for node in nodelist:
00028 if node.nodeType == node.TEXT_NODE:
00029 rc.append(node.data)
00030 return ''.join(rc)
00031 def ParseXML(filename, label):
00032 results = []
00033 initResults = []
00034 finalResults = []
00035 dom = parse(filename)
00036 xml = dom.getElementsByTagName("xml")
00037 execTest = False
00038 env = []
00039 if xml != None:
00040 for xm in xml:
00041 test = xm.getElementsByTagName("test")
00042 for it in test:
00043
00044 if "name" in it.attributes.keys():
00045 tLabel = str(it.attributes["name"].value)
00046 if tLabel == label:
00047 execTest = True
00048 global mLabel
00049 mLabel = label
00050 if execTest == True:
00051 inits = it.getElementsByTagName("init")
00052 finals = it.getElementsByTagName("final")
00053 seqs = it.getElementsByTagName("sequence")
00054 for init in inits:
00055 commands = init.getElementsByTagName("command")
00056 for command in commands:
00057 if "exec" in command.attributes.keys():
00058 initResults.append(str(command.attributes["exec"].value))
00059 if "env" in command.attributes.keys():
00060 env.append(str(command.attributes["env"].value))
00061 for seq in seqs:
00062 commands = seq.getElementsByTagName("command")
00063 for command in commands:
00064 if "exec" in command.attributes.keys():
00065 results.append(str(command.attributes["exec"].value))
00066 if "result" in command.attributes.keys():
00067 global resNames
00068 resNames.append(str(command.attributes["result"].value))
00069 else:
00070 resNames.append("%NONE")
00071 if "env" in command.attributes.keys():
00072 env.append(str(command.attributes["env"].value))
00073 for final in finals:
00074 commands = final.getElementsByTagName("command")
00075 for command in commands:
00076 if "exec" in command.attributes.keys():
00077 finalResults.append(str(command.attributes["exec"].value))
00078 if "env" in command.attributes.keys():
00079 env.append(str(command.attributes["env"].value))
00080 execTest = False
00081 return initResults,results, finalResults, env
00082 def extractLogin(login):
00083 pattern = re.compile(r'value="([^"]+)')
00084 matching = pattern.search(login)
00085 version = 0
00086 if matching:
00087 g = matching.groups()
00088 return g[0]
00089 def getLogin(auth, connStr):
00090 pfile = open(auth, "r")
00091 plist = pfile.readlines()
00092 for i in range (0, len(plist)):
00093 if string.find(plist[i], '<connection name="'+connStr+'">') != -1:
00094 PASSWORD = extractLogin(plist[i+2])
00095 return (PASSWORD)
00096
00097 def setConn():
00098 os.environ['TNS_ADMIN'] = "/afs/cern.ch/project/oracle/admin"
00099 coralConnStr = "oracle://"+DATABASE+"/"+USERNAME+""
00100 PASSWORD = getLogin(AUTH_PATH, coralConnStr)
00101 conn_string = str(USERNAME+"/"+PASSWORD+"@"+DATABASE)
00102 conn = cx_Oracle.connect(conn_string)
00103 return {'r0':conn, 'r1':coralConnStr, 'r2':USERNAME, 'r3':PASSWORD, 'r4':AUTH_PATH}
00104 def WebStatusRunID(label):
00105 result = setConn()
00106 con = result.get('r0')
00107 curs = con.cursor()
00108 sqlstr = "SELECT MAX(RUNID) FROM TEST_STATUS WHERE LABEL = :labl"
00109 curs.prepare(sqlstr)
00110 curs.execute(sqlstr, labl=label)
00111 max = 0
00112 for row in curs:
00113 return row[0]
00114 def WebStatusHeaders(label):
00115 result = setConn()
00116 con = result.get('r0')
00117 curs = con.cursor()
00118 sqlstr = "SELECT DISTINCT RUNID, TO_CHAR(RDATE, 'DD.MM.YYYY HH24:MI:SS'), LABEL, T_RELEASE, T_ARCH "
00119 sqlstr +="FROM TEST_STATUS WHERE LABEL = :labl ORDER BY RUNID DESC"
00120 curs.prepare(sqlstr)
00121 curs.execute(sqlstr, labl = label)
00122 result = curs.fetchall()
00123 return result
00124
00125 def WebLabels():
00126 result = setConn()
00127 con = result.get('r0')
00128 curs = con.cursor()
00129 sqlstr = "SELECT DISTINCT LABEL FROM TEST_STATUS"
00130 curs.prepare(sqlstr)
00131 curs.execute(sqlstr)
00132 return curs
00133
00134 def WebStatus(id, label):
00135 result = setConn()
00136 con = result.get('r0')
00137 curs = con.cursor()
00138 sqlstr = "SELECT ID, R_RELEASE, R_ARCH FROM TEST_STATUS WHERE RUNID = :ids AND LABEL = :labl ORDER BY R_RELEASE"
00139 curs.prepare(sqlstr)
00140 curs.execute(sqlstr, ids=id, labl=label)
00141 result = curs.fetchall()
00142 return result
00143
00144 def WebResultsList(runID, label):
00145 result = setConn()
00146 con = result.get('r0')
00147 curs = con.cursor()
00148 sqlstr = "SELECT ID FROM TEST_STATUS WHERE RUNID = :rid AND LABEL = :labl"
00149 curs.prepare(sqlstr)
00150 curs.execute(sqlstr, rid = runID, labl = label)
00151 idList = []
00152 for row in curs:
00153 idList.append(row[0])
00154 sqlstr = "SELECT ID, STATUS, NAME FROM TEST_RESULTS WHERE ID >= :mi AND ID <= :ma AND LABEL = :labl"
00155 curs.prepare(sqlstr)
00156 curs.execute(sqlstr, mi=min(idList), ma=max(idList), labl = label)
00157 result = curs.fetchall()
00158 count = len(result)/len(idList)
00159 print count
00160 return result, count
00161 def WebReleasesHeaders(label, release="", arch=""):
00162 result = setConn()
00163 con = result.get('r0')
00164 curs = con.cursor()
00165 if(release != "" and arch != ""):
00166 sqlstr = "SELECT DISTINCT RUNID, TO_CHAR(RDATE, 'DD.MM.YYYY HH24:MI:SS'), LABEL, T_RELEASE, T_ARCH FROM TEST_STATUS WHERE T_RELEASE = :rel AND T_ARCH = :arc AND LABEL = :labl ORDER BY RUNID DESC"
00167 curs.prepare(sqlstr)
00168 curs.execute(sqlstr, rel=release, arc=arch, labl=label)
00169 elif(release != ""):
00170 sqlstr = "SELECT DISTINCT RUNID, TO_CHAR(RDATE, 'DD.MM.YYYY HH24:MI:SS'), LABEL, T_RELEASE, T_ARCH FROM TEST_STATUS WHERE T_RELEASE = :rel AND LABEL = :labl ORDER BY RUNID DESC"
00171 curs.prepare(sqlstr)
00172 curs.execute(sqlstr, rel=release, labl=label)
00173 elif(arch != ""):
00174 sqlstr = "SELECT DISTINCT RUNID, TO_CHAR(RDATE, 'DD.MM.YYYY HH24:MI:SS'), LABEL, T_RELEASE, T_ARCH FROM TEST_STATUS WHERE T_ARCH = :arc AND LABEL = :labl ORDER BY RUNID DESC"
00175 curs.prepare(sqlstr)
00176 curs.execute(sqlstr, arc=arch, labl=label)
00177 result = curs.fetchall()
00178 return result
00179 def WebReadLogStatusDB(label, runID):
00180 result = setConn()
00181 con = result.get('r0')
00182 curs = con.cursor()
00183 sqlstr = "SELECT LOG FROM TEST_STATUS WHERE RUNID = :rid"
00184 curs.prepare(sqlstr)
00185 curs.execute(sqlstr, rid = runID)
00186 for row in curs:
00187 return row[0].read()
00188 def BuildLogfile(label, runID):
00189 logFile = open("logs/TestLog"+str(runID)+".txt", "w")
00190 logFile.write('\Output:'+stdout_value)
00191
00192
00193 def extractID(release):
00194 pattern = re.compile("^CMSSW_(\d+)_(\d+)_(\d+|\D)(_pre(\d+)|_patch(\d+))?")
00195 matching = pattern.match(release)
00196 version = 0
00197 if matching:
00198 g = matching.groups()
00199 if(g[2].isdigit()):
00200 if(g[4] is not None and g[4].isdigit()):
00201 version = int(g[0]) * 1000000 + int(g[1]) * 10000 + int(g[2]) * 100 + int(g[4])
00202 else:
00203 version = int(g[0]) * 1000000 + int(g[1]) * 10000 + int(g[2]) * 100
00204 else:
00205 version = int(g[0]) * 1000000 + int(g[1]) * 10000 +9999
00206 if(version is not None):
00207 return version
00208 def extractErr(runID, stdoutStr):
00209 reStr = "\!L\!([^!]+)\!TR\!([^!]+)\!TA\!([^!]+)\!RR\!([^!]+)\!RA\!([^!]+)"
00210 for i in range (0, resCount):
00211 reStr += "\!C"+str(i)+"\!(\d+)"
00212
00213 pattern = re.compile(reStr)
00214 matching = pattern.findall(stdoutStr)
00215 stdoutMod = pattern.sub("", stdoutStr)
00216 for match in matching:
00217 WriteStatusDB(runID, match)
00218 return stdoutMod
00219
00220 def CreateReleaseDB():
00221 curs = conn.cursor()
00222 sqlstr = "CREATE TABLE VERSION_TABLE (ID NUMBER, RELEASE VARCHAR2(50), ARCH VARCHAR2(30), PATH VARCHAR(255), CONSTRAINT PK_ID PRIMARY KEY(RELEASE, ARCH) )"
00223 curs.prepare(sqlstr)
00224 curs.execute(sqlstr)
00225 print 'VERSION TABLE CREATED'
00226 def DropReleaseDB():
00227 curs = conn.cursor()
00228 sqlstr = "DROP TABLE VERSION_TABLE"
00229 curs.prepare(sqlstr)
00230 curs.execute(sqlstr)
00231 print 'VERSION TABLE DROPPED'
00232 def DeleteReleaseDB(release, arch):
00233 curs = conn.cursor()
00234 sqlstr = "DELETE FROM VERSION_TABLE WHERE RELEASE = :rel AND ARCH = :arc"
00235 curs.prepare(sqlstr)
00236 curs.execute(sqlstr, rel = release, arc = arch)
00237 conn.commit()
00238 print 'VALUE DELETED'
00239 def ReadReleaseDB():
00240 curs = conn.cursor()
00241 sqlstr = "SELECT ID, RELEASE, ARCH, PATH FROM VERSION_TABLE ORDER BY ID, RELEASE, ARCH"
00242 curs.prepare(sqlstr)
00243 curs.execute(sqlstr)
00244 print 'VERSION TABLE READ'
00245 print 'ID RELEASE ARCH PATH'
00246 for row in curs:
00247 print row
00248
00249 def CreateStatusDB():
00250 curs = conn.cursor()
00251 sqlstr = "CREATE TABLE TEST_STATUS (ID NUMBER, RUNID NUMBER, RDATE DATE, LABEL VARCHAR2(20), "
00252 sqlstr += "T_RELEASE VARCHAR2(50), T_ARCH VARCHAR2(30), R_RELEASE VARCHAR(50), R_ARCH VARCHAR2(30), LOG CLOB, "
00253 sqlstr += "CONSTRAINT PK_ID2 PRIMARY KEY(ID, RUNID, LABEL))"
00254 curs.prepare(sqlstr)
00255 curs.execute(sqlstr)
00256 CreateResultsDB()
00257 CreateSequenceDB()
00258 conn.commit()
00259 print 'STATUS TABLE CREATED'
00260 def DropStatusDB():
00261 curs = conn.cursor()
00262 sqlstr = "DROP TABLE TEST_STATUS"
00263 curs.prepare(sqlstr)
00264 curs.execute(sqlstr)
00265 DropResultsDB()
00266 DropSequenceDB()
00267 print 'STATUS TABLE DROPPED'
00268 def ReadStatusDB():
00269 curs = conn.cursor()
00270 sqlstr = "SELECT ID, RUNID, TO_CHAR(RDATE, 'DD.MM.YYYY HH24:MI:SS'), LABEL, T_RELEASE, T_ARCH, R_RELEASE, R_ARCH, LOG "
00271 sqlstr +="FROM TEST_STATUS ORDER BY ID"
00272 curs.prepare(sqlstr)
00273 curs.execute(sqlstr)
00274 print 'STATUS TABLE READ'
00275 print 'ID RUNID RDATE LABEL T_RELEASE T_ARCH R_RELEASE R_ARCH'
00276 for row in curs:
00277 print row[0:8]
00278 print ReadResultsDB(row[0])
00279 print row[8].read()
00280 def GetMaxRunIDStatusDB(label):
00281 curs = conn.cursor()
00282 sqlstr = "SELECT MAX(RUNID) FROM TEST_STATUS WHERE LABEL = :labl"
00283 curs.prepare(sqlstr)
00284 curs.execute(sqlstr, labl=label)
00285 for row in curs:
00286 if(row[0] is not None):
00287 return row[0]
00288 else:
00289 return 0
00290 def ReadCurrentStatusDB(runID):
00291 curs = conn.cursor()
00292 sqlstr = "SELECT ID, RUNID, TO_CHAR(RDATE, 'DD.MM.YYYY HH24:MI:SS'), LABEL, T_RELEASE, T_ARCH, R_RELEASE, R_ARCH "
00293 sqlstr +="FROM TEST_STATUS WHERE RUNID = :rid ORDER BY ID"
00294 curs.prepare(sqlstr)
00295 curs.execute(sqlstr, rid= runID)
00296 print 'STATUS TABLE READ'
00297 print 'ID RUNID RDATE LABEL T_RELEASE T_ARCH R_RELEASE R_ARCH'
00298 for row in curs:
00299 print row
00300 print ReadResultsDB(row[0])
00301 def WriteStatusDB(runID, match):
00302 curs = conn.cursor()
00303 id = NextIDVal(match[0])
00304 sqlstr = "INSERT INTO TEST_STATUS(ID, RUNID, RDATE, LABEL, T_RELEASE, T_ARCH, R_RELEASE, R_ARCH)"
00305 sqlstr +="VALUES(:ids, :rid, :ts, :labl, "
00306 sqlstr +=":trel, :tarc, :rrel, :rarc)"
00307 curs.prepare(sqlstr)
00308 curs.execute(sqlstr, ids = id , rid = runID, ts=timeStamp, labl=match[0], trel = match[1], tarc = match[2], rrel = match[3], rarc = match[4])
00309 conn.commit()
00310 for i in range(5, len(match)):
00311 if resNames[i-5] != "%NONE":
00312 WriteResultsDB(id, label, resNames[i-5], match[i])
00313 def AddLogStatusDB(label, runID, logStr):
00314 curs = conn.cursor()
00315 sqlstr = "UPDATE TEST_STATUS SET LOG = :lstr WHERE LABEL = :labl AND RUNID = :rid"
00316 curs.prepare(sqlstr)
00317 curs.execute(sqlstr, lstr = logStr, labl=label, rid=runID)
00318 conn.commit()
00319 def CheckIfOkStatusDB(runID, label):
00320 curs = conn.cursor()
00321 sqlstr = "SELECT ID FROM TEST_STATUS WHERE RUNID = :rid AND LABEL = :labl"
00322 curs.prepare(sqlstr)
00323 curs.execute(sqlstr, rid = runID, labl = label)
00324 idList = []
00325 for row in curs:
00326 idList.append(row[0])
00327 curs = conn.cursor()
00328 sqlstr = "SELECT ID, STATUS FROM TEST_RESULTS WHERE ID >= :mi AND ID <= :ma AND LABEL = :labl"
00329 curs.prepare(sqlstr)
00330
00331 curs.execute(sqlstr, mi=min(idList), ma=max(idList), labl = label)
00332 for row in curs:
00333 if row[1] != 0:
00334 return False
00335 return True
00336
00337 def CreateResultsDB():
00338 curs = conn.cursor()
00339 sqlstr = "CREATE TABLE TEST_RESULTS (RID NUMBER, ID NUMBER, LABEL VARCHAR(20), NAME VARCHAR(100), STATUS NUMBER)"
00340 curs.prepare(sqlstr)
00341 curs.execute(sqlstr)
00342 sqlstr = "CREATE SEQUENCE AUTO_INC INCREMENT BY 1 START WITH 1"
00343 curs.prepare(sqlstr)
00344 curs.execute(sqlstr)
00345 conn.commit()
00346 def DropResultsDB():
00347 curs = conn.cursor()
00348 sqlstr = "DROP TABLE TEST_RESULTS"
00349 curs.prepare(sqlstr)
00350 curs.execute(sqlstr)
00351 sqlstr = "DROP SEQUENCE AUTO_INC"
00352 curs.prepare(sqlstr)
00353 curs.execute(sqlstr)
00354 conn.commit()
00355 def WriteResultsDB(id, label, name, status):
00356 curs = conn.cursor()
00357 sqlstr = "INSERT INTO TEST_RESULTS(RID, ID, LABEL, NAME, STATUS)"
00358 sqlstr +="VALUES(:rid, :ids, :labl, :nam, :stat)"
00359 curs.prepare(sqlstr)
00360 curs.execute(sqlstr, rid = GetAutoIncResultsDB(), ids = id, labl = label, nam = name, stat = status)
00361 conn.commit()
00362 def ReadResultsDB(id):
00363 curs = conn.cursor()
00364 sqlstr = "SELECT LABEL, NAME, STATUS FROM TEST_RESULTS WHERE ID = :ids"
00365 curs.prepare(sqlstr)
00366 curs.execute(sqlstr, ids = id)
00367 conn.commit()
00368 for row in curs:
00369 print row
00370 def GetAutoIncResultsDB():
00371 curs = conn.cursor()
00372 sqlstr = "SELECT AUTO_INC.NextVal FROM DUAL"
00373 curs.prepare(sqlstr)
00374 curs.execute(sqlstr)
00375 for row in curs:
00376 return row[0]
00377
00378 def CreateSequenceDB():
00379 curs = conn.cursor()
00380 sqlstr = "CREATE TABLE SEQUENCES (LABEL VARCHAR(20), ID NUMBER, RUNID NUMBER)"
00381 curs.prepare(sqlstr)
00382 curs.execute(sqlstr)
00383 conn.commit()
00384 def WriteSequenceDB(label):
00385 curs = conn.cursor()
00386 sqlstr = "INSERT INTO SEQUENCES (LABEL, ID, RUNID) VALUES (:labl, 0, 0)"
00387 curs.prepare(sqlstr)
00388 curs.execute(sqlstr, labl=label)
00389 def ReadSequenceDB(label):
00390 curs = conn.cursor()
00391 sqlstr = "SELECT * FROM SEQUENCES WHERE LABEL = :labl"
00392 curs.prepare(sqlstr)
00393 curs.execute(sqlstr, labl=label)
00394 for row in curs:
00395 print row
00396 def CheckLabelSequenceDB(label):
00397 curs = conn.cursor()
00398 sqlstr = "SELECT * FROM SEQUENCES WHERE LABEL = :labl"
00399 curs.prepare(sqlstr)
00400 curs.execute(sqlstr, labl=label)
00401 for row in curs:
00402 return True
00403 return False
00404 def DropSequenceDB():
00405 curs = conn.cursor()
00406 sqlstr = "DROP TABLE SEQUENCES"
00407 curs.prepare(sqlstr)
00408 curs.execute(sqlstr)
00409 conn.commit()
00410 def NextIDVal(label):
00411 curs = conn.cursor()
00412 sqlstr = "SELECT ID FROM SEQUENCES WHERE LABEL = :labl FOR UPDATE"
00413 curs.prepare(sqlstr)
00414 curs.execute(sqlstr, labl=label)
00415 maxID = 0
00416 for row in curs:
00417 maxID = row[0]
00418 maxID += 1
00419 sqlstr = "UPDATE SEQUENCES SET ID = :maxid WHERE LABEL = :labl"
00420 curs.prepare(sqlstr)
00421 curs.execute(sqlstr, maxid = maxID, labl=label)
00422 conn.commit()
00423 curs = conn.cursor()
00424 sqlstr = "SELECT ID FROM SEQUENCES WHERE LABEL = :labl"
00425 curs.prepare(sqlstr)
00426 curs.execute(sqlstr, labl=label)
00427 for row in curs:
00428 return row[0]
00429 def NextRunIDVal(label):
00430 curs = conn.cursor()
00431 sqlstr = "SELECT RUNID FROM SEQUENCES WHERE LABEL = :labl"
00432 curs.prepare(sqlstr)
00433 curs.execute(sqlstr, labl=label)
00434 maxID = 0
00435 for row in curs:
00436 maxID = row[0]
00437 maxID += 1
00438 sqlstr = "UPDATE SEQUENCES SET RUNID = :maxid"
00439 curs.prepare(sqlstr)
00440 curs.execute(sqlstr, maxid = maxID)
00441 sqlstr = "SELECT RUNID FROM SEQUENCES WHERE LABEL = :labl"
00442 curs.prepare(sqlstr)
00443 curs.execute(sqlstr, labl=label)
00444 for row in curs:
00445 return row[0]
00446
00447 def GetDate():
00448 curs = conn.cursor()
00449 sqlstr = "SELECT SYSTIMESTAMP AS \"NOW\" FROM DUAL"
00450 curs.prepare(sqlstr)
00451 curs.execute(sqlstr)
00452 for row in curs:
00453 return row[0]
00454 def TestCompat(label, release, arch, path):
00455 relID = extractID(release)
00456 print "Testing exec "+label+" "+release+" "+arch+" from "
00457 print path+" : "
00458 curs = conn.cursor()
00459 cmds = """
00460 echo ""
00461 echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
00462 echo "Candidate release: """+release+""" "
00463 echo "Arch: """+arch+""" "
00464 echo "Path: """+path+""" "
00465 echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
00466 """
00467 sqlstr = "SELECT RELEASE, ARCH, PATH FROM VERSION_TABLE WHERE ID < :rid"
00468 curs.prepare(sqlstr)
00469 curs.execute(sqlstr, rid = relID)
00470 for row in curs:
00471 cmds += RunTest(label, release, arch, path, row[0], row[1], row[2])
00472 return cmds
00473 def TestCompatRef(label, release, arch, path, refRelease, refArch, refPath):
00474 relID = extractID(release)
00475 print "Testing "+release+" "+arch+" from "
00476 print path+" : "
00477 curs = conn.cursor()
00478 cmds = """
00479 echo ""
00480 echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
00481 echo "Candidate release: """+release+""" "
00482 echo "Arch: """+arch+""" "
00483 echo "Path: """+path+""" "
00484 echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
00485 """
00486 cmds += RunTest(label, release, arch, path, refRelease, refArch, refPath)
00487 return cmds
00488 def WriteReleaseDB(release, arch, path):
00489 curs = conn.cursor()
00490 relID = extractID(release)
00491 print "relID "+str(relID)
00492 sqlstr = "INSERT INTO VERSION_TABLE(ID, RELEASE, ARCH, PATH) VALUES(:rid, :rel, :arc, :pat)"
00493 curs.execute(sqlstr, rid = relID, rel = release, arc = arch, pat = path)
00494 conn.commit()
00495 print 'TABLE WRITTEN'
00496 def SetEnv(release, arch, path):
00497 random.seed()
00498 srcPath = os.path.join(path, release,"src")
00499 cmds = """
00500 if [ $RETVAL = 0 ]; then
00501 echo "Setting environment variables for """+release+""" """+arch+""" "
00502 echo "path : """+path+""""
00503 eval pushd """+srcPath+"""
00504 RETVAL=$?
00505 if [ $RETVAL = 0 ]; then
00506 export SCRAM_ARCH="""+arch+"""
00507 RETVAL=$?
00508 if [ $RETVAL = 0 ]; then
00509 eval `scram runtime -sh`
00510 RETVAL=$?
00511 if [ $RETVAL = 0 ]; then
00512 export TNS_ADMIN=/afs/cern.ch/project/oracle/admin
00513 RETVAL=$?
00514 if [ $RETVAL = 0 ]; then
00515 eval popd
00516 RETVAL=$?
00517 fi
00518 fi
00519 fi
00520 TRELEASE="""+release+"""
00521 TARCH="""+arch+"""
00522 TPATH="""+path+"""
00523 TMAPNAME="""+release+"""_"""+arch+"""
00524 TMAINDB="""+coralConnStr+"""
00525 TAUXDB="""+"oracle://cms_orcoff_prep/CMS_COND_WEB"+"""
00526 TUSERNAME="""+USERNAME+"""
00527 TPASSWORD="""+PASSWORD+"""
00528 TTEST=$LOCALRT/test/$TARCH
00529 TBIN=$LOCALRT/bin/$TARCH
00530 TAUTH="""+AUTH_PATH+"""
00531 TSEED="""+str(random.randrange(1, 10))+"""
00532 echo "Environment variables set successfully"
00533 else
00534 echo "Setting environment failed on """+release+""" """+arch+""" return code : $RETVAL"
00535 fi
00536 fi
00537 echo "----------------------------------------------"
00538 """
00539 return cmds
00540 def Command(runStr):
00541 cmds = """
00542 if [ $RETVAL = 0 ]; then
00543 echo "Executing Command """+runStr+""" "
00544 echo "with $TRELEASE $TARCH :"
00545 """+runStr+"""
00546 RETVAL=$?
00547 if [ $RETVAL != 0 ]; then
00548 echo "Task failed on $TRELEASE $TARCH return code : $RETVAL"
00549 else
00550 echo "Task performed successfully"
00551 fi
00552 fi
00553 """
00554 return cmds
00555 def RunTest(label, release, arch, path, refRelease, refArch, refPath ):
00556 cmds ="""
00557 RETVAL=0
00558 echo "*****************************************************************************************"
00559 echo "Reference release: """+refRelease+""" "
00560 echo "Arch: """+refArch+""" "
00561 echo "Path: """+refPath+""" "
00562 echo "*****************************************************************************************"
00563 """
00564 nr = 0
00565 enr = 0
00566 envType = 0
00567 print "init"
00568 for res in iResults:
00569 cmds += """
00570 echo "==============================================="
00571 """
00572 print res
00573 if setEnvs[enr] == "ref" and envType != 1:
00574 cmds += SetEnv(refRelease, refArch,refPath)
00575 envType = 1
00576 elif setEnvs[enr] == "cand" and envType != 2:
00577 cmds += SetEnv(release, arch, path)
00578 envType = 2
00579 cmds +=Command(res)
00580 enr +=1
00581 print "cmd"
00582 for res in pResults:
00583 cmds += """
00584 echo "==============================================="
00585 """
00586 print res
00587 if setEnvs[enr] == "ref" and envType != 1:
00588 cmds += SetEnv(refRelease, refArch,refPath)
00589 envType = 1
00590 elif setEnvs[enr] == "cand" and envType != 2:
00591 cmds += SetEnv(release, arch, path)
00592 envType = 2
00593 cmds +=Command(res)
00594 cmds += 'RCODE['+str(nr)+']=$RETVAL'
00595 nr +=1
00596 enr +=1
00597 print "final"
00598 cmds += """
00599 RETVAL=0
00600 """
00601 for res in fResults:
00602 cmds += """
00603 echo "==============================================="
00604 """
00605 print res
00606 if setEnvs[enr] == "ref" and envType != 1:
00607 cmds += SetEnv(refRelease, refArch,refPath)
00608 envType = 1
00609 elif setEnvs[enr] == "cand" and envType != 2:
00610 cmds += SetEnv(release, arch, path)
00611 envType = 2
00612 cmds +=Command(res)
00613 enr +=1
00614 global resCount
00615 resCount = nr
00616 cmds += """
00617 echo "==============================================="
00618 echo "Script return code : ${RCODE[1]}"
00619 echo "!L!"""+label+"""!TR!"""+release+"""!TA!"""+arch+"""!RR!"""+refRelease+"""!RA!"""+refArch
00620 for i in range (0, nr):
00621 cmds+= "!C"+str(i)+"!${RCODE["+str(i)+"]}"
00622 cmds += "\""
00623 return cmds
00624 def CmdUsage():
00625 print "Command line arguments :"
00626 print "-c (-s) creates descriptor(status) db schema"
00627 print "-d drops descriptor(status) db schema. Optional : -R [release] -A [arch] to drop single entry (for descriptor db)"
00628 print "-w writes data to db. Goes only with -R [release] -A [arch] -P [path]"
00629 print "-r (-s) reads contents of descriptor(status) db"
00630 print "-t (-o) (-i) runs test. Goes only with -L [label] -R [release] -A [arch] -P [path] "
00631 print "(-o) specifies reference release. supply additional parameters --R [refRelease] --A [refArch] --P [refPath]"
00632 print "(-i) argument forces candidate to test with itself as a reference"
00633 def CheckPath (release, arch, path):
00634 if(os.path.exists(path)):
00635 if(os.path.exists(os.path.join(path, release))):
00636 if(os.path.exists(os.path.join(path, release, "test", arch))):
00637 return True
00638 else:
00639 print "Architecture not found"
00640 return False
00641 else:
00642 print "Release not found"
00643 return False
00644 else:
00645 print "Path not found"
00646 return False
00647 def ReadArgs():
00648 try:
00649 opts, args = getopt.getopt(sys.argv[1:], "cdwrthsoiL:R:A:P:", ['R=', 'A=', 'P='])
00650 except getopt.GetoptError, err:
00651
00652 print str(err)
00653 CmdUsage()
00654 sys.exit(2)
00655 RELEASE = None
00656 ARCH = None
00657 PATH = None
00658 REF_RELEASE = None
00659 REF_ARCH = None
00660 REF_PATH = None
00661 LABEL = None
00662 wflag = False
00663 tflag = False
00664 dflag = False
00665 sflag = False
00666 cflag = False
00667 rflag = False
00668 oflag = False
00669 iflag = False
00670 cmds = ""
00671 for o, a in opts:
00672 if o == "-c":
00673 cflag = True
00674 elif o == "-d":
00675 dflag = True
00676 elif o == "-w":
00677 wflag = True
00678 elif o == "-r":
00679 rflag = True
00680 elif o == "-t":
00681 tflag = True
00682 elif o == "-s":
00683 sflag = True
00684 elif o == "-o":
00685 oflag = True
00686 elif o == "-i":
00687 iflag = True
00688 elif o == "-L":
00689 LABEL = a
00690 elif o == "-R":
00691 RELEASE = a
00692 elif o == "-A":
00693 ARCH = a
00694 elif o == "-P":
00695 PATH = a
00696 elif o in ("-K", "--R"):
00697 REF_RELEASE = a
00698 elif o in ("-L", "--A"):
00699 REF_ARCH = a
00700 elif o in ("-M", "--P"):
00701 REF_PATH = a
00702 elif o == "-h":
00703 CmdUsage()
00704 else:
00705 assert False, "unhandled option"
00706 if(cflag == True):
00707 if(sflag == True):
00708 CreateStatusDB()
00709 else:
00710 CreateReleaseDB()
00711 if(rflag == True):
00712 if(sflag == True):
00713 ReadStatusDB()
00714 else:
00715 ReadReleaseDB()
00716 if(wflag == True):
00717 if(RELEASE != None and ARCH != None and PATH != None):
00718 WriteReleaseDB(RELEASE, ARCH, PATH)
00719 else:
00720 print "Bad arguments for -w"
00721 if(dflag == True):
00722 if(sflag == True):
00723 DropStatusDB();
00724 else:
00725 if(RELEASE != None and ARCH != None):
00726 DeleteReleaseDB(RELEASE, ARCH)
00727 else:
00728 DropReleaseDB();
00729 if(tflag == True):
00730 if LABEL != None :
00731 global pResults, iResults, fResults, setEnvs
00732 iResults,pResults, fResults , setEnvs = ParseXML("sequences.xml", LABEL)
00733 if(iResults == None or pResults == None or fResults == None):
00734 print "Error : sequences.xml reading failed!"
00735 if(RELEASE != None and ARCH != None and PATH != None):
00736 if(oflag == True):
00737 if(REF_RELEASE != None and REF_ARCH != None and REF_PATH != None):
00738 if(CheckPath(RELEASE, ARCH, PATH) == True):
00739 if(CheckPath(REF_RELEASE, REF_ARCH, REF_PATH) == True):
00740 cmds=TestCompatRef(LABEL, RELEASE, ARCH, PATH, REF_RELEASE, REF_ARCH, REF_PATH)
00741 else :
00742 print "Bad reference release arguments"
00743 else :
00744 print "Bad test release arguments"
00745 else:
00746 print "Bad arguments for -t"
00747 else:
00748 if(CheckPath(RELEASE, ARCH, PATH) == True):
00749 cmds = ''
00750 if iflag == True:
00751 cmds += TestCompatRef(LABEL, RELEASE, ARCH, PATH, RELEASE, ARCH, PATH)
00752 cmds += TestCompat(LABEL, RELEASE, ARCH, PATH)
00753 else :
00754 print "Bad test release arguments"
00755 else:
00756 print "Bad arguments for -t"
00757 return (cmds, LABEL)
00758
00759 result = setConn()
00760 conn, coralConnStr, USERNAME, PASSWORD,AUTH_PATH = result.get('r0'), result.get('r1'), result.get('r2'), result.get('r3'), result.get('r4')
00761
00762 cmdList, label = ReadArgs()
00763
00764 timeStamp = GetDate()
00765 runID =0
00766
00767 if cmdList != "":
00768 cmdList+="""
00769 echo "End of test"
00770 echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" """
00771 pipe = subprocess.Popen(cmdList, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
00772 stdout_value = pipe.communicate()[0]
00773
00774 if CheckLabelSequenceDB(label) == False:
00775 WriteSequenceDB(label)
00776 runID = NextRunIDVal(label)
00777 stdout_value = extractErr(runID, stdout_value)
00778 print '\Output:', stdout_value
00779 AddLogStatusDB(label, runID, stdout_value)
00780 print "Test '%s' runID=%d" %(label, runID)
00781 stat = "SUCCESS"
00782 if(CheckIfOkStatusDB(runID, label) == False):
00783 stat = "FAILURE"
00784 print "Exit status=%s" %stat
00785 print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
00786 conn.close()