consul_syncer 1.0.1 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb9445e925d6b0268c3449351cd3bfc56c51d767238265382e80e7bfc0cd3ee9
4
- data.tar.gz: 436992e07cc03d4f2eac53a93be937a48a1308bfc5aaa0d7e5a70f28d97b0782
3
+ metadata.gz: 0b2bef9d0c04323f933176da717b088e7179d8c1654bad10a5c91d1e83f957fb
4
+ data.tar.gz: 25ecfe6ce76a967aefdb2d89fd82137664a418848587645a29fc1346fc95165a
5
5
  SHA512:
6
- metadata.gz: 02b2761bf351a62609de73be6e7e3ba250bbffef95e86806757f1ed24b7db9cadb22cb16322787d6856ac91c21ed6c95d8bb342c049da2f557e408f1023dc918
7
- data.tar.gz: 9da6e8093bd5c99a4c683fa61e75b76748051e9173d3a4057a2ed52d07c8b06c8f51f3312ba358d78f5f62bea8aa2826566bb99e13aa800fccee3fadd30b2a4a
6
+ metadata.gz: 42d34c44dc46d220efff7759e423aa3c2e62ed69e9a63e91fc342111f09ed14ba073798be9edb22c956c3e8007cb0746105c144dedac5bdb1cca0b2a27e94653
7
+ data.tar.gz: 32eeeb25cb89d0f20802abc6a61cf9437bc8f6c44158fc5c84999cca42eb0f4761bfeaf1a97a9062d9ceedadc7588186c3f82e6fe97688138ff4032f1ad04107
@@ -1,3 +1,3 @@
1
1
  class ConsulSyncer
2
- VERSION = "1.0.1"
2
+ VERSION = "1.2.1"
3
3
  end
data/lib/consul_syncer.rb CHANGED
@@ -17,16 +17,21 @@ class ConsulSyncer
17
17
 
18
18
  # changing tags means all previous services need to be removed manually since
19
19
  # they can no longer be found
20
- def sync(expected_definitions, tags)
21
- raise ArgumentError, "Need at least 1 tag to reliably update endpoints" if tags.empty?
20
+ def sync(expected_definitions, tags, dry: false)
21
+ planned = plan(expected_definitions, tags)
22
+ execute planned unless dry
23
+ planned.size # let users know what we did and keep legacy api working
24
+ end
22
25
 
23
- modified = 0
26
+ def plan(expected_definitions, tags)
27
+ raise ArgumentError, "Need at least 1 tag to reliably update endpoints" if tags.empty?
24
28
 
25
29
  # ensure consistent tags to find the endpoints after adding
26
30
  expected_definitions = expected_definitions.dup
27
31
  expected_definitions.each do |d|
28
32
  d[:tags] += tags
29
33
  d[:tags].sort!
34
+ d[:tags].uniq!
30
35
  end
31
36
 
32
37
  actual_definitions = consul_endpoints(tags).map do |consul_endpoint|
@@ -43,6 +48,7 @@ class ConsulSyncer
43
48
 
44
49
  identifying = [:node, :service_id]
45
50
  interesting = [*identifying, :service, :service_address, :address, :tags, :port]
51
+ planned = []
46
52
 
47
53
  expected_definitions.each do |expected|
48
54
  description = "#{expected[:service] || "*"} / #{expected[:service_id] || "*"} on #{expected.fetch(:node)} in Consul"
@@ -58,24 +64,23 @@ class ConsulSyncer
58
64
  elsif remove_matching_service!(actual_definitions, expected, interesting)
59
65
  @logger.debug "Found #{description}"
60
66
  elsif remove_matching_service!(actual_definitions, expected, identifying)
61
- @logger.info "Updating #{description}"
62
- modified += 1
63
- register **expected
67
+ planned << [:register, [], expected.merge(reason: "Updating #{description}")]
64
68
  else
65
- @logger.info "Adding #{description}"
66
- modified += 1
67
- register **expected
69
+ planned << [:register, [], expected.merge(reason: "Adding #{description}")]
68
70
  end
69
71
  end
70
72
 
71
73
  # all definitions that are left did not match any expected definitions and are no longer needed
72
74
  actual_definitions.each do |actual|
73
- @logger.info "Removing #{actual.fetch(:service)} / #{actual.fetch(:service_id)} on #{actual.fetch(:node)} in Consul"
74
- modified += 1
75
- deregister actual.fetch(:node), actual.fetch(:service_id)
75
+ reason = "Removing #{actual.fetch(:service)} / #{actual.fetch(:service_id)} on #{actual.fetch(:node)} in Consul"
76
+ planned << [:deregister, [actual.fetch(:node), actual.fetch(:service_id)], {reason: reason}]
76
77
  end
77
78
 
78
- modified
79
+ planned
80
+ end
81
+
82
+ def execute(planned)
83
+ planned.each { |m, args, kwargs| send m, *args, **kwargs }
79
84
  end
80
85
 
81
86
  private
@@ -103,7 +108,8 @@ class ConsulSyncer
103
108
  end
104
109
 
105
110
  # creates or updates based on node and service
106
- def register(node:, service:, service_id:, service_address:, address:, tags:, port:)
111
+ def register(node:, service:, service_id:, service_address:, address:, tags:, port:, reason:)
112
+ @logger.info reason
107
113
  @consul.request(
108
114
  :put,
109
115
  '/v1/catalog/register',
@@ -119,7 +125,8 @@ class ConsulSyncer
119
125
  )
120
126
  end
121
127
 
122
- def deregister(node, service_id)
128
+ def deregister(node, service_id, reason:)
129
+ @logger.info reason
123
130
  @consul.request(
124
131
  :put,
125
132
  '/v1/catalog/deregister',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: consul_syncer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-27 00:00:00.000000000 Z
11
+ date: 2021-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -54,7 +54,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  requirements: []
57
- rubygems_version: 3.1.2
57
+ rubygems_version: 3.2.16
58
58
  signing_key:
59
59
  specification_version: 4
60
60
  summary: Sync remote services into consul