basic display of nodes, pcus, and sites.
[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 pcucontrol  import reboot
11 from monitor import parser as parsermodule
12 from monitor import config
13 from monitor.database.info.model import HistorySiteRecord, FindbadNodeRecord, session
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 getnewsite(nodelist):
36         new = True
37         for node in nodelist:
38                 try:
39                         noderec = FindbadNodeRecord.query.filter(FindbadNodeRecord.hostname==node['hostname']).order_by(FindbadNodeRecord.date_checked.desc()).first()
40                         if noderec is not None and \
41                                 noderec.plc_node_stats['last_contact'] != None:
42                                 new = False
43                 except:
44                         import traceback
45                         print traceback.print_exc()
46         return new
47
48 def getnodesup(nodelist):
49         up = 0
50         for node in nodelist:
51                 try:
52                         noderec = FindbadNodeRecord.query.filter(FindbadNodeRecord.hostname==node['hostname']).order_by(FindbadNodeRecord.date_checked.desc()).first()
53                         #noderec = FindbadNodeRecord.select(FindbadNodeRecord.q.hostname==node['hostname'], 
54                         #                                                                  orderBy='date_checked').reversed()[0]
55                         if noderec is not None and noderec.observed_status == "BOOT":
56                                 up = up + 1
57                 except:
58                         import traceback
59                         print traceback.print_exc()
60         return up
61
62 def checkAndRecordState(l_sites, l_plcsites):
63         count = 0
64         lb2hn = plccache.plcdb_lb2hn
65         for sitename in l_sites:
66                 d_site = None
67                 for site in l_plcsites:
68                         if site['login_base'] == sitename:
69                                 d_site = site
70                                 break
71                 if not d_site:
72                         continue
73
74                 if sitename in lb2hn:
75                         pf = HistorySiteRecord.findby_or_create(loginbase=sitename)
76
77                         pf.last_checked = datetime.now()
78                         pf.slices_total = d_site['max_slices']
79                         pf.slices_used = len(d_site['slice_ids'])
80                         pf.nodes_total = len(lb2hn[sitename])
81                         pf.nodes_up = getnodesup(lb2hn[sitename])
82                         pf.new = getnewsite(lb2hn[sitename])
83                         pf.enabled = d_site['enabled']
84
85                         if pf.nodes_up >= MINUP:
86                                 if pf.status != "good": pf.last_changed = datetime.now()
87                                 pf.status = "good"
88                         else:
89                                 if pf.status != "down": pf.last_changed = datetime.now()
90                                 pf.status = "down"
91
92                         count += 1
93                         print "%d %15s slices(%2s) nodes(%2s) up(%2s) %s" % (count, sitename, pf.slices_used, 
94                                                                                         pf.nodes_total, pf.nodes_up, pf.status)
95                         pf.flush()
96
97         print HistorySiteRecord.query.count()
98         session.flush()
99
100         return True
101
102 if __name__ == '__main__':
103         from monitor import parser as parsermodule
104
105         parser = parsermodule.getParser()
106         parser.set_defaults(filename=None, node=None, site=None, 
107                                                 nodeselect=False, nodegroup=None, cachenodes=False)
108
109         parser.add_option("", "--site", dest="site", metavar="login_base", 
110                                                 help="Provide a single site to operate on")
111         parser.add_option("", "--sitelist", dest="sitelist", metavar="file.list", 
112                                                 help="Provide a list of files to operate on")
113
114         config = parsermodule.parse_args(parser)
115
116         try:
117                 main(config)
118         except Exception, err:
119                 import traceback
120                 print traceback.print_exc()
121                 print "Exception: %s" % err
122                 sys.exit(0)