fix a bug with pause_penalty.
authorStephen Soltesz <soltesz@cs.princeton.edu>
Tue, 15 Sep 2009 00:43:36 +0000 (00:43 +0000)
committerStephen Soltesz <soltesz@cs.princeton.edu>
Tue, 15 Sep 2009 00:43:36 +0000 (00:43 +0000)
- bug caused a paused site to never unpause
- now after 30 days ticket is closed, and a new ticket is created, thus
resetting the penalty escalation

monitor/common.py
monitor/database/info/history.py
monitor/database/info/interface.py
monitor/wrapper/mailer.py
policy.py

index c3ece6f..05a4ec2 100644 (file)
@@ -240,6 +240,9 @@ def changed_lessthan(last_changed, days):
                return False
 
 def changed_greaterthan(last_changed, days):
+       if last_changed is None:
+               return False
+
        if datetime.now() - last_changed > timedelta(days):
                #print "last changed more than %s" % timedelta(days)
                return True
index 0abdebc..22c8d7b 100644 (file)
@@ -66,10 +66,14 @@ class HistorySiteRecord(Entity):
        message_status = Field(String, default=None)
        message_queue = Field(String, default=None) 
        message_created = Field(DateTime, default=None)
+       #message_last_reply = Field(DateTime, default=None)
 
        penalty_level   = Field(Int, default=0)
        penalty_applied = Field(Boolean, default=False)
-       acts_as_versioned(ignore=['last_changed', 'last_checked', 'message_status'])
+       penalty_pause   = Field(Boolean, default=False)
+       penalty_pause_time   = Field(DateTime, default=None)
+
+       acts_as_versioned(ignore=['last_changed', 'last_checked', 'message_status', 'penalty_pause_time'])
 
        @classmethod
        def by_loginbase(cls, loginbase):
index 06c83a0..8e3b1fb 100644 (file)
@@ -62,7 +62,9 @@ class SiteInterface(HistorySiteRecord):
 
                return
 
-       def pausePenalty(self):
+       def setPenaltyPause(self):
+               self.db.penalty_pause = True
+               self.db.penalty_pause_time = datetime.now()
                act = ActionRecord(loginbase=self.db.loginbase,
                                                        action='penalty',
                                                        action_type='pause_penalty',)
@@ -71,6 +73,11 @@ class SiteInterface(HistorySiteRecord):
                #act = ActionRecord(loginbase=self.db.loginbase, action='penalty', action_type='clear_penalty',)
                self.db.penalty_level = 0
                self.db.penalty_applied = False
+               self.clearPenaltyPause()
+
+       def clearPenaltyPause(self):
+               self.db.penalty_pause = False
+               self.db.penalty_pause_time = None
        
        def getTicketStatus(self):
                if self.db.message_id != 0:
@@ -78,6 +85,7 @@ class SiteInterface(HistorySiteRecord):
                        self.db.message_status = rtstatus['Status']
                        self.db.message_queue = rtstatus['Queue']
                        self.db.message_created = datetime.fromtimestamp(rtstatus['Created'])
+                       #self.db.message_last_reply = datetime.fromtimestamp(rtstatus['Told'])
 
        def setTicketStatus(self, status):
                print 'SETTING status %s' % status
index cd04f3a..abf0352 100755 (executable)
@@ -52,7 +52,7 @@ def getTicketStatus(ticket_id):
        if ticket_id == None or ticket_id == "":
                return {}
 
-       cmd = "rt show -t ticket -f id,subject,status,queue,created %s" % (ticket_id)
+       cmd = "rt show -t ticket -f id,subject,status,queue,created,told %s" % (ticket_id)
        print cmd
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
@@ -66,6 +66,7 @@ def getTicketStatus(ticket_id):
                r_values[key] = r_values[key].strip()
 
        r_values['Created'] = calendar.timegm(time.strptime(r_values['Created']))
+       r_values['Told'] = calendar.timegm(time.strptime(r_values['Told']))
        return r_values
 
 def setAdminCCViaRT(ticket_id, to):
index 54ac80e..cdd311c 100755 (executable)
--- a/policy.py
+++ b/policy.py
@@ -191,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