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