consul_syncer 1.0.1 → 1.2.1

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