ey_stonith 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,8 +6,8 @@ require 'timeout'
6
6
  module EY
7
7
  module Stonith
8
8
  class AwsmNotifier
9
- def initialize(instance_id, uri, credentials)
10
- @instance_id, @uri, @credentials = instance_id, uri, credentials
9
+ def initialize(instance_id, uri, token)
10
+ @instance_id, @uri, @token = instance_id, uri, token
11
11
  end
12
12
 
13
13
  def notify(success, unreachable, refused)
@@ -17,11 +17,9 @@ module EY
17
17
 
18
18
  case code
19
19
  when 200...300
20
- if JSON.parse(body)['status'] == 'ok'
21
- success.call
22
- else
23
- refused.call body
24
- end
20
+ success.call
21
+ when 410
22
+ refused.call body
25
23
  else
26
24
  unreachable.call
27
25
  end
@@ -45,10 +43,10 @@ module EY
45
43
  end
46
44
 
47
45
  def payload
48
- @credentials.merge('instance_id' => @instance_id)
46
+ {'label' => @instance_id, 'token' => @token}
49
47
  end
50
48
 
51
- # ripped from restclient so we can use eventmachine
49
+ # ripped from restclient
52
50
  def process_payload(payload = nil, parent_key = nil)
53
51
  payload.keys.map do |k|
54
52
  key = parent_key ? "#{parent_key}[#{k}]" : k
@@ -1,3 +1,5 @@
1
+ require 'timeout'
2
+
1
3
  module EY
2
4
  module Stonith
3
5
  module Commands
@@ -18,7 +20,9 @@ module EY
18
20
  history << :check
19
21
 
20
22
  begin
21
- open("http://#{data.hostname}#{config.monitor_path}").read
23
+ timeout(config.monitor_timeout) do
24
+ open("http://#{data.hostname}#{config.monitor_path}").read
25
+ end
22
26
  rescue
23
27
  bad_check(data.key, data.instance_id)
24
28
  else
@@ -20,7 +20,7 @@ module EY
20
20
  notify_path.delete if notify_path.exist?
21
21
 
22
22
  database.with_data do |data|
23
- abort_if_master(data.hostname)
23
+ abort_if_master data.hostname
24
24
  notify!
25
25
  end
26
26
 
@@ -50,8 +50,8 @@ If you want to (destructively) notify AWSM that this instance is master, call wi
50
50
  end
51
51
 
52
52
  def notify!
53
- notifier = AwsmNotifier.new(config.meta_data_id, config.notify_uri, config.awsm_credentials)
54
- notifier.notify(method(:success), method(:unreachable), method(:refused))
53
+ notifier = AwsmNotifier.new config.meta_data_id, config.takeover_uri, config.endpoint_token
54
+ notifier.notify method(:success), method(:unreachable), method(:refused)
55
55
  end
56
56
 
57
57
  def success
@@ -74,7 +74,7 @@ If you want to (destructively) notify AWSM that this instance is master, call wi
74
74
  end
75
75
 
76
76
  def parser
77
- super.on('-f', '--force', "Force the command (only applicable to claim currently)") do |f|
77
+ super.on '-f', '--force', "Force the command (only applicable to claim currently)" do |f|
78
78
  @force = f
79
79
  end
80
80
  super
@@ -27,10 +27,12 @@ module EY
27
27
  'log' => '/var/log/stonith.log',
28
28
  'state_dir' => '/var/run/stonith',
29
29
  'heartbeat' => 10,
30
- 'notify_uri' => nil,
30
+ 'endpoint_uri' => nil,
31
+ 'endpoint_token' => nil,
31
32
 
32
33
  'monitor_host' => nil,
33
34
  'monitor_path' => '/haproxy/monitor',
35
+ 'monitor_timeout' => 5,
34
36
 
35
37
  'redis_host' => nil,
36
38
  'redis_port' => 6379,
@@ -69,7 +71,9 @@ Config:
69
71
  history_path: #{history_path}
70
72
  takeover_path: #{takeover_path}
71
73
 
72
- notify_uri: #{notify_uri}
74
+ endpoint_uri: #{endpoint_uri}
75
+ endpoint_token: #{endpoint_token}
76
+ takeover_uri: #{takeover_uri}
73
77
  fog_credentials: #{fog_credentials.inspect}
74
78
  awsm_credentials: #{awsm_credentials.inspect}
75
79
 
@@ -79,6 +83,7 @@ Config:
79
83
 
80
84
  monitor_host: #{monitor_host}
81
85
  monitor_path: #{monitor_path}
86
+ monitor_timeout: #{monitor_timeout}
82
87
 
83
88
  redis_host: #{redis_host}
84
89
  redis_port: #{redis_port}
@@ -96,7 +101,12 @@ Config:
96
101
  def notify_path() state_path + 'notify' end
97
102
  def history_path() state_path + 'history' end
98
103
  def takeover_path() state_path + 'takeover' end
99
- def notify_uri() URI.parse(method_missing('notify_uri')) end
104
+ def endpoint_uri() URI.parse(method_missing('endpoint_uri')) end
105
+ def takeover_uri
106
+ result = endpoint_uri
107
+ result.path << TAKEOVER_PATH
108
+ result
109
+ end
100
110
 
101
111
  def meta_data_hostname() @data['meta_data_hostname'] ||= meta_data('local-hostname') end
102
112
  def meta_data_id() @data['meta_data_id'] ||= meta_data('instance-id') end
@@ -0,0 +1,30 @@
1
+ require 'sinatra/base'
2
+ require 'json'
3
+
4
+ module EY
5
+ module Stonith
6
+ class Rackapp < Sinatra::Base
7
+ before { content_type :json }
8
+ get('/') { {}.to_json }
9
+
10
+ get HEALTH_PATH do
11
+ unless EY::Stonith.healthy?
12
+ status 503
13
+ end
14
+ {}.to_json
15
+ end
16
+
17
+ post TAKEOVER_PATH do
18
+ unless EY::Stonith.takeover(label, token)
19
+ status 410
20
+ end
21
+ {}.to_json
22
+ end
23
+
24
+ private
25
+
26
+ def label() params['label'] end
27
+ def token() params['token'] end
28
+ end
29
+ end
30
+ end
data/lib/ey_stonith.rb CHANGED
@@ -20,10 +20,34 @@ module EY
20
20
  autoload :LocalMaster, 'ey_stonith/local_master'
21
21
  autoload :Master, 'ey_stonith/master'
22
22
  autoload :MetaData, 'ey_stonith/meta_data'
23
+ autoload :Rackapp, 'ey_stonith/rackapp'
23
24
  autoload :Slave, 'ey_stonith/slave'
24
25
 
25
- def self.log_to(io) @@logger = Logger.new(io) end
26
+ HEALTH_PATH = '/health' unless defined? HEALTH_PATH
27
+ TAKEOVER_PATH = '/takeover' unless defined? TAKEOVER_PATH
28
+
29
+ def self.log_to(io) @@logger = Logger.new io end
26
30
  def self.logger() @@logger end
31
+
32
+ ### For Rackapp ###
33
+
34
+ def self.healthy?() callback_module.healthy? end
35
+
36
+ def self.takeover(label, token)
37
+ if valid? label, token
38
+ callback_module.takeover label
39
+ end
40
+ end
41
+
42
+ def self.valid?(label, token)
43
+ token_for(label) == token
44
+ end
45
+
46
+ def self.token_for(label)
47
+ callback_module.token_for label
48
+ end
49
+
50
+ class << self; attr_accessor :callback_module end
27
51
  end
28
52
  end
29
53
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
8
- - 1
9
- version: 0.2.1
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ezra Zygmuntowicz
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-04-27 00:00:00 -07:00
19
+ date: 2010-05-06 00:00:00 -07:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -59,6 +59,20 @@ dependencies:
59
59
  name: redis
60
60
  prerelease: false
61
61
  type: :runtime
62
+ - !ruby/object:Gem::Dependency
63
+ version_requirements: &id004 !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ - 9
70
+ - 6
71
+ version: 0.9.6
72
+ requirement: *id004
73
+ name: sinatra
74
+ prerelease: false
75
+ type: :runtime
62
76
  description: Shoot The Other Node In The Head
63
77
  email: awsmdev@engineyard.com
64
78
  executables:
@@ -103,6 +117,7 @@ files:
103
117
  - lib/ey_stonith/data.rb
104
118
  - lib/ey_stonith/database.rb
105
119
  - lib/ey_stonith/history.rb
120
+ - lib/ey_stonith/rackapp.rb
106
121
  - lib/ey_stonith.rb
107
122
  - bin/stonith
108
123
  - bin/stonith-check