class ConsulDo::Elect

Public Class Methods

new() { |configure!| ... } click to toggle source
# File lib/consul_do/elect.rb, line 6
def initialize()
  yield ConsulDo.configure! if block_given?
end

Public Instance Methods

base_url() click to toggle source
# File lib/consul_do/elect.rb, line 10
def base_url
  "http://#{ConsulDo.config.host}:#{ConsulDo.config.port}"
end
cleanup() click to toggle source
# File lib/consul_do/elect.rb, line 98
def cleanup
  delete_session unless session_has_lock?
end
create_session() click to toggle source
# 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) click to toggle source
# 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() { |session_hash| ... } click to toggle source
# 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() click to toggle source
# 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() click to toggle source
# 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) click to toggle source
# 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?() click to toggle source
# 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) click to toggle source
# 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() click to toggle source
# File lib/consul_do/elect.rb, line 41
def session
  ConsulDo.log "session", @session ||= create_session
end
session_has_lock?() click to toggle source
# File lib/consul_do/elect.rb, line 84
def session_has_lock?
  @session_has_lock
end
token_str() click to toggle source
# File lib/consul_do/elect.rb, line 70
def token_str
  if ConsulDo.config.token
    "&token=#{ConsulDo.config.token}"
  else
    ""
  end
end