Skip to content

Commit 9066934

Browse files
author
Gökhan Kandemir
committed
GGUS ticket information
1 parent d1a718a commit 9066934

3 files changed

Lines changed: 151 additions & 0 deletions

File tree

GGUS/ggus.py

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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()

GGUS/readme.rm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Author : Gökhan Kandemir
2+
# E-mail : gokhan.kandemir@cern.ch
3+
# Script Responsible : Site Support Team
4+
# Script is located : /afs/cern.ch/user/c/cmst1/scratch0/ggus
5+
# Outputs :
6+
# /afs/cern.ch/user/c/cmst1/www/SST/ggusticketmeeting.txt (https://cmst1.web.cern.ch/CMST1/SST/ggusticketmeeting.txt)
7+
# /afs/cern.ch/user/c/cmst1/www/SST/ggusticketmetrics.txt (https://cmst1.web.cern.ch/CMST1/SST/ggusticketmetrics.txt)
8+
# The script is being run by an acronjob
9+
# The acronojb is in the acrontab of the user: cmst1
10+
# 5,20,35,50 * * * * lxplus ssh vocms202 /afs/cern.ch/user/c/cmst1/scratch0/ggus/run_ggus.sh &> /dev/null
11+
# Description : The script is used for getting ggus ticket information for each site. Also it calcultes how many tickets the site has and it creates 2 files. One of them is for metric 198 [1], the other one is for twiki table.
12+
13+
[1] https://dashb-ssb.cern.ch/dashboard/request.py/siteviewhistory?columnid=198&view=Site%20Readiness
14+
[2] https://cmst1.web.cern.ch/CMST1/SST/ggusticketmeeting.txt

GGUS/run_ggus.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/bin/bash
2+
# Script in cmst1 acrontab
3+
# 5,20,35,50 * * * * lxplus ssh vocms202 /afs/cern.ch/user/c/cmst1/scratch0/ggus/run_ggus.sh &> /dev/null
4+
# Script for Dashboard metric
5+
# outputfile ggusticketmetrics.txt
6+
# outputfile ticketmeeting.txt
7+
# outputfile tickets.xml
8+
# Script obtains ggus ticket information and creates 2 files. One of them is ggusticketmetrics.txt for metric in dashboard, the other one is ticketmeeting for CompOps Meeting
9+
curl -kvv --cert /data/certs/servicecert.pem --key /data/certs/servicekey.pem "https://ggus.eu/index.php?mode=ticket_search&show_columns_check%5B%5D=TICKET_TYPE&show_columns_check%5B%5D=AFFECTED_VO&show_columns_check%5B%5D=AFFECTED_SITE&show_columns_check%5B%5D=PRIORITY&show_columns_check%5B%5D=RESPONSIBLE_UNIT&show_columns_check%5B%5D=STATUS&show_columns_check%5B%5D=DATE_OF_CHANGE&show_columns_check%5B%5D=SHORT_DESCRIPTION&ticket_id=&supportunit=&su_hierarchy=0&vo=cms&cms_su=&user=&keyword=&involvedsupporter=&assignedto=&affectedsite=&specattrib=none&status=open&priority=&typeofproblem=&ticket_category=all&mouarea=&date_type=creation+date&tf_radio=1&timeframe=any&from_date=&to_date=&untouched_date=&orderticketsby=REQUEST_ID&orderhow=desc&search_submit=GO%21&writeFormat=XML" -o /afs/cern.ch/user/c/cmst1/scratch0/ggus/tickets.xml
10+
python /afs/cern.ch/user/c/cmst1/scratch0/ggus/ggus.py &> /afs/cern.ch/user/c/cmst1/scratch0/ggus/ticket.log
11+
cp /afs/cern.ch/user/c/cmst1/scratch0/ggus/ggusticketmetrics.txt /afs/cern.ch/user/c/cmst1/www/SST/
12+
cp /afs/cern.ch/user/c/cmst1/scratch0/ggus/ggusticketmeeting.txt /afs/cern.ch/user/c/cmst1/www/SST/

0 commit comments

Comments
 (0)