1 |
#! /usr/bin/env python
|
2 |
|
3 |
import sys, time, datetime, logging
|
4 |
from phedex_monitor.service.calculate_links import DDTCommissionCalculator
|
5 |
from phedex_monitor.model.state import State
|
6 |
from phedex_monitor.service.data_parser import DDTDataParser
|
7 |
from phedex_monitor.service.link_status_parser import DDTLinkStatusParser
|
8 |
|
9 |
log = logging.getLogger()
|
10 |
#log.addHandler( logging.StreamHandler() )
|
11 |
log.setLevel( logging.INFO )
|
12 |
log.propagate = False
|
13 |
|
14 |
""" @author: Brian Bockelman """
|
15 |
|
16 |
def parseOpts( args ):
|
17 |
# Stupid python 2.2 on SLC3 doesn't have optparser...
|
18 |
keywordOpts = {}
|
19 |
passedOpts = []
|
20 |
givenOpts = []
|
21 |
length = len(args)
|
22 |
optNum = 0
|
23 |
while ( optNum < length ):
|
24 |
opt = args[optNum]
|
25 |
hasKeyword = False
|
26 |
if len(opt) > 2 and opt[0:2] == '--':
|
27 |
keyword = opt[2:]
|
28 |
hasKeyword = True
|
29 |
elif opt[0] == '-':
|
30 |
keyword = opt[1:]
|
31 |
hasKeyword = True
|
32 |
if hasKeyword:
|
33 |
if keyword.find('=') >= 0:
|
34 |
keyword, value = keyword.split('=', 1)
|
35 |
keywordOpts[keyword] = value
|
36 |
elif optNum + 1 == length:
|
37 |
passedOpts.append( keyword )
|
38 |
elif args[optNum+1][0] == '-':
|
39 |
passedOpts.append( keyword )
|
40 |
else:
|
41 |
keywordOpts[keyword] = args[optNum+1]
|
42 |
optNum += 1
|
43 |
else:
|
44 |
givenOpts.append( args[optNum] )
|
45 |
optNum += 1
|
46 |
return keywordOpts, passedOpts, givenOpts
|
47 |
|
48 |
def printHelp():
|
49 |
help = """
|
50 |
The calculate_links.py script calculates the status of various PhEDEx links
|
51 |
according to the rules set forth by the DDT starting from 1st of June 2007
|
52 |
|
53 |
Options:
|
54 |
-url=<URL>\t\tManually set the data feed to <URL>.
|
55 |
-debug_links=<link1>,<link2>\tComma-separated list of links to enable debugging.
|
56 |
-debug\t\t\tEnable debug for calculator and parser on the debug links.
|
57 |
-debug_calc\t\tEnable just the debug on the calculator for the debug links.
|
58 |
-debug_parser\t\tEnable just the debug on the parser for the debug links
|
59 |
-y=<year> \t\tyear of end cutoff date
|
60 |
-m=<month> \t\tmonth of end cutoff date
|
61 |
-d=<day>\t\tday of end cutoff date
|
62 |
-sy=<year> \t\tyear of start cutoff date
|
63 |
-sm=<month> \t\tmonth of start cutoff date
|
64 |
-sd=<day>\t\tday of start cutoff date
|
65 |
-dd\t\tdaily data span
|
66 |
"""
|
67 |
print help
|
68 |
|
69 |
if __name__ == '__main__':
|
70 |
kwOpts, passedOpts, givenOpts = parseOpts( sys.argv[1:] )
|
71 |
|
72 |
if 'h' in passedOpts or 'help' in passedOpts:
|
73 |
printHelp()
|
74 |
sys.exit(-1)
|
75 |
|
76 |
|
77 |
#surl = 'http://t2.unl.edu/phedex/xml/enabled?from_node=.*&excludefrom=XT%7CCH_CAF&excludeto=XT%7CCH_CAF&to_node=.*&conn=Prod%2FNEBRASKA'
|
78 |
surl='https://cmsweb.cern.ch/phedex/datasvc/xml/prod/links'
|
79 |
durl2='https://cmsweb.cern.ch/phedex/datasvc/xml/debug/transferhistory?binwidth=%s&starttime=%s&endtime=%s'
|
80 |
|
81 |
year = kwOpts.get('y')
|
82 |
month = kwOpts.get('m')
|
83 |
day = kwOpts.get('d')
|
84 |
if year != None and month != None and day != None:
|
85 |
year, month, day = int(year),int(month),int(day)
|
86 |
etime = int(time.mktime(datetime.datetime(year,month,day).timetuple()))
|
87 |
edate = datetime.datetime( year, month, day, 0 )
|
88 |
else:
|
89 |
etime = int(time.time())
|
90 |
edate = datetime.datetime.today()
|
91 |
|
92 |
start_year = kwOpts.get('sy')
|
93 |
start_month = kwOpts.get('sm')
|
94 |
start_day = kwOpts.get('sd')
|
95 |
|
96 |
if start_year != None and start_month != None and start_day != None:
|
97 |
start_year, start_month, start_day = int(start_year),int(start_month),int(start_day)
|
98 |
stime = max(int(time.mktime(datetime.datetime(start_year,start_month,start_day).timetuple())),int(time.time() - 15*86400))
|
99 |
sdate = datetime.date( start_year, start_month, start_day )
|
100 |
else:
|
101 |
#Default starting date is 3 days ago
|
102 |
#stime = 1180645200 # 2008-12-01
|
103 |
stime = int(time.time() - 3*86400)
|
104 |
|
105 |
if ('dd' in passedOpts):
|
106 |
span=str(86400)
|
107 |
else:
|
108 |
span=str(3600)
|
109 |
|
110 |
url = durl2 % (span,stime,etime)
|
111 |
|
112 |
log.info( "Using URL: %s" % url )
|
113 |
log.info( "Using URL for current link status: %s" % surl )
|
114 |
|
115 |
set_debug = 'debug' in passedOpts
|
116 |
debug_links = [i.strip() for i in kwOpts.get('debug_links','').split(',')]
|
117 |
|
118 |
if ('debug_parser' in passedOpts) or set_debug:
|
119 |
log.setLevel( logging.DEBUG )
|
120 |
|
121 |
data_parser = DDTDataParser( url )
|
122 |
data_parser.run( debug_links )
|
123 |
data = data_parser.getData()
|
124 |
|
125 |
if ('debug_calc' in passedOpts) or set_debug:
|
126 |
log.setLevel( logging.DEBUG )
|
127 |
else:
|
128 |
log.setLevel( logging.INFO )
|
129 |
|
130 |
status_parser = DDTLinkStatusParser( surl )
|
131 |
status_parser.run()
|
132 |
statusdata = status_parser.getCommissionedLinks()
|
133 |
print "\nLink state as defined by https://twiki.cern.ch/twiki/bin/view/CMS/DDTLinkStateChangeProcedure"
|
134 |
print "\nPreviously COMMISSIONED links:"
|
135 |
status_parser.print_all_links_in_state( State.COMMISSIONED )
|
136 |
|
137 |
|
138 |
calc = DDTCommissionCalculator( data, statusdata, edate )
|
139 |
calc.run( debug_links )
|
140 |
print "\nLink state as defined by https://twiki.cern.ch/twiki/bin/view/CMS/DDTLinkStateChangeProcedure"
|
141 |
print "\nCommissioned links (COMMISSIONED):"
|
142 |
calc.print_all_links_in_state( State.COMMISSIONED )
|
143 |
print "\nCommissioned links in danger of uncommissioning (COMMISSIONED-" \
|
144 |
"DANGER):"
|
145 |
calc.print_all_links_in_state(State.COMMISSIONED_DANGER)
|
146 |
print "\nLinks out of commission due to low rate (PROBLEM-RATE):"
|
147 |
calc.print_all_links_in_state( State.PROBLEM_RATE )
|
148 |
print "\nLinks not in commission due to inability to keep target rate for a full day (PENDING-RATE):"
|
149 |
calc.print_all_links_in_state( State.PENDING_RATE )
|
150 |
print "\nLinks pending commissioning (PENDING-COMMISSIONING):"
|
151 |
calc.print_all_links_in_state( State.PENDING_COMMISSIONING )
|
152 |
print "\n NEW Links in state COMMISSIONIED:"
|
153 |
calc.print_all_new_links_in_commissioned_state()
|