clearer names for actions, and infer actions better
[monitor.git] / statistics / nodediff-length.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         return nodelist
26
27 def print_nodelist(nodelist, file):
28         for node in nodelist:
29                 if file:
30                         print >>file, node
31                 else:
32                         print node
33         
34
35 def main():
36         parser = parsermodule.getParser()
37         parser.set_defaults(archivedir='archive-pdb', begin=None, end=None, printnodes=False, select=None)
38         parser.add_option("", "--archivedir", dest="archivedir", metavar="filename",
39                                                 help="Pickle file aggregate output.")
40         parser.add_option("", "--select", dest="select", metavar="key",
41                                                 help="Select .")
42         parser.add_option("", "--print", dest="printnodes", action="store_true",
43                                                 help="print the nodes that have come up or down.")
44         parser.add_option("", "--begin", dest="begin", metavar="YYYY-MM-DD",
45                                                 help="Specify a starting date from which to begin the query.")
46         parser.add_option("", "--end", dest="end", metavar="YYYY-MM-DD",
47                                                 help="Specify a ending date at which queries end.")
48         config = parsermodule.parse_args(parser)
49         archive = get_archive(config.archivedir)
50
51         if not config.begin or not config.end:
52                 print parsermodule.usage(parser)
53                 sys.exit(1)
54
55         tdelta = timedelta(1)
56         d_s1 = datetime_fromstr(config.begin)
57         d_s2 = datetime_fromstr(config.end)
58         d_end = d_s2
59
60         print d_s1
61         print d_s2
62         print d_end
63
64         data = []
65         while d_end >= d_s2:
66
67                 f_s1 = get_filefromglob(d_s1, "production.findbad", config.archivedir)
68                 f_s2 = get_filefromglob(d_s2, "production.findbad", config.archivedir)
69
70                 s1 = set(nodes_from_time(archive, f_s1))
71                 s2 = set(nodes_from_time(archive, f_s2))
72
73                 print "[ %s, %s, %s ]," % ( len(s2), len(s2-s1), len(s1-s2) )
74                 data.append( [ len(s2), len(s2-s1), len(s1-s2)] )
75
76                 #print "len s2 : ", len(s2)
77                 #print "len s1 : ", len(s1)
78                 timestr = d_s2.strftime("%Y-%m-%d")
79                 if not config.printnodes:
80                         f_up = open("up-%s" % timestr, 'w')
81                         f_down = open("dn-%s" % timestr, 'w')
82                 else:
83                         print "%s nodes up" % len(s2-s1)
84                         print "Nodes s2 minus s1: len(s2-s1) = %s" % len(s2-s1)
85                         f_up = None
86                         f_down = None
87
88                 print_nodelist(s2-s1, f_up)
89
90                 if config.printnodes:
91                         print ""
92                         print "%s nodes down" % len(s1-s2)
93                         print "Nodes s1 minus s2: len(s1-s2) = %s" % len(s1-s2)
94
95                 print_nodelist(s1-s2, f_down)
96                 if not config.printnodes:
97                         f_up.close()
98                         f_down.close()
99
100                 d_s1 = d_s2
101                 d_s2 = d_s1 + tdelta
102         
103 # takes two arguments as dates, comparing the number of up nodes from one and
104 # the other.
105
106 if __name__ == "__main__":
107         main()