Skip to content

Commit

Permalink
Merge pull request #6546 from spalger/implement/uiExportsInjectVars
Browse files Browse the repository at this point in the history
[uiExports] add uiExport type "injectDefaultVars"
  • Loading branch information
w33ble committed Mar 18, 2016
2 parents 08ff029 + 26812c9 commit 6c9c9b9
Show file tree
Hide file tree
Showing 14 changed files with 199 additions and 31 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
15 changes: 10 additions & 5 deletions src/plugins/elasticsearch/lib/__tests__/routes.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import expect from 'expect.js';
import util from 'util';
import * as kbnTestServer from '../../../../../test/utils/kbn_server';

const format = util.format;
import { format } from 'util';

import * as kbnTestServer from '../../../../../test/utils/kbn_server';
import fromRoot from '../../../../utils/from_root';

describe('plugins/elasticsearch', function () {
describe('routes', function () {
Expand All @@ -13,7 +12,13 @@ describe('plugins/elasticsearch', function () {
before(function () {
this.timeout(60000); // 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 @@ -34,7 +34,13 @@ module.exports = function (kibana) {
kbnDefaultAppId: config.get('kibana.defaultAppId')
};
}
}
},

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

init: function (server, options) {
Expand Down
25 changes: 17 additions & 8 deletions src/server/plugins/plugin.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import _ from 'lodash';
import Joi from 'joi';
import { attempt, fromNode } from 'bluebird';
import Bluebird, { attempt, fromNode } from 'bluebird';
import { basename, resolve } from 'path';
import { inherits } from 'util';

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

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

if (opts.publicDir === false) {
this.publicDir = null;
Expand Down Expand Up @@ -98,14 +101,12 @@ 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) => {
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.id %>',
Expand All @@ -119,7 +120,11 @@ module.exports = class Plugin {
this.status = kbnServer.status.create(`plugin:${this.id}`);
server.expose('status', this.status);

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

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

register.attributes = { name: id, version: version };
Expand All @@ -138,6 +143,10 @@ module.exports = class Plugin {
}
}

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

toJSON() {
return this.pkg;
}
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"
}
81 changes: 81 additions & 0 deletions src/ui/__tests__/ui_exports.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import expect from 'expect.js';
import { resolve } from 'path';

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

describe('UiExports', function () {
describe('#find()', function () {
Expand All @@ -23,4 +25,83 @@ describe('UiExports', function () {
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
14 changes: 14 additions & 0 deletions src/ui/ui_exports.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 Down Expand Up @@ -80,6 +87,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
7 changes: 1 addition & 6 deletions test/utils/kbn_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ 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 = {
Expand All @@ -16,11 +15,7 @@ const SERVER_DEFAULTS = {
logging: {
quiet: true
},
plugins: {
scanDirs: [
fromRoot('src/plugins')
]
},
plugins: {},
optimize: {
enabled: false
},
Expand Down

0 comments on commit 6c9c9b9

Please sign in to comment.