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 # NOTE: adding a condition for nodehist.haspcu would include pcus
49 nodehist = HistoryNodeRecord.findby_or_create(hostname=node['hostname'])
50 nodebl = BlacklistRecord.get_by(hostname=node['hostname'])
51 if (nodehist is not None and nodehist.status != 'down') or \
52 (nodebl is not None and not nodebl.expired()):
56 email_exception(node['hostname'])
57 print traceback.print_exc()
60 def check_site_state(rec, sitehist):
62 if sitehist.new and sitehist.status not in ['new', 'online', 'good']:
63 sitehist.status = 'new'
64 sitehist.penalty_applied = True # because new sites are disabled by default, i.e. have a penalty.
65 sitehist.last_changed = datetime.now()
67 if sitehist.nodes_up >= MINUP:
69 if sitehist.status != 'online' and sitehist.status != 'good':
70 sitehist.last_changed = datetime.now()
72 if changed_lessthan(sitehist.last_changed, 0.5) and sitehist.status != 'online':
73 print "changed status from %s to online" % sitehist.status
74 sitehist.status = 'online'
76 if changed_greaterthan(sitehist.last_changed, 0.5) and sitehist.status != 'good':
77 print "changed status from %s to good" % sitehist.status
78 sitehist.status = 'good'
80 elif not sitehist.new:
82 if sitehist.status != 'offline' and sitehist.status != 'down':
83 sitehist.last_changed = datetime.now()
85 if changed_lessthan(sitehist.last_changed, 0.5) and sitehist.status != 'offline':
86 print "changed status from %s to offline" % sitehist.status
87 sitehist.status = 'offline'
89 if changed_greaterthan(sitehist.last_changed, 0.5) and sitehist.status != 'down':
90 print "changed status from %s to down" % sitehist.status
91 sitehist.status = 'down'
93 def checkAndRecordState(l_sites, l_plcsites):
95 lb2hn = plccache.plcdb_lb2hn
96 for sitename in l_sites:
98 for site in l_plcsites:
99 if site['login_base'] == sitename:
105 if sitename in lb2hn:
106 sitehist = HistorySiteRecord.findby_or_create(loginbase=sitename,
107 if_new_set={'status' : 'unknown',
108 'last_changed' : datetime.now(),
110 'penalty_level' : 0})
111 sitehist.last_checked = datetime.now()
113 sitehist.slices_total = d_site['max_slices']
114 sitehist.slices_used = len(d_site['slice_ids'])
115 sitehist.nodes_total = len(lb2hn[sitename])
116 if sitehist.message_id != 0:
117 rtstatus = mailer.getTicketStatus(sitehist.message_id)
118 sitehist.message_status = rtstatus['Status']
119 sitehist.message_queue = rtstatus['Queue']
120 sitehist.message_created = datetime.fromtimestamp(rtstatus['Created'])
122 sitehist.nodes_up = getnodesup(lb2hn[sitename])
123 sitehist.new = changed_lessthan(datetime.fromtimestamp(d_site['date_created']), 30) # created < 30 days ago
124 sitehist.enabled = d_site['enabled']
126 check_site_state(d_site, sitehist)
129 print "%d %15s slices(%2s) nodes(%2s) notdown(%2s) %s" % (count, sitename, sitehist.slices_used,
130 sitehist.nodes_total, sitehist.nodes_up, sitehist.status)
133 print HistorySiteRecord.query.count()
138 if __name__ == '__main__':
139 from monitor import parser as parsermodule
141 parser = parsermodule.getParser()
142 parser.set_defaults(filename=None, node=None, site=None,
143 nodeselect=False, nodegroup=None, cachenodes=False)
145 parser.add_option("", "--site", dest="site", metavar="login_base",
146 help="Provide a single site to operate on")
147 parser.add_option("", "--sitelist", dest="sitelist",
148 help="Provide a list of sites separated by ','")
150 config = parsermodule.parse_args(parser)
154 except Exception, err:
156 print traceback.print_exc()
157 print "Exception: %s" % err