Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Backport] PR #6546 to 4.x - [uiExports] add uiExport type "injectDefaultVars" #7362

Merged
merged 1 commit into from
Jun 6, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -41,7 +41,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 @@ -76,6 +83,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