Merge branch 'master' of github.com:elastic/kibana into feature/designMergeSnakeCase

This commit is contained in:
spalger 2016-03-16 10:08:53 -07:00
commit 3c0d12a50d
63 changed files with 569 additions and 154 deletions

View file

@ -218,7 +218,7 @@ So, you've been assigned a pull to review. What's that look like?
Remember, someone is blocked by a pull awaiting review, make it count. Be thorough, the more action items you catch in the first review, the less back and forth will be required, and the better chance the pull has of being successful. Don't you like success?
1. **Understand the issue** that is being fixed, or the feature being added. Check the description on the pull, and check out the related issue. If you don't understand something, ask the person the submitter for clarification.
1. **Understand the issue** that is being fixed, or the feature being added. Check the description on the pull, and check out the related issue. If you don't understand something, ask the submitter for clarification.
1. **Reproduce the bug** (or the lack of feature I guess?) in the destination branch, usually `master`. The referenced issue will help you here. If you're unable to reproduce the issue, contact the issue submitter for clarification
1. **Check out the pull** and test it. Is the issue fixed? Does it have nasty side effects? Try to create suspect inputs. If it operates on the value of a field try things like: strings (including an empty string), null, numbers, dates. Try to think of edge cases that might break the code.
1. **Merge the target branch**. It is possible that tests or the linter have been updated in the target branch since the pull was submitted. Merging the pull could cause core to start failing.

View file

@ -82,17 +82,6 @@ module.exports = function (grunt) {
config: config,
loadGruntTasks: {
pattern: ['grunt-*', '@*/grunt-*', 'gruntify-*', '@*/gruntify-*', 'intern']
},
preMerge(config, data) {
Object.keys(config).forEach(key => {
const taskConfig = config[key];
if (taskConfig.__taskName__) {
config[taskConfig.__taskName__] = taskConfig;
delete config[key];
delete taskConfig.__taskName__;
}
});
}
});

View file

@ -19,7 +19,7 @@
# that connects to this Kibana instance.
# elasticsearch.preserveHost: true
# Kibana uses an index in Elasticsearch to store saved searches, visualizations and
# Kibana uses an index in Elasticsearch to store saved searches, visualizations and
# dashboards. Kibana creates a new index if the index doesnt already exist.
# kibana.index: ".kibana"
@ -28,12 +28,12 @@
# If your Elasticsearch is protected with basic authentication, these settings provide
# the username and password that the Kibana server uses to perform maintenance on the Kibana
# index at startup. Your Kibana users still need to authenticate with Elasticsearch, which
# index at startup. Your Kibana users still need to authenticate with Elasticsearch, which
# is proxied through the Kibana server.
# elasticsearch.username: "user"
# elasticsearch.password: "pass"
# Paths to the PEM-format SSL certificate and SSL key files, respectively. These
# Paths to the PEM-format SSL certificate and SSL key files, respectively. These
# files enable SSL for outgoing requests from the Kibana server to the browser.
# server.ssl.cert: /path/to/your/server.crt
# server.ssl.key: /path/to/your/server.key
@ -43,7 +43,7 @@
# elasticsearch.ssl.cert: /path/to/your/client.crt
# elasticsearch.ssl.key: /path/to/your/client.key
# Optional setting that enables you to specify a path to the PEM file for the certificate
# Optional setting that enables you to specify a path to the PEM file for the certificate
# authority for your Elasticsearch instance.
# elasticsearch.ssl.ca: /path/to/your/CA.pem
@ -54,7 +54,7 @@
# the elasticsearch.requestTimeout setting.
# elasticsearch.pingTimeout: 1500
# Time in milliseconds to wait for responses from the back end or Elasticsearch. This value
# Time in milliseconds to wait for responses from the back end or Elasticsearch. This value
# must be a positive integer.
# elasticsearch.requestTimeout: 30000
@ -76,6 +76,10 @@
# Set the value of this setting to true to suppress all logging output other than error messages.
# logging.quiet: false
# Set the value of this setting to true to log all events, including system usage information
# Set the value of this setting to true to log all events, including system usage information
# and all requests.
# logging.verbose: false
# Set the interval in milliseconds to sample system and process performance
# metrics. Minimum is 100ms. Defaults to 10000.
# ops.interval: 10000

View file

@ -39,3 +39,4 @@ retrying.
error messages.
`logging.verbose`:: *Default: false* Set the value of this setting to `true` to log all events, including system usage
information and all requests.
`ops.interval`:: *Default: 10000* Set the interval in milliseconds to sample system and process performance metrics. Minimum is 100ms. Defaults to 10 seconds.

View file

@ -28,7 +28,7 @@ remove a range.
or bottom _n_ elements of a given field to display, ordered by count or a custom metric.
*Filters*:: You can specify a set of {ref}/search-aggregations-bucket-filters-aggregation.html[_filters_] for the data.
You can specify a filter as a query string or in JSON format, just as in the Discover search bar. Click *Add Filter* to
add another filter. Click the images:labelbutton.png[] *label* button to open the label field, where you can type in a
add another filter. Click the image:images/labelbutton.png[] *label* button to open the label field, where you can type in a
name to display on the visualization.
*Significant Terms*:: Displays the results of the experimental
{ref}/search-aggregations-bucket-significantterms-aggregation.html[_significant terms_] aggregation.

View file

@ -87,7 +87,7 @@
"babel-runtime": "5.8.20",
"bluebird": "2.9.34",
"boom": "2.8.0",
"bootstrap": "3.3.5",
"bootstrap": "3.3.6",
"brace": "0.5.1",
"bunyan": "1.7.1",
"clipboard": "1.5.5",
@ -156,7 +156,7 @@
"grunt-cli": "0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-copy": "0.8.1",
"grunt-esvm": "2.1.1",
"grunt-esvm": "3.0.3",
"grunt-karma": "0.12.0",
"grunt-run": "0.5.0",
"grunt-s3": "0.2.0-alpha.3",
@ -174,7 +174,6 @@
"karma-ie-launcher": "0.2.0",
"karma-mocha": "0.2.0",
"karma-safari-launcher": "0.1.1",
"libesvm": "3.3.0",
"license-checker": "3.1.0",
"load-grunt-config": "0.19.1",
"makelogs": "3.0.0-beta3",

View file

@ -1,7 +1,9 @@
import _ from 'lodash';
import Promise from 'bluebird';
import sinon from 'sinon';
import url from 'url';
import serverConfig from '../../../../../test/server_config';
import checkEsVersion from '../check_es_version';
describe('plugins/elasticsearch', function () {
@ -23,7 +25,7 @@ describe('plugins/elasticsearch', function () {
status: {
red: sinon.stub()
},
url: 'http://localhost:9210'
url: url.format(serverConfig.servers.elasticsearch)
}
}
};

View file

@ -1,9 +1,15 @@
import Promise from 'bluebird';
import sinon from 'sinon';
import expect from 'expect.js';
import url from 'url';
const NoConnections = require('elasticsearch').errors.NoConnections;
import healthCheck from '../health_check';
import serverConfig from '../../../../../test/server_config';
const esPort = serverConfig.servers.elasticsearch.port;
const esUrl = url.format(serverConfig.servers.elasticsearch);
describe('plugins/elasticsearch', function () {
describe('lib/health_check', function () {
@ -39,7 +45,7 @@ describe('plugins/elasticsearch', function () {
nodes: {
'node-01': {
version: '1.5.0',
http_address: 'inet[/127.0.0.1:9210]',
http_address: `inet[/127.0.0.1:${esPort}]`,
ip: '127.0.0.1'
}
}
@ -73,7 +79,7 @@ describe('plugins/elasticsearch', function () {
it('should set the cluster red if the ping fails, then to green', function () {
get.withArgs('elasticsearch.url').returns('http://localhost:9210');
get.withArgs('elasticsearch.url').returns(esUrl);
get.withArgs('elasticsearch.engineVersion').returns('^1.4.4');
get.withArgs('kibana.index').returns('.my-kibana');
client.ping.onCall(0).returns(Promise.reject(new NoConnections()));
@ -85,7 +91,7 @@ describe('plugins/elasticsearch', function () {
expect(plugin.status.yellow.args[0][0]).to.be('Waiting for Elasticsearch');
sinon.assert.calledOnce(plugin.status.red);
expect(plugin.status.red.args[0][0]).to.be(
'Unable to connect to Elasticsearch at http://localhost:9210.'
`Unable to connect to Elasticsearch at ${esUrl}.`
);
sinon.assert.calledTwice(client.ping);
sinon.assert.calledOnce(client.nodes.info);
@ -97,7 +103,7 @@ describe('plugins/elasticsearch', function () {
});
it('should set the cluster red if the health check status is red, then to green', function () {
get.withArgs('elasticsearch.url').returns('http://localhost:9210');
get.withArgs('elasticsearch.url').returns(esUrl);
get.withArgs('elasticsearch.engineVersion').returns('^1.4.4');
get.withArgs('kibana.index').returns('.my-kibana');
client.ping.returns(Promise.resolve());
@ -120,7 +126,7 @@ describe('plugins/elasticsearch', function () {
});
it('should set the cluster yellow if the health check timed_out and create index', function () {
get.withArgs('elasticsearch.url').returns('http://localhost:9210');
get.withArgs('elasticsearch.url').returns(esUrl);
get.withArgs('elasticsearch.engineVersion').returns('^1.4.4');
get.withArgs('kibana.index').returns('.my-kibana');
client.ping.returns(Promise.resolve());

View file

@ -1,4 +1,5 @@
import ingest from './server/routes/api/ingest';
import search from './server/routes/api/search';
module.exports = function (kibana) {
return new kibana.Plugin({
@ -71,6 +72,7 @@ module.exports = function (kibana) {
init: function (server, options) {
ingest(server);
search(server);
}
});

View file

@ -4,7 +4,6 @@
<span ng-show="dash.id" class="kibana-nav-info-title">
<span ng-bind="::dash.title"></span>
</span>
</div>
<div class="button-group kibana-nav-actions" role="toolbar">

View file

@ -3,8 +3,15 @@
<h5 ng-show="!field.details.error">Quick Count <kbn-info info="Top 5 values based on documents in the table" placement="right"></kbn-info>
<span ng-if="!field.details.error" class="small discover-field-details-count">
(
<a ng-show="field.indexed" ng-click="updateFilterInQuery('_exists_', field.name, '+')">{{::field.details.exists}}</a>
<span ng-show="!field.indexed">{{::field.details.exists}}</span>
<a
ng-show="!indexPattern.metaFields.includes(field.name)"
ng-click="updateFilterInQuery('_exists_', field.name, '+')">
{{::field.details.exists}}
</a>
<span
ng-show="indexPattern.metaFields.includes(field.name)">
{{::field.details.exists}}
</span>
/{{::field.details.total}} records
)
</span>

View file

@ -7,9 +7,10 @@ module.exports = function registerDelete(server) {
path: '/api/kibana/ingest/{id}',
method: 'DELETE',
handler: function (req, reply) {
const kibanaIndex = server.config().get('kibana.index');
const callWithRequest = server.plugins.elasticsearch.callWithRequest;
const deletePatternParams = {
index: '.kibana',
index: kibanaIndex,
type: 'index-pattern',
id: req.params.id
};

View file

@ -17,6 +17,7 @@ module.exports = function registerPost(server) {
}
},
handler: function (req, reply) {
const kibanaIndex = server.config().get('kibana.index');
const callWithRequest = server.plugins.elasticsearch.callWithRequest;
const requestDocument = _.cloneDeep(req.payload);
const indexPatternId = requestDocument.id;
@ -36,7 +37,7 @@ module.exports = function registerPost(server) {
}
const patternCreateParams = {
index: '.kibana',
index: kibanaIndex,
type: 'index-pattern',
id: indexPatternId,
body: indexPattern
@ -74,7 +75,7 @@ module.exports = function registerPost(server) {
return callWithRequest(req, 'indices.putTemplate', templateParams)
.catch((templateError) => {
const deleteParams = {
index: '.kibana',
index: kibanaIndex,
type: 'index-pattern',
id: indexPatternId
};

View file

@ -0,0 +1,25 @@
import _ from 'lodash';
import handleESError from '../../../../lib/handle_es_error';
export default function registerCount(server) {
server.route({
path: '/api/kibana/{id}/_count',
method: ['POST', 'GET'],
handler: function (req, reply) {
const boundCallWithRequest = _.partial(server.plugins.elasticsearch.callWithRequest, req);
boundCallWithRequest('count', {
allowNoIndices: false,
index: req.params.id
})
.then(
function (res) {
reply({count: res.count});
},
function (error) {
reply(handleESError(error));
}
);
}
});
}

View file

@ -0,0 +1,5 @@
import registerCount from './count/register_count';
export default function (server) {
registerCount(server);
}

View file

@ -81,6 +81,10 @@ module.exports = () => Joi.object({
})
.default(),
ops: Joi.object({
interval: Joi.number().default(10000),
}),
plugins: Joi.object({
paths: Joi.array().items(Joi.string()).default([]),
scanDirs: Joi.array().items(Joi.string()).default([]),

View file

@ -39,7 +39,7 @@ module.exports = function (kbnServer, server, config) {
server.register({
register: require('good'),
options: {
opsInterval: 5000,
opsInterval: config.get('ops.interval'),
requestHeaders: true,
requestPayload: true,
reporters: [

View file

@ -4,7 +4,6 @@ import Status from '../status';
import ServerStatus from '../server_status';
describe('Status class', function () {
var server;
var serverStatus;
@ -59,6 +58,34 @@ describe('Status class', function () {
expect(json.message).to.eql('Ready');
});
it('should call on handler if status is already matched', function (done) {
var status = serverStatus.create('test');
var msg = 'Test Ready';
status.green(msg);
status.on('green', function (prev, prevMsg) {
expect(arguments.length).to.equal(2);
expect(prev).to.be('green');
expect(prevMsg).to.be(msg);
expect(status.message).to.equal(msg);
done();
});
});
it('should call once handler if status is already matched', function (done) {
var status = serverStatus.create('test');
var msg = 'Test Ready';
status.green(msg);
status.once('green', function (prev, prevMsg) {
expect(arguments.length).to.equal(2);
expect(prev).to.be('green');
expect(prevMsg).to.be(msg);
expect(status.message).to.equal(msg);
done();
});
});
function testState(color) {
it(`should change the state to ${color} when #${color}() is called`, function () {
var status = serverStatus.create('test');

View file

@ -36,6 +36,22 @@ class Status extends EventEmitter {
since: this.since
};
}
on(eventName, handler) {
super.on(eventName, handler);
if (eventName === this.state) {
setImmediate(() => handler(this.state, this.message));
}
}
once(eventName, handler) {
if (eventName === this.state) {
setImmediate(() => handler(this.state, this.message));
} else {
super.once(eventName, handler);
}
}
}
states.all.forEach(function (state) {

View file

@ -82,6 +82,7 @@ describe('Histogram Agg', function () {
describe('extended_bounds', function () {
it('writes when only eb.min is set', function () {
var output = paramWriter.write({
min_doc_count: true,
extended_bounds: { min: 0 }
});
expect(output.params.extended_bounds).to.have.property('min', 0);
@ -90,6 +91,7 @@ describe('Histogram Agg', function () {
it('writes when only eb.max is set', function () {
var output = paramWriter.write({
min_doc_count: true,
extended_bounds: { max: 0 }
});
expect(output.params.extended_bounds).to.have.property('min', undefined);
@ -98,6 +100,7 @@ describe('Histogram Agg', function () {
it('writes when both eb.min and eb.max are set', function () {
var output = paramWriter.write({
min_doc_count: true,
extended_bounds: { min: 99, max: 100 }
});
expect(output.params.extended_bounds).to.have.property('min', 99);
@ -106,10 +109,19 @@ describe('Histogram Agg', function () {
it('does not write when nothing is set', function () {
var output = paramWriter.write({
min_doc_count: true,
extended_bounds: {}
});
expect(output.params).to.not.have.property('extended_bounds');
});
it('does not write when min_doc_count is false', function () {
var output = paramWriter.write({
min_doc_count: false,
extended_bounds: { min: 99, max: 100 }
});
expect(output.params).to.not.have.property('extended_bounds');
});
});
});
});

View file

@ -2,12 +2,12 @@ import _ from 'lodash';
import angular from 'angular';
import AggTypesBucketsBucketAggTypeProvider from 'ui/agg_types/buckets/_bucket_agg_type';
import AggTypesBucketsCreateFilterFiltersProvider from 'ui/agg_types/buckets/create_filter/filters';
import CourierDataSourceDecorateQueryProvider from 'ui/courier/data_source/_decorate_query';
import DecorateQueryProvider from 'ui/courier/data_source/_decorate_query';
import filtersTemplate from 'ui/agg_types/controls/filters.html';
export default function FiltersAggDefinition(Private, Notifier) {
var BucketAggType = Private(AggTypesBucketsBucketAggTypeProvider);
var createFilter = Private(AggTypesBucketsCreateFilterFiltersProvider);
var decorateQuery = Private(CourierDataSourceDecorateQueryProvider);
var decorateQuery = Private(DecorateQueryProvider);
var notif = new Notifier({ location: 'Filters Agg' });
return new BucketAggType({

View file

@ -51,7 +51,7 @@ export default function HistogramAggDefinition(Private) {
write: function (aggConfig, output) {
var val = aggConfig.params.extended_bounds;
if (val.min != null || val.max != null) {
if (aggConfig.params.min_doc_count && (val.min != null || val.max != null)) {
output.params.extended_bounds = {
min: val.min,
max: val.max

View file

@ -36,5 +36,10 @@ describe('chrome nav apis', function () {
const chrome = getChrome();
expect(chrome.addBasePath('http://github.com/elastic/kibana')).to.be('http://github.com/elastic/kibana');
});
it('includes the query string', function () {
const chrome = getChrome();
expect(chrome.addBasePath('/app/kibana?a=b')).to.be(`${basePath}/app/kibana?a=b`);
});
});
});

View file

@ -14,7 +14,7 @@ export default function (chrome, internals) {
var isUrl = url && isString(url);
if (!isUrl) return url;
var parsed = parse(url);
var parsed = parse(url, true);
if (!parsed.host && parsed.pathname) {
if (parsed.pathname[0] === '/') {
parsed.pathname = chrome.getBasePath() + parsed.pathname;

View file

@ -9,7 +9,7 @@ import $ from 'jquery';
import 'ui/timefilter';
import 'ui/private';
import 'ui/promises';
import 'ui/directives/kbnSrc';
import 'ui/directives/kbn_src';
var chrome = {};
var internals = _.defaults(

View file

@ -3,7 +3,7 @@ import _ from 'lodash';
import ConfigDefaultsProvider from 'ui/config/defaults';
import ConfigDelayedUpdaterProvider from 'ui/config/_delayed_updater';
import ConfigValsProvider from 'ui/config/_vals';
import CourierDataSourceDocSourceProvider from 'ui/courier/data_source/doc_source';
import DocSourceProvider from 'ui/courier/data_source/doc_source';
import uiRoutes from 'ui/routes';
import uiModules from 'ui/modules';
import Notifier from 'ui/notify/notifier';
@ -30,7 +30,7 @@ module.service('config', function (Private, kbnVersion, kbnIndex, $rootScope, bu
// update once it is requested by calling #set() or #clear().
var updater;
var DocSource = Private(CourierDataSourceDocSourceProvider);
var DocSource = Private(DocSourceProvider);
var doc = (new DocSource())
.index(kbnIndex)
.type('config')

View file

@ -1,45 +1,48 @@
import errors from 'ui/errors';
import _ from 'lodash';
import errors from 'ui/errors';
import 'ui/es';
import 'ui/promises';
import 'ui/safe_confirm';
import 'ui/index_patterns';
import CourierDataSourceDocSourceProvider from 'ui/courier/data_source/doc_source';
import CourierDataSourceSearchSourceProvider from 'ui/courier/data_source/search_source';
import CourierFetchStrategySearchProvider from 'ui/courier/fetch/strategy/search';
import CourierRequestQueueProvider from 'ui/courier/_request_queue';
import CourierErrorHandlersProvider from 'ui/courier/_error_handlers';
import CourierFetchFetchProvider from 'ui/courier/fetch/fetch';
import CourierLooperDocProvider from 'ui/courier/looper/doc';
import CourierLooperSearchProvider from 'ui/courier/looper/search';
import CourierDataSourceRootSearchSourceProvider from 'ui/courier/data_source/_root_search_source';
import CourierSavedObjectSavedObjectProvider from 'ui/courier/saved_object/saved_object';
import CourierRedirectWhenMissingProvider from 'ui/courier/_redirect_when_missing';
import uiModules from 'ui/modules';
import Notifier from 'ui/notify/notifier';
import DocSourceProvider from './data_source/doc_source';
import SearchSourceProvider from './data_source/search_source';
import SearchStrategyProvider from './fetch/strategy/search';
import RequestQueueProvider from './_request_queue';
import ErrorHandlersProvider from './_error_handlers';
import FetchProvider from './fetch';
import DocLooperProvider from './looper/doc';
import SearchLooperProvider from './looper/search';
import RootSearchSourceProvider from './data_source/_root_search_source';
import SavedObjectProvider from './saved_object';
import RedirectWhenMissingProvider from './_redirect_when_missing';
uiModules.get('kibana/courier')
.service('courier', function ($rootScope, Private, Promise, indexPatterns, Notifier) {
.service('courier', function ($rootScope, Private, Promise, indexPatterns) {
function Courier() {
var self = this;
var DocSource = Private(CourierDataSourceDocSourceProvider);
var SearchSource = Private(CourierDataSourceSearchSourceProvider);
var searchStrategy = Private(CourierFetchStrategySearchProvider);
var DocSource = Private(DocSourceProvider);
var SearchSource = Private(SearchSourceProvider);
var searchStrategy = Private(SearchStrategyProvider);
var requestQueue = Private(CourierRequestQueueProvider);
var errorHandlers = Private(CourierErrorHandlersProvider);
var requestQueue = Private(RequestQueueProvider);
var errorHandlers = Private(ErrorHandlersProvider);
var fetch = Private(CourierFetchFetchProvider);
var docLooper = self.docLooper = Private(CourierLooperDocProvider);
var searchLooper = self.searchLooper = Private(CourierLooperSearchProvider);
var fetch = Private(FetchProvider);
var docLooper = self.docLooper = Private(DocLooperProvider);
var searchLooper = self.searchLooper = Private(SearchLooperProvider);
// expose some internal modules
self.setRootSearchSource = Private(CourierDataSourceRootSearchSourceProvider).set;
self.setRootSearchSource = Private(RootSearchSourceProvider).set;
self.SavedObject = Private(CourierSavedObjectSavedObjectProvider);
self.SavedObject = Private(SavedObjectProvider);
self.indexPatterns = indexPatterns;
self.redirectWhenMissing = Private(CourierRedirectWhenMissingProvider);
self.redirectWhenMissing = Private(RedirectWhenMissingProvider);
self.DocSource = DocSource;
self.SearchSource = SearchSource;

View file

@ -2,7 +2,7 @@ import moment from 'moment';
import expect from 'expect.js';
import ngMock from 'ng_mock';
import _ from 'lodash';
import CourierDataSourceDecorateQueryProvider from 'ui/courier/data_source/_decorate_query';
import DecorateQueryProvider from 'ui/courier/data_source/_decorate_query';
describe('Query decorator', function () {
@ -29,7 +29,7 @@ describe('Query decorator', function () {
beforeEach(ngMock.inject(function (Private, $injector, _config_) {
config = _config_;
fn = Private(CourierDataSourceDecorateQueryProvider);
fn = Private(DecorateQueryProvider);
}));
it('should be a function', function () {

View file

@ -1,19 +1,17 @@
import 'ui/private';
import ngMock from 'ng_mock';
import expect from 'expect.js';
import CourierDataSourceNormalizeSortRequestProvider from 'ui/courier/data_source/_normalize_sort_request';
import NormalizeSortRequestProvider from 'ui/courier/data_source/_normalize_sort_request';
import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern';
describe('SearchSource#normalizeSortRequest', function () {
var normalizeSortRequest;
var indexPattern;
var normalizedSort;
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (Private) {
normalizeSortRequest = Private(CourierDataSourceNormalizeSortRequestProvider);
normalizeSortRequest = Private(NormalizeSortRequestProvider);
indexPattern = Private(FixturesStubbedLogstashIndexPatternProvider);
normalizedSort = [{

View file

@ -1,14 +1,17 @@
import _ from 'lodash';
import angular from 'angular';
import CourierRequestQueueProvider from 'ui/courier/_request_queue';
import CourierErrorHandlersProvider from 'ui/courier/_error_handlers';
import CourierFetchFetchProvider from 'ui/courier/fetch/fetch';
import CourierDataSourceDecorateQueryProvider from 'ui/courier/data_source/_decorate_query';
import 'ui/promises';
import RequestQueueProvider from '../_request_queue';
import ErrorHandlersProvider from '../_error_handlers';
import FetchProvider from '../fetch';
import DecorateQueryProvider from './_decorate_query';
export default function SourceAbstractFactory(Private, Promise, PromiseEmitter) {
var requestQueue = Private(CourierRequestQueueProvider);
var errorHandlers = Private(CourierErrorHandlersProvider);
var courierFetch = Private(CourierFetchFetchProvider);
var requestQueue = Private(RequestQueueProvider);
var errorHandlers = Private(ErrorHandlersProvider);
var courierFetch = Private(FetchProvider);
function SourceAbstract(initialState, strategy) {
var self = this;
@ -268,7 +271,7 @@ export default function SourceAbstractFactory(Private, Promise, PromiseEmitter)
.then(function () {
if (type === 'search') {
// This is down here to prevent the circular dependency
var decorateQuery = Private(CourierDataSourceDecorateQueryProvider);
var decorateQuery = Private(DecorateQueryProvider);
flatState.body = flatState.body || {};

View file

@ -1,4 +1,5 @@
import _ from 'lodash';
export default function DecorateQuery(config) {
/**
* Decorate queries with default parameters

View file

@ -1,11 +1,12 @@
import _ from 'lodash';
import errors from 'ui/errors';
import CourierRequestQueueProvider from 'ui/courier/_request_queue';
import CourierFetchFetchProvider from 'ui/courier/fetch/fetch';
import RequestQueueProvider from 'ui/courier/_request_queue';
import FetchProvider from 'ui/courier/fetch/fetch';
export default function (Promise, Private, es) {
var requestQueue = Private(CourierRequestQueueProvider);
var courierFetch = Private(CourierFetchFetchProvider);
var requestQueue = Private(RequestQueueProvider);
var courierFetch = Private(FetchProvider);
/**
* Backend for doUpdate and doIndex

View file

@ -1,4 +1,5 @@
import _ from 'lodash';
export default function normalizeSortRequest(config) {
var defaultSortOptions = config.get('sort:options');
@ -48,4 +49,3 @@ export default function normalizeSortRequest(config) {
return normalized;
}
};

View file

@ -1,7 +1,7 @@
import CourierDataSourceSearchSourceProvider from 'ui/courier/data_source/search_source';
import SearchSourceProvider from 'ui/courier/data_source/search_source';
export default function RootSearchSource(Private, $rootScope, timefilter, Notifier) {
var SearchSource = Private(CourierDataSourceSearchSourceProvider);
var SearchSource = Private(SearchSourceProvider);
var notify = new Notifier({ location: 'Root Search Source' });

View file

@ -1,16 +1,18 @@
import _ from 'lodash';
import CourierDataSourceDocSendToEsProvider from 'ui/courier/data_source/_doc_send_to_es';
import CourierDataSourceAbstractProvider from 'ui/courier/data_source/_abstract';
import CourierFetchRequestDocProvider from 'ui/courier/fetch/request/doc';
import CourierFetchStrategyDocProvider from 'ui/courier/fetch/strategy/doc';
import 'ui/es';
import 'ui/storage';
import DocSendToEsProvider from './_doc_send_to_es';
import AbstractDataSourceProvider from './_abstract';
import DocRequestProvider from '../fetch/request/doc';
import DocStrategyProvider from '../fetch/strategy/doc';
export default function DocSourceFactory(Private, Promise, es, sessionStorage) {
var sendToEs = Private(CourierDataSourceDocSendToEsProvider);
var SourceAbstract = Private(CourierDataSourceAbstractProvider);
var DocRequest = Private(CourierFetchRequestDocProvider);
var docStrategy = Private(CourierFetchStrategyDocProvider);
var sendToEs = Private(DocSendToEsProvider);
var SourceAbstract = Private(AbstractDataSourceProvider);
var DocRequest = Private(DocRequestProvider);
var docStrategy = Private(DocStrategyProvider);
_.class(DocSource).inherits(SourceAbstract);
function DocSource(initialState) {

View file

@ -1,16 +1,18 @@
import _ from 'lodash';
import rootSearchSource from 'ui/courier/data_source/_root_search_source';
import CourierDataSourceAbstractProvider from 'ui/courier/data_source/_abstract';
import CourierFetchRequestSearchProvider from 'ui/courier/fetch/request/search';
import CourierFetchRequestSegmentedProvider from 'ui/courier/fetch/request/segmented';
import CourierFetchStrategySearchProvider from 'ui/courier/fetch/strategy/search';
import CourierDataSourceNormalizeSortRequestProvider from 'ui/courier/data_source/_normalize_sort_request';
import NormalizeSortRequestProvider from './_normalize_sort_request';
import rootSearchSource from './_root_search_source';
import AbstractDataSourceProvider from './_abstract';
import SearchRequestProvider from '../fetch/request/search';
import SegmentedRequestProvider from '../fetch/request/segmented';
import SearchStrategyProvider from '../fetch/strategy/search';
export default function SearchSourceFactory(Promise, Private) {
var SourceAbstract = Private(CourierDataSourceAbstractProvider);
var SearchRequest = Private(CourierFetchRequestSearchProvider);
var SegmentedRequest = Private(CourierFetchRequestSegmentedProvider);
var searchStrategy = Private(CourierFetchStrategySearchProvider);
var normalizeSortRequest = Private(CourierDataSourceNormalizeSortRequestProvider);
var SourceAbstract = Private(AbstractDataSourceProvider);
var SearchRequest = Private(SearchRequestProvider);
var SegmentedRequest = Private(SegmentedRequestProvider);
var searchStrategy = Private(SearchStrategyProvider);
var normalizeSortRequest = Private(NormalizeSortRequestProvider);
_.class(SearchSource).inherits(SourceAbstract);
function SearchSource(initialState) {

View file

@ -1,5 +1,9 @@
import _ from 'lodash';
export default function LooperFactory($timeout, Notifier, Promise) {
import 'ui/promises';
import Notifier from 'ui/notify/notifier';
export default function LooperFactory($timeout, Promise) {
var notify = new Notifier();
function Looper(ms, fn) {

View file

@ -1,18 +1,18 @@
import CourierFetchFetchProvider from 'ui/courier/fetch/fetch';
import CourierLooperLooperProvider from 'ui/courier/looper/_looper';
import CourierFetchStrategyDocProvider from 'ui/courier/fetch/strategy/doc';
import FetchProvider from '../fetch';
import LooperProvider from './_looper';
import DocStrategyProvider from '../fetch/strategy/doc';
export default function DocLooperService(Private) {
var fetch = Private(CourierFetchFetchProvider);
var Looper = Private(CourierLooperLooperProvider);
var docStrategy = Private(CourierFetchStrategyDocProvider);
var fetch = Private(FetchProvider);
var Looper = Private(LooperProvider);
var DocStrategy = Private(DocStrategyProvider);
/**
* The Looper which will manage the doc fetch interval
* @type {Looper}
*/
var docLooper = new Looper(1500, function () {
fetch.fetchQueued(docStrategy);
fetch.fetchQueued(DocStrategy);
});
return docLooper;

View file

@ -1,14 +1,14 @@
import CourierFetchFetchProvider from 'ui/courier/fetch/fetch';
import CourierFetchStrategySearchProvider from 'ui/courier/fetch/strategy/search';
import CourierRequestQueueProvider from 'ui/courier/_request_queue';
import CourierLooperLooperProvider from 'ui/courier/looper/_looper';
import FetchProvider from '../fetch';
import SearchStrategyProvider from '../fetch/strategy/search';
import RequestQueueProvider from '../_request_queue';
import LooperProvider from './_looper';
export default function SearchLooperService(Private, Promise, Notifier, $rootScope) {
var fetch = Private(CourierFetchFetchProvider);
var searchStrategy = Private(CourierFetchStrategySearchProvider);
var requestQueue = Private(CourierRequestQueueProvider);
var fetch = Private(FetchProvider);
var searchStrategy = Private(SearchStrategyProvider);
var requestQueue = Private(RequestQueueProvider);
var Looper = Private(CourierLooperLooperProvider);
var Looper = Private(LooperProvider);
var notif = new Notifier({ location: 'Search Looper' });
/**

View file

@ -1,15 +1,18 @@
import angular from 'angular';
import errors from 'ui/errors';
import _ from 'lodash';
import errors from 'ui/errors';
import slugifyId from 'ui/utils/slugify_id';
import CourierDataSourceDocSourceProvider from 'ui/courier/data_source/doc_source';
import CourierDataSourceSearchSourceProvider from 'ui/courier/data_source/search_source';
import UtilsMappingSetupProvider from 'ui/utils/mapping_setup';
import MappingSetupProvider from 'ui/utils/mapping_setup';
import DocSourceProvider from '../data_source/doc_source';
import SearchSourceProvider from '../data_source/search_source';
export default function SavedObjectFactory(es, kbnIndex, Promise, Private, Notifier, safeConfirm, indexPatterns) {
var DocSource = Private(CourierDataSourceDocSourceProvider);
var SearchSource = Private(CourierDataSourceSearchSourceProvider);
var mappingSetup = Private(UtilsMappingSetupProvider);
var DocSource = Private(DocSourceProvider);
var SearchSource = Private(SearchSourceProvider);
var mappingSetup = Private(MappingSetupProvider);
function SavedObject(config) {
if (!_.isObject(config)) config = {};

View file

@ -7,7 +7,7 @@ import errors from 'ui/errors';
import IndexedArray from 'ui/indexed_array';
import FixturesLogstashFieldsProvider from 'fixtures/logstash_fields';
import FixturesStubbedDocSourceResponseProvider from 'fixtures/stubbed_doc_source_response';
import CourierDataSourceDocSourceProvider from 'ui/courier/data_source/doc_source';
import DocSourceProvider from 'ui/courier/data_source/doc_source';
import IndexPatternsMapperProvider from 'ui/index_patterns/_mapper';
import UtilsMappingSetupProvider from 'ui/utils/mapping_setup';
import IndexPatternsIntervalsProvider from 'ui/index_patterns/_intervals';
@ -33,7 +33,7 @@ describe('index pattern', function () {
mockLogstashFields = Private(FixturesLogstashFieldsProvider);
docSourceResponse = Private(FixturesStubbedDocSourceResponseProvider);
DocSource = Private(CourierDataSourceDocSourceProvider);
DocSource = Private(DocSourceProvider);
sinon.stub(DocSource.prototype, 'doIndex');
sinon.stub(DocSource.prototype, 'fetch');

View file

@ -7,7 +7,7 @@ import RegistryFieldFormatsProvider from 'ui/registry/field_formats';
import IndexPatternsGetIdsProvider from 'ui/index_patterns/_get_ids';
import IndexPatternsMapperProvider from 'ui/index_patterns/_mapper';
import IndexPatternsIntervalsProvider from 'ui/index_patterns/_intervals';
import CourierDataSourceDocSourceProvider from 'ui/courier/data_source/doc_source';
import DocSourceProvider from 'ui/courier/data_source/doc_source';
import UtilsMappingSetupProvider from 'ui/utils/mapping_setup';
import IndexPatternsFieldListProvider from 'ui/index_patterns/_field_list';
import IndexPatternsFlattenHitProvider from 'ui/index_patterns/_flatten_hit';
@ -19,7 +19,7 @@ export default function IndexPatternFactory(Private, timefilter, Notifier, confi
var getIds = Private(IndexPatternsGetIdsProvider);
var mapper = Private(IndexPatternsMapperProvider);
var intervals = Private(IndexPatternsIntervalsProvider);
var DocSource = Private(CourierDataSourceDocSourceProvider);
var DocSource = Private(DocSourceProvider);
var mappingSetup = Private(UtilsMappingSetupProvider);
var FieldList = Private(IndexPatternsFieldListProvider);

View file

@ -76,7 +76,7 @@ export default function MapperService(Private, Promise, es, config, kbnIndex) {
};
self.getIndicesForIndexPattern = function (indexPattern) {
return es.indices.getAliases({
return es.indices.getAlias({
index: patternToWildcard(indexPattern.id)
})
.then(function (resp) {

View file

@ -16,6 +16,13 @@
ng-class="'btn-' + notif.type"
ng-click="notif.showStack = true"
>More Info</button>
<button
type="button"
ng-if="notif.stack && notif.showStack"
class="btn"
ng-class="'btn-' + notif.type"
ng-click="notif.showStack = false"
>Less Info</button>
<button
type="button"
ng-if="notif.accept"

View file

@ -1,7 +1,7 @@
import _ from 'lodash';
import CourierDataSourceDecorateQueryProvider from 'ui/courier/data_source/_decorate_query';
import DecorateQueryProvider from 'ui/courier/data_source/_decorate_query';
export default function GetQueryFromUser(es, Private) {
var decorateQuery = Private(CourierDataSourceDecorateQueryProvider);
var decorateQuery = Private(DecorateQueryProvider);
/**
* Take text from the user and make it into a query object

View file

@ -11,6 +11,7 @@ var config;
var formatIds = [
'bytes',
'date',
'duration',
'ip',
'number',
'percent',

View file

@ -0,0 +1,50 @@
import expect from 'expect.js';
import ngMock from 'ng_mock';
import RegistryFieldFormatsProvider from 'ui/registry/field_formats';
describe('Duration Format', function () {
let fieldFormats;
let DurationFormat;
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (Private) {
fieldFormats = Private(RegistryFieldFormatsProvider);
DurationFormat = fieldFormats.getType('duration');
}));
test({ inputFormat: 'seconds', outputFormat: 'humanize' })
(-60, 'minus a minute')
(60, 'a minute')
(125, '2 minutes');
test({ inputFormat: 'minutes', outputFormat: 'humanize' })
(-60, 'minus an hour')
(60, 'an hour')
(125, '2 hours');
test({ inputFormat: 'minutes', outputFormat: 'asHours' }) // outputPrecision defaults to: 2
(-60, '-1.00')
(60, '1.00')
(125, '2.08');
test({ inputFormat: 'seconds', outputFormat: 'asSeconds', outputPrecision: 0 })
(-60, '-60')
(60, '60')
(125, '125');
test({ inputFormat: 'seconds', outputFormat: 'asSeconds', outputPrecision: 2 })
(-60, '-60.00')
(-32.333, '-32.33')
(60, '60.00')
(125, '125.00');
function test({ inputFormat, outputFormat, outputPrecision }) {
return function testFixture(input, output) {
it(`should format ${input} ${inputFormat} through ${outputFormat}${outputPrecision ? `, ${outputPrecision} decimals` : ''}`, () => {
const duration = new DurationFormat({ inputFormat, outputFormat, outputPrecision });
expect(duration.convert(input)).to.eql(output);
});
return testFixture;
};
}
});

View file

@ -5,6 +5,7 @@ import './_string';
import './_url';
import './_color';
import './_date';
import './_duration';
import './_truncate';
describe('Stringify Component', function () {
});

View file

@ -0,0 +1,28 @@
<div class="editor-duration">
<div class="form-group">
<label>Input Format</label>
<select
ng-model="editor.formatParams.inputFormat"
ng-options="inputFormat.kind as inputFormat.text for inputFormat in editor.field.format.type.inputFormats"
class="form-control">
</select>
</div>
<div class="form-group">
<label>Output Format</label>
<select
ng-model="editor.formatParams.outputFormat"
ng-options="outputFormat.method as outputFormat.text for outputFormat in editor.field.format.type.outputFormats"
class="form-control">
</select>
</div>
<div class="form-group" ng-hide="editor.field.format.isHuman()">
<label>Decimal Places</label>
<input type="number" min="0" max="20" ng-model="editor.formatParams.outputPrecision" class="form-control" />
</div>
</div>
<div>
<field-format-editor-samples
ng-model="editor.formatParams"
inputs="cntrl.sampleInputs">
</field-format-editor-samples>
</div>

View file

@ -0,0 +1,10 @@
.editor-duration {
display: flex;
> .form-group {
flex: 1 1 1%;
padding-right: 5px;
&:last-child {
padding-right: 0;
}
}
}

View file

@ -2,6 +2,7 @@ import fieldFormats from 'ui/registry/field_formats';
import stringifyUrl from 'ui/stringify/types/url';
import stringifyBytes from 'ui/stringify/types/bytes';
import stringifyDate from 'ui/stringify/types/date';
import stringifyDuration from 'ui/stringify/types/duration';
import stringifyIp from 'ui/stringify/types/ip';
import stringifyNumber from 'ui/stringify/types/number';
import stringifyPercent from 'ui/stringify/types/percent';
@ -9,9 +10,11 @@ import stringifyString from 'ui/stringify/types/string';
import stringifySource from 'ui/stringify/types/source';
import stringifyColor from 'ui/stringify/types/color';
import stringifyTruncate from 'ui/stringify/types/truncate';
fieldFormats.register(stringifyUrl);
fieldFormats.register(stringifyBytes);
fieldFormats.register(stringifyDate);
fieldFormats.register(stringifyDuration);
fieldFormats.register(stringifyIp);
fieldFormats.register(stringifyNumber);
fieldFormats.register(stringifyPercent);

View file

@ -0,0 +1,98 @@
import 'ui/stringify/editors/duration.less';
import _ from 'lodash';
import moment from 'moment';
import IndexPatternsFieldFormatProvider from 'ui/index_patterns/_field_format/field_format';
import durationTemplate from 'ui/stringify/editors/duration.html';
export default function DurationFormatProvider(Private) {
const ratioToSeconds = {
picoseconds: 0.000000000001,
nanoseconds: 0.000000001,
microseconds: 0.000001
};
const FieldFormat = Private(IndexPatternsFieldFormatProvider);
const HUMAN_FRIENDLY = 'humanize';
const DEFAULT_OUTPUT_PRECISION = 2;
const DEFAULT_INPUT_FORMAT = { text: 'Seconds', kind: 'seconds' };
const inputFormats = [
{ text: 'Picoseconds', kind: 'picoseconds' },
{ text: 'Nanoseconds', kind: 'nanoseconds' },
{ text: 'Microseconds', kind: 'microseconds' },
{ text: 'Milliseconds', kind: 'milliseconds' },
DEFAULT_INPUT_FORMAT,
{ text: 'Minutes', kind: 'minutes' },
{ text: 'Hours', kind: 'hours' },
{ text: 'Days', kind: 'days' },
{ text: 'Weeks', kind: 'weeks' },
{ text: 'Months', kind: 'months' },
{ text: 'Years', kind: 'years' }
];
const DEFAULT_OUTPUT_FORMAT = { text: 'Human Readable', method: 'humanize' };
const outputFormats = [
DEFAULT_OUTPUT_FORMAT,
{ text: 'Milliseconds', method: 'asMilliseconds' },
{ text: 'Seconds', method: 'asSeconds' },
{ text: 'Minutes', method: 'asMinutes' },
{ text: 'Hours', method: 'asHours' },
{ text: 'Days', method: 'asDays' },
{ text: 'Weeks', method: 'asWeeks' },
{ text: 'Months', method: 'asMonths' },
{ text: 'Years', method: 'asYears' }
];
class Duration extends FieldFormat {
isHuman() {
return this.param('outputFormat') === HUMAN_FRIENDLY;
}
_convert(val) {
const inputFormat = this.param('inputFormat');
const outputFormat = this.param('outputFormat');
const outputPrecision = this.param('outputPrecision');
const human = this.isHuman();
const prefix = val < 0 && human ? 'minus ' : '';
const duration = parseInputAsDuration(val, inputFormat);
const formatted = duration[outputFormat]();
const precise = human ? formatted : formatted.toFixed(outputPrecision);
return prefix + precise;
}
}
Duration.id = 'duration';
Duration.title = 'Duration';
Duration.fieldType = 'number';
Duration.inputFormats = inputFormats;
Duration.outputFormats = outputFormats;
Duration.editor = {
template: durationTemplate,
controllerAs: 'cntrl',
controller($scope, $interval) {
this.sampleInputs = [
-123,
1,
12,
123,
658,
1988,
3857,
123292,
923528271
];
}
};
Duration.paramDefaults = {
inputFormat: DEFAULT_INPUT_FORMAT.kind,
outputFormat: DEFAULT_OUTPUT_FORMAT.method,
outputPrecision: DEFAULT_OUTPUT_PRECISION
};
return Duration;
function parseInputAsDuration(val, inputFormat) {
const ratio = ratioToSeconds[inputFormat] || 1;
const kind = inputFormat in ratioToSeconds ? 'seconds' : inputFormat;
return moment.duration(val * ratio, kind);
}
};

View file

@ -4,6 +4,9 @@ import Bluebird from 'bluebird';
import 'elasticsearch-browser';
import ngMock from 'ng_mock';
import sinon from 'sinon';
import url from 'url';
import serverConfig from '../../../../../test/server_config';
describe('Scanner', function () {
let es;
@ -11,7 +14,7 @@ describe('Scanner', function () {
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (esFactory) {
es = esFactory({
host: 'http://localhost:9210',
host: url.format(serverConfig.servers.elasticsearch),
defer: function () {
return Bluebird.defer();
}

View file

@ -1,6 +1,6 @@
import { sortBy } from 'lodash';
import UiNavLink from './ui_nav_link';
import Collection from '../utils/Collection';
import Collection from '../utils/collection';
const inOrderCache = Symbol('inOrder');

View file

@ -6,8 +6,9 @@ export default function registerCheckAddedFilenames(grunt) {
const invalid = grunt.config
.get('filesToCommit')
.filter(isAdded)
.map(getFilename)
.filter(isAdded)
.filter(name => !name.match(/([\/\\]|^)(docs|tasks[\/\\]config|webpackShims)([\/\\]|$)/))
.filter(name => name.match(/[A-Z \-]/))
.reduce((all, name) => `${all} ${name}\n`, '');

View file

@ -3,8 +3,6 @@ var path = require('path');
module.exports = function (grunt) {
return {
__taskName__: 'downloadSelenium',
options: {
selenium: {
filename: 'selenium-server-standalone-2.48.2.jar',

View file

@ -2,7 +2,7 @@ module.exports = function (grunt) {
var resolve = require('path').resolve;
var directory = resolve(__dirname, '../../esvm');
var dataDir = resolve(directory, 'data_dir');
var uiConfig = require('../../test/server_config');
var serverConfig = require('../../test/server_config');
return {
options: {
@ -14,11 +14,6 @@ module.exports = function (grunt) {
},
http: {
port: 9200
},
marvel: {
agent: {
enabled: false
}
}
}
},
@ -41,7 +36,7 @@ module.exports = function (grunt) {
purge: true,
config: {
http: {
port: 9210
port: serverConfig.servers.elasticsearch.port
},
cluster: {
name: 'esvm-test'
@ -55,7 +50,7 @@ module.exports = function (grunt) {
purge: true,
config: {
http: {
port: uiConfig.servers.elasticsearch.port
port: serverConfig.servers.elasticsearch.port
},
cluster: {
name: 'esvm-ui'

View file

@ -1,6 +1,7 @@
define({
suites: [
'test/unit/api/ingest/index'
'test/unit/api/ingest/index',
'test/unit/api/search/index'
],
excludeInstrumentation: /(fixtures|node_modules)\//,
loaderOptions: {

View file

@ -23,7 +23,7 @@ module.exports = {
}
},
apps: {
statusPage: {
status_page: {
pathname: 'status'
},
discover: {

View file

@ -0,0 +1,72 @@
define(function (require) {
var Promise = require('bluebird');
var _ = require('intern/dojo/node!lodash');
var expect = require('intern/dojo/node!expect.js');
return function (bdd, scenarioManager, request) {
bdd.describe('Count API', function postIngest() {
bdd.before(function () {
return scenarioManager.client.create({
index: 'foo-1',
type: 'bar',
id: '1',
body: {
foo: 'bar'
}
})
.then(function () {
return scenarioManager.client.create({
index: 'foo-2',
type: 'bar',
id: '2',
body: {
foo: 'bar'
}
});
})
.then(function () {
return scenarioManager.client.indices.refresh({
index: ['foo-1', 'foo-2']
});
});
});
bdd.after(function () {
return scenarioManager.reload('emptyKibana')
.then(function () {
scenarioManager.client.indices.delete({
index: 'foo*'
});
});
});
bdd.it('should return 200 with a document count for existing indices', function () {
return request.post('/kibana/foo-*/_count')
.expect(200)
.then(function (response) {
expect(response.body.count).to.be(2);
});
});
bdd.it('should support GET requests as well', function () {
return request.get('/kibana/foo-*/_count')
.expect(200)
.then(function (response) {
expect(response.body.count).to.be(2);
});
});
bdd.it('should return 404 if a pattern matches no indices', function () {
return request.post('/kibana/doesnotexist-*/_count')
.expect(404);
});
bdd.it('should return 404 if a concrete index does not exist', function () {
return request.post('/kibana/concrete/_count')
.expect(404);
});
});
};
});

View file

@ -0,0 +1,23 @@
define(function (require) {
var bdd = require('intern!bdd');
var serverConfig = require('intern/dojo/node!../../../server_config');
var ScenarioManager = require('intern/dojo/node!../../../fixtures/scenario_manager');
var request = require('intern/dojo/node!supertest-as-promised');
var url = require('intern/dojo/node!url');
var count = require('./_count');
bdd.describe('search API', function () {
var scenarioManager = new ScenarioManager(url.format(serverConfig.servers.elasticsearch));
request = request(url.format(serverConfig.servers.kibana) + '/api');
bdd.before(function () {
return scenarioManager.load('emptyKibana');
});
bdd.after(function () {
return scenarioManager.unload('emptyKibana');
});
count(bdd, scenarioManager, request);
});
});

View file

@ -13,7 +13,7 @@ describe('getUrl', function () {
expect(url).to.be('http://localhost/foo');
});
it('should convert to a secure url with port', function () {
it('should convert to a url with port', function () {
var url = getUrl({
protocol: 'http',
hostname: 'localhost',

View file

@ -1,8 +1,10 @@
import url from 'url';
import { defaultsDeep, set } from 'lodash';
import { header as basicAuthHeader } from './base_auth';
import { kibanaUser, kibanaServer } from '../shield';
import KbnServer from '../../src/server/kbn_server';
import fromRoot from '../../src/utils/from_root';
import serverConfig from '../server_config';
const SERVER_DEFAULTS = {
server: {
@ -23,7 +25,7 @@ const SERVER_DEFAULTS = {
enabled: false
},
elasticsearch: {
url: 'http://localhost:9210',
url: url.format(serverConfig.servers.elasticsearch),
username: kibanaServer.username,
password: kibanaServer.password
}