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.plc_siteid = d_site['site_id']
114 sitehist.slices_total = d_site['max_slices']
115 sitehist.slices_used = len(d_site['slice_ids'])
116 sitehist.nodes_total = len(lb2hn[sitename])
117 if sitehist.message_id != 0:
118 rtstatus = mailer.getTicketStatus(sitehist.message_id)
119 sitehist.message_status = rtstatus['Status']
120 sitehist.message_queue = rtstatus['Queue']
121 sitehist.message_created = datetime.fromtimestamp(rtstatus['Created'])
123 sitehist.nodes_up = getnodesup(lb2hn[sitename])
124 sitehist.new = changed_lessthan(datetime.fromtimestamp(d_site['date_created']), 30) # created < 30 days ago
125 sitehist.enabled = d_site['enabled']
127 check_site_state(d_site, sitehist)
130 print "%d %15s slices(%2s) nodes(%2s) notdown(%2s) %s" % (count, sitename, sitehist.slices_used,
131 sitehist.nodes_total, sitehist.nodes_up, sitehist.status)
134 print HistorySiteRecord.query.count()
139 if __name__ == '__main__':
140 from monitor import parser as parsermodule
142 parser = parsermodule.getParser()
143 parser.set_defaults(filename=None, node=None, site=None,
144 nodeselect=False, nodegroup=None, cachenodes=False)
146 parser.add_option("", "--site", dest="site", metavar="login_base",
147 help="Provide a single site to operate on")
148 parser.add_option("", "--sitelist", dest="sitelist",
149 help="Provide a list of sites separated by ','")
151 config = parsermodule.parse_args(parser)
155 except Exception, err:
157 print traceback.print_exc()
158 print "Exception: %s" % err