consul-templaterb 1.26.3 → 1.28.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +65 -27
- data/README.md +19 -4
- data/TemplateAPI.md +9 -0
- data/bin/consul-templaterb +52 -6
- data/lib/consul/async/consul_endpoint.rb +19 -3
- data/lib/consul/async/consul_template.rb +26 -8
- data/lib/consul/async/consul_template_render.rb +1 -1
- data/lib/consul/async/json_endpoint.rb +15 -2
- data/lib/consul/async/process_handler.rb +7 -1
- data/lib/consul/async/vault_endpoint.rb +16 -2
- data/lib/consul/async/version.rb +1 -1
- data/samples/checks_in_warning_or_critical_state.yaml.erb +13 -0
- data/samples/consul-ui/css/style.css +4 -0
- data/samples/consul-ui/js/nodes.js +1 -1
- data/samples/consul-ui/js/service.js +1 -1
- data/samples/consul-ui/js/utils.js +45 -20
- data/samples/display_timestamped_changes.txt.erb +17 -0
- data/samples/prometheus_datacenter_coordinates.erb +56 -0
- metadata +35 -51
- data/.gitignore +0 -41
- data/.rspec +0 -2
- data/.rubocop.yml +0 -57
- data/.ruby_app +0 -0
- data/.travis.yml +0 -19
- data/CODE_OF_CONDUCT.md +0 -76
- data/CONTRIBUTING.md +0 -25
- data/Dockerfile +0 -15
- data/Gemfile +0 -5
- data/INTERNALS.md +0 -49
- data/LICENSE.txt +0 -201
- data/Rakefile +0 -8
- data/consul-templaterb.gemspec +0 -42
- data/docker-nginx-conf/nginx.conf +0 -27
- data/docs/article-06_Template-based_discovery_with_consul-templaterb.md +0 -124
- data/docs/images/consul-templaterb.png +0 -0
- data/docs/images/consul-templaterb.svg +0 -3
- data/docs/images/consul-ui_001.png +0 -0
@@ -31,7 +31,8 @@ module Consul
|
|
31
31
|
|
32
32
|
def as_json(url, default_value, refresh_delay_secs: 10, **opts)
|
33
33
|
conf = JSONConfiguration.new(url: url, min_duration: refresh_delay_secs, retry_on_non_diff: refresh_delay_secs, **opts)
|
34
|
-
|
34
|
+
endpoint_id = url + opts.to_json
|
35
|
+
@endp_manager.create_if_missing(url, {}, endpoint_id: endpoint_id) do
|
35
36
|
if default_value.is_a?(Array)
|
36
37
|
ConsulTemplateJSONArray.new(JSONEndpoint.new(conf, url, default_value))
|
37
38
|
else
|
@@ -161,6 +162,18 @@ module Consul
|
|
161
162
|
create_if_missing(path, query_params, agent: agent) { ConsulTemplateChecks.new(ConsulEndpoint.new(consul_conf, path, true, query_params, '[]', agent)) }
|
162
163
|
end
|
163
164
|
|
165
|
+
# https://www.consul.io/api-docs/health#list-checks-in-state
|
166
|
+
# Supported in Consul 1.7+
|
167
|
+
def checks_in_state(check_state, dc: nil, agent: nil)
|
168
|
+
valid_checks_states = %w[any critical passing warning]
|
169
|
+
raise "checks_in_state('#{check_state}'...) must be one of #{valid_checks_states}" unless valid_checks_states.include?(check_state)
|
170
|
+
|
171
|
+
path = "/v1/health/state/#{check_state}"
|
172
|
+
query_params = {}
|
173
|
+
query_params[:dc] = dc if dc
|
174
|
+
create_if_missing(path, query_params, agent: agent) { ConsulTemplateChecks.new(ConsulEndpoint.new(consul_conf, path, true, query_params, '[]', agent)) }
|
175
|
+
end
|
176
|
+
|
164
177
|
# https://www.consul.io/api/catalog.html#list-nodes
|
165
178
|
def nodes(dc: nil, agent: nil)
|
166
179
|
path = '/v1/catalog/nodes'
|
@@ -382,16 +395,21 @@ module Consul
|
|
382
395
|
VaultEndpoint.new(vault_conf, path, :POST, {}, {})
|
383
396
|
end
|
384
397
|
|
385
|
-
def create_if_missing(path, query_params, fail_fast_errors: @fail_fast_errors,
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
398
|
+
def create_if_missing(path, query_params, fail_fast_errors: @fail_fast_errors,
|
399
|
+
max_consecutive_errors_on_endpoint: @max_consecutive_errors_on_endpoint,
|
400
|
+
agent: nil, endpoint_id: nil)
|
401
|
+
endpoint_id ||= begin
|
402
|
+
fqdn = path.dup
|
403
|
+
query_params.each_pair do |k, v|
|
404
|
+
fqdn = "#{agent}#{fqdn}&#{k}=#{v}"
|
405
|
+
end
|
406
|
+
fqdn
|
407
|
+
end
|
408
|
+
tpl = @endpoints[endpoint_id]
|
391
409
|
unless tpl
|
392
410
|
tpl = yield
|
393
411
|
::Consul::Async::Debug.print_debug "path #{path.ljust(64)} #{query_params.inspect}\r"
|
394
|
-
@endpoints[
|
412
|
+
@endpoints[endpoint_id] = tpl
|
395
413
|
tpl.endpoint.on_response do |result|
|
396
414
|
@net_info[:success] += 1
|
397
415
|
@net_info[:bytes_read] += result.data.bytesize
|
@@ -59,7 +59,7 @@ module Consul
|
|
59
59
|
return false unless new_template != @template
|
60
60
|
|
61
61
|
# We render to ensure the template is valid
|
62
|
-
render(new_template, current_template_info)
|
62
|
+
render(new_template, current_template_info: current_template_info)
|
63
63
|
@template = new_template.freeze
|
64
64
|
true
|
65
65
|
end
|
@@ -9,7 +9,7 @@ module Consul
|
|
9
9
|
class JSONConfiguration
|
10
10
|
attr_reader :url, :retry_duration, :min_duration, :retry_on_non_diff,
|
11
11
|
:debug, :enable_gzip_compression, :request_method, :json_body,
|
12
|
-
:headers
|
12
|
+
:headers, :tls_cert_chain, :tls_private_key, :tls_verify_peer
|
13
13
|
def initialize(url:,
|
14
14
|
debug: { network: false },
|
15
15
|
retry_duration: 10,
|
@@ -18,7 +18,10 @@ module Consul
|
|
18
18
|
request_method: :get,
|
19
19
|
json_body: nil,
|
20
20
|
headers: {},
|
21
|
-
enable_gzip_compression: true
|
21
|
+
enable_gzip_compression: true,
|
22
|
+
tls_cert_chain: nil,
|
23
|
+
tls_private_key: nil,
|
24
|
+
tls_verify_peer: true)
|
22
25
|
@url = url
|
23
26
|
@debug = debug
|
24
27
|
@enable_gzip_compression = enable_gzip_compression
|
@@ -28,6 +31,9 @@ module Consul
|
|
28
31
|
@request_method = request_method
|
29
32
|
@json_body = json_body
|
30
33
|
@headers = headers
|
34
|
+
@tls_cert_chain = tls_cert_chain
|
35
|
+
@tls_private_key = tls_private_key
|
36
|
+
@tls_verify_peer = tls_verify_peer
|
31
37
|
end
|
32
38
|
|
33
39
|
def create(_url)
|
@@ -181,6 +187,13 @@ module Consul
|
|
181
187
|
connect_timeout: 5, # default connection setup timeout
|
182
188
|
inactivity_timeout: 60 # default connection inactivity (post-setup) timeout
|
183
189
|
}
|
190
|
+
unless conf.tls_cert_chain.nil?
|
191
|
+
options[:tls] = {
|
192
|
+
cert_chain_file: conf.tls_cert_chain,
|
193
|
+
private_key_file: conf.tls_private_key,
|
194
|
+
verify_peer: conf.tls_verify_peer
|
195
|
+
}
|
196
|
+
end
|
184
197
|
connection = {
|
185
198
|
conn: EventMachine::HttpRequest.new(conf.url, options)
|
186
199
|
}
|
@@ -7,7 +7,8 @@ module Consul
|
|
7
7
|
# Handle the full lifecycle of a process and allows to forward
|
8
8
|
# Posix signals to child process when needed.
|
9
9
|
class ProcessHandler
|
10
|
-
attr_reader :command, :sig_reload, :sig_term, :pid, :exit_status
|
10
|
+
attr_reader :command, :sig_reload, :sig_term, :pid, :exit_status, :last_signal_sent, :reload_scheduled
|
11
|
+
attr_writer :reload_scheduled
|
11
12
|
def initialize(command, sig_reload: 'HUP', sig_term: 'TERM')
|
12
13
|
raise 'empty sig_term is not supported' unless sig_term
|
13
14
|
|
@@ -16,18 +17,23 @@ module Consul
|
|
16
17
|
@sig_term = sig_term
|
17
18
|
@pid = nil
|
18
19
|
@exit_status = nil
|
20
|
+
@last_signal_sent = Time.now
|
21
|
+
@reload_scheduled = false
|
19
22
|
end
|
20
23
|
|
21
24
|
def start
|
22
25
|
return pid unless pid.nil?
|
23
26
|
|
24
27
|
@pid = Process.spawn(command)
|
28
|
+
@last_signal_sent = Time.now
|
25
29
|
end
|
26
30
|
|
27
31
|
def reload
|
28
32
|
return if sig_reload.nil?
|
29
33
|
|
34
|
+
@last_signal_sent = Time.now
|
30
35
|
warn "Sending SIG #{sig_reload} to #{pid}..."
|
36
|
+
@reload_scheduled = false
|
31
37
|
begin
|
32
38
|
Process.kill(sig_reload, pid)
|
33
39
|
rescue Errno::ESRCH => e
|
@@ -10,7 +10,8 @@ module Consul
|
|
10
10
|
# Configuration for Vault Endpoints
|
11
11
|
class VaultConfiguration
|
12
12
|
attr_reader :base_url, :token, :token_renew, :retry_duration, :min_duration, :wait_duration, :max_retry_duration, :retry_on_non_diff,
|
13
|
-
:lease_duration_factor, :debug, :max_consecutive_errors_on_endpoint, :fail_fast_errors
|
13
|
+
:lease_duration_factor, :debug, :max_consecutive_errors_on_endpoint, :fail_fast_errors, :tls_cert_chain, :tls_private_key,
|
14
|
+
:tls_verify_peer
|
14
15
|
|
15
16
|
def initialize(base_url: 'http://localhost:8200',
|
16
17
|
debug: { network: false },
|
@@ -22,7 +23,10 @@ module Consul
|
|
22
23
|
max_retry_duration: 600,
|
23
24
|
paths: {},
|
24
25
|
max_consecutive_errors_on_endpoint: 10,
|
25
|
-
fail_fast_errors: false
|
26
|
+
fail_fast_errors: false,
|
27
|
+
tls_cert_chain: nil,
|
28
|
+
tls_private_key: nil,
|
29
|
+
tls_verify_peer: true)
|
26
30
|
@base_url = base_url
|
27
31
|
@token_renew = token_renew
|
28
32
|
@debug = debug
|
@@ -34,6 +38,9 @@ module Consul
|
|
34
38
|
@token = token
|
35
39
|
@max_consecutive_errors_on_endpoint = max_consecutive_errors_on_endpoint
|
36
40
|
@fail_fast_errors = fail_fast_errors
|
41
|
+
@tls_cert_chain = tls_cert_chain
|
42
|
+
@tls_private_key = tls_private_key
|
43
|
+
@tls_verify_peer = tls_verify_peer
|
37
44
|
end
|
38
45
|
|
39
46
|
def ch(path, symbol)
|
@@ -226,6 +233,13 @@ module Consul
|
|
226
233
|
connect_timeout: 5, # default connection setup timeout
|
227
234
|
inactivity_timeout: 1 # default connection inactivity (post-setup) timeout
|
228
235
|
}
|
236
|
+
unless conf.tls_cert_chain.nil?
|
237
|
+
options[:tls] = {
|
238
|
+
cert_chain_file: conf.tls_cert_chain,
|
239
|
+
private_key_file: conf.tls_private_key,
|
240
|
+
verify_peer: conf.tls_verify_peer
|
241
|
+
}
|
242
|
+
end
|
229
243
|
connection = EventMachine::HttpRequest.new(conf.base_url, options)
|
230
244
|
cb = proc do |_|
|
231
245
|
http = connection.send(http_method.downcase, build_request) # Under the hood: c.send('get', {stuff}) === c.get({stuff})
|
data/lib/consul/async/version.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
<%=
|
2
|
+
# This sample displays checks for the whole cluster
|
3
|
+
# in warning or critical state
|
4
|
+
# API available with Consul 1.7+
|
5
|
+
res = []
|
6
|
+
checks_in_state('warning').each do |c|
|
7
|
+
res << c
|
8
|
+
end
|
9
|
+
checks_in_state('critical').each do |c|
|
10
|
+
res << c
|
11
|
+
end
|
12
|
+
YAML.dump({'warning_or_critical_checks' => res})
|
13
|
+
%>
|
@@ -111,7 +111,7 @@ class NodeMainSelector extends MainSelector {
|
|
111
111
|
nodesChecks.appendChild(checksStatusGenerator(node, node['Node']['Name']));
|
112
112
|
content.appendChild(nodesChecks);
|
113
113
|
|
114
|
-
content.appendChild(servicesGenerator(node['Service']));
|
114
|
+
content.appendChild(servicesGenerator(node['Service'], node));
|
115
115
|
content.appendChild(tagsGenerator(getTagsNode(node)));
|
116
116
|
|
117
117
|
sidebar.setAttribute('status', state);
|
@@ -304,7 +304,7 @@ class ServiceMainSelector extends MainSelector {
|
|
304
304
|
element.setAttribute("class", "list-group-item service-instance");
|
305
305
|
var state = nodeState(instance.checks);
|
306
306
|
element.appendChild(weightsGenerator(instance.weights, state));
|
307
|
-
element.appendChild(serviceTitleGenerator(instance));
|
307
|
+
element.appendChild(serviceTitleGenerator(instance, serviceName));
|
308
308
|
var node_info = this.nodes[instance.name];
|
309
309
|
if (node_info != null) {
|
310
310
|
node_info = node_info.meta;
|
@@ -63,7 +63,7 @@ function nodeState(checks) {
|
|
63
63
|
|
64
64
|
supported_protocols = ['https', 'http', 'sftp', 'ftp', 'ssh', 'telnet']
|
65
65
|
|
66
|
-
function serviceTitleGenerator(instance) {
|
66
|
+
function serviceTitleGenerator(instance, serviceName) {
|
67
67
|
var protocol = null;
|
68
68
|
for (i in supported_protocols) {
|
69
69
|
var protoc = supported_protocols[i]
|
@@ -74,10 +74,6 @@ function serviceTitleGenerator(instance) {
|
|
74
74
|
}
|
75
75
|
|
76
76
|
var htmlTitle = document.createElement('h5');
|
77
|
-
htmlTitle.setAttribute('title', 'Node Name: ' + instance.name +
|
78
|
-
'\nAddress: ' + instance.addr +
|
79
|
-
'\nService ID: ' + instance.id +
|
80
|
-
'\nService Port: ' + instance.port);
|
81
77
|
|
82
78
|
htmlTitle.setAttribute('class', 'instance-name');
|
83
79
|
var instanceLink = document.createElement('a');
|
@@ -91,6 +87,15 @@ function serviceTitleGenerator(instance) {
|
|
91
87
|
}
|
92
88
|
|
93
89
|
instanceLink.appendChild(document.createTextNode(instance.name + appendPort));
|
90
|
+
const nodeInfo = document.createElement('a');
|
91
|
+
nodeInfo.appendChild(document.createTextNode('\u24D8'));
|
92
|
+
nodeInfo.setAttribute('title', 'Click to see details of Node: ' + instance.name +
|
93
|
+
'\nAddress: ' + instance.addr +
|
94
|
+
'\nService ID: ' + instance.id +
|
95
|
+
'\nService Port: ' + instance.port);
|
96
|
+
nodeInfo.setAttribute('href', 'consul-nodes-ui.html?node_filter=^' + encodeURIComponent(instance.name) + '$');
|
97
|
+
htmlTitle.appendChild(nodeInfo);
|
98
|
+
htmlTitle.appendChild(document.createTextNode(' '));
|
94
99
|
htmlTitle.appendChild(instanceLink);
|
95
100
|
htmlTitle.appendChild(document.createTextNode(' '));
|
96
101
|
htmlTitle.appendChild(document.createTextNode(instance.addr));
|
@@ -216,24 +221,44 @@ function toCSSClass(state) {
|
|
216
221
|
return state;
|
217
222
|
}
|
218
223
|
|
219
|
-
function servicesGenerator(instanceServices) {
|
220
|
-
var
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
+
function servicesGenerator(instanceServices, node) {
|
225
|
+
var servicesTop = document.createElement('div');
|
226
|
+
servicesTop.className = 'instance-services';
|
227
|
+
const card = document.createElement('div');
|
228
|
+
card.setAttribute('class', 'card');
|
229
|
+
const servicesCard = document.createElement('div');
|
230
|
+
servicesCard.setAttribute('class', 'card-body');
|
231
|
+
const title = document.createElement('h5');
|
232
|
+
title.appendChild(document.createTextNode('Services'));
|
233
|
+
title.setAttribute('class', 'card-title')
|
234
|
+
servicesCard.appendChild(title);
|
235
|
+
const services = document.createElement('div');
|
236
|
+
servicesCard.appendChild(services);
|
224
237
|
for (var serviceKey in instanceServices) {
|
225
|
-
|
226
|
-
|
238
|
+
const serviceGrp = document.createElement('span');
|
239
|
+
serviceGrp.setAttribute('class', 'btn btn-sm');
|
240
|
+
serviceGrp.classList.add('btn-outline-' + toCSSClass(nodeState(instanceServices[serviceKey]['Checks'])))
|
241
|
+
const service = document.createElement('a');
|
242
|
+
serviceGrp.appendChild(service);
|
243
|
+
const serviceName = instanceServices[serviceKey]['Service']['Service'];
|
244
|
+
service.setAttribute('class', 'serviceLink');
|
245
|
+
service.setAttribute('href', 'consul-services-ui.html?service=' + encodeURIComponent(serviceName) + '&node_filter=^' + encodeURIComponent(node['Node']['Name'])+'$');
|
246
|
+
service.appendChild(document.createTextNode(serviceName));
|
227
247
|
var servicePort = instanceServices[serviceKey]['Service']['Port'];
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
248
|
+
if (servicePort) {
|
249
|
+
// Add unbreakable space
|
250
|
+
serviceGrp.appendChild(document.createTextNode('\u00A0'));
|
251
|
+
const servicePortElem = document.createElement('a');
|
252
|
+
servicePortElem.setAttribute('class', 'serviceTargetPort');
|
253
|
+
const nodeAddr = instanceServices[serviceKey]['Service']['Address'];
|
254
|
+
servicePortElem.setAttribute('href', 'http://' + nodeAddr + ':' + servicePort);
|
255
|
+
servicePortElem.appendChild(document.createTextNode(':' + servicePort));
|
256
|
+
serviceGrp.appendChild(servicePortElem);
|
257
|
+
}
|
258
|
+
services.appendChild(serviceGrp);
|
235
259
|
}
|
236
|
-
|
260
|
+
servicesTop.appendChild(servicesCard);
|
261
|
+
return servicesTop;
|
237
262
|
}
|
238
263
|
|
239
264
|
function checksStatusGenerator(instance, prefix) {
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%
|
2
|
+
# This example show how to display local time informaition about changes
|
3
|
+
# Example of usage to display logs of changes on nodes() endpoint:
|
4
|
+
#
|
5
|
+
# consul-templaterb --template "display_timestamped_changes.txt.erb:display_timestamped_changes.txt:cat display_timestamped_changes.txt" -l error
|
6
|
+
#
|
7
|
+
# Would output:
|
8
|
+
# Last update: 1588800554 (2020-05-06 21:29:14 UTC), X-Consul-Index: 4345827328
|
9
|
+
# Last update: 1588800569 (2020-05-06 21:29:29 UTC), X-Consul-Index: 4345829548
|
10
|
+
# Last update: 1588800676 (2020-05-06 21:31:16 UTC), X-Consul-Index: 4345836342
|
11
|
+
#
|
12
|
+
@my_last_time = Time.now.utc unless @my_last_time
|
13
|
+
val = nodes()
|
14
|
+
new_idx = val.endpoint.x_consul_index
|
15
|
+
@my_last_time = Time.now.utc if @my_last_idx != new_idx
|
16
|
+
@my_last_idx = new_idx
|
17
|
+
%>Last update: <%= @my_last_time.to_i %> (<%= @my_last_time %>), X-Consul-Index: <%= new_idx %>
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# HELP consul_wan_servers_rtt_seconds Min Round trip with other servers of DC
|
2
|
+
# TYPE consul_wan_servers_rtt_seconds gauge
|
3
|
+
<%
|
4
|
+
# This computes the RTT over WAN for all DCs
|
5
|
+
results = {'min' => {}, 'max' => {}, 'p50' => {}, 'p90' => {}}
|
6
|
+
my_dcname = (agent_self['Config'] || {})['Datacenter']
|
7
|
+
my_dc = coordinate.datacenters.select { |d| d['Datacenter'] == my_dcname }.first
|
8
|
+
|
9
|
+
def percentile(values_sorted, percentile)
|
10
|
+
k = (percentile*(values_sorted.length-1)+1).floor - 1
|
11
|
+
f = (percentile*(values_sorted.length-1)+1).modulo(1)
|
12
|
+
return values_sorted[k] + (f * (values_sorted[k+1] - values_sorted[k]))
|
13
|
+
end
|
14
|
+
|
15
|
+
if my_dc
|
16
|
+
from = my_dc['Datacenter']
|
17
|
+
coordinate.datacenters.each do |dc_coords|
|
18
|
+
min = Float::MAX
|
19
|
+
max = 0
|
20
|
+
rtts = []
|
21
|
+
dc_coords['Coordinates'].each do |s2|
|
22
|
+
my_dc['Coordinates'].each do |s1|
|
23
|
+
rtt = coordinate.rtt(s1['Coord'], s2['Coord'])
|
24
|
+
min = rtt if rtt < min
|
25
|
+
max = rtt if rtt > max
|
26
|
+
idx = rtts.bsearch_index { |x| x > rtt }
|
27
|
+
if idx.nil?
|
28
|
+
rtts << rtt
|
29
|
+
else
|
30
|
+
rtts = rtts.insert(idx, rtt)
|
31
|
+
end
|
32
|
+
%>
|
33
|
+
consul_wan_servers_rtt_seconds{from="<%= from %>",to="<%= dc_coords['Datacenter'] %>",from_node="<%= s1['Node'] %>",to_node="<%= s2['Node'] %>"} <%= rtt.round(3) %><%
|
34
|
+
end
|
35
|
+
end
|
36
|
+
results['min'][dc_coords['Datacenter']] = min
|
37
|
+
results['max'][dc_coords['Datacenter']] = max
|
38
|
+
results['p50'][dc_coords['Datacenter']] = percentile(rtts, 0.5)
|
39
|
+
results['p90'][dc_coords['Datacenter']] = percentile(rtts, 0.9)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Now, we iterate over aggregated results, type is min, max...
|
43
|
+
results.each do |type, res_type|
|
44
|
+
%>
|
45
|
+
|
46
|
+
# HELP consul_wan_dc_<%= type %>_seconds <%= type %> round trip with other DCs
|
47
|
+
# TYPE consul_wan_dc_<%= type %>_seconds gauge
|
48
|
+
<%
|
49
|
+
# Iterate over destinations
|
50
|
+
res_type.each do |dst, val|
|
51
|
+
%>consul_wan_dc_<%= type %>_seconds{from="<%= my_dcname %>",to="<%= dst %>"} <%= val.round(3) %>
|
52
|
+
<%
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
%>
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: consul-templaterb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.28.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SRE Core Services
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-http-request
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.1
|
19
|
+
version: '1.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.1
|
26
|
+
version: '1.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: eventmachine
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.2
|
33
|
+
version: '1.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.2
|
40
|
+
version: '1.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: parallel
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.2
|
47
|
+
version: '1.2'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.2
|
54
|
+
version: '1.2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 12.3
|
75
|
+
version: '12.3'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 12.3
|
82
|
+
version: '12.3'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,58 +98,58 @@ dependencies:
|
|
98
98
|
name: rspec_junit_formatter
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 0.4.1
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 0.4.1
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rubocop
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: 0.80.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 0.80.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rubocop-junit-formatter
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - '='
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
131
|
+
version: 0.1.4
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - '='
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
138
|
+
version: 0.1.4
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: webmock
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- - "
|
143
|
+
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
145
|
+
version: '2.1'
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- - "
|
150
|
+
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
152
|
+
version: '2.1'
|
153
153
|
description: A ruby implementation of Consul Template with support of erb templating
|
154
154
|
with hi-performance on large clusters and advanced process management features.
|
155
155
|
email:
|
@@ -162,28 +162,10 @@ extra_rdoc_files:
|
|
162
162
|
- CHANGELOG.md
|
163
163
|
- TemplateAPI.md
|
164
164
|
files:
|
165
|
-
- ".gitignore"
|
166
|
-
- ".rspec"
|
167
|
-
- ".rubocop.yml"
|
168
|
-
- ".ruby_app"
|
169
|
-
- ".travis.yml"
|
170
165
|
- CHANGELOG.md
|
171
|
-
- CODE_OF_CONDUCT.md
|
172
|
-
- CONTRIBUTING.md
|
173
|
-
- Dockerfile
|
174
|
-
- Gemfile
|
175
|
-
- INTERNALS.md
|
176
|
-
- LICENSE.txt
|
177
166
|
- README.md
|
178
|
-
- Rakefile
|
179
167
|
- TemplateAPI.md
|
180
168
|
- bin/consul-templaterb
|
181
|
-
- consul-templaterb.gemspec
|
182
|
-
- docker-nginx-conf/nginx.conf
|
183
|
-
- docs/article-06_Template-based_discovery_with_consul-templaterb.md
|
184
|
-
- docs/images/consul-templaterb.png
|
185
|
-
- docs/images/consul-templaterb.svg
|
186
|
-
- docs/images/consul-ui_001.png
|
187
169
|
- lib/consul/async/consul_endpoint.rb
|
188
170
|
- lib/consul/async/consul_template.rb
|
189
171
|
- lib/consul/async/consul_template_engine.rb
|
@@ -198,6 +180,7 @@ files:
|
|
198
180
|
- samples/all_services.txt.erb
|
199
181
|
- samples/all_services_multi_agents.txt.erb
|
200
182
|
- samples/all_templates.erb
|
183
|
+
- samples/checks_in_warning_or_critical_state.yaml.erb
|
201
184
|
- samples/consul-ui/README.md
|
202
185
|
- samples/consul-ui/common/footer.html.erb
|
203
186
|
- samples/consul-ui/common/header.html.erb
|
@@ -229,6 +212,7 @@ files:
|
|
229
212
|
- samples/criteo/haproxy.cfg.erb
|
230
213
|
- samples/debug/compare_connect_services.txt.erb
|
231
214
|
- samples/demos/compute_pricing.txt.erb
|
215
|
+
- samples/display_timestamped_changes.txt.erb
|
232
216
|
- samples/find_all_invalid_dns_labels.json.erb
|
233
217
|
- samples/find_nodes_in_catalog_but_not_in_members.json.erb
|
234
218
|
- samples/ha_proxy.cfg.erb
|
@@ -240,6 +224,7 @@ files:
|
|
240
224
|
- samples/members.json.erb
|
241
225
|
- samples/metrics.erb
|
242
226
|
- samples/prometheus_consul_coordinates.erb
|
227
|
+
- samples/prometheus_datacenter_coordinates.erb
|
243
228
|
- samples/render_template_from_kv.erb
|
244
229
|
- samples/sample_keys.html.erb
|
245
230
|
- samples/service_checks_metrics.erb
|
@@ -249,7 +234,7 @@ files:
|
|
249
234
|
- samples/vault-ldap.txt.erb
|
250
235
|
homepage: https://rubygems.org/gems/consul-templaterb
|
251
236
|
licenses:
|
252
|
-
- Apache
|
237
|
+
- Apache-2.0
|
253
238
|
metadata:
|
254
239
|
bug_tracker_uri: https://github.com/criteo/consul-templaterb/issues
|
255
240
|
changelog_uri: https://github.com/criteo/consul-templaterb/blob/master/CHANGELOG.md
|
@@ -270,8 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
270
255
|
- !ruby/object:Gem::Version
|
271
256
|
version: '0'
|
272
257
|
requirements: []
|
273
|
-
|
274
|
-
rubygems_version: 2.7.7
|
258
|
+
rubygems_version: 3.0.8
|
275
259
|
signing_key:
|
276
260
|
specification_version: 4
|
277
261
|
summary: Implementation of Consul template using Ruby and .erb templating language
|