kibana-sinatra 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/kibana/assets/app/app.js +0 -1
- data/lib/kibana/assets/app/components/extend-jquery.js +1 -0
- data/lib/kibana/assets/app/components/kbn.js +31 -10
- data/lib/kibana/assets/app/components/require.config.js +5 -2
- data/lib/kibana/assets/app/components/underscore.extended.js +4 -0
- data/lib/kibana/assets/app/controllers/dash.js +10 -6
- data/lib/kibana/assets/app/controllers/dashLoader.js +0 -3
- data/lib/kibana/assets/app/dashboards/logstash.js +2 -2
- data/lib/kibana/assets/app/directives/all.js +2 -1
- data/lib/kibana/assets/app/directives/esVersion.js +24 -0
- data/lib/kibana/assets/app/directives/kibanaPanel.js +9 -8
- data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +25 -4
- data/lib/kibana/assets/app/filters/all.js +13 -1
- data/lib/kibana/assets/app/panels/bettermap/module.js +4 -3
- data/lib/kibana/assets/app/panels/derivequeries/editor.html +1 -23
- data/lib/kibana/assets/app/panels/derivequeries/module.html +1 -31
- data/lib/kibana/assets/app/panels/derivequeries/module.js +3 -110
- data/lib/kibana/assets/app/panels/filtering/module.html +8 -8
- data/lib/kibana/assets/app/panels/filtering/module.js +11 -1
- data/lib/kibana/assets/app/panels/histogram/editor.html +37 -66
- data/lib/kibana/assets/app/panels/histogram/module.html +14 -8
- data/lib/kibana/assets/app/panels/histogram/module.js +191 -65
- data/lib/kibana/assets/app/panels/histogram/queriesEditor.html +43 -0
- data/lib/kibana/assets/app/panels/histogram/styleEditor.html +84 -0
- data/lib/kibana/assets/app/panels/histogram/timeSeries.js +39 -2
- data/lib/kibana/assets/app/panels/hits/module.js +10 -13
- data/lib/kibana/assets/app/panels/map/module.js +9 -6
- data/lib/kibana/assets/app/panels/pie/module.js +4 -3
- data/lib/kibana/assets/app/panels/query/editors/lucene.html +0 -0
- data/lib/kibana/assets/app/panels/query/editors/regex.html +0 -0
- data/lib/kibana/assets/app/panels/query/editors/topN.html +12 -0
- data/lib/kibana/assets/app/panels/query/help/lucene.html +30 -0
- data/lib/kibana/assets/app/panels/query/help/regex.html +10 -0
- data/lib/kibana/assets/app/panels/query/help/topN.html +14 -0
- data/lib/kibana/assets/app/panels/query/helpModal.html +12 -0
- data/lib/kibana/assets/app/panels/query/meta.html +29 -16
- data/lib/kibana/assets/app/panels/query/module.html +11 -6
- data/lib/kibana/assets/app/panels/query/module.js +50 -2
- data/lib/kibana/assets/app/panels/query/query.css +8 -0
- data/lib/kibana/assets/app/panels/sparklines/editor.html +23 -0
- data/lib/kibana/assets/app/panels/sparklines/interval.js +57 -0
- data/lib/kibana/assets/app/panels/sparklines/module.html +10 -0
- data/lib/kibana/assets/app/panels/sparklines/module.js +379 -0
- data/lib/kibana/assets/app/panels/sparklines/timeSeries.js +216 -0
- data/lib/kibana/assets/app/panels/table/micropanel.html +36 -18
- data/lib/kibana/assets/app/panels/table/modal.html +45 -0
- data/lib/kibana/assets/app/panels/table/module.html +15 -3
- data/lib/kibana/assets/app/panels/table/module.js +67 -16
- data/lib/kibana/assets/app/panels/terms/module.js +8 -4
- data/lib/kibana/assets/app/panels/timepicker/module.html +5 -2
- data/lib/kibana/assets/app/panels/trends/module.html +8 -2
- data/lib/kibana/assets/app/panels/trends/module.js +15 -18
- data/lib/kibana/assets/app/partials/dashLoader.html +11 -11
- data/lib/kibana/assets/app/partials/dashboard.html +1 -1
- data/lib/kibana/assets/app/partials/dasheditor.html +1 -1
- data/lib/kibana/assets/app/services/all.js +2 -1
- data/lib/kibana/assets/app/services/dashboard.js +5 -4
- data/lib/kibana/assets/app/services/esVersion.js +150 -0
- data/lib/kibana/assets/app/services/fields.js +3 -3
- data/lib/kibana/assets/app/services/filterSrv.js +6 -1
- data/lib/kibana/assets/app/services/querySrv.js +153 -38
- data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
- data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
- data/lib/kibana/assets/img/small.png +0 -0
- data/lib/kibana/assets/index.html +2 -1
- data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +14 -6
- data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +2 -1
- data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +33 -12
- data/lib/kibana/assets/vendor/chromath.js +34 -0
- data/lib/kibana/assets/vendor/jquery/jquery.flot.events.js +641 -0
- data/lib/kibana/sinatra/version.rb +1 -1
- data/lib/kibana/views/config.erb +2 -1
- metadata +22 -2
@@ -36,7 +36,7 @@ function (angular, app, _, $, kbn) {
|
|
36
36
|
editorTabs : [
|
37
37
|
{title:'Queries', src:'app/partials/querySelect.html'}
|
38
38
|
],
|
39
|
-
status : "
|
39
|
+
status : "Stable",
|
40
40
|
description : "Displays the results of an elasticsearch facet as a pie chart, bar chart, or a "+
|
41
41
|
"table"
|
42
42
|
};
|
@@ -83,17 +83,21 @@ function (angular, app, _, $, kbn) {
|
|
83
83
|
$scope.panelMeta.loading = true;
|
84
84
|
var request,
|
85
85
|
results,
|
86
|
-
boolQuery
|
86
|
+
boolQuery,
|
87
|
+
queries;
|
87
88
|
|
88
89
|
request = $scope.ejs.Request().indices(dashboard.indices);
|
89
90
|
|
90
91
|
$scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
|
92
|
+
queries = querySrv.getQueryObjs($scope.panel.queries.ids);
|
93
|
+
|
91
94
|
// This could probably be changed to a BoolFilter
|
92
95
|
boolQuery = $scope.ejs.BoolQuery();
|
93
|
-
_.each(
|
94
|
-
boolQuery = boolQuery.should(querySrv.
|
96
|
+
_.each(queries,function(q) {
|
97
|
+
boolQuery = boolQuery.should(querySrv.toEjsObj(q));
|
95
98
|
});
|
96
99
|
|
100
|
+
|
97
101
|
// Terms mode
|
98
102
|
request = request
|
99
103
|
.facet($scope.ejs.TermsFacet('terms')
|
@@ -13,9 +13,9 @@
|
|
13
13
|
$scope.input isn't available on the controller unless the form element is in this file -->
|
14
14
|
<form name="input" style="margin:3px 0 0 0">
|
15
15
|
<ul class="nav nav-pills timepicker-dropdown">
|
16
|
-
<li class="dropdown"
|
16
|
+
<li class="dropdown">
|
17
17
|
|
18
|
-
<a class="dropdown-toggle timepicker-dropdown" data-toggle="dropdown" href="
|
18
|
+
<a class="dropdown-toggle timepicker-dropdown" data-toggle="dropdown" href="" bs-tooltip="(time.from.date | date:'yyyy-MM-dd HH:mm:ss.sss') + ' <br>to<br>' +(time.to.date | date:'yyyy-MM-dd HH:mm:ss.sss')" data-placement="bottom" ng-click="dismiss();">
|
19
19
|
|
20
20
|
<span ng-show="filterSrv.idsByType('time').length">
|
21
21
|
<span class="pointer" ng-hide="panel.now">{{time.from.date | date:'MMM d, y HH:mm:ss'}}</span>
|
@@ -47,6 +47,9 @@
|
|
47
47
|
</ul>
|
48
48
|
|
49
49
|
</li>
|
50
|
+
<li ng-show="!dashboard.current.refresh">
|
51
|
+
<a class="icon-refresh" ng-click="dashboard.refresh()"></a>
|
52
|
+
</li>
|
50
53
|
</ul>
|
51
54
|
|
52
55
|
</form>
|
@@ -1,11 +1,17 @@
|
|
1
1
|
<div ng-controller='trends' ng-init="init()">
|
2
2
|
|
3
|
-
<
|
3
|
+
<style>
|
4
|
+
div.trends-horizontal {
|
5
|
+
display:inline-block;
|
6
|
+
padding-right: 5px;
|
7
|
+
}
|
8
|
+
</style>
|
9
|
+
|
10
|
+
<div ng-class="{'trends-horizontal':panel.arrangement == 'horizontal'}" ng-style="panel.style" style="line-height:{{panel.style['font-size']}};" ng-repeat="query in trends">
|
4
11
|
<i class="icon-circle" style="color:{{query.info.color}}"></i>
|
5
12
|
<span bs-tooltip="'Then: '+query.hits.old+', Now: '+query.hits.new" ng-class="{'text-success': query.hits.new >= query.hits.old, 'text-error': query.hits.old > query.hits.new}" class='pointer strong'>
|
6
13
|
<i class='large' ng-class="{'icon-caret-up': query.hits.new >= query.hits.old, 'icon-caret-down': query.hits.old > query.hits.new}"></i> {{query.percent}}%
|
7
14
|
</span>
|
8
15
|
<span class="tiny light" ng-show="query.info.alias != ''">({{query.info.alias}})</span>
|
9
|
-
<br ng-show="panel.arrangement == 'vertical'">
|
10
16
|
</div>
|
11
17
|
</div>
|
@@ -73,8 +73,6 @@ function (angular, app, _, kbn) {
|
|
73
73
|
$scope.index = segment > 0 ? $scope.index : dashboard.indices;
|
74
74
|
}
|
75
75
|
|
76
|
-
$scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
|
77
|
-
|
78
76
|
// Determine a time field
|
79
77
|
var timeField = _.uniq(_.pluck(filterSrv.getByType('time'),'field'));
|
80
78
|
if(timeField.length > 1) {
|
@@ -98,11 +96,13 @@ function (angular, app, _, kbn) {
|
|
98
96
|
var request = $scope.ejs.Request();
|
99
97
|
var _ids_without_time = _.difference(filterSrv.ids,filterSrv.idsByType('time'));
|
100
98
|
|
99
|
+
$scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
|
100
|
+
var queries = querySrv.getQueryObjs($scope.panel.queries.ids);
|
101
101
|
|
102
102
|
// Build the question part of the query
|
103
|
-
_.each(
|
103
|
+
_.each(queries, function(query) {
|
104
104
|
var q = $scope.ejs.FilteredQuery(
|
105
|
-
querySrv.
|
105
|
+
querySrv.toEjsObj(query),
|
106
106
|
filterSrv.getBoolFilter(_ids_without_time).must(
|
107
107
|
$scope.ejs.RangeFilter(timeField)
|
108
108
|
.from($scope.time.from)
|
@@ -110,23 +110,23 @@ function (angular, app, _, kbn) {
|
|
110
110
|
));
|
111
111
|
|
112
112
|
request = request
|
113
|
-
.facet($scope.ejs.QueryFacet(id)
|
113
|
+
.facet($scope.ejs.QueryFacet(query.id)
|
114
114
|
.query(q)
|
115
115
|
).size(0);
|
116
116
|
});
|
117
117
|
|
118
118
|
|
119
119
|
// And again for the old time period
|
120
|
-
_.each(
|
120
|
+
_.each(queries, function(query) {
|
121
121
|
var q = $scope.ejs.FilteredQuery(
|
122
|
-
querySrv.
|
122
|
+
querySrv.toEjsObj(query),
|
123
123
|
filterSrv.getBoolFilter(_ids_without_time).must(
|
124
124
|
$scope.ejs.RangeFilter(timeField)
|
125
125
|
.from($scope.old_time.from)
|
126
126
|
.to($scope.old_time.to)
|
127
127
|
));
|
128
128
|
request = request
|
129
|
-
.facet($scope.ejs.QueryFacet("old_"+id)
|
129
|
+
.facet($scope.ejs.QueryFacet("old_"+query.id)
|
130
130
|
.query(q)
|
131
131
|
).size(0);
|
132
132
|
});
|
@@ -169,17 +169,14 @@ function (angular, app, _, kbn) {
|
|
169
169
|
return;
|
170
170
|
}
|
171
171
|
|
172
|
-
// Convert facet ids to numbers
|
173
|
-
var facetIds = _.map(_.keys(results.facets),function(k){if(!isNaN(k)){return parseInt(k, 10);}});
|
174
|
-
|
175
172
|
// Make sure we're still on the same query/queries
|
176
|
-
if($scope.query_id === query_id
|
177
|
-
_.intersection(facetIds,$scope.panel.queries.ids).length === $scope.panel.queries.ids.length
|
178
|
-
) {
|
173
|
+
if($scope.query_id === query_id) {
|
179
174
|
var i = 0;
|
180
|
-
|
181
|
-
|
182
|
-
|
175
|
+
var queries = querySrv.getQueryObjs($scope.panel.queries.ids);
|
176
|
+
|
177
|
+
_.each(queries, function(query) {
|
178
|
+
var n = results.facets[query.id].count;
|
179
|
+
var o = results.facets['old_'+query.id].count;
|
183
180
|
|
184
181
|
var hits = {
|
185
182
|
new : _.isUndefined($scope.data[i]) || _segment === 0 ? n : $scope.data[i].hits.new+n,
|
@@ -193,7 +190,7 @@ function (angular, app, _, kbn) {
|
|
193
190
|
'?' : Math.round(percentage(hits.old,hits.new)*100)/100;
|
194
191
|
// Create series
|
195
192
|
$scope.data[i] = {
|
196
|
-
info:
|
193
|
+
info: query,
|
197
194
|
hits: {
|
198
195
|
new : hits.new,
|
199
196
|
old : hits.old
|
@@ -4,11 +4,11 @@
|
|
4
4
|
}
|
5
5
|
</style>
|
6
6
|
|
7
|
-
<li ng-repeat="pulldown in dashboard.current.nav" ng-controller="PulldownCtrl" ng-show="pulldown.enable"><kibana-simple-panel type="pulldown.type"
|
7
|
+
<li ng-repeat="pulldown in dashboard.current.nav" ng-controller="PulldownCtrl" ng-show="pulldown.enable"><kibana-simple-panel type="pulldown.type" ng-cloak></kibana-simple-panel></li>
|
8
8
|
|
9
9
|
<li><a bs-tooltip="'Goto saved default'" data-placement="bottom" href='#/dashboard'><i class='icon-home'></i></a></li>
|
10
|
-
<li class="dropdown"
|
11
|
-
<a href="#" class="dropdown-toggle" data-toggle="dropdown" ng-click="elasticsearch_dblist('title:'+elasticsearch.query+'*')">
|
10
|
+
<li class="dropdown" ng-show="showDropdown('load')" >
|
11
|
+
<a href="#" bs-tooltip="'Load'" data-placement="bottom" class="dropdown-toggle" data-toggle="dropdown" ng-click="elasticsearch_dblist('title:'+elasticsearch.query+'*')">
|
12
12
|
<i class='icon-folder-open'></i>
|
13
13
|
</a>
|
14
14
|
|
@@ -28,8 +28,8 @@
|
|
28
28
|
</table>
|
29
29
|
</li>
|
30
30
|
|
31
|
-
<li class="dropdown-submenu noarrow">
|
32
|
-
<a tabindex="-1"
|
31
|
+
<li class="dropdown-submenu noarrow" ng-show="dashboard.current.loader.load_gist || dashboard.current.loader.load_local">
|
32
|
+
<a tabindex="-1" class="small" style="padding:0"><i class="icon-caret-left"></i> Advanced</a>
|
33
33
|
<ul class="dropdown-menu" style="padding:10px">
|
34
34
|
<li ng-show='dashboard.current.loader.load_local'>
|
35
35
|
<h5>Local File <tip>Load dashboard JSON layout from file</tip></h5>
|
@@ -58,8 +58,8 @@
|
|
58
58
|
|
59
59
|
|
60
60
|
</li>
|
61
|
-
<li class="dropdown"
|
62
|
-
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
61
|
+
<li class="dropdown"ng-show="showDropdown('save')">
|
62
|
+
<a href="#" bs-tooltip="'Save'" data-placement="bottom" class="dropdown-toggle" data-toggle="dropdown">
|
63
63
|
<i class='icon-save'></i>
|
64
64
|
</a>
|
65
65
|
|
@@ -67,14 +67,14 @@
|
|
67
67
|
<ul class="dropdown-menu" style="padding:10px">
|
68
68
|
|
69
69
|
<li ng-show="dashboard.current.loader.save_elasticsearch">
|
70
|
-
<form class="input-
|
70
|
+
<form class="input-prepend nomargin">
|
71
|
+
<button style="margin-top:-1px" class="btn" ng-click="elasticsearch_save('dashboard')"><i class="icon-save"></i></button>
|
71
72
|
<input class='input-medium' ng-model="dashboard.current.title" type="text" ng-model="elasticsearch.title"/>
|
72
|
-
<button class="btn" ng-click="elasticsearch_save('dashboard')"><i class="icon-save"></i></button>
|
73
73
|
</form>
|
74
74
|
</li>
|
75
75
|
|
76
|
-
<li class="dropdown-submenu noarrow">
|
77
|
-
<a tabindex="-1"
|
76
|
+
<li class="dropdown-submenu noarrow" ng-show="dashboard.current.loader.save_local || dashboard.current.loader.save_gist || dashboard.current.loader.save_default">
|
77
|
+
<a tabindex="-1" class="small" style="padding:0"><i class="icon-caret-left"></i> Advanced</a>
|
78
78
|
<ul class="dropdown-menu">
|
79
79
|
|
80
80
|
<li ng-show="dashboard.current.loader.save_default">
|
@@ -54,7 +54,7 @@
|
|
54
54
|
<div ng-repeat="(name, panel) in row.panels|filter:isPanel" ng-hide="panel.span == 0 || panel.hide" class="span{{panel.span}} panel nospace" style="min-height:{{row.height}}; position:relative" data-drop="true" ng-model="row.panels" data-jqyoui-options jqyoui-droppable="{index:$index,mutate:false,onDrop:'panelMoveDrop',onOver:'panelMoveOver(true)',onOut:'panelMoveOut'}">
|
55
55
|
<!-- Error Panel -->
|
56
56
|
<div class="row-fluid">
|
57
|
-
<div class="span12 alert
|
57
|
+
<div class="span12 alert-error panel-error" ng-hide="!panel.error">
|
58
58
|
<a class="close" ng-click="panel.error=false">×</a>
|
59
59
|
<i class="icon-exclamation-sign"></i> <strong>Oops!</strong> {{panel.error}}
|
60
60
|
</div>
|
@@ -117,7 +117,7 @@
|
|
117
117
|
<h5>Save to</h5>
|
118
118
|
<div class="row-fluid">
|
119
119
|
<div class="span2">
|
120
|
-
<label class="small">
|
120
|
+
<label class="small">Export</label><input type="checkbox" ng-model="dashboard.current.loader.save_local" ng-checked="dashboard.current.loader.save_local">
|
121
121
|
</div>
|
122
122
|
<div class="span2">
|
123
123
|
<label class="small">Browser</label><input type="checkbox" ng-model="dashboard.current.loader.save_default" ng-checked="dashboard.current.loader.save_default">
|
@@ -143,12 +143,13 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
|
|
143
143
|
return false;
|
144
144
|
}
|
145
145
|
}
|
146
|
-
|
146
|
+
// Don't resolve queries until indices are updated
|
147
|
+
querySrv.resolve().then(function(){$rootScope.$broadcast('refresh');});
|
147
148
|
});
|
148
149
|
} else {
|
149
150
|
if(self.current.failover) {
|
150
151
|
self.indices = [self.current.index.default];
|
151
|
-
$rootScope.$broadcast('refresh');
|
152
|
+
querySrv.resolve().then(function(){$rootScope.$broadcast('refresh');});
|
152
153
|
} else {
|
153
154
|
alertSrv.set("No time filter",
|
154
155
|
'Timestamped indices are configured without a failover. Waiting for time filter.',
|
@@ -157,7 +158,7 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
|
|
157
158
|
}
|
158
159
|
} else {
|
159
160
|
self.indices = [self.current.index.default];
|
160
|
-
$rootScope.$broadcast('refresh');
|
161
|
+
querySrv.resolve().then(function(){$rootScope.$broadcast('refresh');});
|
161
162
|
}
|
162
163
|
};
|
163
164
|
|
@@ -292,7 +293,7 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
|
|
292
293
|
|
293
294
|
this.elasticsearch_load = function(type,id) {
|
294
295
|
return $http({
|
295
|
-
url: config.elasticsearch + "/" + config.kibana_index + "/"+type+"/"+id,
|
296
|
+
url: config.elasticsearch + "/" + config.kibana_index + "/"+type+"/"+id+'?' + new Date().getTime(),
|
296
297
|
method: "GET",
|
297
298
|
transformResponse: function(response) {
|
298
299
|
return renderTemplate(angular.fromJson(response)._source.dashboard, $routeParams);
|
@@ -0,0 +1,150 @@
|
|
1
|
+
define([
|
2
|
+
'angular',
|
3
|
+
'underscore',
|
4
|
+
'config'
|
5
|
+
],
|
6
|
+
function (angular, _, config) {
|
7
|
+
'use strict';
|
8
|
+
|
9
|
+
var module = angular.module('kibana.services');
|
10
|
+
|
11
|
+
module.service('esVersion', function($http, alertSrv) {
|
12
|
+
|
13
|
+
this.versions = [];
|
14
|
+
|
15
|
+
// save a reference to this
|
16
|
+
var self = this;
|
17
|
+
|
18
|
+
this.init = function() {
|
19
|
+
getVersions();
|
20
|
+
};
|
21
|
+
|
22
|
+
var getVersions = function() {
|
23
|
+
var nodeInfo = $http({
|
24
|
+
url: config.elasticsearch + '/_nodes',
|
25
|
+
method: "GET"
|
26
|
+
}).error(function(data, status) {
|
27
|
+
if(status === 0) {
|
28
|
+
alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
|
29
|
+
". Please ensure that Elasticsearch is reachable from your system." ,'error');
|
30
|
+
} else {
|
31
|
+
alertSrv.set('Error',"Could not reach "+config.elasticsearch+"/_nodes. If you"+
|
32
|
+
" are using a proxy, ensure it is configured correctly",'error');
|
33
|
+
}
|
34
|
+
});
|
35
|
+
|
36
|
+
return nodeInfo.then(function(p) {
|
37
|
+
_.each(p.data.nodes, function(v) {
|
38
|
+
self.versions.push(v.version.split('-')[0]);
|
39
|
+
});
|
40
|
+
self.versions = sortVersions(_.uniq(self.versions));
|
41
|
+
});
|
42
|
+
};
|
43
|
+
|
44
|
+
// Get the max version in this cluster
|
45
|
+
this.max = function() {
|
46
|
+
return _.last(self.versions);
|
47
|
+
};
|
48
|
+
|
49
|
+
// Return the lowest version in the cluster
|
50
|
+
this.min = function() {
|
51
|
+
return _.first(self.versions);
|
52
|
+
};
|
53
|
+
|
54
|
+
// Sort versions from lowest to highest
|
55
|
+
var sortVersions = function(versions) {
|
56
|
+
var _versions = _.clone(versions),
|
57
|
+
_r = [];
|
58
|
+
|
59
|
+
while(_r.length < versions.length) {
|
60
|
+
var _h = "0";
|
61
|
+
/*jshint -W083 */
|
62
|
+
_.each(_versions,function(v){
|
63
|
+
if(self.compare(_h,v)) {
|
64
|
+
_h = v;
|
65
|
+
}
|
66
|
+
});
|
67
|
+
_versions = _.without(_versions,_h);
|
68
|
+
_r.push(_h);
|
69
|
+
}
|
70
|
+
return _r.reverse();
|
71
|
+
};
|
72
|
+
|
73
|
+
/*
|
74
|
+
Takes a version string with one of the following optional comparison prefixes: >,>=,<.<=
|
75
|
+
and evaluates if the cluster meets the requirement. If the prefix is omitted exact match
|
76
|
+
is assumed
|
77
|
+
*/
|
78
|
+
this.is = function(equation) {
|
79
|
+
var _v = equation,
|
80
|
+
_cf;
|
81
|
+
|
82
|
+
if(_v.charAt(0) === '>') {
|
83
|
+
_cf = _v.charAt(1) === '=' ? self.gte(_v.slice(2)) : self.gt(_v.slice(1));
|
84
|
+
} else if (_v.charAt(0) === '<') {
|
85
|
+
_cf = _v.charAt(1) === '=' ? self.lte(_v.slice(2)) : self.lt(_v.slice(1));
|
86
|
+
} else {
|
87
|
+
_cf = self.eq(_v);
|
88
|
+
}
|
89
|
+
|
90
|
+
return _cf;
|
91
|
+
};
|
92
|
+
|
93
|
+
// check if lowest version in cluster = `version`
|
94
|
+
this.eq = function(version) {
|
95
|
+
return version === self.min() ? true : false;
|
96
|
+
};
|
97
|
+
|
98
|
+
// version > lowest version in cluster?
|
99
|
+
this.gt = function(version) {
|
100
|
+
return version === self.min() ? false : self.gte(version);
|
101
|
+
};
|
102
|
+
|
103
|
+
// version < highest version in cluster?
|
104
|
+
this.lt = function(version) {
|
105
|
+
return version === self.max() ? false : self.lte(version);
|
106
|
+
};
|
107
|
+
|
108
|
+
// Check if the lowest version in the cluster is >= to `version`
|
109
|
+
this.gte = function(version) {
|
110
|
+
return self.compare(version,self.min());
|
111
|
+
};
|
112
|
+
|
113
|
+
// Check if the highest version in the cluster is <= to `version`
|
114
|
+
this.lte = function(version) {
|
115
|
+
return self.compare(self.max(),version);
|
116
|
+
};
|
117
|
+
|
118
|
+
// Determine if a specific version is greater than or equal to another
|
119
|
+
this.compare = function (required,installed) {
|
120
|
+
var a = installed.split('.');
|
121
|
+
var b = required.split('.');
|
122
|
+
var i;
|
123
|
+
|
124
|
+
for (i = 0; i < a.length; ++i) {
|
125
|
+
a[i] = Number(a[i]);
|
126
|
+
}
|
127
|
+
for (i = 0; i < b.length; ++i) {
|
128
|
+
b[i] = Number(b[i]);
|
129
|
+
}
|
130
|
+
if (a.length === 2) {
|
131
|
+
a[2] = 0;
|
132
|
+
}
|
133
|
+
|
134
|
+
if (a[0] > b[0]){return true;}
|
135
|
+
if (a[0] < b[0]){return false;}
|
136
|
+
|
137
|
+
if (a[1] > b[1]){return true;}
|
138
|
+
if (a[1] < b[1]){return false;}
|
139
|
+
|
140
|
+
if (a[2] > b[2]){return true;}
|
141
|
+
if (a[2] < b[2]){return false;}
|
142
|
+
|
143
|
+
return true;
|
144
|
+
};
|
145
|
+
|
146
|
+
this.init();
|
147
|
+
|
148
|
+
});
|
149
|
+
|
150
|
+
});
|
@@ -19,7 +19,7 @@ function (angular, _, config) {
|
|
19
19
|
if(!_.isUndefined(n) && n.length) {
|
20
20
|
// Only get the mapping for indices we don't know it for
|
21
21
|
var indices = _.difference(n,_.keys(self.mapping));
|
22
|
-
// Only get the mapping if there are indices
|
22
|
+
// Only get the mapping if there are new indices
|
23
23
|
if(indices.length > 0) {
|
24
24
|
self.map(indices).then(function(result) {
|
25
25
|
self.mapping = _.extend(self.mapping,result);
|
@@ -36,7 +36,7 @@ function (angular, _, config) {
|
|
36
36
|
var fields = [];
|
37
37
|
_.each(m, function(types) {
|
38
38
|
_.each(types, function(v) {
|
39
|
-
fields = _.union(fields,_.keys(v));
|
39
|
+
fields = _.without(_.union(fields,_.keys(v)),'_all','_source');
|
40
40
|
});
|
41
41
|
});
|
42
42
|
return fields;
|
@@ -75,7 +75,7 @@ function (angular, _, config) {
|
|
75
75
|
ret = {};
|
76
76
|
for(var attr in obj){
|
77
77
|
// For now only support multi field on the top level
|
78
|
-
// and if
|
78
|
+
// and if there is a default field set.
|
79
79
|
if(obj[attr]['type'] === 'multi_field') {
|
80
80
|
ret[attr] = obj[attr]['fields'][attr] || obj[attr];
|
81
81
|
continue;
|