add info to degrading lambda, tested before and after behaviors
[god.git] / lib / god / conditions / degrading_lambda.rb
blob5bb97dd0f90ebb252d1974017834eb8893d2f24c
1 module God
2   module Conditions
3     
4     # This condition degrades its interval by a factor of two for 3 tries before failing
5     class DegradingLambda < PollCondition
6       attr_accessor :lambda
7       
8       def initialize
9         super
10         @tries = 0
11       end
12       
13       def valid?
14         valid = true
15         valid &= complain("Attribute 'lambda' must be specified", self) if self.lambda.nil?
16         valid
17       end
18       
19       def test
20         puts "Calling test. Interval at #{self.interval}"
21         @original_interval ||= self.interval
22         unless pass?
23           if @tries == 2
24             self.info = "lambda condition was satisfied"
25             return true
26           end
27           self.interval = self.interval / 2.0
28           @tries += 1
29         else
30           @tries = 0
31           self.interval = @original_interval
32         end
33         
34         self.info = "lambda condition was not satisfied"
35         false
36       end
37       
38       private
39         
40         def pass?
41           begin
42             Timeout::timeout(@interval) {
43               self.lambda.call()
44             }
45           rescue Timeout::Error
46             false
47           end
48         end
49     end
51   end
52 end