Class: God::Conditions::HttpResponseCode

Inherits:
PollCondition show all
Defined in:
lib/god/conditions/http_response_code.rb

Overview

Condition Symbol :http_response_code Type: Poll

Trigger based on the response from an HTTP request.

Paramaters

 Required
   +host+ is the hostname to connect [required]
   --one of code_is or code_is_not--
   +code_is+ trigger if the response code IS one of these
             e.g. 500 or '500' or [404, 500] or %w{404 500}
   +code_is_not+ trigger if the response code IS NOT one of these
                 e.g. 200 or '200' or [200, 302] or %w{200 302}
Optional
   +port+ is the port to connect (default 80)
   +path+ is the path to connect (default '/')
   +headers+ is the hash of HTTP headers to send (default none)
   +times+ is the number of times after which to trigger (default 1)
           e.g. 3 (times in a row) or [3, 5] (three out of fives times)
   +timeout+ is the time to wait for a connection (default 60.seconds)

Examples

Trigger if the response code from www.example.com/foo/bar is not a 200 (or if the connection is refused or times out:

on.condition(:http_response_code) do |c|
  c.host = 'www.example.com'
  c.path = '/foo/bar'
  c.code_is_not = 200
end

Trigger if the response code is a 404 or a 500 (will not be triggered by a connection refusal or timeout):

on.condition(:http_response_code) do |c|
  c.host = 'www.example.com'
  c.path = '/foo/bar'
  c.code_is = [404, 500]
end

Trigger if the response code is not a 200 five times in a row:

on.condition(:http_response_code) do |c|
  c.host = 'www.example.com'
  c.path = '/foo/bar'
  c.code_is_not = 200
  c.times = 5
end

Trigger if the response code is not a 200 or does not respond within 10 seconds:

on.condition(:http_response_code) do |c|
  c.host = 'www.example.com'
  c.path = '/foo/bar'
  c.code_is_not = 200
  c.timeout = 10
end

Instance Attribute Summary collapse

Attributes inherited from PollCondition

#interval

Attributes inherited from God::Condition

#info, #notify, #phase, #transition

Attributes inherited from Behavior

#watch

Instance Method Summary collapse

Methods inherited from PollCondition

#after, #before

Methods inherited from God::Condition

#friendly_name, generate, valid?

Methods inherited from Behavior

#after_restart, #after_start, #after_stop, #before_restart, #before_start, #before_stop, #friendly_name, generate

Methods included from God::Configurable

#base_name, complain, #complain, #friendly_name

Constructor Details

#initializeHttpResponseCode

Returns a new instance of HttpResponseCode.



75
76
77
78
79
80
81
82
# File 'lib/god/conditions/http_response_code.rb', line 75

def initialize
  super
  self.port = 80
  self.path = '/'
  self.headers = {}
  self.times = [1, 1]
  self.timeout = 60.seconds
end

Instance Attribute Details

#code_isObject

e.g. 500 or ‘500’ or [404, 500] or %w500



66
67
68
# File 'lib/god/conditions/http_response_code.rb', line 66

def code_is
  @code_is
end

#code_is_notObject

e.g. 500 or ‘500’ or [404, 500] or %w500



66
67
68
# File 'lib/god/conditions/http_response_code.rb', line 66

def code_is_not
  @code_is_not
end

#headersObject

e.g. 500 or ‘500’ or [404, 500] or %w500



66
67
68
# File 'lib/god/conditions/http_response_code.rb', line 66

def headers
  @headers
end

#hostObject

e.g. 500 or ‘500’ or [404, 500] or %w500



66
67
68
# File 'lib/god/conditions/http_response_code.rb', line 66

def host
  @host
end

#pathObject

e.g. 500 or ‘500’ or [404, 500] or %w500



66
67
68
# File 'lib/god/conditions/http_response_code.rb', line 66

def path
  @path
end

#portObject

e.g. 500 or ‘500’ or [404, 500] or %w500



66
67
68
# File 'lib/god/conditions/http_response_code.rb', line 66

def port
  @port
end

#timeoutObject

e.g. 500 or ‘500’ or [404, 500] or %w500



66
67
68
# File 'lib/god/conditions/http_response_code.rb', line 66

def timeout
  @timeout
end

#timesObject

e.g. 500 or ‘500’ or [404, 500] or %w500



66
67
68
# File 'lib/god/conditions/http_response_code.rb', line 66

def times
  @times
end

Instance Method Details

#prepareObject



84
85
86
87
88
89
90
91
92
93
94
# File 'lib/god/conditions/http_response_code.rb', line 84

def prepare
  self.code_is = Array(self.code_is).map { |x| x.to_i } if self.code_is
  self.code_is_not = Array(self.code_is_not).map { |x| x.to_i } if self.code_is_not
  
  if self.times.kind_of?(Integer)
    self.times = [self.times, self.times]
  end
  
  @timeline = Timeline.new(self.times[1])
  @history = Timeline.new(self.times[1])
end

#resetObject



96
97
98
99
# File 'lib/god/conditions/http_response_code.rb', line 96

def reset
  @timeline.clear
  @history.clear
end

#testObject



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/god/conditions/http_response_code.rb', line 109

def test
  response = nil
  
  Net::HTTP.start(self.host, self.port) do |http|
    http.read_timeout = self.timeout
    response = http.get(self.path, self.headers)
  end
  
  actual_response_code = response.code.to_i
  if self.code_is && self.code_is.include?(actual_response_code)
    pass(actual_response_code)
  elsif self.code_is_not && !self.code_is_not.include?(actual_response_code)
    pass(actual_response_code)
  else
    fail(actual_response_code)
  end
rescue Errno::ECONNREFUSED
  self.code_is ? fail('Refused') : pass('Refused')
rescue Errno::ECONNRESET
  self.code_is ? fail('Reset') : pass('Reset')
rescue EOFError
  self.code_is ? fail('EOF') : pass('EOF')
rescue Timeout::Error
  self.code_is ? fail('Timeout') : pass('Timeout')
rescue Errno::ETIMEDOUT
  self.code_is ? fail('Timedout') : pass('Timedout')
rescue Exception => failure
  self.code_is ? fail(failure.class.name) : pass(failure.class.name)
end

#valid?Boolean

Returns:

  • (Boolean)


101
102
103
104
105
106
107
# File 'lib/god/conditions/http_response_code.rb', line 101

def valid?
  valid = true
  valid &= complain("Attribute 'host' must be specified", self) if self.host.nil?
  valid &= complain("One (and only one) of attributes 'code_is' and 'code_is_not' must be specified", self) if
    (self.code_is.nil? && self.code_is_not.nil?) || (self.code_is && self.code_is_not)
  valid
end