lib/god/conditions/http_response_code.rb in god-0.5.0 vs lib/god/conditions/http_response_code.rb in god-0.6.0
- old
+ new
@@ -1,10 +1,68 @@
require 'net/http'
module God
module Conditions
+ # 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 '/')
+ # +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
class HttpResponseCode < PollCondition
attr_accessor :code_is, # e.g. 500 or '500' or [404, 500] or %w{404 500}
:code_is_not, # e.g. 200 or '200' or [200, 302] or %w{200 302}
:times, # e.g. 3 or [3, 5]
:host, # e.g. www.example.com
@@ -12,11 +70,14 @@
:timeout, # e.g. 60.seconds
:path # e.g. '/'
def initialize
super
+ self.port = 80
+ self.path = '/'
self.times = [1, 1]
+ self.timeout = 60.seconds
end
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
@@ -35,15 +96,12 @@
end
def valid?
valid = true
valid &= complain("Attribute 'host' must be specified", self) if self.host.nil?
- valid &= complain("Attribute 'port' must be specified", self) if self.port.nil?
- valid &= complain("Attribute 'path' must be specified", self) if self.path.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 &= complain("Attribute 'timeout' must be specified", self) if self.timeout.nil?
valid
end
def test
response = nil
@@ -59,9 +117,11 @@
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 Timeout::Error
self.code_is ? fail('Timeout') : pass('Timeout')
end
private
\ No newline at end of file