Add IP range aggregation, add ip address input validator. Closes #240

This commit is contained in:
Rashid Khan 2014-08-13 16:09:38 -07:00
parent a118748fe2
commit 750675b89b
6 changed files with 129 additions and 1 deletions

View file

@ -11,6 +11,7 @@ define(function (require) {
var controlHtml = {
ranges: require('text!apps/visualize/partials/controls/ranges.html'),
ip_range: require('text!apps/visualize/partials/controls/ip_range.html'),
filters: require('text!apps/visualize/partials/controls/filters.html'),
orderAndSize: require('text!apps/visualize/partials/controls/order_and_size.html'),
minDocCount: require('text!apps/visualize/partials/controls/min_doc_count.html'),
@ -57,6 +58,7 @@ define(function (require) {
aggs.bucketAggsByName.terms,
aggs.bucketAggsByName.histogram,
aggs.bucketAggsByName.range,
aggs.bucketAggsByName.ip_range,
aggs.bucketAggsByName.date_histogram,
aggs.bucketAggsByName.filters,
// 'range'
@ -123,10 +125,14 @@ define(function (require) {
if (!controlsHtml.match(/aggParams\.interval\.options/)) ; //debugger;
}
if (params.ranges) {
if (aggName === 'range' && params.ranges) {
controlsHtml += ' ' + controlHtml.ranges;
}
if (aggName === 'ip_range' && params.ranges) {
controlsHtml += ' ' + controlHtml.ip_range;
}
if (params.filters) {
controlsHtml += ' ' + controlHtml.filters;
}

View file

@ -0,0 +1,43 @@
<div ng-init="config.ranges = (config.ranges || [{}])">
<div class="form-group" >
<div class="row">
<div class="col-xs-5">
<label>From</label>
</div>
<div class="col-xs-5">
<label>To</label>
</div>
</div>
<div class="row"
ng-repeat="range in config.ranges track by $index">
<div class="col-xs-5">
<input validate-ip
ng-model="range.from"
type="text"
class="form-control"
name="range.from" />
</div>
<div class="col-xs-5">
<input validate-ip
ng-model="range.to"
type="text"
class="form-control"
name="range.to" />
</div>
<div class="col-xs-1">
<button ng-click="config.ranges.splice($index, 1)"
class="btn btn-danger btn-xs">
<i class="fa fa-ban" ></i>
</button>
</div>
</div>
</div>
<div
ng-click="config.ranges.push({})"
class="sidebar-item-button primary">
Add Range
</div>
</div>

View file

@ -80,6 +80,7 @@ define(function (require) {
],
ip: [
aggs.bucketAggsByName.terms,
aggs.bucketAggsByName.ip_range,
// 'ipv4 range'
],
geo_point: [

View file

@ -4,6 +4,7 @@ define(function (require) {
Private(require('apps/visualize/saved_visualizations/bucket_aggs/date_histogram')),
Private(require('apps/visualize/saved_visualizations/bucket_aggs/histogram')),
Private(require('apps/visualize/saved_visualizations/bucket_aggs/range')),
Private(require('apps/visualize/saved_visualizations/bucket_aggs/ip_range')),
Private(require('apps/visualize/saved_visualizations/bucket_aggs/terms')),
Private(require('apps/visualize/saved_visualizations/bucket_aggs/filters')),
Private(require('apps/visualize/saved_visualizations/bucket_aggs/significant_terms'))

View file

@ -0,0 +1,31 @@
define(function (require) {
require('directives/validate_ip');
return function RangeAggDefinition(timefilter, config) {
var _ = require('lodash');
var moment = require('moment');
var angular = require('angular');
var agg = this;
agg.name = 'ip_range';
agg.display = 'IP Range';
//agg.ordered = {};
agg.makeLabel = function (params) {
return params.field;
};
agg.params = {};
agg.params.ranges = {
custom: true,
default: [{from: '0.0.0.0', to: '255.255.255.255'}],
write: function (input, output) {
output.aggParams.ranges = input.val;
output.aggParams.keyed = true;
}
};
};
});

View file

@ -0,0 +1,46 @@
define(function (require) {
var _ = require('lodash');
require('modules')
.get('kibana')
.directive('validateIp', function () {
return {
restrict: 'A',
require: 'ngModel',
scope: {
'ngModel': '=',
},
link: function ($scope, elem, attr, ngModel) {
var isIP = function (value) {
if (!value) return false;
var parts = value.match(/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);
var valid = true;
if (parts) {
_.each(parts.slice(1, 5), function (octet) {
if (octet > 255 || octet < 0) valid = false;
});
} else {
valid = false;
}
return valid;
};
// From User
ngModel.$parsers.unshift(function (value) {
var valid = isIP(value);
ngModel.$setValidity('ipInput', valid);
return valid ? value : undefined;
});
// To user
ngModel.$formatters.unshift(function (value) {
ngModel.$setValidity('ipInput', isIP(value));
return value;
});
}
};
});
});