capistrano-consul_kv_lock 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 82388f59c13c02e7a7a7aaf521de61fe0a1b986e
4
- data.tar.gz: 744e27b8dd823b2372b95fe30648e3365a7772b5
3
+ metadata.gz: 1faefc322b8e5b7f0b50d750d6b8e891e23fd776
4
+ data.tar.gz: b2702796331c0bafe1fb3703dee0479abeb2ff48
5
5
  SHA512:
6
- metadata.gz: aa2e99b389907ef918963bf3a54b2c2830d7381d9abb6e460c2b048b0dc3b8b2c7ea4f8c744a37d919879b9f2e046ef3ffa87294c8dbf13a4723cf02e8cfe74f
7
- data.tar.gz: 2510a2a7cd0bf75db7c81705db064dd2aadcb8fd6ce25108e9821e743228d73028b0edc011bddc0ca7305eb6643f61eab0688a24b0496b1911567bd0606eccd0
6
+ metadata.gz: 5ddd65c39dec7d0b59eb9b6385348fde4a6bd044e4009cc7dae7955e628d5b3d9c76e8bcffb0f6a5c7d274480d38d4f42c645ce8316794da493af529a595ba62
7
+ data.tar.gz: 27744fca1979c3c2a393f0e3f6b30e899bd6b99622784ae99a8a6dda3702008c38dd3543fcd6effe134be0849a3cfaeecf73b396283da0975cdfd6217b314a0f
@@ -1,10 +1,5 @@
1
- require 'capistrano/framework'
2
- load File.expand_path("../tasks/consul_kv_lock.rake", __FILE__)
3
-
4
- module Capistrano
5
- module ConsulKvLock
6
- # Your code goes here...
7
- end
8
- end
9
-
1
+ require "capistrano/framework"
2
+ require "capistrano/consul_kv_lock/latch"
10
3
  require "capistrano/consul_kv_lock/version"
4
+
5
+ load File.expand_path("../tasks/consul_kv_lock.rake", __FILE__)
@@ -0,0 +1,85 @@
1
+ module Capistrano
2
+ module ConsulKvLock
3
+ class SSHKittyLogger
4
+ def initialize
5
+ @coordinator = SSHKit::Coordinator.new('localhost')
6
+ end
7
+
8
+ %w(debug info warn error fatal).each do |ll|
9
+ define_method(ll) do |str|
10
+ @coordinator.each do
11
+ run_locally { self.send(ll, "[consul-client] #{str}") }
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ class Latch
18
+ def self.set_instance(consul_url, options={})
19
+ @_instance ||= p(new(consul_url, options))
20
+ end
21
+
22
+ def self.instance
23
+ @_instance
24
+ end
25
+
26
+ def initialize(consul_url, options={})
27
+ @logger = SSHKittyLogger.new
28
+ @client = begin
29
+ consul = URI.parse(consul_url)
30
+ Consul::Client.v1.http(host: consul.host, port: consul.port, logger: @logger)
31
+ end
32
+ @lock_key = options[:consul_lock_key] || 'deployment/locked'
33
+ @session_id = nil
34
+ end
35
+ attr_reader :client, :lock_key
36
+
37
+ def session_request
38
+ {
39
+ "LockDelay" => 15,
40
+ "Name" => "lock-for-#{lock_key.tr("/", "-")}",
41
+ }
42
+ end
43
+
44
+ def locked?
45
+ r = client.get("/kv/#{lock_key}")
46
+ !!(Base64.decode64(r[0]['Value']) =~ /\A["'](t(rue)?|1|y(es)?)["']\z/)
47
+ rescue Consul::Client::ResponseException => e
48
+ # in case of 404
49
+ if e.message.include?('404')
50
+ return false
51
+ else
52
+ raise e
53
+ end
54
+ end
55
+
56
+ def create_session
57
+ @logger.debug "Session request: #{session_request.inspect}"
58
+ r = client.put("/session/create", session_request)
59
+ @session_id = r['ID']
60
+ end
61
+
62
+ def delete_session
63
+ with_session {
64
+ client.put("/session/destroy/#{@session_id}", "")
65
+ }
66
+ @session_id = nil
67
+ end
68
+
69
+ def lock
70
+ with_session { client.put("/kv/#{lock_key}?acquire=#{@session_id}", "true") }
71
+ end
72
+
73
+ def unlock
74
+ with_session { client.put("/kv/#{lock_key}?release=#{@session_id}", "false") }
75
+ end
76
+
77
+ private
78
+ def with_session &blk
79
+ return false unless @session_id
80
+ blk.call
81
+ return true
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module ConsulKvLock
3
- VERSION = "0.1.1"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -4,68 +4,51 @@ require 'base64'
4
4
  require 'consul/client'
5
5
 
6
6
  namespace :consul_kv_lock do
7
- class SSHKittyLogger
8
- def initialize
9
- @coordinator = SSHKit::Coordinator.new('localhost')
10
- end
11
-
12
- %w(debug info warn error fatal).each do |ll|
13
- define_method(ll) do |str|
14
- @coordinator.each do
15
- run_locally { self.send(ll, "[consul-client] #{str}") }
16
- end
17
- end
18
- end
7
+ def latch
8
+ Capistrano::ConsulKvLock::Latch.instance || \
9
+ Capistrano::ConsulKvLock::Latch.set_instance(fetch(:consul_url), consul_lock_key: fetch(:consul_lock_key))
19
10
  end
20
11
 
21
- def client
22
- @_client ||= begin
23
- consul = URI.parse(fetch(:consul_url))
24
- Consul::Client.v1.http(host: consul.host, port: consul.port, logger: SSHKittyLogger.new)
25
- end
26
- end
27
-
28
- def lock_key
29
- fetch(:consul_lock_key)
12
+ task :check_lock do
13
+ if latch.locked?
14
+ fail("Deployment is locked!")
15
+ end
30
16
  end
31
17
 
32
- def locked?
33
- r = client.get("/kv/#{lock_key}")
34
- !!(Base64.decode64(r[0]['Value']) =~ /\A["'](t(rue)?|1|y(es)?)["']\z/)
35
- rescue Consul::Client::ResponseException => e
36
- # in case of 404
37
- if e.message.include?('404')
38
- return false
39
- else
40
- raise e
41
- end
18
+ task :start_session do
19
+ latch.create_session
42
20
  end
43
21
 
44
- task :check_lock do
45
- if locked?
46
- fail("Deployment is locked!")
47
- end
22
+ task :destroy_session do
23
+ latch.delete_session
48
24
  end
49
25
 
50
26
  task :lock do
51
27
  run_locally do
52
28
  info("Setting lock to #{fetch(:consul_url)}")
53
- client.put("/kv/#{lock_key}", "true")
29
+ unless latch.lock
30
+ warn("Setting lock to #{fetch(:consul_url)} failed! Skipping.")
31
+ end
54
32
  end
55
33
  end
56
34
 
57
35
  task :unlock do
58
36
  run_locally do
59
37
  info("Deleting lock from #{fetch(:consul_url)}")
60
- client.put("/kv/#{lock_key}", "false")
38
+ unless latch.unlock
39
+ warn("Deleting lock from #{fetch(:consul_url)} failed! Skipping.")
40
+ end
61
41
  end
62
42
  end
63
43
  end
64
44
 
65
45
  before 'deploy:starting', 'consul_kv_lock:lock'
66
- before 'consul_kv_lock:lock', 'consul_kv_lock:check_lock'
46
+ before 'consul_kv_lock:lock', 'consul_kv_lock:start_session'
47
+ before 'consul_kv_lock:start_session', 'consul_kv_lock:check_lock'
48
+
67
49
  after 'deploy:finished', 'consul_kv_lock:unlock'
68
50
  after 'deploy:failed', 'consul_kv_lock:unlock'
51
+ after 'consul_kv_lock:unlock', 'consul_kv_lock:destroy_session'
69
52
 
70
53
  namespace :load do
71
54
  task :defaults do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-consul_kv_lock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio KONDO
@@ -82,6 +82,7 @@ files:
82
82
  - capistrano-consul_kv_lock.gemspec
83
83
  - lib/capistrano-consul_kv_lock.rb
84
84
  - lib/capistrano/consul_kv_lock.rb
85
+ - lib/capistrano/consul_kv_lock/latch.rb
85
86
  - lib/capistrano/consul_kv_lock/version.rb
86
87
  - lib/capistrano/tasks/consul_kv_lock.rake
87
88
  homepage: https://github.com/udzura/capistrano-consul_kv_lock