clearer names for actions, and infer actions better
[monitor.git] / statistics / nodediff.py
1 #!/usr/bin/python
2
3
4 from monitor import config
5 from monitor.wrapper import plc
6 from monitor import parser as parsermodule
7 from monitor.model import *
8 from monitorstats import *
9 from monitor import database
10
11 import sys
12 import time
13 import calendar
14 from datetime import datetime, timedelta
15
16 from nodequeryold import verify,query_to_dict,node_select
17
18 api = plc.getAuthAPI()
19
20 def nodes_from_time(arch, file):
21         fb = arch.load(file)
22
23         nodelist = fb['nodes'].keys()
24         nodelist = node_select(config.select, nodelist, fb)
25         del fb
26         return nodelist
27
28 def print_nodelist(nodelist, file):
29         for node in nodelist:
30                 if file:
31                         print >>file, node
32                 else:
33                         print node
34         
35 def main():
36         parser = parsermodule.getParser()
37         parser.set_defaults(archivedir='archive-pdb', begin=None, end=None, 
38                                                 sequential=False, printnodes=False, select=None)
39
40         parser.add_option("", "--archivedir", dest="archivedir", metavar="filename",
41                                                 help="Pickle file aggregate output.")
42         parser.add_option("", "--select", dest="select", metavar="key",
43                                                 help="Select .")
44         parser.add_option("", "--sequential", dest="sequential", action="store_true",
45                                                 help="Compare EVERY timestep between begin and end .")
46         parser.add_option("", "--print", dest="printnodes", action="store_true",
47                                                 help="print the nodes that have come up or down.")
48         parser.add_option("", "--begin", dest="begin", metavar="YYYY-MM-DD",
49                                                 help="Specify a starting date from which to begin the query.")
50         parser.add_option("", "--end", dest="end", metavar="YYYY-MM-DD",
51                                                 help="Specify a ending date at which queries end.")
52
53         config = parsermodule.parse_args(parser)
54         archive = get_archive(config.archivedir)
55
56         if not config.begin or not config.end:
57                 print parsermodule.usage(parser)
58                 sys.exit(1)
59
60         tdelta = timedelta(1)
61         d_s1 = datetime_fromstr(config.begin)
62         d_s2 = datetime_fromstr(config.begin) + tdelta
63         d_end = datetime_fromstr(config.end)
64
65         print d_s1
66         print d_s2
67         print d_end
68
69         file_list = []
70                 # then the iterations are day-based.
71         while d_end > d_s2:
72                 f_s1 = get_filefromglob(d_s1, "production.findbad", config.archivedir, True)
73                 if not config.sequential:
74                         file_list.append(f_s1)
75                 else:
76                         file_list += f_s1
77                         
78                 d_s1 = d_s2
79                 d_s2 = d_s1 + tdelta
80                 
81         print file_list
82         file_list = file_list[4:]
83
84         xaxis = get_xaxis(file_list)
85
86         data = []
87         f_s1 = None
88         f_s2 = None
89         i = 0
90         for file in file_list:
91
92                 i+=1
93                 f_s2 = file
94                 if f_s1 is None:
95                         f_s1 = f_s2
96                         continue
97
98                 s1 = set(nodes_from_time(archive, f_s1))
99                 s2 = set(nodes_from_time(archive, f_s2))
100
101                 print f_s1
102                 print "[ %s, %s, %s ]," % ( len(s2), len(s2-s1), len(s1-s2) )
103                 data.append( [ len(s2), len(s2-s1), len(s1-s2)] )
104
105                 print "%s nodes up" % len(s2-s1)
106                 print "Nodes s2 minus s1: len(s2-s1) = %s" % len(s2-s1)
107                 f_up = None
108                 f_down = None
109
110                 if config.printnodes:
111                         print_nodelist(s2-s1, f_up)
112
113                 print ""
114                 print "%s nodes down" % len(s1-s2)
115                 print "Nodes s1 minus s2: len(s1-s2) = %s" % len(s1-s2)
116
117                 if config.printnodes:
118                         print_nodelist(s1-s2, f_down)
119
120                 f_s1 = f_s2
121                 f_s2 = None
122
123         print_graph(data, config.begin, config.end, xaxis)
124 # takes two arguments as dates, comparing the number of up nodes from one and
125 # the other.
126
127 if __name__ == "__main__":
128         main()