move clean_policy.py into monitor package
[monitor.git] / sitebad.py
1 #!/usr/bin/python
2
3 import os
4 import sys
5 import string
6 import time
7 from datetime import datetime,timedelta
8
9 from monitor import database
10 from monitor.pcu import reboot
11 from monitor import parser as parsermodule
12 from monitor import config
13 from monitor.database import HistorySiteRecord, FindbadNodeRecord
14 from monitor.wrapper import plc, plccache
15 from monitor.const import MINUP
16
17 from nodecommon import *
18 from nodequery import verify,query_to_dict,node_select
19 from monitor.model import *
20
21 api = plc.getAuthAPI()
22
23 def main(config):
24
25         l_nodes = plccache.l_nodes
26         l_plcsites = plccache.l_sites
27
28         if config.site:
29                 l_sites = [config.site]
30         else:
31                 l_sites = [site['login_base'] for site in l_plcsites]
32         
33         checkAndRecordState(l_sites, l_plcsites)
34
35 def getnodesup(nodelist):
36         up = 0
37         for node in nodelist:
38                 try:
39                         noderec = FindbadNodeRecord.query.filter(FindbadNodeRecord.hostname==node['hostname']).order_by(FindbadNodeRecord.date_checked.desc()).first()
40                         #noderec = FindbadNodeRecord.select(FindbadNodeRecord.q.hostname==node['hostname'], 
41                         #                                                                  orderBy='date_checked').reversed()[0]
42                         if noderec is not None and noderec.observed_status == "BOOT":
43                                 up = up + 1
44                 except:
45                         import traceback
46                         print traceback.print_exc()
47         return up
48
49 def checkAndRecordState(l_sites, l_plcsites):
50         count = 0
51         lb2hn = plccache.plcdb_lb2hn
52         for sitename in l_sites:
53                 d_site = None
54                 for site in l_plcsites:
55                         if site['login_base'] == sitename:
56                                 d_site = site
57                                 break
58                 if not d_site:
59                         continue
60
61                 if sitename in lb2hn:
62                         pf = HistorySiteRecord.findby_or_create(loginbase=sitename)
63
64                         pf.last_checked = datetime.now()
65                         pf.slices_used = len(d_site['slice_ids'])
66                         pf.nodes_total = len(lb2hn[sitename])
67                         pf.nodes_up = getnodesup(lb2hn[sitename])
68
69                         if pf.nodes_up >= MINUP:
70                                 if pf.status != "good": pf.last_changed = datetime.now()
71                                 pf.status = "good"
72                         else:
73                                 if pf.status != "down": pf.last_changed = datetime.now()
74                                 pf.status = "down"
75
76                         count += 1
77                         print "%d %15s slices(%2s) nodes(%2s) up(%2s) %s" % (count, sitename, pf.slices_used, 
78                                                                                         pf.nodes_total, pf.nodes_up, pf.status)
79         print HistorySiteRecord.query.count()
80
81         return True
82
83 if __name__ == '__main__':
84         from monitor import parser as parsermodule
85
86         parser = parsermodule.getParser()
87         parser.set_defaults(filename=None, node=None, site=None, 
88                                                 nodeselect=False, nodegroup=None, cachenodes=False)
89
90         parser.add_option("", "--site", dest="site", metavar="login_base", 
91                                                 help="Provide a single site to operate on")
92         parser.add_option("", "--sitelist", dest="sitelist", metavar="file.list", 
93                                                 help="Provide a list of files to operate on")
94
95         config = parsermodule.parse_args(parser)
96
97         try:
98                 main(config)
99         except Exception, err:
100                 import traceback
101                 print traceback.print_exc()
102                 print "Exception: %s" % err
103                 sys.exit(0)