consul-templaterb 1.0.10 → 1.0.11
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 +4 -4
- data/.gitignore +2 -0
- data/CHANGELOG.md +19 -1
- data/README.md +10 -10
- data/TemplateAPI.md +1 -1
- data/bin/consul-templaterb +4 -4
- data/lib/consul/async/version.rb +1 -1
- data/samples/consul-ui/common/header.html.erb +18 -10
- data/samples/consul-ui/consul-services-ui.html.erb +10 -2
- data/samples/consul-ui/consul_template.json.erb +6 -5
- data/samples/consul-ui/css/style.css +15 -1
- data/samples/consul-ui/js/service.js +92 -16
- data/samples/sample_keys.html.erb +1 -1
- metadata +2 -3
- data/.gitreview +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e668f5f7933ba2ec7c0ccad29248d7c2c18cb638931c13dbd4cbb63e55f5908
|
4
|
+
data.tar.gz: 61f3edd44ca479edad6c71226f6a2b827ae83f5387726a012f4e2d72d5606f3b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7fe83b0f9c67abf720fb6a9f941c184c646a9ea5aa7dbeaf244840d9cea52bdbb41a81fb4b79b0a178dc24c3c48e5d75eecd8236731e22ad836262e9ec4d3b3
|
7
|
+
data.tar.gz: 878b453b28fb63c430604ae1335a23267f31a5e0dfcc2e1728d5bb919a8cfe907ac1c8458916b6682bb39b7bb51e09baadb5e4bfe97b9b8d6805ce534ab34497
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,7 +4,25 @@
|
|
4
4
|
|
5
5
|
IMPROVEMENTS:
|
6
6
|
|
7
|
-
|
7
|
+
## 1.0.11 (May 11, 2018)
|
8
|
+
|
9
|
+
BUG FIXES:
|
10
|
+
|
11
|
+
* Fix for Mac OS X fixed in `1.2-stable` branch of
|
12
|
+
[event-machine](https://github.com/eventmachine/eventmachine/), see
|
13
|
+
https://github.com/igrigorik/em-http-request/issues/315 for more
|
14
|
+
details
|
15
|
+
* fixed bug in samples/sample_keys.html.erb
|
16
|
+
* Unit tests now catches all `*.erb` files in subdirectories
|
17
|
+
|
18
|
+
IMPROVEMENTS:
|
19
|
+
|
20
|
+
* Improved new samples/consul-ui/
|
21
|
+
* Documentation typos
|
22
|
+
* Help typos fixed
|
23
|
+
* Various improvements in [samples/](samples/]
|
24
|
+
|
25
|
+
# 1.0.10 (May 4, 2018)
|
8
26
|
|
9
27
|
IMPROVEMENTS:
|
10
28
|
|
data/README.md
CHANGED
@@ -88,7 +88,7 @@ $ gem install consul-templaterb
|
|
88
88
|
[...]
|
89
89
|
```
|
90
90
|
|
91
|
-
If you simply want to use the executable on your
|
91
|
+
If you simply want to use the executable on your preferred Linux distribution, you
|
92
92
|
have to install first: ruby and ruby dev.
|
93
93
|
|
94
94
|
### Quick install on Ubuntu-Linux
|
@@ -140,8 +140,8 @@ USAGE: consul-templaterb [[options]]
|
|
140
140
|
-w, --wait=<min_duration> Wait at least n seconds before each template generation
|
141
141
|
-r, --retry-delay=<min_duration> Min Retry delay on Error/Missing Consul Index
|
142
142
|
-k, --hot-reload=<behavior> Control hot reload behaviour, one of :[die (kill daemon on hot reload failure), keep (on error, keep running), disable (hot reload disabled)]
|
143
|
-
-K, --sig-term=kill_signal Signal to
|
144
|
-
-R, --sig-reload=reload_signal Signal to
|
143
|
+
-K, --sig-term=kill_signal Signal to send to next --exec command on kill, default=TERM
|
144
|
+
-R, --sig-reload=reload_signal Signal to send to next --exec command on reload (NONE supported), default=HUP
|
145
145
|
-e, --exec=<command> Execute the following command
|
146
146
|
-d, --debug-network-usage Debug the network usage
|
147
147
|
-t erb_file:[output]:[command]:[params_file],
|
@@ -153,8 +153,8 @@ When launched with file arguments ending with .erb, the executable will assume
|
|
153
153
|
the file is a template and will render the corresponding file without the
|
154
154
|
`.erb` extension.
|
155
155
|
|
156
|
-
It means that you can call consul-templaterb with
|
157
|
-
will then substitute all files and render it by removing the
|
156
|
+
It means that you can call consul-templaterb with `*.erb` arguments, the shell
|
157
|
+
will then substitute all files and render it by removing the `.erb` extension as
|
158
158
|
if the `--template my_file.ext.erb:myfile.ext` was used.
|
159
159
|
|
160
160
|
### Generate multiple templates
|
@@ -222,7 +222,7 @@ examples:
|
|
222
222
|
7. [Services in JSON](samples/consul_template.json.erb)
|
223
223
|
8. [Generate HaProxy Configuration](samples/ha_proxy.cfg.erb)
|
224
224
|
|
225
|
-
If you want to test it quickly, you might try with (assuming
|
225
|
+
If you want to test it quickly, you might try with (assuming your consul agent is listening on
|
226
226
|
`http://localhost:8500`):
|
227
227
|
|
228
228
|
```shell
|
@@ -253,11 +253,11 @@ push git commits and tags, and push the `.gem` file to [rubygems.org](https://ru
|
|
253
253
|
|
254
254
|
Here are the known bugs of the application:
|
255
255
|
|
256
|
-
* [
|
256
|
+
* [x] On Mac OS X, with many services, consul-templaterb sometimes crashes when watching lots of changes (more than 2k
|
257
257
|
watches) at the same time. This bug is
|
258
258
|
[probably a race condition in `em-http-request`](https://github.com/igrigorik/em-http-request/issues/315). Only visible
|
259
259
|
on very large clusters or when watching thousands of individual KV keys.
|
260
|
-
* [ ] render_file might create an infinite recursion if a template includes itself indirectly.
|
260
|
+
* [ ] `render_file` might create an infinite recursion if a template includes itself indirectly.
|
261
261
|
|
262
262
|
Please consult [CHANGELOG.md](CHANGELOG.md) for fixed bugs.
|
263
263
|
|
@@ -266,9 +266,9 @@ Please consult [CHANGELOG.md](CHANGELOG.md) for fixed bugs.
|
|
266
266
|
* [ ] Hashi's Vault support
|
267
267
|
* [ ] Implement automatic dynamic rate limit
|
268
268
|
* [ ] More samples: apache, nginx, full website displaying consul information...
|
269
|
-
* [ ] Optimize rendering speed at
|
269
|
+
* [ ] Optimize rendering speed at start-up: an iteration is done very second by default, but it would be possible to speed
|
270
270
|
up rendering by iterating with higher frequency until the first write of result has been performed.
|
271
|
-
* [ ] Allow to tune bandwidth using a simple
|
271
|
+
* [ ] Allow to tune bandwidth using a simple configuration file (while it should not be necessary for 90% of use-cases)
|
272
272
|
|
273
273
|
## Contributing
|
274
274
|
|
data/TemplateAPI.md
CHANGED
@@ -95,7 +95,7 @@ Full example: [samples/consul_template.txt.erb](samples/consul_template.txt.erb)
|
|
95
95
|
|
96
96
|
[List the instances](https://www.consul.io/api/health.html#list-nodes-for-service) of a service having the given
|
97
97
|
optional tag. If no tag is specified, will return all instances of service. By default, it will return all the
|
98
|
-
|
98
|
+
services that are passing or not. An optional argument passing might be used to retrieve only passing instances.
|
99
99
|
|
100
100
|
<details><summary>Examples</summary>
|
101
101
|
<div class="samples">
|
data/bin/consul-templaterb
CHANGED
@@ -92,19 +92,19 @@ optparse = OptionParser.new do |opts|
|
|
92
92
|
|
93
93
|
def compute_signal(val, none_value)
|
94
94
|
valid_signals = Signal.list.keys
|
95
|
-
raise "Please
|
95
|
+
raise "Please specify a signal, use any of: #{valid_signals.inspect}" unless val
|
96
96
|
return nil if val == none_value
|
97
|
-
raise "Invalid signal, valid signals: #{valid_signals.inspect}" unless valid_signals.include? val
|
97
|
+
raise "Invalid signal #{val}, valid signals: #{valid_signals.inspect}" unless valid_signals.include? val
|
98
98
|
val
|
99
99
|
end
|
100
100
|
|
101
101
|
opts.on('-K', '--sig-term=kill_signal', String,
|
102
|
-
"Signal to
|
102
|
+
"Signal to send to next --exec command on kill, default=#{cur_sig_term}") do |sig|
|
103
103
|
cur_sig_term = compute_signal(sig, nil)
|
104
104
|
end
|
105
105
|
|
106
106
|
opts.on('-R', '--sig-reload=reload_signal', String,
|
107
|
-
"Signal to
|
107
|
+
"Signal to send to next --exec command on reload (NONE supported), default=#{cur_sig_reload}") do |sig|
|
108
108
|
cur_sig_reload = compute_signal(sig, 'NONE')
|
109
109
|
end
|
110
110
|
|
data/lib/consul/async/version.rb
CHANGED
@@ -4,8 +4,12 @@
|
|
4
4
|
# CONSUL_TOOLS_PREFIX: prefix for the address of consul tools
|
5
5
|
# CONSUL_TOOLS: comma sperated list of consul tools
|
6
6
|
tools = (ENV['CONSUL_TOOLS'] || 'services').split(",")
|
7
|
-
|
8
|
-
|
7
|
+
tools_suffix = ENV['CONSUL_TOOLS_PREFIX'] || '-ui.html'
|
8
|
+
tools_prefix = ENV['CONSUL_TOOLS_SUFFIX'] || 'consul-'
|
9
|
+
|
10
|
+
dc_suffix = ENV['CONSUL_DC_SUFFIX'] || ''
|
11
|
+
dc_prefix = ENV['CONSUL_DC_PREFIX'] || '#'
|
12
|
+
|
9
13
|
%><!DOCTYPE html>
|
10
14
|
<html lang="en">
|
11
15
|
<head>
|
@@ -13,24 +17,28 @@
|
|
13
17
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
|
14
18
|
<meta name="description" content="Display Consul information"/>
|
15
19
|
<meta name="author" content="Criteo"/>
|
16
|
-
<meta http-equiv="refresh" content="<%= param('refresh', ENV['REFRESH'] || '600') %>"/>
|
17
20
|
<title><%= param('title', 'Consul Real Time information') %></title>
|
18
21
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
|
19
|
-
<!-- <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> -->
|
20
22
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.11/css/all.css" integrity="sha384-p2jx59pefphTFIpeqCcISO9MdVfIm4pNnsL08A6v5vaQc4owkQqxMV8kg4Yvhaw/" crossorigin="anonymous">
|
21
23
|
<link rel="stylesheet" href="css/style.css">
|
22
24
|
</head>
|
23
25
|
<body>
|
24
26
|
<nav class="navbar navbar-expand-md navbar-dark bg-secondary">
|
25
|
-
<
|
26
|
-
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
27
|
-
<span class="navbar-brand">Consul</span>
|
28
|
-
</button>
|
29
|
-
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
27
|
+
<div class="collapse navbar-collapse">
|
30
28
|
<ul class="navbar-nav mr-auto">
|
29
|
+
<li class="nav-item dropdown">
|
30
|
+
<a class="navbar-brand dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
31
|
+
Consul
|
32
|
+
</a>
|
33
|
+
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
34
|
+
<% datacenters.each do |dc| %>
|
35
|
+
<a class="dropdown-item" href="<%= dc_prefix + dc + dc_suffix %>"><%= dc %></a>
|
36
|
+
<% end %>
|
37
|
+
</div>
|
38
|
+
</li>
|
31
39
|
<% tools.each do |tool| %>
|
32
40
|
<li class="nav-item">
|
33
|
-
<a class="nav-link" href="<%=
|
41
|
+
<a class="nav-link" href="<%= tools_prefix + tool + tools_suffix %>"><%= tool.gsub('_', ' ').capitalize %></a>
|
34
42
|
</li>
|
35
43
|
<% end %>
|
36
44
|
</ul>
|
@@ -1,4 +1,7 @@
|
|
1
|
-
<% datasource = ENV['SERVICE_DATASOURCE'] || 'consul-template.json'
|
1
|
+
<% datasource = ENV['SERVICE_DATASOURCE'] || 'consul-template.json'
|
2
|
+
# Time to wait before reloading configuration again in seconds (0 = never)
|
3
|
+
refresh = ENV['REFRESH'] || '600' %>
|
4
|
+
|
2
5
|
<%= render_file('common/header.html.erb', title: 'Services') %>
|
3
6
|
<div class="main">
|
4
7
|
<div class="row mx-0">
|
@@ -13,6 +16,11 @@
|
|
13
16
|
</div>
|
14
17
|
<div class="col-8 col-m-9">
|
15
18
|
<h2 class="text-center" id="service-title"></h2>
|
19
|
+
<div class="progress">
|
20
|
+
<div id="service-progress-passing" status="passing" onclick="consulService.onClickFilter(this)" class="progress-status progress-bar bg-success" role="progressbar" style="width: 100%">passing</div>
|
21
|
+
<div id="service-progress-warning" status="warning" onclick="consulService.onClickFilter(this)" class="progress-status progress-bar bg-warning" role="progressbar" style="width: 0%">warning</div>
|
22
|
+
<div id="service-progress-critical" status="critical" onclick="consulService.onClickFilter(this)" class="progress-status progress-bar bg-danger" role="progressbar" style="width: 0%">critical</div>
|
23
|
+
</div>
|
16
24
|
<div id="instances-wrapper">
|
17
25
|
<div id="instances-list" class="list-group"></div>
|
18
26
|
</div>
|
@@ -25,7 +33,7 @@
|
|
25
33
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
|
26
34
|
<script src="js/service.js"></script>
|
27
35
|
<script type="text/javascript">
|
28
|
-
consulService = new ConsulService('<%= datasource %>');
|
36
|
+
consulService = new ConsulService('<%= datasource %>','<%= refresh %>');
|
29
37
|
</script>
|
30
38
|
</body>
|
31
39
|
</html>
|
@@ -6,9 +6,9 @@
|
|
6
6
|
# INSTANCE_EXCLUDE_TAG: Exclude instances having the given tag (default: canary)
|
7
7
|
# EXCLUDE_SERVICES: comma-separated services to exclude (default: consul-agent-http,mesos-slave,mesos-agent-watcher)
|
8
8
|
|
9
|
-
service_tag_filter = ENV['SERVICES_TAG_FILTER'] ||
|
9
|
+
service_tag_filter = ENV['SERVICES_TAG_FILTER'] || nil
|
10
10
|
instance_must_tag = ENV['INSTANCE_MUST_TAG'] || service_tag_filter
|
11
|
-
instance_exclude_tag = ENV['INSTANCE_EXCLUDE_TAG']
|
11
|
+
instance_exclude_tag = ENV['INSTANCE_EXCLUDE_TAG']
|
12
12
|
|
13
13
|
# Services to hide
|
14
14
|
services_blacklist = (ENV['EXCLUDE_SERVICES'] || 'consul-agent-http,mesos-slave,mesos-agent-watcher,mesos-exporter-slave').split(',')
|
@@ -42,11 +42,11 @@
|
|
42
42
|
end
|
43
43
|
backends = {}
|
44
44
|
services(tag: service_tag_filter).each do |service_name, tags|
|
45
|
-
if !services_blacklist.include?(service_name) && tags.include?(instance_must_tag)
|
45
|
+
if !services_blacklist.include?(service_name) && (instance_must_tag.nil? || tags.include?(instance_must_tag))
|
46
46
|
the_backends = []
|
47
47
|
service(service_name).sort {|a,b| a['Node']['Node'] <=> b['Node']['Node'] }.each do |snode|
|
48
48
|
tags_of_instance = snode['Service']['Tags']
|
49
|
-
if tags_of_instance.include?(instance_must_tag) && !tags_of_instance.include?(instance_exclude_tag)
|
49
|
+
if (instance_must_tag.nil? || tags_of_instance.include?(instance_must_tag)) && !tags_of_instance.include?(instance_exclude_tag)
|
50
50
|
the_backends << snode if snode['Service']['Port']
|
51
51
|
end
|
52
52
|
end
|
@@ -85,5 +85,6 @@
|
|
85
85
|
service[:instances] << server
|
86
86
|
end
|
87
87
|
end
|
88
|
-
|
88
|
+
json_datacenters = datacenters
|
89
|
+
json = { services: json_backends, datacenters: json_datacenters, generated_at: Time.now}
|
89
90
|
%><%= JSON.pretty_generate(json) %>
|
@@ -38,7 +38,7 @@ h2 .fas {
|
|
38
38
|
cursor: pointer;
|
39
39
|
color: rgba( 0, 0, 0, 0.5);
|
40
40
|
font-size: 1.5rem;
|
41
|
-
transition: color .16s linear
|
41
|
+
transition: color .16s linear;
|
42
42
|
}
|
43
43
|
|
44
44
|
h2 .fas:hover {
|
@@ -55,3 +55,17 @@ h2 .fas:hover {
|
|
55
55
|
padding: 5px;
|
56
56
|
padding-left: 10px;
|
57
57
|
}
|
58
|
+
|
59
|
+
.progress {
|
60
|
+
border-radius: 0px;
|
61
|
+
}
|
62
|
+
|
63
|
+
.progress-status {
|
64
|
+
transition: background-color .16s linear;
|
65
|
+
cursor: pointer;
|
66
|
+
}
|
67
|
+
|
68
|
+
.progress-deactivated {
|
69
|
+
background-color: #a5a5a5 !important;
|
70
|
+
color: #f1f1f1 !important;
|
71
|
+
}
|
@@ -1,27 +1,27 @@
|
|
1
1
|
class ConsulService {
|
2
|
-
constructor(ressourceURL) {
|
2
|
+
constructor(ressourceURL, refresh) {
|
3
3
|
this.ressourceURL = ressourceURL;
|
4
4
|
this.fetchRessource();
|
5
5
|
this.serviceList = $("#service-list");
|
6
6
|
this.serviceFilter = $("#service-filter");
|
7
|
-
this.serviceFilter.keyup(this.filterService)
|
7
|
+
this.serviceFilter.keyup(this.filterService);
|
8
|
+
this.refresh = parseInt(refresh);
|
9
|
+
this.filterStatus = null;
|
8
10
|
}
|
9
11
|
|
10
12
|
fetchRessource() {
|
11
13
|
$.ajax({url: "consul_template.json", cache: false, dataType: "json", sourceObject: this, success: function(result){
|
12
|
-
|
13
|
-
// For autoupdate
|
14
|
-
} else {
|
15
|
-
this.sourceObject.initRessource(result);
|
16
|
-
}
|
14
|
+
consulService.initRessource(result);
|
17
15
|
}});
|
18
16
|
}
|
19
17
|
|
20
18
|
initRessource(data) {
|
21
19
|
this.data = data;
|
22
20
|
this.reloadServiceList();
|
23
|
-
|
24
|
-
|
21
|
+
console.log('Data generated at: ' + data['generated_at']);
|
22
|
+
|
23
|
+
var urlParam = new URL(location.href).searchParams.get('service');
|
24
|
+
if (urlParam) {
|
25
25
|
var nodes = document.getElementById('service-list').childNodes;
|
26
26
|
for(var i in nodes) {
|
27
27
|
if($(nodes[i]).html() == urlParam) {
|
@@ -32,6 +32,10 @@ class ConsulService {
|
|
32
32
|
} else {
|
33
33
|
this.selectService(document.getElementById('service-list').firstElementChild);
|
34
34
|
}
|
35
|
+
|
36
|
+
if(this.refresh > 0) {
|
37
|
+
setTimeout(this.fetchRessource, this.refresh * 1000);
|
38
|
+
}
|
35
39
|
}
|
36
40
|
|
37
41
|
reloadServiceList() {
|
@@ -62,6 +66,38 @@ class ConsulService {
|
|
62
66
|
this.updateURL();
|
63
67
|
}
|
64
68
|
|
69
|
+
onClickFilter(source) {
|
70
|
+
var status = $(source).attr('status');
|
71
|
+
this.filterStatus = (this.filterStatus == status) ? null : status;
|
72
|
+
this.filterInstances();
|
73
|
+
}
|
74
|
+
|
75
|
+
filterInstances() {
|
76
|
+
$('.progress-status').each(function() {
|
77
|
+
var status = $(this).attr('status');
|
78
|
+
if (consulService.filterStatus == null) {
|
79
|
+
$(this).removeClass('progress-deactivated');
|
80
|
+
} else if(consulService.filterStatus == status) {
|
81
|
+
$(this).removeClass('progress-deactivated');
|
82
|
+
} else {
|
83
|
+
$(this).addClass('progress-deactivated');
|
84
|
+
}
|
85
|
+
})
|
86
|
+
$('#instances-list').children('div').each(function() {
|
87
|
+
var status = $(this).attr('status');
|
88
|
+
if (consulService.filterStatus == null) {
|
89
|
+
$(this).removeClass('d-none');
|
90
|
+
$(this).addClass('d-block');
|
91
|
+
} else if (consulService.filterStatus == status) {
|
92
|
+
$(this).removeClass('d-none');
|
93
|
+
$(this).addClass('d-block');
|
94
|
+
} else {
|
95
|
+
$(this).removeClass('d-block');
|
96
|
+
$(this).addClass('d-none');
|
97
|
+
}
|
98
|
+
})
|
99
|
+
}
|
100
|
+
|
65
101
|
updateURL() {
|
66
102
|
var newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname;
|
67
103
|
newUrl += '?service=' + $(this.selectedService).html();
|
@@ -82,7 +118,9 @@ class ConsulService {
|
|
82
118
|
|
83
119
|
displayService(service) {
|
84
120
|
$("#service-title").html(service['name']);
|
85
|
-
$("#instances-list").html("")
|
121
|
+
$("#instances-list").html("");
|
122
|
+
|
123
|
+
var serviceStatus = {};
|
86
124
|
|
87
125
|
for (var key in service['instances']) {
|
88
126
|
var instance = service['instances'][key];
|
@@ -92,26 +130,54 @@ class ConsulService {
|
|
92
130
|
serviceHtml.appendChild(serviceTitleGenerator(instance));
|
93
131
|
serviceHtml.appendChild(tagsGenerator(instance));
|
94
132
|
serviceHtml.appendChild(checksStatusGenerator(instance));
|
133
|
+
var state = nodeState(instance);
|
134
|
+
serviceHtml.setAttribute('status', state);
|
135
|
+
serviceStatus[state] = (serviceStatus[state] || 0) + 1;
|
136
|
+
serviceStatus['total'] = (serviceStatus['total'] || 0) + 1;
|
95
137
|
|
96
138
|
$("#instances-list").append(serviceHtml);
|
97
139
|
}
|
98
140
|
|
141
|
+
$('#service-progress-passing').css('width', (serviceStatus['passing'] || 0) / serviceStatus['total'] * 100 + '%')
|
142
|
+
$('#service-progress-warning').css('width', (serviceStatus['warning'] || 0) / serviceStatus['total'] * 100 + '%')
|
143
|
+
$('#service-progress-critical').css('width', (serviceStatus['critical'] || 0) / serviceStatus['total'] * 100 + '%')
|
144
|
+
|
99
145
|
resizeWrapper('instances-wrapper', 'instances-list');
|
100
146
|
$('#instances-list .list-group-item').resize(resizeAll);
|
101
147
|
}
|
102
148
|
}
|
103
149
|
|
150
|
+
function nodeState(instance) {
|
151
|
+
status='passing';
|
152
|
+
for (var checkKey in instance.checks) {
|
153
|
+
switch(instance.checks[checkKey]['status']) {
|
154
|
+
case 'passing': break;
|
155
|
+
case 'warning': status='warning'; break;
|
156
|
+
case 'critical': return 'critical'; break;
|
157
|
+
}
|
158
|
+
}
|
159
|
+
return status;
|
160
|
+
}
|
161
|
+
|
162
|
+
supported_protocols = ['https', 'http', 'sftp', 'ftp', 'ssh', 'telnet']
|
163
|
+
|
104
164
|
function serviceTitleGenerator(instance) {
|
105
|
-
var protocol =
|
106
|
-
|
107
|
-
|
165
|
+
var protocol = null;
|
166
|
+
for (i in supported_protocols) {
|
167
|
+
var protoc = supported_protocols[i]
|
168
|
+
if (instance.tags.includes(protoc)) {
|
169
|
+
protocol = protoc + '://';
|
170
|
+
break;
|
171
|
+
}
|
108
172
|
}
|
109
173
|
|
110
174
|
var htmlTitle = document.createElement('h5');
|
111
175
|
|
112
176
|
var instanceLink = document.createElement('a');
|
113
|
-
|
114
|
-
|
177
|
+
if (protocol != null) {
|
178
|
+
instanceLink.setAttribute('href', protocol + instance.name + ':' + instance.port);
|
179
|
+
instanceLink.setAttribute('target', '_blank');
|
180
|
+
}
|
115
181
|
instanceLink.appendChild(document.createTextNode(instance.name + ':' + instance.port));
|
116
182
|
htmlTitle.appendChild(instanceLink);
|
117
183
|
|
@@ -177,7 +243,17 @@ function checksStatusGenerator(instance) {
|
|
177
243
|
var td2 = document.createElement('td');
|
178
244
|
var fieldName = dataToDisplay[index].replace(/\b\w/g, l => l.toUpperCase());
|
179
245
|
td1.appendChild(document.createTextNode(fieldName + ': '));
|
180
|
-
td2
|
246
|
+
var target = td2
|
247
|
+
if (index != 1) {
|
248
|
+
target = document.createElement('div');
|
249
|
+
target.setAttribute("class", "check-notes")
|
250
|
+
} else {
|
251
|
+
// Notes are rendered as plain text
|
252
|
+
target = document.createElement('pre');
|
253
|
+
target.setAttribute("class", "check-output")
|
254
|
+
}
|
255
|
+
target.appendChild(document.createTextNode(instance.checks[checkKey][dataToDisplay[index]]));
|
256
|
+
td2.appendChild(target)
|
181
257
|
tr.appendChild(td1);
|
182
258
|
tr.appendChild(td2);
|
183
259
|
notes.appendChild(tr);
|
@@ -57,7 +57,7 @@ if key_to_display
|
|
57
57
|
<code><%
|
58
58
|
# catch_errors: true will return nil if data cannot be converted to JSON
|
59
59
|
json = kv(key_to_display).get_value_json(catch_errors: true)
|
60
|
-
%><%= (json ?
|
60
|
+
%><%= (json ? ERB::Util.html_escape(json) : 'No Valid JSON Data') %></code>
|
61
61
|
</div>
|
62
62
|
<%
|
63
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: consul-templaterb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.11
|
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: 2018-05-
|
11
|
+
date: 2018-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-http-request
|
@@ -135,7 +135,6 @@ extra_rdoc_files:
|
|
135
135
|
- TemplateAPI.md
|
136
136
|
files:
|
137
137
|
- ".gitignore"
|
138
|
-
- ".gitreview"
|
139
138
|
- ".rspec"
|
140
139
|
- ".rubocop.yml"
|
141
140
|
- ".ruby_app"
|