Class: ConsulDo::Elect
- Inherits:
-
Object
- Object
- ConsulDo::Elect
- Defined in:
- lib/consul_do/elect.rb
Instance Method Summary collapse
- #base_url ⇒ Object
- #cleanup ⇒ Object
- #create_session ⇒ Object
- #delete_session(session_id = session) ⇒ Object
- #delete_sessions ⇒ Object
- #get_key ⇒ Object
- #get_lock ⇒ Object
- #get_session_info(session_id) ⇒ Object
-
#initialize {|ConsulDo.configure!| ... } ⇒ Elect
constructor
A new instance of Elect.
- #is_leader? ⇒ Boolean
- #parse_json(json_blob, default_value) ⇒ Object
- #session ⇒ Object
- #session_has_lock? ⇒ Boolean
- #token_str ⇒ Object
Constructor Details
#initialize {|ConsulDo.configure!| ... } ⇒ Elect
Returns a new instance of Elect.
6 7 8 |
# File 'lib/consul_do/elect.rb', line 6 def initialize() yield ConsulDo.configure! if block_given? end |
Instance Method Details
#base_url ⇒ Object
10 11 12 |
# File 'lib/consul_do/elect.rb', line 10 def base_url "http://#{ConsulDo.config.host}:#{ConsulDo.config.port}" end |
#cleanup ⇒ Object
98 99 100 |
# File 'lib/consul_do/elect.rb', line 98 def cleanup delete_session unless session_has_lock? end |
#create_session ⇒ Object
34 35 36 37 38 39 |
# File 'lib/consul_do/elect.rb', line 34 def create_session url = "#{base_url}/v1/session/create" response = ConsulDo.http_put(url, {'name' => ConsulDo.config.session_name}) ConsulDo.log "create_session", parse_json(response.body, {})['ID'] or raise "Could not create session: #{response.code} - #{response.message} (#{response.body})" end |
#delete_session(session_id = session) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/consul_do/elect.rb', line 45 def delete_session(session_id = session) url = "#{base_url}/v1/session/destroy/#{session_id}" response = ConsulDo.http_put(url) case response when Net::HTTPSuccess @session = nil else raise "Could not delete session: #{response.code} - #{response.message} (#{response.body})" end response end |
#delete_sessions ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/consul_do/elect.rb', line 58 def delete_sessions url = "#{base_url}/v1/session/node/#{get_session_info(session)['Node']}" response = ConsulDo.http_get(url) parse_json(response.body, []).each do |session_hash| if block_given? delete_session(session_hash['ID']) if yield session_hash['Name'] else delete_session(session_hash['ID']) if session_hash['Name'] == ConsulDo.config.session_name end end end |
#get_key ⇒ Object
14 15 16 17 18 |
# File 'lib/consul_do/elect.rb', line 14 def get_key url = "#{base_url}/v1/kv/service/#{ConsulDo.config.key}/leader?" + token_str response = ConsulDo.http_get(url) ConsulDo.log "get_key", parse_json(response.body, [{}]).first end |
#get_lock ⇒ Object
78 79 80 81 82 |
# File 'lib/consul_do/elect.rb', line 78 def get_lock url = "#{base_url}/v1/kv/service/#{ConsulDo.config.key}/leader?acquire=#{session}" + token_str response = ConsulDo.http_put(url, {'updated' => Time.now}) @session_has_lock = true if response.body == "true" end |
#get_session_info(session_id) ⇒ Object
28 29 30 31 32 |
# File 'lib/consul_do/elect.rb', line 28 def get_session_info(session_id) url = "#{base_url}/v1/session/info/#{session_id}" response = ConsulDo.http_get(url) ConsulDo.log "get_session_info", parse_json(response.body, []).first or raise "Invalid Session" end |
#is_leader? ⇒ Boolean
88 89 90 91 92 93 94 95 96 |
# File 'lib/consul_do/elect.rb', line 88 def is_leader? leader_session = get_key['Session'] if (leader_session && (session_has_lock? || get_session_info(leader_session)['Node'] == get_session_info(session)['Node'])) ConsulDo.log "is_leader?", true else ConsulDo.log "is_leader?", false end end |
#parse_json(json_blob, default_value) ⇒ Object
20 21 22 23 24 25 26 |
# File 'lib/consul_do/elect.rb', line 20 def parse_json(json_blob, default_value) begin JSON.parse(json_blob) rescue JSON::ParserError, TypeError default_value end end |
#session ⇒ Object
41 42 43 |
# File 'lib/consul_do/elect.rb', line 41 def session ConsulDo.log "session", @session ||= create_session end |
#session_has_lock? ⇒ Boolean
84 85 86 |
# File 'lib/consul_do/elect.rb', line 84 def session_has_lock? @session_has_lock end |
#token_str ⇒ Object
70 71 72 73 74 75 76 |
# File 'lib/consul_do/elect.rb', line 70 def token_str if ConsulDo.config.token "&token=#{ConsulDo.config.token}" else "" end end |