|
| 1 | +import os,sys,time |
| 2 | +from xml.dom.minidom import parse, parseString |
| 3 | +import simplejson |
| 4 | +import simplejson as json |
| 5 | +import httplib |
| 6 | +import operator |
| 7 | + |
| 8 | +#_______________________________________________________________ |
| 9 | +def getJSONfromSiteDB(): |
| 10 | + headers = {"Accept": "application/json"} |
| 11 | + url = "cmsweb.cern.ch" |
| 12 | + api = "/sitedb/data/prod/site-names" |
| 13 | + if 'X509_USER_PROXY' in os.environ: |
| 14 | + print 'X509_USER_PROXY found' |
| 15 | + conn = httplib.HTTPSConnection(url, cert_file = os.getenv('X509_USER_PROXY'), key_file = os.getenv('X509_USER_PROXY')) |
| 16 | + elif 'X509_USER_CERT' in os.environ and 'X509_USER_KEY' in os.environ: |
| 17 | + print 'X509_USER_CERT and X509_USER_KEY found' |
| 18 | + conn = httplib.HTTPSConnection(url, cert_file = os.getenv('X509_USER_CERT'), key_file = os.getenv('X509_USER_KEY')) |
| 19 | + elif os.path.isfile('/data/certs/servicecert.pem') and os.path.isfile('/data/certs/servicekey.pem'): |
| 20 | + conn = httplib.HTTPSConnection(url, cert_file = '/data/certs/servicecert.pem', key_file = '/data/certs/servicekey.pem') |
| 21 | + else: |
| 22 | + print 'You need a valid proxy or cert/key files' |
| 23 | + sys.exit() |
| 24 | + r1=conn.request("GET",api, None, headers) |
| 25 | + r2=conn.getresponse() |
| 26 | + inputjson=r2.read() |
| 27 | + jn = simplejson.loads(inputjson) |
| 28 | + conn.close() |
| 29 | + return jn |
| 30 | + |
| 31 | +#______________________________________________________________ |
| 32 | +def convertLCGtoCMS(jn, getlcgName, mode): |
| 33 | + lcgNames = {} |
| 34 | + for row in jn['result']: |
| 35 | + if row[0] == 'lcg': |
| 36 | + lcgNames[row[2]] = row[1] |
| 37 | + siteNames = {} |
| 38 | + for row in jn['result']: |
| 39 | + if row[0] == 'cms': |
| 40 | + siteNames[row[1]] = row[2] |
| 41 | + lcgtoCms = {} |
| 42 | + |
| 43 | + for lcgName in lcgNames: |
| 44 | + if siteNames.has_key(lcgNames[lcgName]): |
| 45 | + lcgtoCms[lcgName] = siteNames[lcgNames[lcgName]] |
| 46 | + |
| 47 | + if mode != 'cms': |
| 48 | + if not lcgtoCms.has_key(getlcgName): |
| 49 | + return 'cms' |
| 50 | + else: |
| 51 | + return lcgtoCms[getlcgName] |
| 52 | + else: |
| 53 | + return lcgtoCms |
| 54 | + |
| 55 | +#______________________________________________________________ |
| 56 | +def ReadXML(fileName): |
| 57 | + fileHandle = open(fileName) |
| 58 | + data = fileHandle.read() |
| 59 | + if "“" in data: |
| 60 | + data = data.replace("“" , " ") |
| 61 | + if "”" in data: |
| 62 | + data = data.replace("”" , " ") |
| 63 | + fileHandle.close() |
| 64 | + return data |
| 65 | + |
| 66 | +#______________________________________________________________ |
| 67 | +def getTicketNumbers(dom, lcgName): |
| 68 | + tag = dom.getElementsByTagName('tickets')[0].childNodes |
| 69 | + count = len(tag) |
| 70 | + ticketlist = [] |
| 71 | + for i in range(count): |
| 72 | + try: |
| 73 | + siteName = dom.getElementsByTagName('tickets')[0].getElementsByTagName('ticket')[i].getElementsByTagName('affected_site')[0].firstChild.nodeValue |
| 74 | + except AttributeError: |
| 75 | + continue |
| 76 | + if siteName == lcgName: |
| 77 | + ticketNumber = dom.getElementsByTagName('tickets')[0].getElementsByTagName('ticket')[i].getElementsByTagName('request_id')[0].firstChild.nodeValue |
| 78 | + url = "https://ggus.eu/?mode=ticket_info&ticket_id=" + ticketNumber |
| 79 | + ticketURL = "[" + "[" + url + "]" + "[" + ticketNumber + "]" + "]" |
| 80 | + ticketlist.append(ticketURL) |
| 81 | + return ticketlist |
| 82 | +#______________________________________________________________ |
| 83 | + |
| 84 | +if __name__ == '__main__': |
| 85 | + json = getJSONfromSiteDB() |
| 86 | + text = ReadXML('/afs/cern.ch/user/c/cmst1/scratch0/ggus/tickets.xml') |
| 87 | + dom = parseString(text) |
| 88 | + tag = dom.getElementsByTagName('tickets')[0].childNodes |
| 89 | + count = len(tag) |
| 90 | + sites = {} |
| 91 | + #________________________get ticket information and calculate number of tickets______________________________ |
| 92 | + for i in range(count): |
| 93 | + try: |
| 94 | + siteName = dom.getElementsByTagName('tickets')[0].getElementsByTagName('ticket')[i].getElementsByTagName('affected_site')[0].firstChild.nodeValue |
| 95 | + except AttributeError: |
| 96 | + continue |
| 97 | + if not sites.has_key(siteName): sites[siteName] = 0 |
| 98 | + sites[siteName] += 1 |
| 99 | + #____________________________________________________________________________________________________________ |
| 100 | + saveTime = time.strftime('%Y-%m-%d %H:%M:%S') |
| 101 | + fileOp = open("/afs/cern.ch/user/c/cmst1/scratch0/ggus/ggusticketmetrics.txt" , "w") |
| 102 | + fileMeet = open("/afs/cern.ch/user/c/cmst1/scratch0/ggus/ggusticketmeeting.txt" , "w") |
| 103 | + fileMeet.write("| *Order* | *SiteName* | *Ticket Count* | *Tickets* |" + "\n") |
| 104 | + lcgNames = convertLCGtoCMS(json, '', 'cms') |
| 105 | + order = 0 |
| 106 | + for lcgName in lcgNames: |
| 107 | + color = "green" |
| 108 | + if sites.has_key(lcgName): |
| 109 | + cmsSiteName = convertLCGtoCMS(json, lcgName, 'lcg') |
| 110 | + ticketCount = sites[lcgName] |
| 111 | + order = order + 1 |
| 112 | + #________________________To write Tickets List for CompOps Meeting______________________________ |
| 113 | + fileMeet.write(" | " + str(order) + " | " + cmsSiteName + " | " + str(ticketCount) + " | " + ' , '.join(getTicketNumbers(dom, lcgName)) + " | " + "\n") |
| 114 | + #_______________________________________________________________________________________________ |
| 115 | + else: |
| 116 | + cmsSiteName = lcgNames[lcgName] |
| 117 | + ticketCount = 0 |
| 118 | + url = "http://para.ms/GGUS/" + lcgName |
| 119 | + if ticketCount > 0 : color = "red" |
| 120 | + i = i + 1 |
| 121 | + #________________________To write sites for metricg______________________________ |
| 122 | + fileOp.write(saveTime + "\t" + cmsSiteName + "\t" + str(ticketCount) + "\t" + color + "\t" + url + "\n" ) |
| 123 | + #________________________________________________________________________________ |
| 124 | + fileMeet.close() |
| 125 | + fileOp.close() |
0 commit comments