halb 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/halb.rb CHANGED
@@ -0,0 +1,2 @@
1
+ require 'halb/deploy'
2
+ require 'halb/load_balancer'
@@ -0,0 +1,23 @@
1
+ require 'socket'
2
+
3
+ module Halb
4
+ class Deploy
5
+ def initialize(load_balancers, machines)
6
+ @load_balancers=load_balancers
7
+ @this_computer=Socket.gethostname.downcase
8
+ @machines = machines
9
+ end
10
+
11
+ def active_balancer
12
+ @load_balancers.detect { |lb| lb.active? }
13
+ end
14
+
15
+ def remove_from_production
16
+ active_balancer.put_in_maintenance(@machines[@this_computer])
17
+ end
18
+
19
+ def put_into_production
20
+ active_balancer.remove_from_maintenance(@machines[@this_computer])
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,51 @@
1
+ require 'net/ssh'
2
+
3
+ module Halb
4
+ class LoadBalancer
5
+ SHOW_ACTIVE_HOSTS_COMMAND='ipvsadm -l -n'
6
+
7
+ def initialize(host, user, ssh_keys)
8
+ @host, @user, @ssh_keys = host, user, ssh_keys
9
+ end
10
+
11
+ def active?
12
+ !/TCP[ ]+\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/.match(get_output_of(SHOW_ACTIVE_HOSTS_COMMAND)).nil?
13
+ end
14
+
15
+ def get_output_of(command)
16
+ output=''
17
+ open_connection do |ssh|
18
+ output=ssh.exec!(command)
19
+ end
20
+ output
21
+ end
22
+
23
+ def put_in_maintenance(ip_address)
24
+ service_endpoint=service_endpoint_for(ip_address)
25
+ perform(:command => "touch /etc/ha.d/maintenance/#{service_endpoint}", :exit_when => lambda { |ssh| !ssh.exec!(SHOW_ACTIVE_HOSTS_COMMAND).include?(service_endpoint) })
26
+ end
27
+
28
+ def remove_from_maintenance(ip_address)
29
+ service_endpoint = service_endpoint_for(ip_address)
30
+ perform(:command => "rm /etc/ha.d/maintenance/#{service_endpoint}", :exit_when => lambda { |ssh| ssh.exec!(SHOW_ACTIVE_HOSTS_COMMAND).include?(service_endpoint) })
31
+ end
32
+
33
+ def service_endpoint_for(ip_address)
34
+ "#{ip_address}:80"
35
+ end
36
+
37
+ def perform(params)
38
+ open_connection do |ssh|
39
+ ssh.exec!(params[:command])
40
+ loop do
41
+ break if params[:exit_when].call(ssh)
42
+ sleep(1)
43
+ end
44
+ end
45
+ end
46
+
47
+ def open_connection(&block)
48
+ Net::SSH.start(@host, 'root', :keys => @ssh_keys, &block)
49
+ end
50
+ end
51
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: halb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-07-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &11187500 !ruby/object:Gem::Requirement
16
+ requirement: &16720700 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,21 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *11187500
24
+ version_requirements: *16720700
25
+ - !ruby/object:Gem::Dependency
26
+ name: net-ssh
27
+ requirement: &16719360 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *16719360
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: mocha
27
- requirement: &11130580 !ruby/object:Gem::Requirement
38
+ requirement: &16717980 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
@@ -32,10 +43,10 @@ dependencies:
32
43
  version: '0'
33
44
  type: :development
34
45
  prerelease: false
35
- version_requirements: *11130580
46
+ version_requirements: *16717980
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: test-unit
38
- requirement: &11129640 !ruby/object:Gem::Requirement
49
+ requirement: &17139380 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,13 +54,15 @@ dependencies:
43
54
  version: '0'
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *11129640
57
+ version_requirements: *17139380
47
58
  description:
48
59
  email:
49
60
  executables: []
50
61
  extensions: []
51
62
  extra_rdoc_files: []
52
63
  files:
64
+ - lib/halb/deploy.rb
65
+ - lib/halb/load_balancer.rb
53
66
  - lib/halb.rb
54
67
  homepage: https://github.com/TeamIguana/halb
55
68
  licenses: []