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, BlacklistRecord
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 l_sites = [plccache.plcdb_hn2lb[config.node]]
34 site_list = config.sitelist.split(',')
37 l_sites = [site['login_base'] for site in l_plcsites]
39 checkAndRecordState(l_sites, l_plcsites)
41 def getnodesup(nodelist):
42 # NOTE : assume that a blacklisted node is fine, since we're told not to
43 # ignore it, no policy actions should be taken for it.
47 nodehist = HistoryNodeRecord.findby_or_create(hostname=node['hostname'])
48 nodebl = BlacklistRecord.get_by(hostname=node['hostname'])
49 if (nodehist is not None and nodehist.status != 'down') or \
50 (nodebl is not None and not nodebl.expired()):
54 print traceback.print_exc()
57 def check_site_state(rec, sitehist):
59 if sitehist.new and sitehist.status not in ['new', 'online', 'good']:
60 sitehist.status = 'new'
61 sitehist.penalty_applied = True # because new sites are disabled by default, i.e. have a penalty.
62 sitehist.last_changed = datetime.now()
64 if sitehist.nodes_up >= MINUP:
66 if sitehist.status != 'online' and sitehist.status != 'good':
67 sitehist.last_changed = datetime.now()
69 if changed_lessthan(sitehist.last_changed, 0.5) and sitehist.status != 'online':
70 print "changed status from %s to online" % sitehist.status
71 sitehist.status = 'online'
73 if changed_greaterthan(sitehist.last_changed, 0.5) and sitehist.status != 'good':
74 print "changed status from %s to good" % sitehist.status
75 sitehist.status = 'good'
77 elif not sitehist.new:
79 if sitehist.status != 'offline' and sitehist.status != 'down':
80 sitehist.last_changed = datetime.now()
82 if changed_lessthan(sitehist.last_changed, 0.5) and sitehist.status != 'offline':
83 print "changed status from %s to offline" % sitehist.status
84 sitehist.status = 'offline'
86 if changed_greaterthan(sitehist.last_changed, 0.5) and sitehist.status != 'down':
87 print "changed status from %s to down" % sitehist.status
88 sitehist.status = 'down'
90 def checkAndRecordState(l_sites, l_plcsites):
92 lb2hn = plccache.plcdb_lb2hn
93 for sitename in l_sites:
95 for site in l_plcsites:
96 if site['login_base'] == sitename:
102 if sitename in lb2hn:
103 sitehist = HistorySiteRecord.findby_or_create(loginbase=sitename,
104 if_new_set={'status' : 'unknown',
105 'last_changed' : datetime.now(),
107 'penalty_level' : 0})
108 sitehist.last_checked = datetime.now()
110 sitehist.slices_total = d_site['max_slices']
111 sitehist.slices_used = len(d_site['slice_ids'])
112 sitehist.nodes_total = len(lb2hn[sitename])
113 if sitehist.message_id != 0:
114 rtstatus = mailer.getTicketStatus(sitehist.message_id)
115 sitehist.message_status = rtstatus['Status']
116 sitehist.message_queue = rtstatus['Queue']
117 sitehist.message_created = datetime.fromtimestamp(rtstatus['Created'])
119 sitehist.nodes_up = getnodesup(lb2hn[sitename])
120 sitehist.new = changed_lessthan(datetime.fromtimestamp(d_site['date_created']), 30) # created < 30 days ago
121 sitehist.enabled = d_site['enabled']
123 check_site_state(d_site, sitehist)
126 print "%d %15s slices(%2s) nodes(%2s) notdown(%2s) %s" % (count, sitename, sitehist.slices_used,
127 sitehist.nodes_total, sitehist.nodes_up, sitehist.status)
130 print HistorySiteRecord.query.count()
135 if __name__ == '__main__':
136 from monitor import parser as parsermodule
138 parser = parsermodule.getParser()
139 parser.set_defaults(filename=None, node=None, site=None,
140 nodeselect=False, nodegroup=None, cachenodes=False)
142 parser.add_option("", "--site", dest="site", metavar="login_base",
143 help="Provide a single site to operate on")
144 parser.add_option("", "--sitelist", dest="sitelist",
145 help="Provide a list of sites separated by ','")
147 config = parsermodule.parse_args(parser)
151 except Exception, err:
153 print traceback.print_exc()
154 print "Exception: %s" % err