get the server tests passing again

This commit is contained in:
spalger 2015-07-26 10:05:57 -07:00
parent 2dff117151
commit 2bcf846993
62 changed files with 543 additions and 669 deletions

View file

@ -1,7 +1,9 @@
'use strict';
let _ = require('lodash');
let pkg = require('../utils/closestPackageJson').getSync();
let utils = require('requirefrom')('src/utils');
let pkg = utils('packageJson');
let Command = require('./Command');
let argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) : process.argv.slice();

View file

@ -1,4 +1,3 @@
var root = require('requirefrom')('');
var expect = require('expect.js');
var nock = require('nock');
var glob = require('glob');
@ -6,8 +5,9 @@ var rimraf = require('rimraf');
var fs = require('fs');
var join = require('path').join;
var sinon = require('sinon');
var pluginLogger = root('src/server/bin/plugin/pluginLogger');
var npmInstall = root('src/server/bin/plugin/npmInstall');
var pluginLogger = require('../pluginLogger');
var npmInstall = require('../npmInstall');
describe('kibana cli', function () {
@ -66,4 +66,4 @@ describe('kibana cli', function () {
});
});
});

View file

@ -1,10 +1,10 @@
var root = require('requirefrom')('');
var plugin = root('src/server/bin/plugin/plugin');
var expect = require('expect.js');
var sinon = require('sinon');
var installer = root('src/server/bin/plugin/pluginInstaller');
var remover = root('src/server/bin/plugin/pluginRemover');
var settingParser = root('src/server/bin/plugin/settingParser');
var plugin = require('../plugin');
var installer = require('../pluginInstaller');
var remover = require('../pluginRemover');
var settingParser = require('../settingParser');
describe('kibana cli', function () {
@ -77,4 +77,4 @@ describe('kibana cli', function () {
});
});
});

View file

@ -1,10 +1,10 @@
var root = require('requirefrom')('');
var expect = require('expect.js');
var sinon = require('sinon');
var fs = require('fs');
var rimraf = require('rimraf');
var pluginCleaner = root('src/server/bin/plugin/pluginCleaner');
var pluginLogger = root('src/server/bin/plugin/pluginLogger');
var pluginCleaner = require('../pluginCleaner');
var pluginLogger = require('../pluginLogger');
describe('kibana cli', function () {
@ -144,4 +144,4 @@ describe('kibana cli', function () {
});
});
});

View file

@ -1,12 +1,12 @@
var root = require('requirefrom')('');
var expect = require('expect.js');
var sinon = require('sinon');
var nock = require('nock');
var glob = require('glob');
var rimraf = require('rimraf');
var join = require('path').join;
var pluginLogger = root('src/server/bin/plugin/pluginLogger');
var pluginDownloader = root('src/server/bin/plugin/pluginDownloader');
var pluginLogger = require('../pluginLogger');
var pluginDownloader = require('../pluginDownloader');
describe('kibana cli', function () {
@ -246,4 +246,4 @@ describe('kibana cli', function () {
});
});
});

View file

@ -1,4 +1,3 @@
var root = require('requirefrom')('');
var expect = require('expect.js');
var sinon = require('sinon');
var nock = require('nock');
@ -6,10 +5,11 @@ var glob = require('glob');
var rimraf = require('rimraf');
var fs = require('fs');
var join = require('path').join;
var pluginLogger = root('src/server/bin/plugin/pluginLogger');
var pluginInstaller = root('src/server/bin/plugin/pluginInstaller');
var Promise = require('bluebird');
var pluginLogger = require('../pluginLogger');
var pluginInstaller = require('../pluginInstaller');
describe('kibana cli', function () {
describe('plugin installer', function () {
@ -71,4 +71,4 @@ describe('kibana cli', function () {
});
});
});

View file

@ -1,8 +1,8 @@
var root = require('requirefrom')('');
var pluginLogger = root('src/server/bin/plugin/pluginLogger');
var expect = require('expect.js');
var sinon = require('sinon');
var pluginLogger = require('../pluginLogger');
describe('kibana cli', function () {
describe('plugin installer', function () {
@ -125,4 +125,4 @@ describe('kibana cli', function () {
});
});
});

View file

@ -1,8 +1,7 @@
var root = require('requirefrom')('');
var expect = require('expect.js');
var sinon = require('sinon');
var progressReporter = root('src/server/bin/plugin/progressReporter');
var pluginLogger = root('src/server/bin/plugin/pluginLogger');
var progressReporter = require('../progressReporter');
var pluginLogger = require('../pluginLogger');
describe('kibana cli', function () {
@ -299,4 +298,4 @@ describe('kibana cli', function () {
});
});
});

View file

@ -1,8 +1,10 @@
var root = require('requirefrom')('');
var settingParser = root('src/server/bin/plugin/settingParser');
var path = require('path');
var expect = require('expect.js');
var utils = require('requirefrom')('src/utils');
var fromRoot = utils('fromRoot');
var settingParser = require('../settingParser');
describe('kibana cli', function () {
describe('plugin installer', function () {
@ -71,7 +73,7 @@ describe('kibana cli', function () {
var options;
var parser;
beforeEach(function () {
options = { install: 'dummy/dummy' };
options = { install: 'dummy/dummy', pluginDir: fromRoot('installedPlugins') };
});
it('should require the user to specify either install and remove', function () {
@ -224,7 +226,7 @@ describe('kibana cli', function () {
parser = settingParser(options);
var settings = parser.parse();
var expected = path.resolve(__dirname, '..', '..', '..', '..', '..', 'src', 'server', 'bin', 'plugins', 'test-plugin');
var expected = fromRoot('installedPlugins/test-plugin');
expect(settings).to.have.property('pluginPath', expected);
});
@ -307,7 +309,7 @@ describe('kibana cli', function () {
parser = settingParser(options);
var settings = parser.parse();
var expected = path.resolve(__dirname, '..', '..', '..', '..', '..', 'src', 'server', 'bin', 'plugins', 'test-plugin');
var expected = fromRoot('installedPlugins/test-plugin');
expect(settings).to.have.property('pluginPath', expected);
});
@ -320,4 +322,4 @@ describe('kibana cli', function () {
});
});
});

View file

@ -1,8 +1,10 @@
var utils = require('requirefrom')('src/utils');
var fromRoot = utils('fromRoot');
var settingParser = require('./settingParser');
var installer = require('./pluginInstaller');
var remover = require('./pluginRemover');
var pluginLogger = require('./pluginLogger');
var fromRoot = require('../../utils/fromRoot');
module.exports = function (program) {
function processCommand(command, options) {
@ -40,7 +42,7 @@ module.exports = function (program) {
.option(
'-d, --plugin-dir <path>',
'The path to the directory where plugins are stored',
fromRoot('installed_plugins')
fromRoot('installedPlugins')
)
.description(
'Maintain Plugins',

View file

@ -3,7 +3,9 @@
let _ = require('lodash');
let fs = require('fs');
let yaml = require('js-yaml');
let fromRoot = require('../../utils/fromRoot');
let utils = require('requirefrom')('src/utils');
let fromRoot = utils('fromRoot');
let legacySettingMap = {
// server

View file

@ -6,8 +6,9 @@ let resolve = require('path').resolve;
let cwd = process.cwd();
let readYamlConfig = require('./readYamlConfig');
let fromRoot = require('../../utils/fromRoot');
let KbnServer = require('../../server/KbnServer');
let src = require('requirefrom')('src');
let fromRoot = src('utils/fromRoot');
let KbnServer = src('server/KbnServer');
let pathCollector = function () {
let paths = [];
@ -39,7 +40,7 @@ module.exports = function (program) {
'times to specify multiple directories',
pluginDirCollector,
[
fromRoot('installed_plugins'),
fromRoot('installedPlugins'),
fromRoot('src/plugins')
]
)

View file

@ -5,8 +5,9 @@ let join = require('path').join;
let _ = require('lodash');
var chokidar = require('chokidar');
let utils = require('requirefrom')('src/utils');
let fromRoot = utils('fromRoot');
let Log = require('../Log');
let fromRoot = require('../../utils/fromRoot');
let Worker = require('./Worker');
module.exports = function (opts) {

View file

@ -2,7 +2,7 @@ extends ../../../server/ui/views/chrome.jade
block head
link(rel='stylesheet', href='/tests/style.css')
script(src='/tests/bundle.js')
block content
#mocha Bundling tests, brb!
script(defer src='/tests/bundle.js')
#mocha

View file

@ -15,8 +15,10 @@ module.exports = function (server, kbnServer) {
method: 'GET',
handler: function (req, reply) {
return reply.renderApp(new UiApp(kbnServer.uiExports, {
id: 'tests'
}), 'testHarness');
id: 'tests',
templateName: 'testHarness',
requireOptimizeGreen: false
}));
}
});

View file

@ -34,8 +34,7 @@ function maybeStartES() {
});
}
before(function () {
module.exports = function () {
this.timeout(120000);
return maybeStartES();
});
};

View file

@ -1,17 +1,30 @@
var root = require('requirefrom')('');
var _ = require('lodash');
var checkEsVersion = root('src/server/plugins/elasticsearch/lib/check_es_version');
var Promise = require('bluebird');
var sinon = require('sinon');
var checkEsVersion = require('../check_es_version');
describe('plugins/elasticsearch', function () {
describe('lib/check_es_version', function () {
var server;
var plugin;
beforeEach(function () {
var get = sinon.stub().withArgs('elasticserach.minimumVerison').returns('1.4.3');
var config = function () { return { get: get }; };
server = { config: config, plugins: { elasticsearch: { client: { nodes: {} } } } };
server = {
config: config,
plugins: {
elasticsearch: {
client: {
nodes: {}
},
status: {
red: sinon.stub()
}
}
}
};
});
function setNodes(/* ...versions */) {
@ -40,17 +53,17 @@ describe('plugins/elasticsearch', function () {
it('passes with single a node that matches', function () {
setNodes('1.4.3');
return checkEsVersion(server)();
return checkEsVersion(server);
});
it('passes with multiple nodes that satisfy', function () {
setNodes('1.4.3', '1.4.4', '1.4.3-Beta1');
return checkEsVersion(server)();
return checkEsVersion(server);
});
it('fails with a single node that is out of date', function () {
setNodes('1.4.4', '1.4.2', '1.4.5');
return checkEsVersion(server)()
return checkEsVersion(server)
.then(function () {
throw new Error('expected validation to fail');
}, _.noop);
@ -63,7 +76,7 @@ describe('plugins/elasticsearch', function () {
'1.4.5'
);
return checkEsVersion(server)();
return checkEsVersion(server);
});
});

View file

@ -1,11 +1,11 @@
var root = require('requirefrom')('');
var _ = require('lodash');
var sinon = require('sinon');
var expect = require('expect.js');
var createKibanaIndex = root('src/server/plugins/elasticsearch/lib/create_kibana_index');
var SetupError = root('src/server/plugins/elasticsearch/lib/setup_error');
var Promise = require('bluebird');
var createKibanaIndex = require('../create_kibana_index');
var SetupError = require('../setup_error');
describe('plugins/elasticsearch', function () {
describe('lib/create_kibana_index', function () {

View file

@ -1,5 +1,6 @@
var Promise = require('bluebird');
var portscanner = require('portscanner');
module.exports = function findPort(start, end, host) {
host = host || 'localhost';
return new Promise(function (resolve, reject) {

View file

@ -1,10 +1,9 @@
var root = require('requirefrom')('');
var healthCheck = root('src/server/plugins/elasticsearch/lib/health_check');
var Promise = require('bluebird');
var sinon = require('sinon');
var expect = require('expect.js');
var NoConnections = require('elasticsearch').errors.NoConnections;
var healthCheck = require('../health_check');
describe('plugins/elasticsearch', function () {
describe('lib/health_check', function () {

View file

@ -1,30 +1,41 @@
var root = require('requirefrom')('');
var isUpgradeable = root('src/server/plugins/elasticsearch/lib/is_upgradeable');
var expect = require('expect.js');
var util = require('util');
var package = root('package.json');
var sinon = require('sinon');
'use strict';
let _ = require('lodash');
let expect = require('expect.js');
let sinon = require('sinon');
let isUpgradeable = require('../is_upgradeable');
let utils = require('requirefrom')('src/utils');
let pkg = utils('packageJson');
let version = pkg.version;
describe('plugins/elasticsearch', function () {
describe('lib/isUpgradeable', function () {
var config = {};
var server = {
config: function () {
return config;
}
let server = {
config: _.constant({
get: function (key) {
switch (key) {
case 'pkg.version': return version;
default: throw new Error(`no stub for config key ${key}`);
}
}
})
};
function upgradeDoc(_id, version, bool) {
it(util.format('should return %s for %s <= %s', bool, _id, version), function () {
var doc = { _id: _id };
config.get = sinon.stub().withArgs('kibana.package.version').returns(version);
expect(isUpgradeable(server, doc)).to.be(bool);
function upgradeDoc(_id, _version, bool) {
describe('', function () {
before(function () { version = _version; });
it(`should return ${bool} for ${_id} <= ${version}`, function () {
expect(isUpgradeable(server, { _id: _id })).to.be(bool);
});
after(function () { version = pkg.version; });
});
}
upgradeDoc('1.0.0-beta1', package.version, false);
upgradeDoc(package.version, package.version, false);
upgradeDoc('1.0.0-beta1', pkg.version, false);
upgradeDoc(pkg.version, pkg.version, false);
upgradeDoc('4.0.0-RC1', '4.0.0-RC2', true);
upgradeDoc('4.0.0-rc2', '4.0.0-rc1', false);
upgradeDoc('4.0.0-rc2', '4.0.0', true);
@ -35,8 +46,7 @@ describe('plugins/elasticsearch', function () {
upgradeDoc('4.1.0-rc1-snapshot', '4.1.0-rc1', false);
it('should handle missing _id field', function () {
config.get = sinon.stub().withArgs('kibana.package.version').returns(package.version);
var doc = {
let doc = {
'_index': '.kibana',
'_type': 'config',
'_score': 1,
@ -45,12 +55,12 @@ describe('plugins/elasticsearch', function () {
'defaultIndex': '[logstash-]YYYY.MM.DD'
}
};
expect(isUpgradeable(server, doc)).to.be(false);
});
it('should handle _id of @@version', function () {
config.get = sinon.stub().withArgs('kibana.package.version').returns(package.version);
var doc = {
let doc = {
'_index': '.kibana',
'_type': 'config',
'_id': '@@version',

View file

@ -1,37 +1,53 @@
var root = require('requirefrom')('');
var src = require('requirefrom')('src');
var expect = require('expect.js');
var Kibana = root('src/server');
var findPort = require('./findPort');
require('./_ensure_elasticsearch');
var util = require('util');
var format = util.format;
var KbnServer = src('server/KbnServer');
var fromRoot = src('utils/fromRoot');
describe('plugins/elasticsearch', function () {
describe('routes', function () {
var server, config;
before(require('./_ensure_elasticsearch'));
beforeEach(function () {
return findPort(7000, 8000).then(function (port) {
config = { 'kibana.server.port': port, 'logging.quiet': true};
var kibana = new Kibana(config);
return kibana.listen().then(function (_server) {
server = _server;
});
var kbnServer;
before(function () {
kbnServer = new KbnServer({
server: { autoListen: false },
logging: { quiet: true },
plugins: {
scanDirs: [
fromRoot('src/plugins')
]
},
optimize: {
enabled: false
}
});
return kbnServer.ready();
});
afterEach(function (done) {
server.stop(done);
after(function () {
return kbnServer.close();
});
function testRoute(options) {
var statusCode = options.statusCode || 200;
describe(format('%s %s', options.method, options.url), function () {
it('should should return ' + statusCode, function (done) {
server.inject(options, function (res) {
expect(res.statusCode).to.be(statusCode);
done();
kbnServer.server.inject(options, function (res) {
try {
expect(res.statusCode).to.be(statusCode);
} catch (e) {
done(e);
done = null;
} finally {
done && done();
}
});
});
});

View file

@ -1,5 +1,4 @@
var root = require('requirefrom')('');
var SetupError = root('src/server/plugins/elasticsearch/lib/setup_error');
var SetupError = require('../setup_error');
var expect = require('expect.js');
describe('plugins/elasticsearch', function () {

View file

@ -1,28 +1,36 @@
var root = require('requirefrom')('');
var upgradeConfig = root('src/server/plugins/elasticsearch/lib/upgrade_config');
var _ = require('lodash');
var Promise = require('bluebird');
var sinon = require('sinon');
var expect = require('expect.js');
var upgradeConfig = require('../upgrade_config');
describe('pluigns/elasticsearch', function () {
describe('lib/upgrade_config', function () {
var get;
var server;
var client;
var config;
var upgrade;
var get, server, client, config, upgrade;
beforeEach(function () {
get = sinon.stub();
get.withArgs('kibana.package.version').returns('4.0.1');
get.withArgs('kibana.index').returns('.my-kibana');
get.withArgs('pkg.version').returns('4.0.1');
client = { create: sinon.stub() };
server = {
log: sinon.stub(),
config: function () { return { get: get }; },
config: function () {
return {
get: get
};
},
plugins: { elasticsearch: { client: client } }
};
upgrade = upgradeConfig(server);
});
describe('nothing is found', function () {
var env = process.env.NODE_ENV;
var response = { hits: { hits:[] } };
beforeEach(function () {
@ -31,11 +39,14 @@ describe('pluigns/elasticsearch', function () {
describe('production', function () {
beforeEach(function () {
process.env.NODE_ENV = 'production';
get.withArgs('env.name').returns('production');
get.withArgs('env.prod').returns(true);
get.withArgs('env.dev').returns(false);
});
it('should resolve buildNum to kibana.buildNum', function () {
get.withArgs('kibana.buildNum').returns(5801);
it('should resolve buildNum to pkg.buildNum', function () {
get.withArgs('pkg.buildNum').returns(5801);
return upgrade(response).then(function (resp) {
sinon.assert.calledOnce(client.create);
var params = client.create.args[0][0];
@ -53,7 +64,9 @@ describe('pluigns/elasticsearch', function () {
describe('development', function () {
beforeEach(function () {
process.env.NODE_ENV = 'development';
get.withArgs('env.name').returns('development');
get.withArgs('env.prod').returns(false);
get.withArgs('env.dev').returns(true);
});
it('should resolve buildNum to the max integer', function () {
@ -69,12 +82,6 @@ describe('pluigns/elasticsearch', function () {
expect(params).to.have.property('id', '@@version');
});
});
});
afterEach(function () {
process.env.NODE_ENV = env;
});
});
@ -93,7 +100,7 @@ describe('pluigns/elasticsearch', function () {
});
it('should update the build number on the new config', function () {
get.withArgs('kibana.buildNum').returns(5801);
get.withArgs('pkg.buildNum').returns(5801);
client.create.returns(Promise.resolve());
var response = { hits: { hits: [ { _id: '4.0.0', _source: { buildNum: 1 } } ] } };
return upgrade(response).then(function (resp) {
@ -108,7 +115,7 @@ describe('pluigns/elasticsearch', function () {
});
it('should update the build number to max integer if buildNum is template string', function () {
get.withArgs('kibana.buildNum').returns('@@buildNum');
get.withArgs('pkg.buildNum').returns('@@buildNum');
client.create.returns(Promise.resolve());
var response = { hits: { hits: [ { _id: '4.0.0', _source: { buildNum: 1 } } ] } };
return upgrade(response).then(function (resp) {
@ -120,18 +127,21 @@ describe('pluigns/elasticsearch', function () {
});
it('should log a message for upgrades', function () {
get.withArgs('kibana.buildNum').returns(5801);
get.withArgs('pkg.buildNum').returns(5801);
client.create.returns(Promise.resolve());
var response = { hits: { hits: [ { _id: '4.0.0', _source: { buildNum: 1 } } ] } };
return upgrade(response).then(function (resp) {
sinon.assert.calledOnce(server.log);
expect(server.log.args[0][0]).to.be('plugin');
expect(server.log.args[0][1]).to.be('[ elasticsearch ] Upgrade config from 4.0.0 to 4.0.1');
expect(server.log.args[0][0]).to.eql(['plugin', 'elasticsearch']);
var msg = server.log.args[0][1];
expect(msg).to.have.property('prevVersion', '4.0.0');
expect(msg).to.have.property('newVersion', '4.0.1');
expect(msg.tmpl).to.contain('Upgrade');
});
});
it('should copy attributes from old config', function () {
get.withArgs('kibana.buildNum').returns(5801);
get.withArgs('pkg.buildNum').returns(5801);
client.create.returns(Promise.resolve());
var response = { hits: { hits: [ { _id: '4.0.0', _source: { buildNum: 1, defaultIndex: 'logstash-*' } } ] } };
return upgrade(response).then(function (resp) {

View file

@ -1,11 +1,36 @@
var _ = require('lodash');
var root = require('requirefrom')('');
var validateRequest = root('src/server/plugins/elasticsearch/lib/validate');
var expect = require('expect.js');
var server = { config: root('src/server/lib/config') };
var config = server.config();
var src = require('requirefrom')('src');
var fromRoot = src('utils/fromRoot');
var KbnServer = src('server/KbnServer');
var validateRequest = require('../validate');
describe('plugins/elasticsearch', function () {
var kbnServer;
var server;
var config;
before(function () {
kbnServer = new KbnServer({
server: { autoListen: false },
plugins: { scanDirs: [ fromRoot('src/plugins') ] },
logging: { quiet: true },
optimize: { enabled: false }
});
return kbnServer.ready()
.then(function () {
server = kbnServer.server;
config = kbnServer.config;
});
});
after(function () {
kbnServer.close();
});
describe('lib/validate', function () {
function del(path, body, valid) {

View file

@ -1,6 +1,5 @@
var root = require('requirefrom')('');
var _ = require('lodash');
var versionMath = root('src/server/plugins/elasticsearch/lib/version_math');
var versionMath = require('../version_math');
var expect = require('expect.js');
var versions = [
'1.1.12',

View file

@ -6,31 +6,32 @@ var SetupError = require('./setup_error');
module.exports = function (server) {
var client = server.plugins.elasticsearch.client;
var minimumElasticsearchVersion = server.config().get('elasticsearch.minimumVerison');
return client.nodes.info()
.then(function (info) {
var badNodes = _.filter(info.nodes, function (node) {
// remove client nodes (Logstash)
var isClient = _.get(node, 'attributes.client');
if (isClient != null && esBool(isClient) === true) {
return false;
}
.then(function (info) {
var badNodes = _.filter(info.nodes, function (node) {
// remove client nodes (Logstash)
var isClient = _.get(node, 'attributes.client');
if (isClient != null && esBool(isClient) === true) {
return false;
}
// remove nodes that are gte the min version
var v = node.version.split('-')[0];
return !versionMath.gte(minimumElasticsearchVersion, v);
});
if (!badNodes.length) return true;
var badNodeNames = badNodes.map(function (node) {
return 'Elasticsearch v' + node.version + ' @ ' + node.http_address + ' (' + node.ip + ')';
});
var message = 'This version of Kibana requires Elasticsearch ' +
minimumElasticsearchVersion + ' or higher on all nodes. ' +
'I found the following incompatible nodes in your cluster: ' +
badNodeNames.join(',');
server.plugins.elasticsearch.status.red(message);
throw new SetupError(server, message);
// remove nodes that are gte the min version
var v = node.version.split('-')[0];
return !versionMath.gte(minimumElasticsearchVersion, v);
});
if (!badNodes.length) return true;
var badNodeNames = badNodes.map(function (node) {
return 'Elasticsearch v' + node.version + ' @ ' + node.http_address + ' (' + node.ip + ')';
});
var message = `This version of Kibana requires Elasticsearch ` +
`${minimumElasticsearchVersion} or higher on all nodes. I found ` +
`the following incompatible nodes in your cluster: ${badNodeNames.join(',')}`;
server.plugins.elasticsearch.status.red(message);
throw new SetupError(server, message);
});
};

View file

@ -36,7 +36,7 @@ module.exports = function (server) {
server.log(['error', 'elasticsearch'], err);
};
this.warning = function (message) {
server.log(['warning', 'elasticsearch'], '[ elasticsearch ] ' + message);
server.log(['warning', 'elasticsearch'], message);
};
this.info = _.noop;
this.debug = _.noop;

View file

@ -53,7 +53,7 @@ module.exports = function (plugin, server) {
function check() {
return waitForPong()
.then(_.partial(checkEsVersion, server))
.then(_.partial(checkEsVersion, server, plugin))
.then(waitForShards)
.then(_.partial(migrateConfig, server))
.catch(_.bindKey(server, 'log', 'error'));

View file

@ -1,19 +1,19 @@
var semver = require('semver');
var pkg = require('../../../utils/closestPackageJson').getSync();
var utils = require('requirefrom')('src/utils');
var rcVersionRegex = /(\d+\.\d+\.\d+)\-rc(\d+)/i;
module.exports = function (server, doc) {
var config = server.config();
if (/beta|snapshot/i.test(doc._id)) return false;
if (!doc._id) return false;
if (doc._id === pkg.version) return false;
if (doc._id === config.get('pkg.version')) return false;
var packageRcRelease = Infinity;
var rcRelease = Infinity;
var packageVersion = pkg.version;
var packageVersion = config.get('pkg.version');
var version = doc._id;
var matches = doc._id.match(rcVersionRegex);
var packageMatches = pkg.version.match(rcVersionRegex);
var packageMatches = config.get('pkg.version').match(rcVersionRegex);
if (matches) {
version = matches[1];

View file

@ -1,34 +1,35 @@
var Promise = require('bluebird');
var isUpgradeable = require('./is_upgradeable');
var pkg = require('../../../utils/closestPackageJson').getSync();
var _ = require('lodash');
var format = require('util').format;
module.exports = function (server) {
var utils = require('requirefrom')('src/utils');
module.exports = function (server) {
var MAX_INTEGER = Math.pow(2, 53) - 1;
var client = server.plugins.elasticsearch.client;
var config = server.config();
return function (response) {
var newConfig = {};
// Check to see if there are any doc. If not then we set the build number and id
if (response.hits.hits.length === 0) {
var isProduction = process.env.NODE_ENV === 'production';
return client.create({
index: config.get('kibana.index'),
type: 'config',
body: {
buildNum: isProduction ? config.get('kibana.buildNum') : MAX_INTEGER
},
id: isProduction ? config.get('kibana.package.version') : '@@version'
});
index: config.get('kibana.index'),
type: 'config',
body: {
buildNum: config.get('env.prod') ? config.get('pkg.buildNum') : MAX_INTEGER
},
id: config.get('env.prod') ? config.get('pkg.version') : '@@version'
});
}
// if we already have a the current version in the index then we need to stop
if (_.find(response.hits.hits, function currentVersion(hit) {
return hit._id !== '@@version' &&
hit._id === pkg.version;
hit._id === config.get('pkg.version');
})) {
return Promise.resolve();
}
@ -41,21 +42,21 @@ module.exports = function (server) {
// if the build number is still the template string (which it wil be in development)
// then we need to set it to the max interger. Otherwise we will set it to the build num
body._source.buildNum = MAX_INTEGER;
if (!/^@@/.test(config.get('kibana.buildNum'))) {
body._source.buildNum = parseInt(config.get('kibana.buildNum'), 10);
if (!/^@@/.test(config.get('pkg.buildNum'))) {
body._source.buildNum = parseInt(config.get('pkg.buildNum'), 10);
}
server.log('plugin', {
tmpl: '[ elasticsearch ] Upgrade config from <%= prevVersion %> to <%= newVersion %>',
server.log(['plugin', 'elasticsearch'], {
tmpl: 'Upgrade config from <%= prevVersion %> to <%= newVersion %>',
prevVersion: body._id,
newVersion: pkg.version
newVersion: config.get('pkg.version')
});
return client.create({
index: config.get('kibana.index'),
type: 'config',
body: body._source,
id: pkg.version
id: config.get('pkg.version')
});
};
};

View file

@ -5,8 +5,7 @@ module.exports = function (kibana) {
return Joi.object({
enabled: Joi.boolean().default(true),
defaultAppId: Joi.string().default('discover'),
index: Joi.string().default('.kibana'),
buildNum: Joi.string().default('@@buildNum')
index: Joi.string().default('.kibana')
}).default();
},

View file

@ -4,10 +4,12 @@ let _ = require('lodash');
let EventEmitter = require('events').EventEmitter;
let promify = require('bluebird').promisify;
let resolve = require('bluebird').resolve;
let fromNode = require('bluebird').fromNode;
let Hapi = require('hapi');
let rootDir = require('../utils/fromRoot')('.');
let pkg = require('../utils/closestPackageJson').getSync();
let utils = require('requirefrom')('src/utils');
let rootDir = utils('fromRoot')('.');
let pkg = utils('packageJson');
module.exports = class KbnServer extends EventEmitter {
constructor(settings) {
@ -18,7 +20,7 @@ module.exports = class KbnServer extends EventEmitter {
this.build = pkg.build || false;
this.rootDir = rootDir;
this.server = new Hapi.Server();
this.settings = settings;
this.settings = settings || {};
this.ready = _.constant(this.mixin(
require('./config/setup'),
@ -73,12 +75,13 @@ module.exports = class KbnServer extends EventEmitter {
let server = self.server;
let start = _.ary(promify(server.start, server), 0);
self.ready().then(function () {
return self.ready()
.then(function () {
return self.mixin(start, require('./pid'));
})
.then(
function () {
server.log('info', 'Server running at ' + server.info.uri);
server.log(['listening', 'info'], 'Server running at ' + server.info.uri);
self.emit('listening');
return server;
},
@ -87,7 +90,18 @@ module.exports = class KbnServer extends EventEmitter {
self.emit('error', err);
}
);
}
return this;
close() {
let self = this;
return fromNode(function (cb) {
self.server.stop(cb);
})
.then(function () {
if (self.optimizer && self.optimizer.disable) {
return self.optimizer.disable();
}
});
}
};

View file

@ -1,5 +1,4 @@
var root = require('requirefrom')('');
var Config = root('src/server/lib/config/config');
var Config = require('../Config');
var expect = require('expect.js');
var _ = require('lodash');
var Joi = require('joi');
@ -201,9 +200,8 @@ describe('lib/config/config', function () {
it('should NOT allow you to extend the schema if somethign else is there', function () {
var newSchema = Joi.object({ test: Joi.boolean().default(true) }).default();
config.extendSchema('test', newSchema);
var run = function () {
config.get('test.test');
config.extendSchema('test', newSchema);
};
expect(run).to.throwException();
});

View file

@ -1,5 +1,4 @@
var root = require('requirefrom')('');
var explodeBy = root('src/server/lib/config/explode_by');
var explodeBy = require('../explodeBy');
var expect = require('expect.js');
describe('explode_by(dot, flatObject)', function () {

View file

@ -1,5 +1,4 @@
var root = require('requirefrom')('');
var flattenWith = root('src/server/lib/config/flatten_with');
var flattenWith = require('../flattenWith');
var expect = require('expect.js');
describe('flatten_with(dot, nestedObj)', function () {

View file

@ -1,14 +0,0 @@
var root = require('requirefrom')('');
var config = root('src/server/lib/config');
var Config = root('src/server/lib/config/config');
var expect = require('expect.js');
describe('server.config()', function (arg) {
it('should return a Config object', function () {
var conf = config();
expect(conf).to.be.an(Config);
});
});

View file

@ -1,5 +1,4 @@
var root = require('requirefrom')('');
var override = root('src/server/lib/config/override');
var override = require('../override');
var expect = require('expect.js');
describe('override(target, source)', function () {

View file

@ -64,10 +64,14 @@ module.exports = class Config {
env: env,
prod: env === 'production',
dev: env === 'development',
notProd: env !== 'production',
notDev: env !== 'development'
};
if (!context.dev && !context.prod) {
throw new TypeError(`Unexpected environment "${env}", expected one of "development" or "production"`);
if (!context.dev && !context.prod && !context.test) {
throw new TypeError(
`Unexpected environment "${env}", expected one of "development" or "production"`
);
}
let results = Joi.validate(newConfig, this.schema, {

View file

@ -1,15 +1,27 @@
var Joi = require('joi');
var fs = require('fs');
var path = require('path');
var package = require('../../utils/closestPackageJson').getSync();
var fromRoot = require('../../utils/fromRoot');
'use strict';
let get = require('lodash').get;
let Joi = require('joi');
let fs = require('fs');
let path = require('path');
let utils = require('requirefrom')('src/utils');
let fromRoot = utils('fromRoot');
let pkg = utils('packageJson');
let buildNum = get(pkg, 'build.num', '@@buildNum');
module.exports = Joi.object({
pkg: Joi.object({
version: Joi.string().valid(pkg.version).default(pkg.version),
buildNum: Joi.string().valid(buildNum).default(buildNum)
}).default(),
env: Joi.object({
name: Joi.string().default(Joi.ref('$env')),
dev: Joi.boolean().default(Joi.ref('$dev')),
prod: Joi.boolean().default(Joi.ref('$prod'))
prod: Joi.boolean().default(Joi.ref('$prod')),
test: Joi.boolean().default(Joi.ref('$test')),
}).default(),
pid: Joi.object({
@ -64,6 +76,7 @@ module.exports = Joi.object({
}).default(),
optimize: Joi.object({
enabled: Joi.boolean().default(true),
bundleDir: Joi.string().default(fromRoot('optimize/bundles')),
viewCaching: Joi.boolean().default(Joi.ref('$prod')),
watch: Joi.boolean().default(Joi.ref('$dev')),

View file

@ -21,6 +21,7 @@ let typeColors = {
server: 'brightBlack',
optmzr: 'white',
optimize: 'magenta',
listening: 'magenta'
};
let color = _.memoize(function (name) {

View file

@ -12,7 +12,7 @@ module.exports = function (kbnServer, server, config) {
}
else if (config.get('logging.quiet')) {
_.defaults(events, {
log: ['error', 'fatal'],
log: ['listening', 'error', 'fatal'],
error: '*'
});
}

View file

@ -9,11 +9,12 @@ let webpack = require('webpack');
let DirectoryNameAsMain = require('webpack-directory-name-as-main');
let ExtractTextPlugin = require('extract-text-webpack-plugin');
let fromRoot = require('../../utils/fromRoot');
let utils = require('requirefrom')('src/utils');
let fromRoot = utils('fromRoot');
let OptmzBundles = require('./OptmzBundles');
let OptmzUiModules = require('./OptmzUiModules');
let kbnTag = `Kibana ${ require('../../utils/closestPackageJson').getSync().version }`;
let kbnTag = `Kibana ${ utils('packageJson').version }`;
class BaseOptimizer extends EventEmitter {
constructor(opts) {

View file

@ -1,6 +1,8 @@
'use strict';
module.exports = function (kbnServer, server, config) {
if (!config.get('optimize.enabled')) return;
var _ = require('lodash');
var resolve = require('path').resolve;
var fromRoot = require('../../utils/fromRoot');

View file

@ -72,6 +72,7 @@ module.exports = class Plugin {
}
let register = function (server, options, next) {
server.expose('status', self.status);
Promise.try(self.externalInit, [server, options], self).nodeify(next);
};

View file

@ -1,76 +0,0 @@
var checkDependencies = require('../../../../../src/server/lib/plugins/check_dependencies');
var expect = require('expect.js');
describe('src/server/lib/check_dependencies', function () {
it('should return true for first -> second -> third', function () {
var deps = {
first: [],
second: ['first'],
third: ['second']
};
var results = checkDependencies('first', deps);
expect(results).to.be(true);
});
it('should throw an error for first -> third -> second -> first', function () {
var deps = {
first: ['third'],
second: ['first'],
third: ['second']
};
var run = function () {
checkDependencies('first', deps);
};
expect(run).to.throwException(function (e) {
expect(e.message).to.be('Circular dependency: first -> third -> second -> first');
});
});
it('should throw an error for first -> missing', function () {
var deps = {
first: ['missing']
};
var run = function () {
checkDependencies('first', deps);
};
expect(run).to.throwException(function (e) {
expect(e.message).to.be('Missing dependency: missing');
});
});
it('should throw an error for missing dependency', function () {
var deps = {
first: ['missing']
};
var run = function () {
checkDependencies('missing', deps);
};
expect(run).to.throwException(function (e) {
expect(e.message).to.be('Missing dependency: missing');
});
});
it('should throw an error on complex circulars', function () {
var deps = {
first: ['second', 'fifth'],
second: ['fourth'],
third: [],
fourth: ['third'],
fifth: ['sixth'],
sixth: ['first']
};
var run = function () {
checkDependencies('first', deps);
};
expect(run).to.throwException(function (e) {
expect(e.message).to.be('Circular dependency: first -> fifth -> sixth -> first');
});
});
});

View file

@ -1,28 +0,0 @@
var expect = require('expect.js');
var Plugin = require('../../../../../src/server/lib/plugins/plugin');
describe('lib/plugins/plugin', function () {
it('should assign attributes passed into the created to the object', function () {
var plugin = new Plugin({ name: 'test', require: ['config'] });
expect(plugin).to.have.property('name', 'test');
expect(plugin).to.have.property('require');
expect(plugin.require).to.eql(['config']);
});
it('should by default assign an empty array to the require attribute', function () {
var plugin = new Plugin();
expect(plugin).to.have.property('require');
expect(plugin.require).to.eql([]);
});
it('should by default assign a function to init attribute that rejects a promise', function (done) {
var plugin = new Plugin();
expect(plugin).to.have.property('init');
plugin.init().catch(function (err) {
expect(err.message).to.be('You must override the init function for plugins');
done();
});
});
});

View file

@ -1,174 +0,0 @@
var expect = require('expect.js');
var sinon = require('sinon');
var registerPlugins = require('../../../../../src/server/lib/plugins/register_plugins');
var Status = require('../../../../../src/server/lib/status/status');
var systemStatus = require('../../../../../src/server/lib/status');
var Promise = require('bluebird');
function createInit() {
return sinon.stub().returns(Promise.resolve());
}
describe('server/lib/register_plugins', function () {
var server, get;
beforeEach(function () {
get = sinon.stub();
server = {
register: sinon.stub(),
config: sinon.stub().returns({ get: get }),
expose: sinon.stub(),
log: sinon.stub()
};
});
describe('registerPlugins() wrapper', function () {
var options = { foo: 'bar' };
it('should pass server, options and next to the init function', function () {
var next = function (err) {
server.register.args[0][1](err);
};
server.register.yieldsTo('register', server, options, next);
var plugin = { name: 'first', init: createInit() };
var plugins = [plugin];
return registerPlugins(server, plugins).then(function () {
expect(plugin.init.args[0][0]).to.equal(server);
expect(plugin.init.args[0][1]).to.equal(options);
});
});
it('should call next() when plugin.init completes', function () {
var called = false;
var next = function (err) {
called = true;
server.register.args[0][1](err);
};
server.register.yieldsTo('register', server, options, next);
var plugin = { name: 'first', init: createInit() };
var plugins = [plugin];
return registerPlugins(server, plugins).then(function () {
expect(called).to.be(true);
});
});
it('should attach the server to the plugin', function () {
var next = function (err) {
server.register.args[0][1](err);
};
server.register.yieldsTo('register', server, options, next);
var plugin = { name: 'first', init: createInit() };
var plugins = [plugin];
return registerPlugins(server, plugins).then(function () {
expect(plugin).to.have.property('server');
expect(plugin.server).to.eql(server);
});
});
var greenSpy, yellowSpy, createStatus;
beforeEach(function () {
greenSpy = sinon.spy(Status.prototype, 'green');
yellowSpy = sinon.spy(Status.prototype, 'yellow');
createStatus = sinon.spy(systemStatus, 'createStatus');
});
afterEach(function () {
Status.prototype.green.restore();
Status.prototype.yellow.restore();
systemStatus.createStatus.restore();
});
it('should call status.createStatus() with plugin', function () {
var next = function (err) {
server.register.args[0][1](err);
};
server.register.yieldsTo('register', server, options, next);
var plugin = { name: 'first', init: createInit() };
var plugins = [plugin];
return registerPlugins(server, plugins).then(function () {
sinon.assert.calledOnce(createStatus);
expect(plugin).to.have.property('status');
expect(createStatus.args[0][0]).to.eql(plugin);
});
});
it('should not set the status before init is called', function () {
var next = function (err) {
server.register.args[0][1](err);
};
server.register.yieldsTo('register', server, options, next);
var plugin = { name: 'first', init: createInit() };
var plugins = [plugin];
return registerPlugins(server, plugins).then(function () {
expect(yellowSpy).to.have.property('callCount', 0);
});
});
it('should set the status to green and "Ready" after init', function () {
var next = function (err) {
server.register.args[0][1](err);
};
server.register.yieldsTo('register', server, options, next);
var plugin = { name: 'first', init: createInit() };
var plugins = [plugin];
return registerPlugins(server, plugins).then(function () {
sinon.assert.calledOnce(greenSpy);
expect(greenSpy.calledAfter(plugin.init)).to.be(true);
expect(greenSpy.args[0][0]).to.be('Ready');
});
});
});
describe('dependencies', function () {
var nextStub;
beforeEach(function () {
var count = 0;
var next = function (err) {
server.register.args[count++][1](err);
};
server.register.yieldsTo('register', server, {}, next);
});
it('should run second after first and third and third after first', function () {
var first = { name: 'first', init: createInit() };
var second = { name: 'second', require: ['first', 'third'], init: createInit() };
var third = { name: 'third', require: ['first'], init: createInit() };
var plugins = [second, first, third];
return registerPlugins(server, plugins).then(function () {
expect(second.init.calledAfter(first.init)).to.be(true);
expect(second.init.calledAfter(third.init)).to.be(true);
expect(third.init.calledAfter(first.init)).to.be(true);
sinon.assert.calledThrice(server.register);
});
});
it('should run first, second, third', function () {
var first = { name: 'first', init: createInit() };
var second = { name: 'second', require: ['first'], init: createInit() };
var third = { name: 'third', require: ['second'], init: createInit() };
var plugins = [second, first, third];
return registerPlugins(server, plugins).then(function () {
sinon.assert.calledOnce(first.init);
expect(second.init.calledAfter(first.init)).to.be(true);
expect(third.init.calledAfter(second.init)).to.be(true);
sinon.assert.calledThrice(server.register);
});
});
it('should detect circular dependencies', function (done) {
var first = { name: 'first', require: ['third'], init: sinon.stub() };
var second = { name: 'second', require: ['first'], init: sinon.stub() };
var third = { name: 'third', require: ['second'], init: sinon.stub() };
var plugins = [second, first, third];
registerPlugins(server, plugins).catch(function (err) {
expect(err).to.be.a(Error);
expect(err.message).to.be('Circular dependency: second -> first -> third -> second');
done();
});
});
}); // end dependencies tests
});

View file

@ -0,0 +1,88 @@
var _ = require('lodash');
var expect = require('expect.js');
var sinon = require('sinon');
var states = require('../states');
var Status = require('../Status');
var ServerStatus = require('../ServerStatus');
describe('ServerStatus class', function () {
var server;
var serverStatus;
beforeEach(function () {
server = { expose: sinon.stub(), log: sinon.stub() };
serverStatus = new ServerStatus(server);
});
describe('#create(name)', function () {
it('should create a new status by name', function () {
var status = serverStatus.create('name');
expect(status).to.be.a(Status);
});
});
describe('#get(name)', function () {
it('exposes plugins by name', function () {
var status = serverStatus.create('name');
expect(serverStatus.get('name')).to.be(status);
});
});
describe('#getState(name)', function () {
it('should expose the state of the plugin by name', function () {
var status = serverStatus.create('name');
status.green();
expect(serverStatus.getState('name')).to.be('green');
});
});
describe('#overall()', function () {
it('considers each status to produce a summary', function () {
var status = serverStatus.create('name');
expect(serverStatus.overall().state).to.be('uninitialized');
var match = function (overall, state) {
expect(overall).to.have.property('state', state.id);
expect(overall).to.have.property('title', state.title);
expect(overall).to.have.property('icon', state.icon);
expect(overall).to.have.property('icon', state.icon);
expect(state.nicknames).contain(overall.nickname);
};
status.green();
match(serverStatus.overall(), states.get('green'));
status.yellow();
match(serverStatus.overall(), states.get('yellow'));
status.red();
match(serverStatus.overall(), states.get('red'));
});
});
describe('#toJSON()', function () {
it('serializes to overall status and individuals', function () {
var one = serverStatus.create('one');
var two = serverStatus.create('two');
var three = serverStatus.create('three');
one.green();
two.yellow();
three.red();
var obj = JSON.parse(JSON.stringify(serverStatus));
expect(obj).to.have.property('overall');
expect(obj.overall.state).to.eql(serverStatus.overall().state);
expect(obj.statuses).to.have.length(3);
var outs = _.indexBy(obj.statuses, 'name');
expect(outs.one).to.have.property('state', 'green');
expect(outs.two).to.have.property('state', 'yellow');
expect(outs.three).to.have.property('state', 'red');
});
});
});

View file

@ -1,38 +0,0 @@
var expect = require('expect.js');
var sinon = require('sinon');
var status = require('../../../../../src/server/lib/status');
var Status = require('../../../../../src/server/lib/status/status');
describe('lib/status/index.js', function () {
var plugin, yellowSpy;
beforeEach(function () {
plugin = {
name: 'test',
server: { expose: sinon.stub(), log: sinon.stub() }
};
yellowSpy = sinon.spy(Status.prototype, 'yellow');
});
afterEach(function () {
Status.prototype.yellow.restore();
});
it('should create a new status for a plugin', function () {
status.createStatus(plugin);
expect(status.data).to.have.property('test');
expect(status.data.test).to.eql(plugin.status);
});
it('should attach a logger to the change status', function () {
status.createStatus(plugin);
plugin.status.green('Ready!');
sinon.assert.calledOnce(plugin.server.log);
});
it('should serialize the statuses when toJSON is called', function () {
status.createStatus(plugin);
expect(JSON.stringify(status)).to.eql(JSON.stringify(status.data));
});
});

View file

@ -1,29 +0,0 @@
var expect = require('expect.js');
var sinon = require('sinon');
var logStatusChange = require('../../../../../src/server/lib/status/log_status_change');
describe('lib/status/log_status_change', function () {
var plugin;
var current = { state: 'yellow', message: 'Initialize' };
var previous = { state: 'red', message: '' };
beforeEach(function () {
plugin = { name: 'test', server: { log: sinon.stub() } };
});
it('should call plugin.server.log', function () {
var fn = logStatusChange(plugin);
fn(current, previous);
sinon.assert.calledOnce(plugin.server.log);
});
it('should call plugin.server.log with plugin and error message', function () {
var fn = logStatusChange(plugin);
fn(current, previous);
sinon.assert.calledOnce(plugin.server.log);
expect(plugin.server.log.args[0][0]).to.be('plugin');
expect(plugin.server.log.args[0][1]).to.be('[ test ] Change status from red to yellow - Initialize');
});
});

View file

@ -1,60 +1,96 @@
var expect = require('expect.js');
var sinon = require('sinon');
var Status = require('../../../../../src/server/lib/status/status');
var Status = require('../Status');
var ServerStatus = require('../ServerStatus');
describe('lib/status/status.js', function () {
describe('Status class', function () {
it('should have a undefined state when initialized', function () {
var obj = new Status('test');
expect(obj).to.have.property('state');
expect(obj.statue).to.be(undefined);
var server;
var serverStatus;
beforeEach(function () {
server = { expose: sinon.stub(), log: sinon.stub() };
serverStatus = new ServerStatus(server);
});
it('should only trigger the change listner when something changes', function () {
var obj = new Status('test');
it('should have an "uninitialized" state initially', function () {
expect(serverStatus.create('test')).to.have.property('state', 'uninitialized');
});
it('emits change when the status is set', function (done) {
var status = serverStatus.create('test');
status.once('change', function (prev, prevMsg) {
expect(status.state).to.be('green');
expect(status.message).to.be('GREEN');
expect(prev).to.be('uninitialized');
status.once('change', function (prev, prevMsg) {
expect(status.state).to.be('red');
expect(status.message).to.be('RED');
expect(prev).to.be('green');
expect(prevMsg).to.be('GREEN');
done();
});
status.red('RED');
});
status.green('GREEN');
});
it('should only trigger the change listener when something changes', function () {
var status = serverStatus.create('test');
var stub = sinon.stub();
obj.on('change', stub);
obj.green('Ready');
obj.green('Ready');
obj.red('Not Ready');
status.on('change', stub);
status.green('Ready');
status.green('Ready');
status.red('Not Ready');
sinon.assert.calledTwice(stub);
});
it('should create a JSON representation of the status', function () {
var obj = new Status('test');
obj.green('Ready');
expect(obj.toJSON()).to.eql({ state: 'green', message: 'Ready' });
var status = serverStatus.create('test');
status.green('Ready');
var json = status.toJSON();
expect(json.state).to.eql('green');
expect(json.message).to.eql('Ready');
});
function testState(color) {
it('should change the state to ' + color + ' when #' + color + '() is called', function () {
var obj = new Status('test');
it(`should change the state to ${color} when #${color}() is called`, function () {
var status = serverStatus.create('test');
var message = 'testing ' + color;
obj[color](message);
expect(obj).to.have.property('state', color);
expect(obj).to.have.property('message', message);
status[color](message);
expect(status).to.have.property('state', color);
expect(status).to.have.property('message', message);
});
it('should trigger the "change" listner when #' + color + '() is called', function (done) {
var obj = new Status('test');
it(`should trigger the "change" listner when #${color}() is called`, function (done) {
var status = serverStatus.create('test');
var message = 'testing ' + color;
obj.on('change', function (current, previous) {
expect(current).to.eql({ state: color, message: message });
expect(previous).to.eql({ state: undefined, message: 'uninitialized' });
status.on('change', function (prev, prevMsg) {
expect(status.state).to.be(color);
expect(status.message).to.be(message);
expect(prev).to.be('uninitialized');
expect(prevMsg).to.be('uninitialized');
done();
});
obj[color](message);
status[color](message);
});
it('should trigger the "' + color + '" listner when #' + color + '() is called', function (done) {
var obj = new Status('test');
it(`should trigger the "${color}" listner when #${color}() is called`, function (done) {
var status = serverStatus.create('test');
var message = 'testing ' + color;
obj.on(color, function (msg, prev) {
expect(msg).to.be(message);
expect(prev).to.eql({ state: undefined, message: 'uninitialized' });
status.on(color, function (prev, prevMsg) {
expect(status.state).to.be(color);
expect(status.message).to.be(message);
done();
});
obj[color](message);
status[color](message);
});
}

View file

@ -20,6 +20,8 @@ class UiApp {
this.icon = this.spec.icon;
this.hidden = this.spec.hidden;
this.autoloadOverrides = this.spec.autoload;
this.templateName = this.spec.templateName || 'uiApp';
this.requireOptimizeGreen = this.spec.requireOptimizeGreen !== false;
this.getModules = _.once(this.getModules);
}

View file

@ -1,23 +1,24 @@
module.exports = function (kbnServer, server, config) {
var _ = require('lodash');
server.decorate('reply', 'renderApp', function (app, view) {
server.decorate('reply', 'renderApp', function (app) {
var optimizeStatus = kbnServer.status.get('optimize');
switch (optimizeStatus && optimizeStatus.state) {
case 'yellow':
return this(`
<html>
<head><meta http-equiv="refresh" content="1"></head>
<body>${optimizeStatus.message}</body>
</html>
`).code(503);
case 'red':
return this(`
<html><body>${optimizeStatus.message}</body></html>
`).code(500);
if (app.requireOptimizeGreen) {
var optimizeStatus = kbnServer.status.get('optimize');
switch (optimizeStatus && optimizeStatus.state) {
case 'yellow':
return this(`
<html>
<head><meta http-equiv="refresh" content="1"></head>
<body>${optimizeStatus.message}</body>
</html>
`).code(503);
case 'red':
return this(`
<html><body>${optimizeStatus.message}</body></html>
`).code(500);
}
}
var payload = {
@ -31,7 +32,7 @@ module.exports = function (kbnServer, server, config) {
esShardTimeout: config.get('elasticsearch.shardTimeout')
};
return this.view(view || 'uiApp', {
return this.view(app.templateName, {
app: app,
cacheBust: payload.cacheBust,
kibanaPayload: payload

View file

@ -1,35 +0,0 @@
var join = require('path').join;
var existsSync = require('fs').existsSync;
var packageDir;
function packagePath() {
return join(packageDir, 'package.json');
}
function findSync() {
if (packageDir) return packagePath();
packageDir = __dirname;
while (!existsSync(packagePath())) {
var prev = packageDir;
packageDir = join(packageDir, '..');
if (prev === packageDir) {
// if going up a directory doesn't work, we
// are already at the root of the filesystem
packageDir = null;
throw new Error('unable to find package.json');
}
}
return packagePath();
}
function getSync() {
return require(findSync());
}
exports.getSync = getSync;
exports.findSync = findSync;

View file

@ -2,6 +2,6 @@ var _ = require('lodash');
var dirname = require('path').dirname;
var join = require('path').join;
var normalize = require('path').normalize;
var root = dirname(require('./closestPackageJson').findSync());
var root = require('./packageJson').__dirname;
module.exports = _.flow(_.partial(join, root), normalize);

22
src/utils/packageJson.js Normal file
View file

@ -0,0 +1,22 @@
var join = require('path').join;
var existsSync = require('fs').existsSync;
var packageDir;
var packagePath;
while (!packagePath || !existsSync(packagePath)) {
var prev = packageDir;
packageDir = prev ? join(prev, '..') : __dirname;
packagePath = join(packageDir, 'package.json');
if (prev === packageDir) {
// if going up a directory doesn't work, we
// are already at the root of the filesystem
throw new Error('unable to find package.json');
}
}
module.exports = require(packagePath);
module.exports.__filename = packagePath;
module.exports.__dirname = packageDir;

View file

@ -1,22 +1,21 @@
module.exports = function (grunt) {
return {
options: {
log: true,
logErrors: true,
run: false,
page: {
settings: {
viewportSize: {
width: 2400,
height: 1250
}
}
}
},
unit: {
options: {
log: true,
logErrors: true,
run: false,
timeout: 120000,
page: {
settings: {
viewportSize: {
width: 2400,
height: 1250
}
}
},
urls: [
'http://localhost:' + (grunt.option('port') || '5601') + '/test/unit/'
'http://localhost:' + (grunt.option('port') || '5601') + '/tests'
]
}
}

View file

@ -8,7 +8,7 @@ module.exports = function (grunt) {
failOnError: false
},
cmd: './bin/kibana',
args: ['--logging.json=false']
args: ['--dev', '--quiet', '--logging.json=false']
}
};
};

View file

@ -4,5 +4,11 @@ module.exports = {
ignoreLeaks: false,
reporter: 'dot'
},
all: { src: ['<%= root %>/test/unit/{server,tasks}/**/*.js'] }
all: {
src: [
'src/**/__tests__/**/*.js',
'!src/**/public/**',
'!src/ui/**'
]
}
};

View file

@ -11,8 +11,6 @@ module.exports = function (grunt) {
'jshint:source',
'jscs:source',
'maybeStartKibana',
'jade',
'less:build',
'simplemocha:all',
'mocha:unit'
];

2
test.sh Executable file
View file

@ -0,0 +1,2 @@
FILES=$(glob-cli src/**/__tests__/**/*.js '!src/**/public/**' '!src/ui/**')
mocha --bail --reporter spec --timeout 10000 $FILES