litmus_paper 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -1
- data/.travis.yml +1 -0
- data/bin/litmusctl +1 -1
- data/lib/litmus_paper/app.rb +1 -5
- data/lib/litmus_paper/cli/server.rb +3 -9
- data/lib/litmus_paper/dependency/haproxy_backends.rb +7 -37
- data/lib/litmus_paper/dependency/http.rb +17 -9
- data/lib/litmus_paper/dependency/tcp.rb +7 -28
- data/lib/litmus_paper/logger.rb +6 -6
- data/lib/litmus_paper/metric/available_memory.rb +3 -3
- data/lib/litmus_paper/metric/cpu_load.rb +1 -1
- data/lib/litmus_paper/version.rb +1 -1
- data/lib/litmus_paper.rb +9 -23
- data/litmus_paper.gemspec +5 -14
- data/spec/litmus_paper/app_spec.rb +1 -1
- data/spec/litmus_paper/cli/admin_spec.rb +1 -2
- data/spec/litmus_paper/dependency/haproxy_backends_spec.rb +6 -31
- data/spec/litmus_paper/dependency/http_spec.rb +0 -2
- data/spec/litmus_paper/dependency/tcp_spec.rb +9 -19
- data/spec/litmus_paper/metric/available_memory_spec.rb +0 -20
- data/spec/litmus_paper/metric/cpu_load_spec.rb +0 -2
- data/spec/litmus_paper_spec.rb +8 -8
- data/spec/spec_helper.rb +0 -21
- data/spec/support/haproxy_test_socket +22 -0
- metadata +27 -114
- data/lib/litmus_paper/deferred_facter.rb +0 -14
- data/lib/sinatra/synchrony.rb +0 -41
- data/lib/thin/backends/tcp_server_with_callbacks.rb +0 -20
- data/lib/thin/callback_rack_handler.rb +0 -14
- data/lib/thin/callbacks.rb +0 -19
- data/spec/litmus_paper/deferred_facter_spec.rb +0 -12
- data/spec/support/null_logger.rb +0 -11
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use ruby-1.
|
1
|
+
rvm use ruby-1.8.7-p249@litmus_paper --create
|
data/.travis.yml
CHANGED
data/bin/litmusctl
CHANGED
data/lib/litmus_paper/app.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
module LitmusPaper
|
2
2
|
class App < Sinatra::Base
|
3
|
-
register Sinatra::Synchrony
|
4
|
-
set :dump_errors, true
|
5
|
-
set :raise_errors, false
|
6
|
-
|
7
3
|
get "/" do
|
8
4
|
output = "Services monitored:\n"
|
9
5
|
output += LitmusPaper.services.keys.join("\n")
|
@@ -48,7 +44,7 @@ module LitmusPaper
|
|
48
44
|
end
|
49
45
|
|
50
46
|
error do
|
51
|
-
text 500, "Server Error
|
47
|
+
text 500, "Server Error"
|
52
48
|
end
|
53
49
|
|
54
50
|
def text(response_code, body, headers ={})
|
@@ -6,7 +6,7 @@ module LitmusPaper
|
|
6
6
|
args, options = args.dup, {}
|
7
7
|
|
8
8
|
opt_parser = OptionParser.new do |opts|
|
9
|
-
opts.banner = "Usage: litmus [options]"
|
9
|
+
opts.banner = "Usage: litmus [mongrel, thin, etc] [options]"
|
10
10
|
opts.on("-c", "--config=file", String,
|
11
11
|
"Litmus configuration file", "Default: /etc/litmus.conf") { |v| options[:litmus_config] = v }
|
12
12
|
opts.on("-D", "--data-dir=path", String,
|
@@ -31,8 +31,7 @@ module LitmusPaper
|
|
31
31
|
opt_parser.parse! args
|
32
32
|
|
33
33
|
options[:config] = File.expand_path("../../../config.ru", File.dirname(__FILE__))
|
34
|
-
options[:server] =
|
35
|
-
options[:backend] = Thin::Backends::TcpServerWithCallbacks
|
34
|
+
options[:server] = args.shift
|
36
35
|
options
|
37
36
|
end
|
38
37
|
end
|
@@ -47,13 +46,8 @@ module LitmusPaper
|
|
47
46
|
exit 1
|
48
47
|
end
|
49
48
|
|
50
|
-
LitmusPaper.
|
49
|
+
LitmusPaper.configure(options[:litmus_config])
|
51
50
|
LitmusPaper.config_dir = options[:config_dir]
|
52
|
-
|
53
|
-
Thin::Callbacks.after_connect do
|
54
|
-
LitmusPaper.configure!
|
55
|
-
end
|
56
|
-
|
57
51
|
super
|
58
52
|
end
|
59
53
|
|
@@ -3,27 +3,6 @@ require 'csv'
|
|
3
3
|
module LitmusPaper
|
4
4
|
module Dependency
|
5
5
|
class HaproxyBackends
|
6
|
-
|
7
|
-
module HaproxyStatReader
|
8
|
-
def initialize(fiber)
|
9
|
-
@fiber = fiber
|
10
|
-
@stats = ""
|
11
|
-
end
|
12
|
-
|
13
|
-
def connection_completed
|
14
|
-
send_data("show stat\n")
|
15
|
-
end
|
16
|
-
|
17
|
-
def receive_data(data)
|
18
|
-
@stats << data
|
19
|
-
@fiber.resume(@stats) if finished?
|
20
|
-
end
|
21
|
-
|
22
|
-
def finished?
|
23
|
-
@stats =~ /\n\n\z/
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
6
|
def initialize(domain_socket, cluster)
|
28
7
|
@domain_socket = domain_socket
|
29
8
|
@cluster = cluster
|
@@ -31,18 +10,10 @@ module LitmusPaper
|
|
31
10
|
|
32
11
|
def available?
|
33
12
|
stats = _parse_stats(_fetch_stats)
|
34
|
-
servers = _servers_in(stats, @cluster)
|
35
13
|
|
36
|
-
|
37
|
-
LitmusPaper.logger.info("None of the servers (#{servers.map{ |s| s['svname'] }.join(',')}) are up")
|
38
|
-
false
|
39
|
-
else
|
40
|
-
true
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def _any_up?(servers)
|
14
|
+
servers = _servers_in(stats, @cluster)
|
45
15
|
available = servers.select { |s| s['status'] == "UP" }
|
16
|
+
|
46
17
|
available.size > 0
|
47
18
|
end
|
48
19
|
|
@@ -53,17 +24,16 @@ module LitmusPaper
|
|
53
24
|
end
|
54
25
|
|
55
26
|
def _parse_stats(csv)
|
56
|
-
stats = CSV.parse(
|
27
|
+
stats = CSV.parse(csv)
|
57
28
|
headers = stats.shift
|
58
29
|
stats.map { |stat| Hash[headers.zip(stat)] }
|
59
30
|
end
|
60
31
|
|
61
32
|
def _fetch_stats
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
Fiber.yield
|
33
|
+
UNIXSocket.open(@domain_socket) do |socket|
|
34
|
+
socket.send "show stat\n", 0
|
35
|
+
socket.read
|
36
|
+
end
|
67
37
|
end
|
68
38
|
end
|
69
39
|
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
module LitmusPaper
|
2
2
|
module Dependency
|
3
3
|
class HTTP
|
4
|
-
VALID_RESPONSE_CODES = (200..399).freeze
|
5
|
-
|
6
4
|
def initialize(uri, options = {})
|
7
5
|
@uri = uri
|
8
6
|
@expected_content = Regexp.new(options.fetch(:content, '.*'))
|
9
|
-
@method = options.fetch(:method, '
|
7
|
+
@method = options.fetch(:method, 'GET')
|
10
8
|
@ca_file = options[:ca_file]
|
11
9
|
end
|
12
10
|
|
@@ -15,7 +13,7 @@ module LitmusPaper
|
|
15
13
|
success = _successful_response?(response)
|
16
14
|
matches = _body_matches?(response)
|
17
15
|
|
18
|
-
LitmusPaper.logger.info("Available check to #{@uri} failed with status #{response.
|
16
|
+
LitmusPaper.logger.info("Available check to #{@uri} failed with status #{response.code}") unless success
|
19
17
|
LitmusPaper.logger.info("Available check to #{@uri} did not match #{@expected_content}") unless matches
|
20
18
|
|
21
19
|
success && matches
|
@@ -26,18 +24,28 @@ module LitmusPaper
|
|
26
24
|
|
27
25
|
def _make_request
|
28
26
|
uri = URI.parse(@uri)
|
29
|
-
|
30
|
-
|
27
|
+
request = Net::HTTP.const_get(@method.capitalize).new(uri.normalize.path)
|
28
|
+
request.set_form_data({})
|
29
|
+
|
30
|
+
connection = Net::HTTP.new(uri.host, uri.port)
|
31
|
+
if uri.scheme == "https"
|
32
|
+
connection.use_ssl = true
|
33
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
34
|
+
connection.ca_file = @ca_file unless @ca_file.nil?
|
35
|
+
connection.verify_callback = proc { |preverify_ok, ssl_context| _verify_ssl_certificate(preverify_ok, ssl_context) }
|
36
|
+
end
|
31
37
|
|
32
|
-
|
38
|
+
connection.start do |http|
|
39
|
+
http.request(request)
|
40
|
+
end
|
33
41
|
end
|
34
42
|
|
35
43
|
def _successful_response?(response)
|
36
|
-
|
44
|
+
response.is_a? Net::HTTPSuccess
|
37
45
|
end
|
38
46
|
|
39
47
|
def _body_matches?(response)
|
40
|
-
(response.
|
48
|
+
(response.body =~ @expected_content) ? true : false
|
41
49
|
end
|
42
50
|
|
43
51
|
def _verify_ssl_certificate(preverify_ok, ssl_context)
|
@@ -1,39 +1,18 @@
|
|
1
1
|
module LitmusPaper
|
2
2
|
module Dependency
|
3
3
|
class TCP
|
4
|
-
|
5
|
-
def initialize(fiber, timeout, ip, port)
|
6
|
-
@fiber = fiber
|
7
|
-
@ip = ip
|
8
|
-
@port = port
|
9
|
-
@timer = EM::Timer.new(timeout, method(:connection_timeout))
|
10
|
-
end
|
11
|
-
|
12
|
-
def connection_completed
|
13
|
-
close_connection
|
14
|
-
@timer.cancel
|
15
|
-
@fiber.resume(true)
|
16
|
-
end
|
17
|
-
|
18
|
-
def connection_timeout
|
19
|
-
LitmusPaper.logger.info("Available check to #{@ip}:#{@port} failed with a timeout")
|
20
|
-
@fiber.resume(false)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def initialize(ip, port, options = {})
|
4
|
+
def initialize(ip, port)
|
25
5
|
@ip, @port = ip, port
|
26
|
-
@timeout = options.fetch(:timeout, 2)
|
27
6
|
end
|
28
7
|
|
29
8
|
def available?
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
connection.set_pending_connect_timeout @timeout
|
9
|
+
Timeout.timeout(5) do
|
10
|
+
socket = TCPSocket.new(@ip, @port)
|
11
|
+
socket.close
|
34
12
|
end
|
35
|
-
|
36
|
-
|
13
|
+
true
|
14
|
+
rescue Exception
|
15
|
+
false
|
37
16
|
end
|
38
17
|
|
39
18
|
def to_s
|
data/lib/litmus_paper/logger.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
module LitmusPaper
|
2
2
|
class Logger
|
3
3
|
extend Forwardable
|
4
|
-
def_delegators
|
4
|
+
def_delegators :@syslog, :debug, :info
|
5
5
|
|
6
|
-
def
|
7
|
-
|
6
|
+
def initialize
|
7
|
+
@syslog = SyslogLogger.new("litmus_paper")
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
12
|
-
EM.syslog_setup('0.0.0.0', 514)
|
10
|
+
def write(message)
|
11
|
+
@syslog.info(message)
|
13
12
|
end
|
13
|
+
|
14
14
|
end
|
15
15
|
end
|
@@ -7,7 +7,7 @@ module LitmusPaper
|
|
7
7
|
"KB" => 1024
|
8
8
|
}
|
9
9
|
|
10
|
-
def initialize(weight, facter =
|
10
|
+
def initialize(weight, facter = Facter)
|
11
11
|
@weight = weight
|
12
12
|
@facter = facter
|
13
13
|
end
|
@@ -20,12 +20,12 @@ module LitmusPaper
|
|
20
20
|
return @memory_total unless @memory_total.nil?
|
21
21
|
|
22
22
|
size, scale = @facter.value('memorytotal').split(' ')
|
23
|
-
@memory_total =
|
23
|
+
@memory_total = size.to_i * MULTIPLIER[scale]
|
24
24
|
end
|
25
25
|
|
26
26
|
def memory_free
|
27
27
|
size, scale = @facter.value('memoryfree').split(' ')
|
28
|
-
|
28
|
+
size.to_i * MULTIPLIER[scale]
|
29
29
|
end
|
30
30
|
|
31
31
|
def to_s
|
data/lib/litmus_paper/version.rb
CHANGED
data/lib/litmus_paper.rb
CHANGED
@@ -4,23 +4,14 @@ require 'net/https'
|
|
4
4
|
require 'uri'
|
5
5
|
require 'forwardable'
|
6
6
|
|
7
|
-
require 'async-rack'
|
8
7
|
require 'sinatra/base'
|
9
|
-
require 'sinatra/synchrony'
|
10
|
-
require 'em-synchrony/em-http'
|
11
|
-
require 'em/syslog'
|
12
|
-
|
13
|
-
require 'thin'
|
14
|
-
require 'thin/callbacks'
|
15
|
-
require 'thin/backends/tcp_server_with_callbacks'
|
16
|
-
require 'thin/callback_rack_handler'
|
17
|
-
|
18
8
|
require 'facter'
|
9
|
+
require 'syslog_logger'
|
10
|
+
|
19
11
|
require 'facts/loadaverage'
|
20
12
|
|
21
13
|
require 'litmus_paper/app'
|
22
14
|
require 'litmus_paper/configuration'
|
23
|
-
require 'litmus_paper/deferred_facter'
|
24
15
|
require 'litmus_paper/dependency/haproxy_backends'
|
25
16
|
require 'litmus_paper/dependency/http'
|
26
17
|
require 'litmus_paper/dependency/tcp'
|
@@ -35,17 +26,17 @@ require 'litmus_paper/status_file'
|
|
35
26
|
module LitmusPaper
|
36
27
|
class << self
|
37
28
|
attr_reader :services, :config_dir
|
38
|
-
attr_accessor :logger
|
29
|
+
attr_accessor :logger
|
39
30
|
end
|
40
31
|
|
41
32
|
self.logger = Logger.new
|
42
33
|
|
43
|
-
def self.configure
|
44
|
-
|
34
|
+
def self.configure(filename)
|
35
|
+
@config_file = filename
|
36
|
+
|
45
37
|
begin
|
46
|
-
@services = LitmusPaper::Configuration.new(
|
47
|
-
rescue Exception
|
48
|
-
logger.info("Error in configuration #{e.message}")
|
38
|
+
@services = LitmusPaper::Configuration.new(filename).evaluate
|
39
|
+
rescue Exception
|
49
40
|
end
|
50
41
|
end
|
51
42
|
|
@@ -54,11 +45,7 @@ module LitmusPaper
|
|
54
45
|
end
|
55
46
|
|
56
47
|
def self.reload
|
57
|
-
|
58
|
-
@services = LitmusPaper::Configuration.new(@config_file).evaluate
|
59
|
-
rescue Exception => e
|
60
|
-
logger.info("Error in configuration #{e.message}")
|
61
|
-
end
|
48
|
+
configure(@config_file)
|
62
49
|
end
|
63
50
|
|
64
51
|
def self.reset
|
@@ -67,4 +54,3 @@ module LitmusPaper
|
|
67
54
|
end
|
68
55
|
|
69
56
|
Signal.trap("HUP") { LitmusPaper.reload }
|
70
|
-
|
data/litmus_paper.gemspec
CHANGED
@@ -15,21 +15,12 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = LitmusPaper::VERSION
|
17
17
|
|
18
|
-
gem.required_ruby_version = '>= 1.9.1'
|
19
|
-
|
20
|
-
gem.add_dependency "thin", "~> 1.3.1"
|
21
|
-
gem.add_dependency "async-rack", "~> 0.5.1"
|
22
18
|
gem.add_dependency "sinatra", "~> 1.3.2"
|
23
|
-
gem.add_dependency "rack-fiber_pool", "~> 0.9"
|
24
19
|
gem.add_dependency "facter", "~> 1.6.7"
|
25
|
-
gem.add_dependency "
|
26
|
-
gem.add_dependency "em-http-request", "~> 1.0"
|
27
|
-
gem.add_dependency "em-synchrony", "~> 1.0"
|
28
|
-
gem.add_dependency "em-resolv-replace", "~> 1.1"
|
29
|
-
gem.add_dependency "em-syslog", "~> 0.0.2"
|
20
|
+
gem.add_dependency "SyslogLogger", "1.4.1"
|
30
21
|
|
31
|
-
gem.add_development_dependency "rspec", "
|
32
|
-
gem.add_development_dependency "rack-test", "
|
33
|
-
gem.add_development_dependency "rake"
|
34
|
-
gem.add_development_dependency "rake_commit", "
|
22
|
+
gem.add_development_dependency "rspec", "2.9.0"
|
23
|
+
gem.add_development_dependency "rack-test", "0.6.1"
|
24
|
+
gem.add_development_dependency "rake"
|
25
|
+
gem.add_development_dependency "rake_commit", "0.13"
|
35
26
|
end
|
@@ -237,7 +237,7 @@ describe LitmusPaper::App do
|
|
237
237
|
get "/test/error"
|
238
238
|
last_response.status.should == 500
|
239
239
|
last_response.headers["Content-Type"].should == "text/plain"
|
240
|
-
last_response.body.should == "Server Error
|
240
|
+
last_response.body.should == "Server Error"
|
241
241
|
ensure
|
242
242
|
app.environment = old_environment
|
243
243
|
end
|
@@ -7,8 +7,7 @@ describe 'litmusctl' do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
before(:all) do
|
10
|
-
|
11
|
-
SpecHelper.wait_for_service :host => '127.0.0.1', :port => 9293
|
10
|
+
system "bundle exec ruby -I lib bin/litmus -p 9293 -d -D /tmp/litmus_paper -c #{TEST_CONFIG} -P /tmp/litmus.pid"
|
12
11
|
end
|
13
12
|
|
14
13
|
after(:all) do
|
@@ -1,45 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe LitmusPaper::Dependency::HaproxyBackends do
|
4
|
-
run_in_reactor
|
5
|
-
|
6
|
-
module StubHaproxy
|
7
|
-
def receive_data(data)
|
8
|
-
send_data(<<-DATA)
|
9
|
-
# pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,
|
10
|
-
stats,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,
|
11
|
-
stats_backend,BACKEND,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,0,35,0,,1,2,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,
|
12
|
-
yellow,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,3,0,,,,0,0,0,0,,,,,,,,,,,0,0,0,,,
|
13
|
-
yellow_cluster,node1,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,1,0,0,1,35,35,,1,4,1,,0,,2,0,,0,L4CON,,0,,,,,,,0,,,,0,0,
|
14
|
-
yellow_cluster,node2,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,1,35,35,,1,4,1,,0,,2,0,,0,L4CON,,0,,,,,,,0,,,,0,0,
|
15
|
-
yellow_cluster,node3,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,1,34,34,,1,4,2,,0,,2,0,,0,L4CON,,0,,,,,,,0,,,,0,0,
|
16
|
-
yellow_cluster,BACKEND,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,1,34,34,,1,4,0,,0,,1,0,,0,,,,,,,,,,,,,,0,0,
|
17
|
-
orange,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,5,0,,,,0,0,0,0,,,,,,,,,,,0,0,0,,,
|
18
|
-
orange_cluster,orange1,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,0,35,0,,1,6,1,,0,,2,0,,0,L4OK,,5,,,,,,,0,,,,0,0,
|
19
|
-
orange_cluster,orange2,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,0,35,0,,1,6,1,,0,,2,0,,0,L4OK,,5,,,,,,,0,,,,0,0,
|
20
|
-
orange_cluster,BACKEND,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,DOWN,1,1,0,,0,35,0,,1,6,0,,0,,1,0,,0,,,,,,,,,,,,,,0,0,
|
21
|
-
|
22
|
-
DATA
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
4
|
describe "available?" do
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
ensure
|
32
|
-
FileUtils.rm("/tmp/haproxy.#{Process.pid}")
|
33
|
-
end
|
5
|
+
before(:each) do
|
6
|
+
FileUtils.rm_rf("/tmp/stub-haproxy-stats")
|
7
|
+
system "spec/support/haproxy_test_socket /tmp/stub-haproxy-stats &"
|
8
|
+
sleep 1
|
34
9
|
end
|
35
10
|
|
36
11
|
it "is available if at least one backend is up" do
|
37
|
-
haproxy = LitmusPaper::Dependency::HaproxyBackends.new("/tmp/haproxy
|
12
|
+
haproxy = LitmusPaper::Dependency::HaproxyBackends.new("/tmp/stub-haproxy-stats", "yellow_cluster")
|
38
13
|
haproxy.should be_available
|
39
14
|
end
|
40
15
|
|
41
16
|
it "returns 0 if no nodes are available" do
|
42
|
-
haproxy = LitmusPaper::Dependency::HaproxyBackends.new("/tmp/haproxy
|
17
|
+
haproxy = LitmusPaper::Dependency::HaproxyBackends.new("/tmp/stub-haproxy-stats", "orange_cluster")
|
43
18
|
haproxy.should_not be_available
|
44
19
|
end
|
45
20
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe LitmusPaper::Dependency::HTTP do
|
4
|
-
run_in_reactor
|
5
|
-
|
6
4
|
before(:all) do
|
7
5
|
server_start = system "bundle exec rackup spec/support/http_test_server_config.ru --port 9294 --pid /tmp/http-test-server.pid --daemonize"
|
8
6
|
SpecHelper.wait_for_service :host => '127.0.0.1', :port => 9294
|
@@ -1,37 +1,27 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe LitmusPaper::Dependency::TCP do
|
4
|
-
|
4
|
+
before(:all) do
|
5
|
+
@server = TCPServer.new 3333
|
6
|
+
end
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@server = EM.start_server('127.0.0.1', 3333)
|
10
|
-
spec.run
|
11
|
-
ensure
|
12
|
-
EM.stop_server @server if @server
|
13
|
-
end
|
14
|
-
end
|
8
|
+
after(:all) do
|
9
|
+
@server.close
|
10
|
+
end
|
15
11
|
|
12
|
+
describe "#available?" do
|
16
13
|
it "is true when it's able to reach the ip and port" do
|
17
14
|
check = LitmusPaper::Dependency::TCP.new("127.0.0.1", 3333)
|
18
15
|
check.should be_available
|
19
16
|
end
|
20
17
|
|
21
|
-
it "cancels the timer when successful" do
|
22
|
-
SpecHelper.ensure_no_outstanding_timers do
|
23
|
-
check = LitmusPaper::Dependency::TCP.new("127.0.0.1", 3333)
|
24
|
-
check.should be_available
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
18
|
it "is false when the ip is not available" do
|
29
|
-
check = LitmusPaper::Dependency::TCP.new("
|
19
|
+
check = LitmusPaper::Dependency::TCP.new("10.254.254.254", 3333)
|
30
20
|
check.should_not be_available
|
31
21
|
end
|
32
22
|
|
33
23
|
it "is false when the port is not available" do
|
34
|
-
check = LitmusPaper::Dependency::TCP.new("127.0.0.1", 3334
|
24
|
+
check = LitmusPaper::Dependency::TCP.new("127.0.0.1", 3334)
|
35
25
|
check.should_not be_available
|
36
26
|
end
|
37
27
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe LitmusPaper::Metric::AvailableMemory do
|
4
|
-
run_in_reactor
|
5
|
-
|
6
4
|
describe "#current_health" do
|
7
5
|
it "multiplies weight by memory available" do
|
8
6
|
facter = StubFacter.new({"memorytotal" => "10 GB", "memoryfree" => "5 GB"})
|
@@ -10,24 +8,12 @@ describe LitmusPaper::Metric::AvailableMemory do
|
|
10
8
|
memory.current_health.should == 25
|
11
9
|
end
|
12
10
|
|
13
|
-
it "multiplies weight by memory available when handling floating point values" do
|
14
|
-
facter = StubFacter.new({"memorytotal" => "2.0 GB", "memoryfree" => "1.8 GB"})
|
15
|
-
memory = LitmusPaper::Metric::AvailableMemory.new(50, facter)
|
16
|
-
memory.current_health.should == 44
|
17
|
-
end
|
18
|
-
|
19
11
|
describe "#memory_total" do
|
20
12
|
it "is a positive integer" do
|
21
13
|
metric = LitmusPaper::Metric::AvailableMemory.new(50)
|
22
14
|
metric.memory_total.should > 1_000
|
23
15
|
end
|
24
16
|
|
25
|
-
it "handles floating point values properly" do
|
26
|
-
facter = StubFacter.new("memorytotal" => "1.80 GB")
|
27
|
-
memory = LitmusPaper::Metric::AvailableMemory.new(50, facter)
|
28
|
-
memory.memory_total.should == 1932735283
|
29
|
-
end
|
30
|
-
|
31
17
|
it "is cached" do
|
32
18
|
Facter.should_receive(:value).once.and_return("10 MB")
|
33
19
|
metric = LitmusPaper::Metric::AvailableMemory.new(50)
|
@@ -42,12 +28,6 @@ describe LitmusPaper::Metric::AvailableMemory do
|
|
42
28
|
metric = LitmusPaper::Metric::AvailableMemory.new(50)
|
43
29
|
metric.memory_free.should > 100
|
44
30
|
end
|
45
|
-
|
46
|
-
it "handles floating point values properly" do
|
47
|
-
facter = StubFacter.new("memoryfree" => "1.80 GB")
|
48
|
-
memory = LitmusPaper::Metric::AvailableMemory.new(50, facter)
|
49
|
-
memory.memory_free.should == 1932735283
|
50
|
-
end
|
51
31
|
end
|
52
32
|
|
53
33
|
describe "#to_s" do
|
data/spec/litmus_paper_spec.rb
CHANGED
@@ -3,16 +3,14 @@ require 'spec_helper'
|
|
3
3
|
describe LitmusPaper do
|
4
4
|
describe 'configure' do
|
5
5
|
it 'populates services from the config file' do
|
6
|
-
LitmusPaper.
|
7
|
-
LitmusPaper.configure!
|
6
|
+
LitmusPaper.configure(TEST_CONFIG)
|
8
7
|
LitmusPaper.services.has_key?('test').should == true
|
9
8
|
end
|
10
9
|
end
|
11
10
|
|
12
11
|
describe "reload" do
|
13
12
|
it "will reconfigure the services" do
|
14
|
-
LitmusPaper.
|
15
|
-
LitmusPaper.configure!
|
13
|
+
LitmusPaper.configure(TEST_CONFIG)
|
16
14
|
LitmusPaper.services["bar"] = :service
|
17
15
|
|
18
16
|
LitmusPaper.reload
|
@@ -22,18 +20,20 @@ describe LitmusPaper do
|
|
22
20
|
end
|
23
21
|
|
24
22
|
it "keeps the old config if there are errors in the new config" do
|
25
|
-
|
23
|
+
old_config_file = SpecHelper.create_temp_file(<<-END)
|
26
24
|
service :old_service do |s|
|
27
25
|
s.measure_health Metric::CPULoad, :weight => 100
|
28
26
|
end
|
29
27
|
END
|
30
|
-
|
31
|
-
LitmusPaper.config_file = SpecHelper.create_temp_file(<<-END)
|
28
|
+
new_bad_config_file = SpecHelper.create_temp_file(<<-END)
|
32
29
|
service :old_service do |s|
|
33
30
|
syntax error here
|
34
31
|
end
|
35
32
|
END
|
36
|
-
LitmusPaper.
|
33
|
+
LitmusPaper.configure(old_config_file)
|
34
|
+
LitmusPaper.services.keys.should == ["old_service"]
|
35
|
+
LitmusPaper.configure(new_bad_config_file)
|
36
|
+
LitmusPaper.services.keys.should == ["old_service"]
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -14,18 +14,6 @@ RSpec.configure do |config|
|
|
14
14
|
config.before :each do
|
15
15
|
FileUtils.rm_rf(LitmusPaper.config_dir)
|
16
16
|
LitmusPaper.reset
|
17
|
-
LitmusPaper.logger = NullLogger.new
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def run_in_reactor(timeout = 5)
|
22
|
-
around(:each) do |spec|
|
23
|
-
EM.synchrony do
|
24
|
-
sig = EM.add_timer(timeout) { fail "timeout!"; EM.stop }
|
25
|
-
spec.run
|
26
|
-
EM.cancel_timer(sig)
|
27
|
-
EM.stop
|
28
|
-
end
|
29
17
|
end
|
30
18
|
end
|
31
19
|
|
@@ -37,15 +25,6 @@ module SpecHelper
|
|
37
25
|
file.path
|
38
26
|
end
|
39
27
|
|
40
|
-
def self.ensure_no_outstanding_timers(&block)
|
41
|
-
timer_keys = EM.instance_variable_get("@timers").keys
|
42
|
-
yield
|
43
|
-
new_timer_keys = EM.instance_variable_get("@timers").keys - timer_keys
|
44
|
-
new_timer_keys.each do |timer_key|
|
45
|
-
EM.instance_variable_get("@timers")[timer_key].should == false
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
28
|
def self.wait_for_service(options)
|
50
29
|
Timeout::timeout(options[:timeout] || 20) do
|
51
30
|
loop do
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
UNIXServer.open(ARGV[0]) do |server|
|
6
|
+
socket = server.accept
|
7
|
+
socket.puts <<-DATA
|
8
|
+
# pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,
|
9
|
+
stats,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,
|
10
|
+
stats_backend,BACKEND,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,0,35,0,,1,2,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,
|
11
|
+
yellow,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,3,0,,,,0,0,0,0,,,,,,,,,,,0,0,0,,,
|
12
|
+
yellow_cluster,node1,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,1,0,0,1,35,35,,1,4,1,,0,,2,0,,0,L4CON,,0,,,,,,,0,,,,0,0,
|
13
|
+
yellow_cluster,node2,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,1,35,35,,1,4,1,,0,,2,0,,0,L4CON,,0,,,,,,,0,,,,0,0,
|
14
|
+
yellow_cluster,node3,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,1,34,34,,1,4,2,,0,,2,0,,0,L4CON,,0,,,,,,,0,,,,0,0,
|
15
|
+
yellow_cluster,BACKEND,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,1,34,34,,1,4,0,,0,,1,0,,0,,,,,,,,,,,,,,0,0,
|
16
|
+
orange,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,5,0,,,,0,0,0,0,,,,,,,,,,,0,0,0,,,
|
17
|
+
orange_cluster,orange1,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,0,35,0,,1,6,1,,0,,2,0,,0,L4OK,,5,,,,,,,0,,,,0,0,
|
18
|
+
orange_cluster,orange2,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,0,35,0,,1,6,1,,0,,2,0,,0,L4OK,,5,,,,,,,0,,,,0,0,
|
19
|
+
orange_cluster,BACKEND,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,DOWN,1,1,0,,0,35,0,,1,6,0,,0,,1,0,,0,,,,,,,,,,,,,,0,0,
|
20
|
+
DATA
|
21
|
+
socket.close
|
22
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: litmus_paper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,33 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: thin
|
16
|
-
requirement: &70141208657940 !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 1.3.1
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: *70141208657940
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: async-rack
|
27
|
-
requirement: &70141208657480 !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
|
-
requirements:
|
30
|
-
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 0.5.1
|
33
|
-
type: :runtime
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *70141208657480
|
36
14
|
- !ruby/object:Gem::Dependency
|
37
15
|
name: sinatra
|
38
|
-
requirement: &
|
16
|
+
requirement: &70190125701040 !ruby/object:Gem::Requirement
|
39
17
|
none: false
|
40
18
|
requirements:
|
41
19
|
- - ~>
|
@@ -43,21 +21,10 @@ dependencies:
|
|
43
21
|
version: 1.3.2
|
44
22
|
type: :runtime
|
45
23
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: rack-fiber_pool
|
49
|
-
requirement: &70141208656540 !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
|
-
requirements:
|
52
|
-
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0.9'
|
55
|
-
type: :runtime
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: *70141208656540
|
24
|
+
version_requirements: *70190125701040
|
58
25
|
- !ruby/object:Gem::Dependency
|
59
26
|
name: facter
|
60
|
-
requirement: &
|
27
|
+
requirement: &70190125700200 !ruby/object:Gem::Requirement
|
61
28
|
none: false
|
62
29
|
requirements:
|
63
30
|
- - ~>
|
@@ -65,109 +32,62 @@ dependencies:
|
|
65
32
|
version: 1.6.7
|
66
33
|
type: :runtime
|
67
34
|
prerelease: false
|
68
|
-
version_requirements: *
|
35
|
+
version_requirements: *70190125700200
|
69
36
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
71
|
-
requirement: &
|
37
|
+
name: SyslogLogger
|
38
|
+
requirement: &70190125698680 !ruby/object:Gem::Requirement
|
72
39
|
none: false
|
73
40
|
requirements:
|
74
|
-
- -
|
41
|
+
- - =
|
75
42
|
- !ruby/object:Gem::Version
|
76
|
-
version: 1.
|
77
|
-
- - <
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version: 1.0.0.beta.100
|
43
|
+
version: 1.4.1
|
80
44
|
type: :runtime
|
81
45
|
prerelease: false
|
82
|
-
version_requirements: *
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: em-http-request
|
85
|
-
requirement: &70141208654800 !ruby/object:Gem::Requirement
|
86
|
-
none: false
|
87
|
-
requirements:
|
88
|
-
- - ~>
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
version: '1.0'
|
91
|
-
type: :runtime
|
92
|
-
prerelease: false
|
93
|
-
version_requirements: *70141208654800
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: em-synchrony
|
96
|
-
requirement: &70141208654320 !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ~>
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '1.0'
|
102
|
-
type: :runtime
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: *70141208654320
|
105
|
-
- !ruby/object:Gem::Dependency
|
106
|
-
name: em-resolv-replace
|
107
|
-
requirement: &70141208653820 !ruby/object:Gem::Requirement
|
108
|
-
none: false
|
109
|
-
requirements:
|
110
|
-
- - ~>
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version: '1.1'
|
113
|
-
type: :runtime
|
114
|
-
prerelease: false
|
115
|
-
version_requirements: *70141208653820
|
116
|
-
- !ruby/object:Gem::Dependency
|
117
|
-
name: em-syslog
|
118
|
-
requirement: &70141208653340 !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
|
-
requirements:
|
121
|
-
- - ~>
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: 0.0.2
|
124
|
-
type: :runtime
|
125
|
-
prerelease: false
|
126
|
-
version_requirements: *70141208653340
|
46
|
+
version_requirements: *70190125698680
|
127
47
|
- !ruby/object:Gem::Dependency
|
128
48
|
name: rspec
|
129
|
-
requirement: &
|
49
|
+
requirement: &70190125696660 !ruby/object:Gem::Requirement
|
130
50
|
none: false
|
131
51
|
requirements:
|
132
|
-
- -
|
52
|
+
- - =
|
133
53
|
- !ruby/object:Gem::Version
|
134
54
|
version: 2.9.0
|
135
55
|
type: :development
|
136
56
|
prerelease: false
|
137
|
-
version_requirements: *
|
57
|
+
version_requirements: *70190125696660
|
138
58
|
- !ruby/object:Gem::Dependency
|
139
59
|
name: rack-test
|
140
|
-
requirement: &
|
60
|
+
requirement: &70190125694260 !ruby/object:Gem::Requirement
|
141
61
|
none: false
|
142
62
|
requirements:
|
143
|
-
- -
|
63
|
+
- - =
|
144
64
|
- !ruby/object:Gem::Version
|
145
65
|
version: 0.6.1
|
146
66
|
type: :development
|
147
67
|
prerelease: false
|
148
|
-
version_requirements: *
|
68
|
+
version_requirements: *70190125694260
|
149
69
|
- !ruby/object:Gem::Dependency
|
150
70
|
name: rake
|
151
|
-
requirement: &
|
71
|
+
requirement: &70190125693180 !ruby/object:Gem::Requirement
|
152
72
|
none: false
|
153
73
|
requirements:
|
154
|
-
- -
|
74
|
+
- - ! '>='
|
155
75
|
- !ruby/object:Gem::Version
|
156
|
-
version: 0
|
76
|
+
version: '0'
|
157
77
|
type: :development
|
158
78
|
prerelease: false
|
159
|
-
version_requirements: *
|
79
|
+
version_requirements: *70190125693180
|
160
80
|
- !ruby/object:Gem::Dependency
|
161
81
|
name: rake_commit
|
162
|
-
requirement: &
|
82
|
+
requirement: &70190125691740 !ruby/object:Gem::Requirement
|
163
83
|
none: false
|
164
84
|
requirements:
|
165
|
-
- -
|
85
|
+
- - =
|
166
86
|
- !ruby/object:Gem::Version
|
167
87
|
version: '0.13'
|
168
88
|
type: :development
|
169
89
|
prerelease: false
|
170
|
-
version_requirements: *
|
90
|
+
version_requirements: *70190125691740
|
171
91
|
description: Backend health tester for HA Services
|
172
92
|
email:
|
173
93
|
- code@getbraintree.com
|
@@ -194,7 +114,6 @@ files:
|
|
194
114
|
- lib/litmus_paper/cli/admin.rb
|
195
115
|
- lib/litmus_paper/cli/server.rb
|
196
116
|
- lib/litmus_paper/configuration.rb
|
197
|
-
- lib/litmus_paper/deferred_facter.rb
|
198
117
|
- lib/litmus_paper/dependency/haproxy_backends.rb
|
199
118
|
- lib/litmus_paper/dependency/http.rb
|
200
119
|
- lib/litmus_paper/dependency/tcp.rb
|
@@ -206,16 +125,11 @@ files:
|
|
206
125
|
- lib/litmus_paper/service.rb
|
207
126
|
- lib/litmus_paper/status_file.rb
|
208
127
|
- lib/litmus_paper/version.rb
|
209
|
-
- lib/sinatra/synchrony.rb
|
210
|
-
- lib/thin/backends/tcp_server_with_callbacks.rb
|
211
|
-
- lib/thin/callback_rack_handler.rb
|
212
|
-
- lib/thin/callbacks.rb
|
213
128
|
- litmus_paper.gemspec
|
214
129
|
- spec/litmus_paper/app_spec.rb
|
215
130
|
- spec/litmus_paper/cli/admin_spec.rb
|
216
131
|
- spec/litmus_paper/cli/server_spec.rb
|
217
132
|
- spec/litmus_paper/configuration_spec.rb
|
218
|
-
- spec/litmus_paper/deferred_facter_spec.rb
|
219
133
|
- spec/litmus_paper/dependency/haproxy_backends_spec.rb
|
220
134
|
- spec/litmus_paper/dependency/http_spec.rb
|
221
135
|
- spec/litmus_paper/dependency/tcp_spec.rb
|
@@ -233,10 +147,10 @@ files:
|
|
233
147
|
- spec/support/config.d/passing_test.config
|
234
148
|
- spec/support/config.d/test.config
|
235
149
|
- spec/support/constant_metric.rb
|
150
|
+
- spec/support/haproxy_test_socket
|
236
151
|
- spec/support/http_test_server.rb
|
237
152
|
- spec/support/http_test_server_config.ru
|
238
153
|
- spec/support/never_available_dependency.rb
|
239
|
-
- spec/support/null_logger.rb
|
240
154
|
- spec/support/stdout_logger.rb
|
241
155
|
- spec/support/stub_facter.rb
|
242
156
|
- spec/support/test.config
|
@@ -252,7 +166,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
252
166
|
requirements:
|
253
167
|
- - ! '>='
|
254
168
|
- !ruby/object:Gem::Version
|
255
|
-
version:
|
169
|
+
version: '0'
|
256
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
257
171
|
none: false
|
258
172
|
requirements:
|
@@ -270,7 +184,6 @@ test_files:
|
|
270
184
|
- spec/litmus_paper/cli/admin_spec.rb
|
271
185
|
- spec/litmus_paper/cli/server_spec.rb
|
272
186
|
- spec/litmus_paper/configuration_spec.rb
|
273
|
-
- spec/litmus_paper/deferred_facter_spec.rb
|
274
187
|
- spec/litmus_paper/dependency/haproxy_backends_spec.rb
|
275
188
|
- spec/litmus_paper/dependency/http_spec.rb
|
276
189
|
- spec/litmus_paper/dependency/tcp_spec.rb
|
@@ -288,10 +201,10 @@ test_files:
|
|
288
201
|
- spec/support/config.d/passing_test.config
|
289
202
|
- spec/support/config.d/test.config
|
290
203
|
- spec/support/constant_metric.rb
|
204
|
+
- spec/support/haproxy_test_socket
|
291
205
|
- spec/support/http_test_server.rb
|
292
206
|
- spec/support/http_test_server_config.ru
|
293
207
|
- spec/support/never_available_dependency.rb
|
294
|
-
- spec/support/null_logger.rb
|
295
208
|
- spec/support/stdout_logger.rb
|
296
209
|
- spec/support/stub_facter.rb
|
297
210
|
- spec/support/test.config
|
data/lib/sinatra/synchrony.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
# inlined from sinatra-synchrony
|
2
|
-
require 'sinatra/base'
|
3
|
-
require 'rack/fiber_pool'
|
4
|
-
require 'eventmachine'
|
5
|
-
require 'em-http-request'
|
6
|
-
require 'em-synchrony'
|
7
|
-
require 'em-resolv-replace'
|
8
|
-
|
9
|
-
module Sinatra
|
10
|
-
module Synchrony
|
11
|
-
def self.registered(app)
|
12
|
-
app.disable :threaded
|
13
|
-
end
|
14
|
-
|
15
|
-
def setup_sessions(builder)
|
16
|
-
builder.use Rack::FiberPool, {:rescue_exception => handle_exception } unless test?
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
def handle_exception
|
21
|
-
Proc.new do |env, e|
|
22
|
-
if settings.show_exceptions?
|
23
|
-
request = Sinatra::Request.new(env)
|
24
|
-
printer = Sinatra::ShowExceptions.new(proc{ raise e })
|
25
|
-
s, h, b = printer.call(env)
|
26
|
-
[s, h, b]
|
27
|
-
else
|
28
|
-
LitmusPaper.logger.info(e)
|
29
|
-
[500, {}, ""]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class << self
|
35
|
-
def overload_tcpsocket!
|
36
|
-
require 'sinatra/synchrony/tcpsocket'
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
register Synchrony
|
41
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Thin
|
2
|
-
module Backends
|
3
|
-
class TcpServerWithCallbacks < TcpServer
|
4
|
-
def initialize(host, port, options)
|
5
|
-
super(host, port)
|
6
|
-
end
|
7
|
-
|
8
|
-
def connect
|
9
|
-
super
|
10
|
-
Thin::Callbacks.after_connect_callbacks.each { |callback| callback.call }
|
11
|
-
end
|
12
|
-
|
13
|
-
def disconnect
|
14
|
-
Thin::Callbacks.before_disconnect_callbacks.each { |callback| callback.call }
|
15
|
-
super
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Thin
|
2
|
-
class CallbackRackHandler
|
3
|
-
def self.run(app, options)
|
4
|
-
server = ::Thin::Server.new(options[:Host] || '0.0.0.0',
|
5
|
-
options[:Port] || 8080,
|
6
|
-
app,
|
7
|
-
options)
|
8
|
-
yield server if block_given?
|
9
|
-
server.start
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
Rack::Handler.register 'thin-with-callbacks', Thin::CallbackRackHandler
|
data/lib/thin/callbacks.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module Thin
|
2
|
-
class Callbacks
|
3
|
-
def self.after_connect_callbacks
|
4
|
-
@after_connect_callbacks ||= []
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.after_connect(&block)
|
8
|
-
after_connect_callbacks << block
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.before_disconnect_callbacks
|
12
|
-
@before_disconnect_callbacks ||= []
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.before_disconnect(&block)
|
16
|
-
before_disconnect_callbacks << block
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe LitmusPaper::DeferredFacter do
|
4
|
-
run_in_reactor
|
5
|
-
|
6
|
-
describe "value" do
|
7
|
-
it "executes Facter access on another thread" do
|
8
|
-
processors = LitmusPaper::DeferredFacter.value("processorcount")
|
9
|
-
processors.should match(/\d+/)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|