Skip to content

Commit

Permalink
Merge pull request #7362 from w33ble/backport/inject-default-vars
Browse files Browse the repository at this point in the history
[Backport] PR #6546 to 4.x
  • Loading branch information
epixa committed Jun 6, 2016
2 parents 31bdad8 + ea603d0 commit 08fd599
Show file tree
Hide file tree
Showing 15 changed files with 205 additions and 36 deletions.
10 changes: 10 additions & 0 deletions src/plugins/elasticsearch/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ module.exports = function ({ Plugin }) {
}).default();
},

uiExports: {
injectDefaultVars(server, options) {
return {
esRequestTimeout: options.requestTimeout,
esShardTimeout: options.shardTimeout,
esApiVersion: options.apiVersion,
};
}
},

init(server, options) {
const kibanaIndex = server.config().get('kibana.index');

Expand Down
17 changes: 10 additions & 7 deletions src/plugins/elasticsearch/lib/__tests__/routes.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
const expect = require('expect.js');
const util = require('util');
const requireFromTest = require('requirefrom')('test');
const kbnTestServer = requireFromTest('utils/kbn_server');

const format = util.format;

const { format } = require('util');
const kbnTestServer = require('../../../../../test/utils/kbn_server');
const fromRoot = require('../../../../utils/fromRoot');

describe('plugins/elasticsearch', function () {
describe('routes', function () {
Expand All @@ -14,7 +11,13 @@ describe('plugins/elasticsearch', function () {
before(function () {
this.timeout(15000); // sometimes waiting for server takes longer than 10

kbnServer = kbnTestServer.createServer();
kbnServer = kbnTestServer.createServer({
plugins: {
scanDirs: [
fromRoot('src/plugins')
]
}
});
return kbnServer.ready()
.then(() => kbnServer.server.plugins.elasticsearch.waitUntilReady());
});
Expand Down
8 changes: 7 additions & 1 deletion src/plugins/kibana/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,13 @@ module.exports = function (kibana) {
kbnDefaultAppId: config.get('kibana.defaultAppId')
};
}
}
},

injectDefaultVars(server, options) {
return {
kbnIndex: options.index
};
},
}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ define(function (require) {

// This is the only thing that gets injected into controllers
module.service('savedDashboards', function (Promise, SavedDashboard, kbnIndex, es, kbnUrl) {
console.log('savedDashboards', kbnIndex);
const scanner = new Scanner(es, {
index: kbnIndex,
type: 'dashboard'
Expand Down
25 changes: 18 additions & 7 deletions src/server/plugins/Plugin.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
let _ = require('lodash');
let Joi = require('joi');
let { attempt, fromNode } = require('bluebird');
let Bluebird = require('bluebird');
let { resolve } = require('path');
let { inherits } = require('util');

const extendInitFns = Symbol('extend plugin initialization');

const defaultConfigSchema = Joi.object({
enabled: Joi.boolean().default(true)
}).default();
Expand All @@ -23,6 +25,7 @@ module.exports = class Plugin {
this.externalInit = opts.init || _.noop;
this.getConfigSchema = opts.config || _.noop;
this.init = _.once(this.init);
this[extendInitFns] = [];
}

static scoped(kbnServer, path, pkg) {
Expand Down Expand Up @@ -51,14 +54,14 @@ module.exports = class Plugin {
let { config } = kbnServer;

// setup the hapi register function and get on with it
let register = (server, options, next) => {
const asyncRegister = async (server, options, next) => {
this.server = server;

// bind the server and options to all
// apps created by this plugin
for (let app of this.apps) {
app.getInjectedVars = _.partial(app.getInjectedVars, server, options);
}
await Promise.all(this[extendInitFns].map(async fn => {
await fn.call(this, server, options);
}));

server.log(['plugins', 'debug'], {
tmpl: 'Initializing plugin <%= plugin.toString() %>',
Expand All @@ -72,12 +75,16 @@ module.exports = class Plugin {
this.status = kbnServer.status.create(this);
server.expose('status', this.status);

attempt(this.externalInit, [server, options], this).nodeify(next);
return await Bluebird.attempt(this.externalInit, [server, options], this);
};

const register = (server, options, next) => {
Bluebird.resolve(asyncRegister(server, options)).nodeify(next);
};

register.attributes = { name: id, version: version };

await fromNode(cb => {
await Bluebird.fromNode(cb => {
kbnServer.server.register({
register: register,
options: config.has(id) ? config.get(id) : null
Expand All @@ -91,6 +98,10 @@ module.exports = class Plugin {
}
}

extendInit(fn) {
this[extendInitFns].push(fn);
}

toJSON() {
return this.pkg;
}
Expand Down
14 changes: 14 additions & 0 deletions src/ui/UiExports.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class UiExports {
this.exportConsumer = _.memoize(this.exportConsumer);
this.consumers = [];
this.bundleProviders = [];
this.defaultInjectedVars = [];
}

consumePlugin(plugin) {
Expand Down Expand Up @@ -53,6 +54,12 @@ class UiExports {
id: plugin.id,
urlBasePath: this.urlBasePath
}));

plugin.extendInit((server, options) => { // eslint-disable-line no-loop-func
const wrapped = app.getInjectedVars;
app.getInjectedVars = () => wrapped.call(plugin, server, options);
});

plugin.apps.add(app);
}
};
Expand All @@ -77,6 +84,13 @@ class UiExports {
this.aliases[adhocType] = _.union(this.aliases[adhocType] || [], spec);
});
};

case 'injectDefaultVars':
return (plugin, injector) => {
plugin.extendInit(async (server, options) => {
_.merge(this.defaultInjectedVars, await injector.call(plugin, server, options));
});
};
}
}

Expand Down
18 changes: 18 additions & 0 deletions src/ui/__tests__/fixtures/plugin_async_foo/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import Bluebird from 'bluebird';

export default kibana => new kibana.Plugin({
config(Joi) {
return Joi.object().keys({
enabled: Joi.boolean().default(true),
delay: Joi.number().required(),
shared: Joi.string(),
}).default();
},

uiExports: {
async injectDefaultVars(server, options) {
await Bluebird.delay(options.delay);
return { shared: options.shared };
}
}
});
4 changes: 4 additions & 0 deletions src/ui/__tests__/fixtures/plugin_async_foo/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "plugin_async_foo",
"version": "0.0.0"
}
14 changes: 14 additions & 0 deletions src/ui/__tests__/fixtures/plugin_bar/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export default kibana => new kibana.Plugin({
config(Joi) {
return Joi.object().keys({
enabled: Joi.boolean().default(true),
shared: Joi.string()
}).default();
},

uiExports: {
injectDefaultVars(server, options) {
return { shared: options.shared };
}
}
});
4 changes: 4 additions & 0 deletions src/ui/__tests__/fixtures/plugin_bar/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "plugin_bar",
"version": "0.0.0"
}
14 changes: 14 additions & 0 deletions src/ui/__tests__/fixtures/plugin_foo/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export default kibana => new kibana.Plugin({
config(Joi) {
return Joi.object().keys({
enabled: Joi.boolean().default(true),
shared: Joi.string()
}).default();
},

uiExports: {
injectDefaultVars(server, options) {
return { shared: options.shared };
}
}
});
4 changes: 4 additions & 0 deletions src/ui/__tests__/fixtures/plugin_foo/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "plugin_foo",
"version": "0.0.0"
}
89 changes: 85 additions & 4 deletions src/ui/__tests__/ui_exports.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import expect from 'expect.js';
import { resolve } from 'path';

import UiExports from '../UiExports';
import UiExports from '../ui_exports';
import * as kbnTestServer from '../../../test/utils/kbn_server';

describe('UiExports', function () {
describe('#find()', function () {
it('finds exports based on the passed export names', function () {
let uiExports = new UiExports({});
var uiExports = new UiExports({});
uiExports.aliases.foo = ['a', 'b', 'c'];
uiExports.aliases.bar = ['d', 'e', 'f'];

Expand All @@ -15,12 +17,91 @@ describe('UiExports', function () {
});

it('allows query types that match nothing', function () {
let uiExports = new UiExports({});
var uiExports = new UiExports({});
uiExports.aliases.foo = ['a', 'b', 'c'];

expect(uiExports.find(['foo'])).to.eql(['a', 'b', 'c']);
expect(uiExports.find(['bar'])).to.eql([]);
expect(uiExports.find(['foo', 'bar'])).to.eql(['a', 'b', 'c']);
});
});
});
//
describe('#defaultInjectedVars', function () {
context('two plugins, two sync', function () {
this.slow(10000);
this.timeout(60000);

let kbnServer;
before(async function () {
kbnServer = kbnTestServer.createServer({
plugins: {
paths: [
resolve(__dirname, 'fixtures/plugin_bar'),
resolve(__dirname, 'fixtures/plugin_foo')
]
},

plugin_foo: {
shared: 'foo'
},

plugin_bar: {
shared: 'bar'
}
});

await kbnServer.ready();
});

after(async function () {
await kbnServer.close();
});

it('merges the two plugins in the order they are loaded', function () {
expect(kbnServer.uiExports.defaultInjectedVars).to.eql({
shared: 'foo'
});
});
});

context('two plugins, one async', function () {
this.slow(10000);
this.timeout(60000);

let kbnServer;
before(async function () {
kbnServer = kbnTestServer.createServer({
plugins: {
scanDirs: [],
paths: [
resolve(__dirname, 'fixtures/plugin_async_foo'),
resolve(__dirname, 'fixtures/plugin_foo')
]
},

plugin_async_foo: {
delay: 500,
shared: 'foo'
},

plugin_bar: {
shared: 'bar'
}
});

await kbnServer.ready();
});

after(async function () {
await kbnServer.close();
});

it('merges the two plugins in the order they are loaded', function () {
// even though plugin_async_foo loads 500ms later, it is still "first" to merge
expect(kbnServer.uiExports.defaultInjectedVars).to.eql({
shared: 'foo'
});
});
});
});
});
12 changes: 1 addition & 11 deletions src/ui/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,6 @@ module.exports = async (kbnServer, server, config) => {
}
});

const defaultInjectedVars = {};
if (config.has('kibana')) {
defaultInjectedVars.kbnIndex = config.get('kibana.index');
}
if (config.has('elasticsearch')) {
defaultInjectedVars.esRequestTimeout = config.get('elasticsearch.requestTimeout');
defaultInjectedVars.esShardTimeout = config.get('elasticsearch.shardTimeout');
defaultInjectedVars.esApiVersion = config.get('elasticsearch.apiVersion');
}

server.decorate('reply', 'renderApp', function (app) {
const payload = {
app: app,
Expand All @@ -77,7 +67,7 @@ module.exports = async (kbnServer, server, config) => {
buildNum: config.get('pkg.buildNum'),
buildSha: config.get('pkg.buildSha'),
basePath: config.get('server.basePath'),
vars: defaults(app.getInjectedVars(), defaultInjectedVars),
vars: defaults(app.getInjectedVars() || {}, uiExports.defaultInjectedVars),
};

return this.view(app.templateName, {
Expand Down
7 changes: 1 addition & 6 deletions test/utils/kbn_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { kibanaUser, kibanaServer } from '../shield';

const src = requirefrom('src');
const KbnServer = src('server/KbnServer');
const fromRoot = src('utils/fromRoot');

const SERVER_DEFAULTS = {
server: {
Expand All @@ -17,11 +16,7 @@ const SERVER_DEFAULTS = {
logging: {
quiet: true
},
plugins: {
scanDirs: [
fromRoot('src/plugins')
]
},
plugins: {},
optimize: {
enabled: false
},
Expand Down

0 comments on commit 08fd599

Please sign in to comment.