X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=policy.py;h=cdd311c043fd2547c465b7ff10577a419f78ff74;hb=2d1c0c5c0bf2fb15651dcfd813ae68bff4b80535;hp=77cf76e2b6097110d53a56ba73efc86cc3de27ee;hpb=40884a302bf204a7f42044b72d87f9431ad6dd35;p=monitor.git diff --git a/policy.py b/policy.py index 77cf76e..cdd311c 100755 --- a/policy.py +++ b/policy.py @@ -27,7 +27,7 @@ from monitor.wrapper import plccache from monitor.database.info.model import * from monitor.database.info.interface import * -from nodequery import verify,query_to_dict,node_select +from monitor.query import verify,query_to_dict,node_select api = plc.getAuthAPI() @@ -94,8 +94,32 @@ def main(hostnames, sitenames): not nodehist.firewall and \ not found_between(recent_actions, 'try_reboot', 3.5, 1): + # TODO: there MUST be a better way to do this... + # get fb node record for pcuid + fbpcu = None + fbnode = FindbadNodeRecord.get_latest_by(hostname=host) + if fbnode: + fbpcu = FindbadPCURecord.get_latest_by(plc_pcuid=fbnode.plc_pcuid) + sitehist.attemptReboot(host) print "send message for host %s try_reboot" % host + if not fbpcu.test_is_ok() and \ + not found_within(recent_actions, 'pcuerror_notice', 3.0): + + args = {} + if fbpcu: + args['pcu_name'] = fbpcu.pcu_name() + args['pcu_errors'] = fbpcu.pcu_errors() + args['plc_pcuid'] = fbpcu.plc_pcuid + else: + args['pcu_name'] = "error looking up pcu name" + args['pcu_errors'] = "" + args['plc_pcuid'] = 0 + + args['hostname'] = host + sitehist.sendMessage('pcuerror_notice', **args) + print "send message for host %s PCU Failure" % host + # NOTE: non-intuitive is that found_between(try_reboot, 3.5, 1) # will be false for a day after the above condition is satisfied @@ -105,13 +129,24 @@ def main(hostnames, sitenames): found_between(recent_actions, 'try_reboot', 3.5, 1) and \ not found_within(recent_actions, 'pcufailed_notice', 3.5): + # TODO: there MUST be a better way to do this... + # get fb node record for pcuid + fbpcu = None + fbnode = FindbadNodeRecord.get_latest_by(hostname=host) + if fbnode: + fbpcu = FindbadPCURecord.get_latest_by(plc_pcuid=fbnode.plc_pcuid) + if fbpcu: + pcu_name = fbpcu.pcu_name() + else: + pcu_name = "error looking up pcu name" + + # get fb pcu record for pcuid # send pcu failure message - #act = ActionRecord(**kwargs) - sitehist.sendMessage('pcufailed_notice', hostname=host) + sitehist.sendMessage('pcufailed_notice', hostname=host, pcu_name=pcu_name) print "send message for host %s PCU Failure" % host if nodehist.status == 'failboot' and \ - changed_greaterthan(nodehist.last_changed, 1) and \ + changed_greaterthan(nodehist.last_changed, 0.25) and \ not found_between(recent_actions, 'bootmanager_restore', 0.5, 0): # send down node notice # delay 0.5 days before retrying... @@ -156,40 +191,46 @@ def main(hostnames, sitenames): print "%s %s %s" % (i, sitehist.db.loginbase, sitehist.db.status) - # determine if there are penalties within the last 30 days? - # if so, add a 'pause_penalty' action. - if sitehist.db.message_id != 0 and sitehist.db.message_status == 'open' and \ - sitehist.db.penalty_level > 0 and not found_within(recent_actions, 'pause_penalty', 30): - # pause escalation - print "Pausing penalties for %s" % site - sitehist.pausePenalty() - else: - - if sitehist.db.status == 'down': - if not found_within(recent_actions, 'pause_penalty', 30) and \ - not found_within(recent_actions, 'increase_penalty', 7) and \ - changed_greaterthan(sitehist.db.last_changed, 7): - - # TODO: catch errors - sitehist.increasePenalty() - sitehist.applyPenalty() - sitehist.sendMessage('increase_penalty') - - print "send message for site %s penalty increase" % site - - if sitehist.db.status == 'good': - # clear penalty - # NOTE: because 'all clear' should have an indefinite status, we - # have a boolean value rather than a 'recent action' - if sitehist.db.penalty_applied: - # send message that penalties are cleared. - - sitehist.clearPenalty() - sitehist.applyPenalty() - sitehist.sendMessage('clear_penalty') - sitehist.closeTicket() - - print "send message for site %s penalty cleared" % site + if sitehist.db.status == 'down': + if sitehist.db.penalty_pause and \ + changed_greaterthan(sitehist.db.penalty_pause_time, 30): + + email_exception("", "clear pause penalty for site: %s" % sitehist.db.loginbase) + sitehist.closeTicket() + # NOTE: but preserve the penalty status. + sitehist.clearPenaltyPause() + + if sitehist.db.message_id != 0 and \ + sitehist.db.message_status == 'open' and \ + not sitehist.db.penalty_pause: + + email_exception("", "pause penalty for site: %s" % sitehist.db.loginbase) + sitehist.setPenaltyPause() + + if not sitehist.db.penalty_pause and \ + not found_within(recent_actions, 'increase_penalty', 7) and \ + changed_greaterthan(sitehist.db.last_changed, 7): + + # TODO: catch errors + sitehist.increasePenalty() + sitehist.applyPenalty() + sitehist.sendMessage('increase_penalty') + + print "send message for site %s penalty increase" % site + + if sitehist.db.status == 'good': + # clear penalty + # NOTE: because 'all clear' should have an indefinite status, we + # have a boolean value rather than a 'recent action' + if sitehist.db.penalty_applied or sitehist.db.penalty_pause: + # send message that penalties are cleared. + + sitehist.clearPenalty() + sitehist.applyPenalty() + sitehist.sendMessage('clear_penalty') + sitehist.closeTicket() + + print "send message for site %s penalty cleared" % site site_count = site_count + 1