proxymgr 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/.rubocop.yml +11 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +52 -0
- data/README.md +99 -0
- data/Rakefile +5 -0
- data/bin/proxymgr +74 -0
- data/etc/haproxy.cfg.erb +11 -0
- data/examples/config.yml +5 -0
- data/lib/proxymgr.rb +20 -0
- data/lib/proxymgr/callbacks.rb +17 -0
- data/lib/proxymgr/config.rb +130 -0
- data/lib/proxymgr/haproxy.rb +51 -0
- data/lib/proxymgr/haproxy/control.rb +46 -0
- data/lib/proxymgr/haproxy/process.rb +107 -0
- data/lib/proxymgr/haproxy/server.rb +24 -0
- data/lib/proxymgr/haproxy/socket.rb +67 -0
- data/lib/proxymgr/haproxy/socket_manager.rb +62 -0
- data/lib/proxymgr/haproxy/state.rb +124 -0
- data/lib/proxymgr/haproxy/updater.rb +74 -0
- data/lib/proxymgr/logging.rb +26 -0
- data/lib/proxymgr/platform.rb +16 -0
- data/lib/proxymgr/platform/linux.rb +9 -0
- data/lib/proxymgr/process_manager.rb +101 -0
- data/lib/proxymgr/process_manager/signal_handler.rb +44 -0
- data/lib/proxymgr/service_config.rb +12 -0
- data/lib/proxymgr/service_config/base.rb +16 -0
- data/lib/proxymgr/service_config/zookeeper.rb +33 -0
- data/lib/proxymgr/service_manager.rb +53 -0
- data/lib/proxymgr/sink.rb +100 -0
- data/lib/proxymgr/watcher.rb +9 -0
- data/lib/proxymgr/watcher/base.rb +75 -0
- data/lib/proxymgr/watcher/campanja_zk.rb +20 -0
- data/lib/proxymgr/watcher/dns.rb +36 -0
- data/lib/proxymgr/watcher/file.rb +45 -0
- data/lib/proxymgr/watcher/zookeeper.rb +61 -0
- data/packaging/profile.sh +1 -0
- data/packaging/recipe.rb +35 -0
- data/proxymgr.gemspec +20 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/support/dummy_watcher.rb +21 -0
- data/spec/support/fake_proxy.rb +15 -0
- data/spec/support/fake_zookeeper.rb +170 -0
- data/spec/support/mock_servers.rb +7 -0
- data/spec/unit/haproxy/socket_manager_spec.rb +40 -0
- data/spec/unit/haproxy/updater_spec.rb +123 -0
- data/spec/unit/service_manager_spec.rb +49 -0
- data/spec/unit/sink_spec.rb +41 -0
- data/spec/unit/watcher/base_spec.rb +27 -0
- metadata +188 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ProxyMgr::Haproxy::SocketManager, '#update' do
|
4
|
+
before(:each) do
|
5
|
+
@sm = ProxyMgr::Haproxy::SocketManager.new
|
6
|
+
Socket.any_instance.stub(:bind) { true }
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'creates new sockets when none exist' do
|
10
|
+
watcher = double(ProxyMgr::Watcher::Base)
|
11
|
+
watcher.stub(:port) { 9090 }
|
12
|
+
@sm.update({"test" => watcher})
|
13
|
+
@sm.sockets[9090].should be_kind_of(Socket)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'deletes sockets which are no longer part of the state' do
|
17
|
+
ports = [9090, 9091]
|
18
|
+
watchers = Hash[ports.map do |port|
|
19
|
+
watcher = double(ProxyMgr::Watcher::Base)
|
20
|
+
watcher.stub(:port) { port }
|
21
|
+
["service_" + port.to_s, watcher]
|
22
|
+
end]
|
23
|
+
@sm.update(watchers)
|
24
|
+
ports.each do |port|
|
25
|
+
@sm.sockets[port].should be_kind_of(Socket)
|
26
|
+
end
|
27
|
+
watchers.delete("service_9090")
|
28
|
+
Socket.any_instance.should_receive(:close)
|
29
|
+
@sm.update(watchers)
|
30
|
+
@sm.sockets[9091].should be_kind_of(Socket)
|
31
|
+
@sm.sockets[9090].should == nil
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'sets SO_REUSEADDR on sockets' do
|
35
|
+
watcher = double(ProxyMgr::Watcher::Base)
|
36
|
+
watcher.stub(:port) { 9090 }
|
37
|
+
Socket.any_instance.should_receive(:setsockopt).with(::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, 1)
|
38
|
+
@sm.update("test" => watcher)
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ProxyMgr::Haproxy::Updater, '#produce_changeset' do
|
4
|
+
before do
|
5
|
+
@socket = double(ProxyMgr::Haproxy::Socket)
|
6
|
+
@sm = double(ProxyMgr::ServiceManager)
|
7
|
+
@updater = ProxyMgr::Haproxy::Updater.new(@socket)
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'stats socket not available' do
|
11
|
+
before do
|
12
|
+
@socket.stub(:connected?) { false }
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should require restarts if no stats socket is available' do
|
16
|
+
@socket.stub(:connected?) { false }
|
17
|
+
changeset = @updater.produce_changeset(nil)
|
18
|
+
changeset.restart_needed?.should == true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'stats socket available' do
|
23
|
+
before do
|
24
|
+
@socket.stub(:connected?) { true }
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'requires restarts if a new server is provided' do
|
28
|
+
@socket.should_receive(:servers) do
|
29
|
+
['a', 'b'].map { |name| new_mock_server('dummy', 'name') }
|
30
|
+
end
|
31
|
+
watcher = ProxyMgr::Watcher::Dummy.new('dummy', {}, @sm)
|
32
|
+
watcher.servers = ['a', 'b', 'c']
|
33
|
+
changeset = @updater.produce_changeset('dummy' => watcher)
|
34
|
+
changeset.restart_needed?.should == true
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'disables servers if they are already added' do
|
38
|
+
@socket.should_receive(:servers) { [] }
|
39
|
+
watcher = ProxyMgr::Watcher::Dummy.new('dummy', {}, @sm)
|
40
|
+
watcher.servers = ['a', 'b', 'c']
|
41
|
+
@updater.produce_changeset('dummy' => watcher)
|
42
|
+
@socket.should_receive(:servers) do
|
43
|
+
['a', 'b', 'c'].map { |name| new_mock_server('dummy', name) }
|
44
|
+
end
|
45
|
+
watcher = ProxyMgr::Watcher::Dummy.new('dummy', {}, @sm)
|
46
|
+
watcher.servers = ['a', 'b']
|
47
|
+
changeset = @updater.produce_changeset('dummy' => watcher)
|
48
|
+
changeset.disable.should == {'dummy' => ['c']}
|
49
|
+
changeset.restart_needed?.should == false
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'enables servers if they are down and added' do
|
53
|
+
@socket.should_receive(:servers) { [] }
|
54
|
+
watcher = ProxyMgr::Watcher::Dummy.new('dummy', {}, @sm)
|
55
|
+
watcher.servers = []
|
56
|
+
@updater.produce_changeset('dummy' => watcher)
|
57
|
+
@socket.should_receive(:servers) do
|
58
|
+
s = ['a', 'b'].map { |name| new_mock_server('dummy', name) }
|
59
|
+
s << new_mock_server('dummy', 'c', 'MAINT')
|
60
|
+
end
|
61
|
+
watcher = ProxyMgr::Watcher::Dummy.new('dummy', {}, @sm)
|
62
|
+
watcher.servers = ['a', 'b', 'c']
|
63
|
+
changeset = @updater.produce_changeset('dummy' => watcher)
|
64
|
+
changeset.enable.should == {'dummy' => ['c']}
|
65
|
+
changeset.restart_needed?.should == false
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'requires restart if a backend is added' do
|
69
|
+
@socket.should_receive(:servers) { [] }
|
70
|
+
watcher = double(ProxyMgr::Watcher::Base)
|
71
|
+
watcher.should_receive(:servers) { ['a', 'b'] }
|
72
|
+
changeset = @updater.produce_changeset('dummy' => watcher)
|
73
|
+
changeset.restart_needed?.should == true
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'requires a restart if a server has not already been added/is disabled' do
|
77
|
+
@socket.stub(:servers) do
|
78
|
+
['a', 'b'].map do |name|
|
79
|
+
new_mock_server('dummy', name)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
watcher = double(ProxyMgr::Watcher::Base)
|
83
|
+
watcher.should_receive(:servers) { ['a', 'b'] }
|
84
|
+
changeset = @updater.produce_changeset('dummy' => watcher)
|
85
|
+
watcher.should_receive(:servers) { ['a', 'b', 'c'] }
|
86
|
+
changeset = @updater.produce_changeset('dummy' => watcher)
|
87
|
+
changeset.restart_needed?.should == true
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'requires restart if a backend is deleted' do
|
91
|
+
@socket.stub(:servers) do
|
92
|
+
['a', 'b'].map do |name|
|
93
|
+
new_mock_server('dummy', name)
|
94
|
+
end
|
95
|
+
['c', 'd'].map do |name|
|
96
|
+
new_mock_server('dummy2', name)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
watcher1 = ProxyMgr::Watcher::Dummy.new('dummy', {}, @sm).tap do |w|
|
100
|
+
w.servers = ['a', 'b']
|
101
|
+
end
|
102
|
+
watcher2 = ProxyMgr::Watcher::Dummy.new('dummy2', {}, @sm).tap do |w|
|
103
|
+
w.servers = ['c', 'd']
|
104
|
+
end
|
105
|
+
@updater.produce_changeset('dummy' => watcher1,
|
106
|
+
'dummy2' => watcher2)
|
107
|
+
changeset = @updater.produce_changeset('dummy' => watcher1)
|
108
|
+
changeset.restart_needed?.should == true
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'requires restarting if listen_options is changed' do
|
112
|
+
@socket.should_receive(:servers) { [] }
|
113
|
+
watcher = ProxyMgr::Watcher::Dummy.new('dummy', {}, @sm)
|
114
|
+
watcher.servers = ['a']
|
115
|
+
@updater.produce_changeset('dummy' => watcher)
|
116
|
+
@socket.should_receive(:servers) { [new_mock_server('dummy', 'a')] }
|
117
|
+
watcher = ProxyMgr::Watcher::Dummy.new('dummy', {'listen_options' => ['test option']}, @sm)
|
118
|
+
watcher.servers = ['a']
|
119
|
+
changeset = @updater.produce_changeset('dummy' => watcher)
|
120
|
+
changeset.restart_needed?.should == true
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ProxyMgr::ServiceManager do
|
4
|
+
before(:each) do
|
5
|
+
@sink = double(ProxyMgr::Sink)
|
6
|
+
@manager = ProxyMgr::ServiceManager.new(@sink)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'adds new services' do
|
10
|
+
expect(ProxyMgr::Watcher::Dummy).to receive(:new).with('dummy', {'config' => 'thing'}, @manager)
|
11
|
+
@manager.update_service('dummy', {'type' => 'dummy', 'config' => 'thing'})
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'starts services if valid' do
|
15
|
+
expect_any_instance_of(ProxyMgr::Watcher::Dummy).to receive(:watch)
|
16
|
+
ProxyMgr::Watcher::Dummy.any_instance.stub(:valid?) { true }
|
17
|
+
@manager.update_service('dummy', {'type' => 'dummy', 'config' => 'thing'})
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'shuts down old services when replaced' do
|
21
|
+
@manager.update_service('dummy', {'type' => "dummy"})
|
22
|
+
expect_any_instance_of(ProxyMgr::Watcher::Dummy).to receive(:shutdown)
|
23
|
+
@manager.update_service('dummy', {'type' => "dummy"})
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'shuts down serviecs when deleted and notifies sink' do
|
27
|
+
@sink.should_receive(:update_backends)
|
28
|
+
@manager.update_service('dummy', {'type' => "dummy"})
|
29
|
+
expect_any_instance_of(ProxyMgr::Watcher::Dummy).to receive(:shutdown)
|
30
|
+
@manager.delete_service('dummy')
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'notifies sink when watchers are updated' do
|
34
|
+
@manager.update_service('dummy', {'type' => 'dummy'})
|
35
|
+
@sink.should_receive(:update_backends)
|
36
|
+
@manager.update_backends
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'shuts down all services and sink when shut down' do
|
40
|
+
@manager.update_service('dummy', {'type' => 'dummy'})
|
41
|
+
expect_any_instance_of(ProxyMgr::Watcher::Dummy).to receive(:shutdown)
|
42
|
+
@sink.should_receive(:shutdown)
|
43
|
+
@manager.shutdown
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'does not create services for non-existing watcher types' do
|
47
|
+
@manager.update_service('dummy', {'type' => 'NonExisting'}).should == nil
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ProxyMgr::Sink do
|
4
|
+
require 'absolute_time'
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@manager = double(ProxyMgr::ServiceManager)
|
8
|
+
@watcher = ProxyMgr::Watcher::Dummy.new('test', {'port' => 1}, @manager)
|
9
|
+
@watcher.servers = ['a', 'b']
|
10
|
+
@mutex = Mutex.new
|
11
|
+
@cv = ConditionVariable.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'calls update_backends after a delay' do
|
15
|
+
t1 = AbsoluteTime.now
|
16
|
+
elapsed = nil
|
17
|
+
proxy = ProxyMgr::FakeProxy.new do
|
18
|
+
elapsed = AbsoluteTime.now-t1
|
19
|
+
@mutex.synchronize { @cv.signal }
|
20
|
+
end
|
21
|
+
sink = ProxyMgr::Sink.new(proxy, :default_timeout => 2)
|
22
|
+
sink.update_backends('test' => @watcher)
|
23
|
+
@mutex.synchronize { @cv.wait(@mutex) }
|
24
|
+
elapsed.should >= 2
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'calls update_backends with increasing delay if interrupted' do
|
28
|
+
t1 = AbsoluteTime.now
|
29
|
+
elapsed = nil
|
30
|
+
proxy = ProxyMgr::FakeProxy.new do
|
31
|
+
elapsed = AbsoluteTime.now-t1
|
32
|
+
@mutex.synchronize { @cv.signal }
|
33
|
+
end
|
34
|
+
sink = ProxyMgr::Sink.new(proxy, :default_timeout => 2)
|
35
|
+
sink.update_backends('test' => @watcher)
|
36
|
+
sleep(1) # this is a bit of a hack. but the semantics don't lend themselves to testing very well.
|
37
|
+
sink.update_backends('test' => @watcher, 'test2' => @watcher)
|
38
|
+
@mutex.synchronize { @cv.wait(@mutex) }
|
39
|
+
elapsed.should >= 4
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ProxyMgr::Watcher::Base do
|
4
|
+
before(:each) do
|
5
|
+
@sm = double(ProxyMgr::ServiceManager)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'is valid if port is correctly specified' do
|
9
|
+
watcher = ProxyMgr::Watcher::Dummy.new('test', {'port' => 8080}, @sm)
|
10
|
+
watcher.valid?.should == true
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'does not start if port is not an integer' do
|
14
|
+
watcher = ProxyMgr::Watcher::Dummy.new('test', {'port' => 'false'}, @sm)
|
15
|
+
watcher.valid?.should == false
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'does not start if port is invalid' do
|
19
|
+
watcher = ProxyMgr::Watcher::Dummy.new('test', {'port' => 0}, @sm)
|
20
|
+
watcher.valid?.should == false
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'is valid if listen_options specified and is an array' do
|
24
|
+
watcher = ProxyMgr::Watcher::Dummy.new('test', {'port' => 65535, 'listen_options' => ['a config option', 'another']}, @sm)
|
25
|
+
watcher.valid?.should == true
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: proxymgr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Torbjörn Norinder
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-09-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: docopt
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.5.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.5.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: zoology
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: absolute_time
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yajl-ruby
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: zookeeper
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: state_machine
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Manages Haproxy configuration dynamically
|
98
|
+
email:
|
99
|
+
- torbjorn@genunix.se
|
100
|
+
executables:
|
101
|
+
- proxymgr
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
106
|
+
- ".rspec"
|
107
|
+
- ".rubocop.yml"
|
108
|
+
- Gemfile
|
109
|
+
- Gemfile.lock
|
110
|
+
- README.md
|
111
|
+
- Rakefile
|
112
|
+
- bin/proxymgr
|
113
|
+
- etc/haproxy.cfg.erb
|
114
|
+
- examples/config.yml
|
115
|
+
- lib/proxymgr.rb
|
116
|
+
- lib/proxymgr/callbacks.rb
|
117
|
+
- lib/proxymgr/config.rb
|
118
|
+
- lib/proxymgr/haproxy.rb
|
119
|
+
- lib/proxymgr/haproxy/control.rb
|
120
|
+
- lib/proxymgr/haproxy/process.rb
|
121
|
+
- lib/proxymgr/haproxy/server.rb
|
122
|
+
- lib/proxymgr/haproxy/socket.rb
|
123
|
+
- lib/proxymgr/haproxy/socket_manager.rb
|
124
|
+
- lib/proxymgr/haproxy/state.rb
|
125
|
+
- lib/proxymgr/haproxy/updater.rb
|
126
|
+
- lib/proxymgr/logging.rb
|
127
|
+
- lib/proxymgr/platform.rb
|
128
|
+
- lib/proxymgr/platform/linux.rb
|
129
|
+
- lib/proxymgr/process_manager.rb
|
130
|
+
- lib/proxymgr/process_manager/signal_handler.rb
|
131
|
+
- lib/proxymgr/service_config.rb
|
132
|
+
- lib/proxymgr/service_config/base.rb
|
133
|
+
- lib/proxymgr/service_config/zookeeper.rb
|
134
|
+
- lib/proxymgr/service_manager.rb
|
135
|
+
- lib/proxymgr/sink.rb
|
136
|
+
- lib/proxymgr/watcher.rb
|
137
|
+
- lib/proxymgr/watcher/base.rb
|
138
|
+
- lib/proxymgr/watcher/campanja_zk.rb
|
139
|
+
- lib/proxymgr/watcher/dns.rb
|
140
|
+
- lib/proxymgr/watcher/file.rb
|
141
|
+
- lib/proxymgr/watcher/zookeeper.rb
|
142
|
+
- packaging/profile.sh
|
143
|
+
- packaging/recipe.rb
|
144
|
+
- proxymgr.gemspec
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
- spec/support/dummy_watcher.rb
|
147
|
+
- spec/support/fake_proxy.rb
|
148
|
+
- spec/support/fake_zookeeper.rb
|
149
|
+
- spec/support/mock_servers.rb
|
150
|
+
- spec/unit/haproxy/socket_manager_spec.rb
|
151
|
+
- spec/unit/haproxy/updater_spec.rb
|
152
|
+
- spec/unit/service_manager_spec.rb
|
153
|
+
- spec/unit/sink_spec.rb
|
154
|
+
- spec/unit/watcher/base_spec.rb
|
155
|
+
homepage: https://github.com/campanja/proxymgr
|
156
|
+
licenses: []
|
157
|
+
metadata: {}
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
require_paths:
|
161
|
+
- lib
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
requirements: []
|
173
|
+
rubyforge_project:
|
174
|
+
rubygems_version: 2.2.2
|
175
|
+
signing_key:
|
176
|
+
specification_version: 4
|
177
|
+
summary: Manages Haproxy configuration dynamically
|
178
|
+
test_files:
|
179
|
+
- spec/spec_helper.rb
|
180
|
+
- spec/support/dummy_watcher.rb
|
181
|
+
- spec/support/fake_proxy.rb
|
182
|
+
- spec/support/fake_zookeeper.rb
|
183
|
+
- spec/support/mock_servers.rb
|
184
|
+
- spec/unit/haproxy/socket_manager_spec.rb
|
185
|
+
- spec/unit/haproxy/updater_spec.rb
|
186
|
+
- spec/unit/service_manager_spec.rb
|
187
|
+
- spec/unit/sink_spec.rb
|
188
|
+
- spec/unit/watcher/base_spec.rb
|