Class: ConsulDo::Elect

Inherits:
Object
  • Object
show all
Defined in:
lib/consul_do/elect.rb

Instance Method Summary collapse

Constructor Details

#initialize {|ConsulDo.configure!| ... } ⇒ Elect

Returns a new instance of Elect.

Yields:



6
7
8
# File 'lib/consul_do/elect.rb', line 6

def initialize()
  yield ConsulDo.configure! if block_given?
end

Instance Method Details

#base_urlObject



10
11
12
# File 'lib/consul_do/elect.rb', line 10

def base_url
  "http://#{ConsulDo.config.host}:#{ConsulDo.config.port}"
end

#cleanupObject



98
99
100
# File 'lib/consul_do/elect.rb', line 98

def cleanup
  delete_session unless session_has_lock?
end

#create_sessionObject



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_sessionsObject



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_keyObject



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_lockObject



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

Returns:

  • (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

#sessionObject



41
42
43
# File 'lib/consul_do/elect.rb', line 41

def session
  ConsulDo.log "session", @session ||= create_session
end

#session_has_lock?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/consul_do/elect.rb', line 84

def session_has_lock?
  @session_has_lock
end

#token_strObject



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