mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 01:38:56 -04:00
Merge remote-tracking branch 'upstream/master' into feature/5.0
This commit is contained in:
commit
9d4d38d37b
19 changed files with 139 additions and 71 deletions
|
@ -1,12 +1,12 @@
|
|||
[[setup-repositories]]
|
||||
=== Kibana Repositories
|
||||
|
||||
Binary packages for Kibana are available for Unix distributions that support the `apt` and `yum` tools.We also have
|
||||
repositories available for APT and YUM based distributions.
|
||||
Binary packages for Kibana are available for Unix distributions that support the `apt` and `yum` tools.We also have
|
||||
repositories available for APT and YUM based distributions.
|
||||
|
||||
NOTE: Since the packages are created as part of the Kibana build, source packages are not available.
|
||||
|
||||
Packages are signed with the PGP key http://pgp.mit.edu/pks/lookup?op=vindex&search=0xD27D666CD88E42B4[D88E42B4], which
|
||||
Packages are signed with the PGP key http://pgp.mit.edu/pks/lookup?op=vindex&search=0xD27D666CD88E42B4[D88E42B4], which
|
||||
has the following fingerprint:
|
||||
|
||||
4609 5ACC 8548 582C 1A26 99A9 D27D 666C D88E 42B4
|
||||
|
@ -31,7 +31,7 @@ echo "deb http://packages.elastic.co/kibana/{branch}/debian stable main" | sudo
|
|||
+
|
||||
[WARNING]
|
||||
==================================================
|
||||
Use the `echo` method described above to add the Kibana repository. Do not use `add-apt-repository`, as that command
|
||||
Use the `echo` method described above to add the Kibana repository. Do not use `add-apt-repository`, as that command
|
||||
adds a `deb-src` entry with no corresponding source package.
|
||||
When the `deb-src` entry, is present, the commands in this procedure generate an error similar to the following:
|
||||
|
||||
|
@ -47,7 +47,7 @@ Delete the `deb-src` entry from the `/etc/apt/sources.list` file to clear the er
|
|||
sudo apt-get update && sudo apt-get install kibana
|
||||
--------------------------------------------------
|
||||
+
|
||||
. Configure Kibana to automatically start during bootup. If your distribution is using the System V version of `init`,
|
||||
. Configure Kibana to automatically start during bootup. If your distribution is using the System V version of `init`,
|
||||
run the following command:
|
||||
+
|
||||
[source,sh]
|
||||
|
@ -67,7 +67,7 @@ sudo /bin/systemctl enable kibana.service
|
|||
[[kibana-yum]]
|
||||
===== Installing Kibana with yum
|
||||
|
||||
WARNING: The repositories set up in this procedure are not compatible with distributions using version 3 of `rpm`, such
|
||||
WARNING: The repositories set up in this procedure are not compatible with distributions using version 3 of `rpm`, such
|
||||
as CentOS version 5.
|
||||
|
||||
. Download and install the public signing key:
|
||||
|
@ -96,8 +96,8 @@ enabled=1
|
|||
yum install kibana
|
||||
--------------------------------------------------
|
||||
+
|
||||
Configure Kibana to automatically start during bootup. If your distribution is using the System V version of `init`,
|
||||
run the following command:
|
||||
Configure Kibana to automatically start during bootup. If your distribution is using the System V version of `init`
|
||||
(check with `ps -p 1`), run the following command:
|
||||
+
|
||||
[source,sh]
|
||||
--------------------------------------------------
|
||||
|
|
|
@ -56,8 +56,8 @@
|
|||
"elasticsearchWithPlugins": "grunt esvm:withPlugins:keepalive",
|
||||
"lint": "grunt eslint:source",
|
||||
"lintroller": "grunt eslint:fixSource",
|
||||
"mocha": "mocha --compilers js:babel/register",
|
||||
"mocha:debug": "mocha --debug-brk --compilers js:babel/register"
|
||||
"mocha": "mocha",
|
||||
"mocha:debug": "mocha --debug-brk"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -142,7 +142,7 @@
|
|||
"Nonsense": "0.1.2",
|
||||
"angular-mocks": "1.4.7",
|
||||
"auto-release-sinon": "1.0.3",
|
||||
"babel-eslint": "4.1.3",
|
||||
"babel-eslint": "4.1.7",
|
||||
"chokidar": "1.0.5",
|
||||
"eslint": "1.5.1",
|
||||
"eslint-plugin-mocha": "1.0.0",
|
||||
|
|
|
@ -2,15 +2,21 @@ const _ = require('lodash');
|
|||
const Promise = require('bluebird');
|
||||
const Boom = require('boom');
|
||||
const getBasicAuthRealm = require('./get_basic_auth_realm');
|
||||
const toPath = require('lodash/internal/toPath');
|
||||
|
||||
module.exports = (client) => {
|
||||
return (req, endpoint, params = {}) => {
|
||||
if (req.headers.authorization) {
|
||||
_.set(params, 'headers.authorization', req.headers.authorization);
|
||||
}
|
||||
const api = _.get(client, endpoint);
|
||||
const path = toPath(endpoint);
|
||||
const api = _.get(client, path);
|
||||
let apiContext = _.get(client, path.slice(0, -1));
|
||||
if (_.isEmpty(apiContext)) {
|
||||
apiContext = client;
|
||||
}
|
||||
if (!api) throw new Error(`callWithRequest called with an invalid endpoint: ${endpoint}`);
|
||||
return api.call(client, params)
|
||||
return api.call(apiContext, params)
|
||||
.catch((err) => {
|
||||
if (err.status === 401) {
|
||||
// TODO: The err.message is temporary until we have support for getting headers in the client.
|
||||
|
|
|
@ -60,11 +60,11 @@ define(function (require) {
|
|||
};
|
||||
|
||||
$scope.toggleDisplay = function (field) {
|
||||
// inheritted param to fieldChooser
|
||||
// This is inherited from fieldChooser
|
||||
$scope.toggle(field.name);
|
||||
if (field.display) $scope.increaseFieldCounter(field);
|
||||
|
||||
// we are now displaying the field, kill it's details
|
||||
// we are now displaying the field, kill its details
|
||||
if (field.details) {
|
||||
$scope.toggleDetails(field);
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<!-- Settings editors -->
|
||||
<form
|
||||
name="forms.configEdit"
|
||||
ng-if="conf.editting"
|
||||
ng-if="conf.editing"
|
||||
ng-submit="save(conf)"
|
||||
role="form">
|
||||
|
||||
|
@ -65,7 +65,7 @@
|
|||
</form>
|
||||
|
||||
<!-- Setting display formats -->
|
||||
<span ng-if="!conf.editting" data-test-subj="currentValue">
|
||||
<span ng-if="!conf.editing" data-test-subj="currentValue">
|
||||
<span ng-show="(conf.normal || conf.json || conf.select)">{{conf.value || conf.defVal}}</span>
|
||||
<span ng-show="conf.array">{{(conf.value || conf.defVal).join(', ')}}</span>
|
||||
<span ng-show="conf.bool">{{conf.value === undefined ? conf.defVal : conf.value}}</span>
|
||||
|
@ -74,7 +74,7 @@
|
|||
</td>
|
||||
<td class="actions">
|
||||
<button
|
||||
ng-if="!conf.editting"
|
||||
ng-if="!conf.editing"
|
||||
ng-click="edit(conf)"
|
||||
class="btn btn-default"
|
||||
ng-disabled="conf.tooComplex"
|
||||
|
@ -85,7 +85,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
ng-if="conf.editting"
|
||||
ng-if="conf.editing"
|
||||
ng-click="save(conf)"
|
||||
class="btn btn-success"
|
||||
ng-disabled="conf.loading || conf.tooComplex || forms.configEdit.$invalid"
|
||||
|
@ -97,7 +97,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
ng-if="!conf.editting"
|
||||
ng-if="!conf.editing"
|
||||
ng-click="clear(conf)"
|
||||
ng-hide="conf.value === undefined"
|
||||
class="btn btn-danger"
|
||||
|
@ -108,7 +108,7 @@
|
|||
</button>
|
||||
|
||||
<button
|
||||
ng-if="conf.editting"
|
||||
ng-if="conf.editing"
|
||||
ng-click="cancelEdit(conf)"
|
||||
class="btn btn-default"
|
||||
aria-label="Cancel edit"
|
||||
|
|
|
@ -22,12 +22,12 @@ define(function (require) {
|
|||
// To allow passing form validation state back
|
||||
$scope.forms = {};
|
||||
|
||||
// setup loading flag, run async op, then clear loading and editting flag (just in case)
|
||||
// setup loading flag, run async op, then clear loading and editing flag (just in case)
|
||||
var loading = function (conf, fn) {
|
||||
conf.loading = true;
|
||||
fn()
|
||||
.finally(function () {
|
||||
conf.loading = conf.editting = false;
|
||||
conf.loading = conf.editing = false;
|
||||
})
|
||||
.catch(notify.fatal);
|
||||
};
|
||||
|
@ -41,7 +41,7 @@ define(function (require) {
|
|||
$scope.edit = function (conf) {
|
||||
conf.unsavedValue = conf.value == null ? conf.defVal : conf.value;
|
||||
$scope.configs.forEach(function (c) {
|
||||
c.editting = (c === conf);
|
||||
c.editing = (c === conf);
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -56,7 +56,7 @@ define(function (require) {
|
|||
};
|
||||
|
||||
$scope.cancelEdit = function (conf) {
|
||||
conf.editting = false;
|
||||
conf.editing = false;
|
||||
};
|
||||
|
||||
$scope.clear = function (conf) {
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<h5>
|
||||
Index Patterns
|
||||
<a
|
||||
ng-if="edittingId"
|
||||
ng-if="editingId"
|
||||
href="#/settings/indices"
|
||||
class="btn btn-primary btn-xs"
|
||||
aria-label="Add New">
|
||||
|
|
|
@ -23,7 +23,7 @@ define(function (require) {
|
|||
transclude: true,
|
||||
template: require('plugins/kibana/settings/sections/indices/index.html'),
|
||||
link: function ($scope) {
|
||||
$scope.edittingId = $route.current.params.indexPatternId;
|
||||
$scope.editingId = $route.current.params.indexPatternId;
|
||||
config.$bind($scope, 'defaultIndex');
|
||||
|
||||
$scope.$watch('defaultIndex', function () {
|
||||
|
@ -32,7 +32,7 @@ define(function (require) {
|
|||
return {
|
||||
id: id,
|
||||
url: kbnUrl.eval('#/settings/indices/{{id}}', {id: id}),
|
||||
class: 'sidebar-item-title ' + ($scope.edittingId === id ? 'active' : ''),
|
||||
class: 'sidebar-item-title ' + ($scope.editingId === id ? 'active' : ''),
|
||||
default: $scope.defaultIndex === id
|
||||
};
|
||||
});
|
||||
|
|
|
@ -14,7 +14,7 @@ module.exports = (kibana) => {
|
|||
},
|
||||
|
||||
uiExports: {
|
||||
bundle: async (UiBundle, env, apps) => {
|
||||
bundle: async (UiBundle, env, apps, plugins) => {
|
||||
let modules = [];
|
||||
let config = kibana.config;
|
||||
|
||||
|
@ -23,10 +23,15 @@ module.exports = (kibana) => {
|
|||
modules = union(modules, app.getModules());
|
||||
}
|
||||
|
||||
let testFiles = await findSourceFiles([
|
||||
'src/**/public/**/__tests__/**/*.js',
|
||||
'installedPlugins/*/public/**/__tests__/**/*.js'
|
||||
]);
|
||||
const testGlobs = [
|
||||
'src/ui/public/**/__tests__/**/*.js',
|
||||
];
|
||||
|
||||
for (const plugin of plugins) {
|
||||
testGlobs.push(`${plugin.publicDir}/**/__tests__/**/*.js`);
|
||||
}
|
||||
|
||||
const testFiles = await findSourceFiles(testGlobs);
|
||||
|
||||
for (let f of testFiles) modules.push(f);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
let _ = require('lodash');
|
||||
let Joi = require('joi');
|
||||
let { attempt, fromNode } = require('bluebird');
|
||||
let { resolve } = require('path');
|
||||
let { basename, resolve } = require('path');
|
||||
let { inherits } = require('util');
|
||||
|
||||
const defaultConfigSchema = Joi.object({
|
||||
|
@ -18,11 +18,23 @@ module.exports = class Plugin {
|
|||
this.uiExportsSpecs = opts.uiExports || {};
|
||||
this.requiredIds = opts.require || [];
|
||||
this.version = opts.version || pkg.version;
|
||||
this.publicDir = opts.publicDir !== false ? resolve(path, 'public') : null;
|
||||
this.externalCondition = opts.initCondition || _.constant(true);
|
||||
this.externalInit = opts.init || _.noop;
|
||||
this.getConfigSchema = opts.config || _.noop;
|
||||
this.init = _.once(this.init);
|
||||
|
||||
if (opts.publicDir === false) {
|
||||
this.publicDir = null;
|
||||
}
|
||||
else if (!opts.publicDir) {
|
||||
this.publicDir = resolve(this.path, 'public');
|
||||
}
|
||||
else {
|
||||
this.publicDir = opts.publicDir;
|
||||
if (basename(this.publicDir) !== 'public') {
|
||||
throw new Error(`publicDir for plugin ${this.id} must end with a "public" directory.`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static scoped(kbnServer, path, pkg) {
|
||||
|
|
|
@ -35,7 +35,7 @@ module.exports = async (kbnServer, server, config) => {
|
|||
}
|
||||
|
||||
for (let gen of uiExports.getBundleProviders()) {
|
||||
let bundle = await gen(UiBundle, bundlerEnv, uiExports.getAllApps());
|
||||
let bundle = await gen(UiBundle, bundlerEnv, uiExports.getAllApps(), kbnServer.plugins);
|
||||
if (bundle) bundles.add(bundle);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ define(function (require) {
|
|||
self.fetch();
|
||||
}),
|
||||
|
||||
// begining of full route update, new app will be initialized before
|
||||
// beginning of full route update, new app will be initialized before
|
||||
// $routeChangeSuccess or $routeChangeError
|
||||
$rootScope.$on('$routeChangeStart', function () {
|
||||
if (self._persistAcrossApps) {
|
||||
|
@ -136,8 +136,8 @@ define(function (require) {
|
|||
* @returns {void}
|
||||
*/
|
||||
State.prototype.destroy = function () {
|
||||
this.off(); // removes all listners
|
||||
this._cleanUpListeners(); // Removes the $routeUpdate listner
|
||||
this.off(); // removes all listeners
|
||||
this._cleanUpListeners(); // Removes the $routeUpdate listener
|
||||
};
|
||||
|
||||
State.prototype.setDefaults = function (defaults) {
|
||||
|
|
|
@ -88,9 +88,9 @@ define(function (require) {
|
|||
/**
|
||||
* Return the current bounds, if we have any.
|
||||
*
|
||||
* THIS DOES NOT CLONE THE BOUNDS, so editting them
|
||||
* THIS DOES NOT CLONE THE BOUNDS, so editing them
|
||||
* may have unexpected side-effects. Always
|
||||
* call bounds.min.clone() before editting
|
||||
* call bounds.min.clone() before editing
|
||||
*
|
||||
* @return {object|undefined} - If bounds are not defined, this
|
||||
* returns undefined, else it returns the bounds
|
||||
|
|
|
@ -37,7 +37,7 @@ module.exports = function (grunt) {
|
|||
// use an async iife to store promise for download
|
||||
// then store platform in active downloads list
|
||||
// which we will read from in the finish task
|
||||
platform.downloadPromise = (async () => {
|
||||
platform.downloadPromise = (async function () {
|
||||
grunt.file.mkdir(downloadDir);
|
||||
|
||||
if (platform.name === 'windows') {
|
||||
|
@ -82,4 +82,3 @@ module.exports = function (grunt) {
|
|||
.nodeify(this.async());
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -1,31 +1,33 @@
|
|||
module.exports = function (grunt) {
|
||||
let { flatten } = require('lodash');
|
||||
|
||||
grunt.registerTask('build', flatten([
|
||||
'_build:getProps',
|
||||
'clean:build',
|
||||
'clean:target',
|
||||
'_build:downloadNodeBuilds:start',
|
||||
'copy:devSource',
|
||||
'babel:build',
|
||||
'_build:babelOptions',
|
||||
'_build:installedPlugins',
|
||||
'_build:packageJson',
|
||||
'_build:readme',
|
||||
'_build:installNpmDeps',
|
||||
'_build:removePkgJsonDeps',
|
||||
'clean:testsFromModules',
|
||||
'clean:deepModuleBins',
|
||||
'clean:deepModules',
|
||||
'run:optimizeBuild',
|
||||
'stop:optimizeBuild',
|
||||
'_build:downloadNodeBuilds:finish',
|
||||
'_build:versionedLinks',
|
||||
'_build:archives',
|
||||
!grunt.option('os-packages') ? [] : [
|
||||
'_build:pleaseRun',
|
||||
'_build:osPackages',
|
||||
],
|
||||
'_build:shasums'
|
||||
]));
|
||||
grunt.registerTask('build', 'Build packages', function (arg) {
|
||||
grunt.task.run(flatten([
|
||||
'_build:getProps',
|
||||
'clean:build',
|
||||
'clean:target',
|
||||
'_build:downloadNodeBuilds:start',
|
||||
'copy:devSource',
|
||||
'babel:build',
|
||||
'_build:babelOptions',
|
||||
'_build:installedPlugins',
|
||||
'_build:packageJson',
|
||||
'_build:readme',
|
||||
'_build:installNpmDeps',
|
||||
'_build:removePkgJsonDeps',
|
||||
'clean:testsFromModules',
|
||||
'clean:deepModuleBins',
|
||||
'clean:deepModules',
|
||||
'run:optimizeBuild',
|
||||
'stop:optimizeBuild',
|
||||
'_build:downloadNodeBuilds:finish',
|
||||
'_build:versionedLinks',
|
||||
'_build:archives',
|
||||
(grunt.option('os-packages') || arg === 'ospackages') ? [
|
||||
'_build:pleaseRun',
|
||||
'_build:osPackages',
|
||||
] : [],
|
||||
'_build:shasums'
|
||||
]));
|
||||
});
|
||||
};
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
require('../../test/mocha_setup');
|
||||
|
||||
module.exports = {
|
||||
options: {
|
||||
timeout: 10000,
|
||||
|
|
|
@ -3,7 +3,7 @@ module.exports = function (grunt) {
|
|||
|
||||
grunt.registerTask('jenkins', 'Jenkins build script', compact([
|
||||
'test',
|
||||
process.env.JOB_NAME === 'kibana_core' ? 'build' : null
|
||||
process.env.JOB_NAME === 'kibana_core' ? 'build:ospackages' : null
|
||||
]));
|
||||
|
||||
};
|
||||
|
|
1
test/mocha.opts
Normal file
1
test/mocha.opts
Normal file
|
@ -0,0 +1 @@
|
|||
--require test/mocha_setup.js
|
41
test/mocha_setup.js
Normal file
41
test/mocha_setup.js
Normal file
|
@ -0,0 +1,41 @@
|
|||
var sinon = require('sinon');
|
||||
var autoRelease = require('auto-release-sinon');
|
||||
|
||||
require('babel/register')(require('../src/optimize/babelOptions').node);
|
||||
|
||||
// hook into the global afterEach variable to allow autoReleaseSinon to register
|
||||
// an afterEach handler before mocha has exposed itself to the test files.
|
||||
//
|
||||
// This works by telling autoReleaseSinon to use a fake "afterEach" function.
|
||||
// Rather than actually record an afterEach handler the function tracks all of
|
||||
// the calls it received and queues them up in queuedAfterEachArgs.
|
||||
//
|
||||
// The global "afterEach" variable is also tracked, and once it is assigned by mocha
|
||||
// the variable global is reconfigured to point directly to the new value (from mocha)
|
||||
// and all of the queued invocations are executed.
|
||||
var queuedAfterEachArgs = [];
|
||||
Object.defineProperty(global, 'afterEach', {
|
||||
configurable: true,
|
||||
get() { return undefined; },
|
||||
set(afterEach) {
|
||||
Object.defineProperty(global, 'afterEach', {
|
||||
configurable: true,
|
||||
writable: true,
|
||||
value: afterEach
|
||||
});
|
||||
|
||||
queuedAfterEachArgs.forEach(function (args) {
|
||||
afterEach.apply(null, args);
|
||||
});
|
||||
|
||||
return global.afterEach;
|
||||
}
|
||||
});
|
||||
|
||||
autoRelease.setupAutoRelease(sinon, function () {
|
||||
if (!global.afterEach) {
|
||||
queuedAfterEachArgs.push(Array.prototype.slice.call(arguments));
|
||||
} else {
|
||||
global.afterEach.apply(this, arguments);
|
||||
}
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue