clearer names for actions, and infer actions better
[monitor.git] / statistics / aggregate-nm.py
1 #!/usr/bin/python
2
3 from monitor.wrapper import plc
4 api = plc.getAuthAPI()
5
6 from monitor import database
7 import time
8 from datetime import datetime, timedelta
9 import calendar
10
11 import sys
12 import time
13 from monitor.model import *
14
15 from monitorstats import *
16
17
18 def main():
19         from monitor import parser as parsermodule
20
21         parser = parsermodule.getParser()
22         parser.set_defaults(node=None, aggname='aggregatenm', archivedir='archive-pdb', field='nm', value='Y', fromtime=None, load=False, state='BOOT')
23         parser.add_option("", "--node", dest="node", metavar="nodename.edu", 
24                                                 help="A single node name to add to the nodegroup")
25         parser.add_option("", "--archivedir", dest="archivedir", metavar="filename",
26                                                 help="Pickle file aggregate output.")
27         parser.add_option("", "--aggname", dest="aggname", metavar="filename",
28                                                 help="Pickle file aggregate output.")
29         parser.add_option("", "--field", dest="field", metavar="key",
30                                                 help="Which record field to extract from all files.")
31         parser.add_option("", "--value", dest="value", metavar="val",
32                                                 help="Which value to look for in field.")
33         parser.add_option("", "--state", dest="state", metavar="key",
34                                                 help="Which boot state to accept.")
35         parser.add_option("", "--load", action="store_true",
36                                                 help="load aggregatenm rather than recreate it.")
37         parser.add_option("", "--fromtime", dest="fromtime", metavar="YYYY-MM-DD",
38                                                 help="Specify a starting date from which to begin the query.")
39         config = parsermodule.parse_args(parser)
40
41         archive = get_archive(config.archivedir)
42         agg = {}
43
44         if config.fromtime:
45                 begin = config.fromtime
46         else:
47                 begin = "2008-09-28"
48
49         d = datetime_fromstr(begin)
50         tdelta = timedelta(1)
51         verbose = 1
52
53         if not config.load:
54                 while True:
55                         file = get_filefromglob(d, "production.findbad", config.archivedir)
56                         print archive.path
57                         fb = archive.load(file)
58                         try:
59                                 print "nodes: ", len(fb['nodes'])
60                                 state_count=0
61                                 for node in fb['nodes']:
62                                         fb_nodeinfo  = fb['nodes'][node]['values']
63                                         time = d.strftime("%Y-%m-%d")
64
65                                         if type(fb_nodeinfo) == type([]):
66                                                 continue
67
68                                         if fb_nodeinfo['state'] != config.state:
69                                                 continue
70                                         state_count += 1
71
72                                         if node not in agg:
73                                                 agg[node] = { 'total' : 0, 'up' : 0}
74
75                                         agg[node]['total'] += 1
76                                         if fb_nodeinfo[config.field] == config.value:
77                                                 agg[node]['up'] += 1
78                                 print "%s nodes in state %s" % ( state_count, config.state )
79
80                                 del fb
81                                 verbose = 0
82                         except SystemExit:
83                                 sys.exit(1)
84                         except KeyboardInterrupt:
85                                 sys.exit(1)
86                         except:
87                                 import traceback; print traceback.print_exc()
88                                 print d.strftime("%Y-%m-%d"), "No record"
89
90                         d = d + tdelta
91                         if d > datetime.now(): break
92         else:
93                 agg = database.dbLoad(config.aggname)
94         
95         for node in agg:
96                 if agg[node]['total'] > 0:
97                         if agg[node]['up'] != agg[node]['total']:
98                                 print "%s %s" %  (node, float(agg[node]['up']) / float(agg[node]['total']))
99
100         database.dbDump(config.aggname, agg)
101
102 if __name__ == "__main__":
103         main()