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)
   +ssl+ should the connection use ssl (default false)

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.



79
80
81
82
83
84
85
86
87
88
# File 'lib/god/conditions/http_response_code.rb', line 79

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

Instance Attribute Details

#ca_fileObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def ca_file
  @ca_file
end

#code_isObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def code_is
  @code_is
end

#code_is_notObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def code_is_not
  @code_is_not
end

#headersObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def headers
  @headers
end

#hostObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def host
  @host
end

#pathObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def path
  @path
end

#portObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def port
  @port
end

#sslObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def ssl
  @ssl
end

#timeoutObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def timeout
  @timeout
end

#timesObject

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



68
69
70
# File 'lib/god/conditions/http_response_code.rb', line 68

def times
  @times
end

Instance Method Details

#prepareObject



90
91
92
93
94
95
96
97
98
99
100
# File 'lib/god/conditions/http_response_code.rb', line 90

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



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

def reset
  @timeline.clear
  @history.clear
end

#testObject



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/god/conditions/http_response_code.rb', line 115

def test
  response = nil

  connection = Net::HTTP.new(self.host, self.port)
  connection.use_ssl = self.port == 443 ? true : self.ssl
  connection.verify_mode = OpenSSL::SSL::VERIFY_NONE if connection.use_ssl?

  if connection.use_ssl? && self.ca_file
    pem = File.read(self.ca_file)
    connection.ca_file = self.ca_file
    connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
  end

  connection.start 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)


107
108
109
110
111
112
113
# File 'lib/god/conditions/http_response_code.rb', line 107

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