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