7 from datetime import datetime,timedelta
9 from monitor import database
10 from monitor import parser as parsermodule
11 from monitor import config
12 from monitor.database.info.model import HistorySiteRecord, HistoryNodeRecord, session
13 from monitor.wrapper import plc, plccache
14 from monitor.const import MINUP
16 from monitor.common import *
17 from nodequery import verify,query_to_dict,node_select
18 from monitor.model import *
20 api = plc.getAuthAPI()
26 l_nodes = plccache.l_nodes
27 l_plcsites = plccache.l_sites
30 l_sites = [config.site]
32 site_list = config.sitelist.split(',')
35 l_sites = [site['login_base'] for site in l_plcsites]
37 checkAndRecordState(l_sites, l_plcsites)
39 def getnodesup(nodelist):
40 # NOTE : assume that a blacklisted node is fine, since we're told not to
41 # ignore it, no policy actions should be taken for it.
45 nodehist = HistoryNodeRecord.findby_or_create(hostname=node['hostname'])
46 nodebl = BlacklistRecord.get_by(hostname=node['hostname'])
47 if (nodehist is not None and nodehist.status != 'down') or \
48 (nodebl is not None and not nodebl.expired():
52 print traceback.print_exc()
55 def check_site_state(rec, sitehist):
57 if sitehist.new and sitehist.status != 'new':
58 sitehist.status = 'new'
59 sitehist.last_changed = datetime.now()
63 if sitehist.nodes_up >= MINUP:
65 if sitehist.status != 'online' and sitehist.status != 'good':
66 sitehist.last_changed = datetime.now()
68 if changed_lessthan(sitehist.last_changed, 0.5) and sitehist.status != 'online':
69 print "changed status from %s to online" % sitehist.status
70 sitehist.status = 'online'
72 if changed_greaterthan(sitehist.last_changed, 0.5) and sitehist.status != 'good':
73 print "changed status from %s to good" % sitehist.status
74 sitehist.status = 'good'
76 else: # sitehist.nodes_up < MINUP:
78 if sitehist.status != 'offline' and sitehist.status != 'down':
79 sitehist.last_changed = datetime.now()
81 if changed_lessthan(sitehist.last_changed, 0.5) and sitehist.status != 'offline':
82 print "changed status from %s to offline" % sitehist.status
83 sitehist.status = 'offline'
85 if changed_greaterthan(sitehist.last_changed, 0.5) and sitehist.status != 'down':
86 print "changed status from %s to down" % sitehist.status
87 sitehist.status = 'down'
89 def checkAndRecordState(l_sites, l_plcsites):
91 lb2hn = plccache.plcdb_lb2hn
92 for sitename in l_sites:
94 for site in l_plcsites:
95 if site['login_base'] == sitename:
101 if sitename in lb2hn:
102 sitehist = HistorySiteRecord.findby_or_create(loginbase=sitename,
103 if_new_set={'status' : 'unknown',
104 'last_changed' : datetime.now(),
106 'penalty_level' : 0})
107 sitehist.last_checked = datetime.now()
109 sitehist.slices_total = d_site['max_slices']
110 sitehist.slices_used = len(d_site['slice_ids'])
111 sitehist.nodes_total = len(lb2hn[sitename])
112 if sitehist.message_id != 0:
113 rtstatus = mailer.getTicketStatus(sitehist.message_id)
114 sitehist.message_status = rtstatus['Status']
115 sitehist.message_queue = rtstatus['Queue']
116 sitehist.message_created = datetime.fromtimestamp(rtstatus['Created'])
118 sitehist.nodes_up = getnodesup(lb2hn[sitename])
119 sitehist.new = changed_lessthan(datetime.fromtimestamp(d_site['date_created']), 30) # created < 30 days ago
120 sitehist.enabled = d_site['enabled']
122 check_site_state(d_site, sitehist)
125 print "%d %15s slices(%2s) nodes(%2s) up(%2s) %s" % (count, sitename, sitehist.slices_used,
126 sitehist.nodes_total, sitehist.nodes_up, sitehist.status)
129 print HistorySiteRecord.query.count()
134 if __name__ == '__main__':
135 from monitor import parser as parsermodule
137 parser = parsermodule.getParser()
138 parser.set_defaults(filename=None, node=None, site=None,
139 nodeselect=False, nodegroup=None, cachenodes=False)
141 parser.add_option("", "--site", dest="site", metavar="login_base",
142 help="Provide a single site to operate on")
143 parser.add_option("", "--sitelist", dest="sitelist",
144 help="Provide a list of sites separated by ','")
146 config = parsermodule.parse_args(parser)
150 except Exception, err:
152 print traceback.print_exc()
153 print "Exception: %s" % err