Class: Capistrano::ConsulKvLock::Latch

Inherits:
Object
  • Object
show all
Defined in:
lib/capistrano/consul_kv_lock/latch.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(consul_url, options = {}) ⇒ Latch

Returns a new instance of Latch.



32
33
34
35
36
37
38
39
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 32

def initialize(consul_url, options={})
  @client = begin
             consul = URI.parse(consul_url)
             Consul::Client.v1.http(host: consul.host, port: consul.port, logger: logger)
            end
  @lock_key = options[:consul_lock_key] || 'deployment/locked'
  @session_id = nil
end

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



40
41
42
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 40

def client
  @client
end

#lock_keyObject (readonly)

Returns the value of attribute lock_key.



40
41
42
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 40

def lock_key
  @lock_key
end

Class Method Details

.instanceObject



24
25
26
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 24

def self.instance
  @_instance
end

.loggerObject



28
29
30
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 28

def self.logger
  @_logger ||= SSHKittyLogger.new
end

.set_instance(consul_url, options = {}) ⇒ Object



18
19
20
21
22
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 18

def self.set_instance(consul_url, options={})
  @_instance ||= new(consul_url, options)
  logger.debug "Registered latch instance: #{@_instance.inspect}"
  @_instance
end

Instance Method Details

#create_sessionObject



65
66
67
68
69
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 65

def create_session
  logger.debug "Session request: #{session_request.inspect}"
  r = client.put("/session/create", session_request)
  @session_id = r['ID']
end

#delete_sessionObject



71
72
73
74
75
76
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 71

def delete_session
  with_session {
    client.put("/session/destroy/#{@session_id}", "")
  }
  @session_id = nil
end

#lockObject



78
79
80
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 78

def lock
  with_session { client.put("/kv/#{lock_key}?acquire=#{@session_id}", "true") }
end

#locked?Boolean

Returns:

  • (Boolean)


53
54
55
56
57
58
59
60
61
62
63
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 53

def locked?
  r = client.get("/kv/#{lock_key}")
  !!(Base64.decode64(r[0]['Value']) =~ /\A["'](t(rue)?|1|y(es)?)["']\z/)
rescue Consul::Client::ResponseException => e
  # in case of 404
  if e.message.include?('404')
    return false
  else
    raise e
  end
end

#loggerObject



42
43
44
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 42

def logger
  self.class.logger
end

#session_requestObject



46
47
48
49
50
51
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 46

def session_request
  {
    "LockDelay" => 15,
    "Name" => "lock-for-#{lock_key.tr("/", "-")}",
  }
end

#unlockObject



82
83
84
# File 'lib/capistrano/consul_kv_lock/latch.rb', line 82

def unlock
  with_session { client.put("/kv/#{lock_key}?release=#{@session_id}", "false") }
end