From 2b9802030c9b65ac4d1f464066558df1cc6bffb5 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 23 Jan 2015 11:34:29 -0700 Subject: [PATCH 01/17] Closes #2377 - Migrate config from > GA - Closes #2377 - Added testing framework for server side tests - Fixed jshint - Added config migration - Added framework for server initialization --- package.json | 17 ++++++++------- src/server/config/index.js | 10 ++++++++- src/server/index.js | 15 +++++++++---- src/server/lib/isUpgradeable.js | 30 ++++++++++++++++++++++++++ src/server/lib/migrateConfig.js | 29 +++++++++++++++++++++++++ src/server/lib/serverInitialization.js | 10 +++++++++ src/server/lib/upgradeConfig.js | 28 ++++++++++++++++++++++++ tasks/config/jshint.js | 1 + tasks/config/simplemocha.js | 8 +++++++ tasks/test.js | 12 ++++++----- test/server/unit/lib/isUpgradeable.js | 27 +++++++++++++++++++++++ 11 files changed, 169 insertions(+), 18 deletions(-) create mode 100644 src/server/lib/isUpgradeable.js create mode 100644 src/server/lib/migrateConfig.js create mode 100644 src/server/lib/serverInitialization.js create mode 100644 src/server/lib/upgradeConfig.js create mode 100644 tasks/config/simplemocha.js create mode 100644 test/server/unit/lib/isUpgradeable.js diff --git a/package.json b/package.json index 4ad2434c5bcb1..7067d62811354 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,13 @@ "dashboarding" ], "private": false, - "version": "4.0.0-beta3", + "version": "4.0.0-rc1-snapshot", "main": "src/server/app.js", "homepage": "http://www.elasticsearch.org/overview/kibana/", - "bugs": "https://github.com/elasticsearch/kibana/issues", - "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/elasticsearch/kibana/issues" + }, + "license": "Apache 2.0", "author": "Rashid Khan ", "contributors": [ "Spencer Alger ", @@ -35,12 +37,14 @@ }, "dependencies": { "ansicolors": "^0.3.2", + "bluebird": "~2.0.7", "body-parser": "~1.10.1", "bunyan": "^1.2.3", "commander": "^2.6.0", "compression": "^1.3.0", "cookie-parser": "~1.3.3", "debug": "~2.1.1", + "elasticsearch": "^3.1.1", "express": "~4.10.6", "glob": "^4.3.2", "http-proxy": "^1.8.1", @@ -49,10 +53,10 @@ "less-middleware": "1.0.x", "lodash": "^2.4.1", "morgan": "~1.5.1", + "semver": "^4.2.0", "serve-favicon": "~2.2.0" }, "devDependencies": { - "bluebird": "~2.0.7", "connect": "~2.19.5", "event-stream": "~3.1.5", "expect.js": "~0.3.1", @@ -72,6 +76,7 @@ "grunt-run": "^0.2.3", "grunt-s3": "~0.2.0-alpha.3", "grunt-saucelabs": "~8.3.2", + "grunt-simple-mocha": "^0.4.0", "html-entities": "^1.1.1", "http-proxy": "~1.8.1", "husky": "~0.6.0", @@ -91,9 +96,5 @@ "rjs-build-analysis": "0.0.3", "simple-git": "^0.11.0", "tar": "^1.0.1" - }, - "license": "Apache 2.0", - "bugs": { - "url": "https://github.com/elasticsearch/kibana/issues" } } diff --git a/src/server/config/index.js b/src/server/config/index.js index f85eb383f111f..0bedef87770a8 100644 --- a/src/server/config/index.js +++ b/src/server/config/index.js @@ -16,6 +16,13 @@ try { public_folder = path.resolve(__dirname, '..', '..', 'kibana'); } +var packagePath = path.resolve(__dirname, '..', 'package.json'); +try { + fs.statSync(packagePath); +} catch (err) { + packagePath = path.resolve(__dirname, '..', '..', '..', 'package.json'); +} + var config = module.exports = { port : kibana.port || 5601, host : kibana.host || '0.0.0.0', @@ -25,7 +32,8 @@ var config = module.exports = { public_folder : public_folder, external_plugins_folder : process.env.PLUGINS_FOLDER || null, bundled_plugins_folder : path.resolve(public_folder, 'plugins'), - kibana : kibana + kibana : kibana, + package : require(packagePath) }; config.plugins = listPlugins(config); diff --git a/src/server/index.js b/src/server/index.js index 139f338f77c83..6b434e82e85e1 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -6,6 +6,8 @@ var app = require('./app'); var http = require('http'); var config = require('./config'); var logger = require('./lib/logger'); +var Promise = require('bluebird'); +var initialization = require('./lib/serverInitialization'); /** @@ -50,13 +52,18 @@ function onListening() { logger.info('Listening on %s:%d', address.address, address.port); } +function start() { + var port = parseInt(process.env.PORT, 10) || config.port || 3000; + var host = process.env.HOST || config.host || '127.0.0.1'; + var listen = Promise.promisify(server.listen.bind(server)); + app.set('port', port); + return listen(port, host); +} + module.exports = { server: server, start: function (cb) { - var port = parseInt(process.env.PORT, 10) || config.port || 3000; - var host = process.env.HOST || config.host || '127.0.0.1'; - app.set('port', port); - server.listen(port, host, cb); + return initialization().then(start).nodeify(cb); } }; diff --git a/src/server/lib/isUpgradeable.js b/src/server/lib/isUpgradeable.js new file mode 100644 index 0000000000000..f23d5b52c605f --- /dev/null +++ b/src/server/lib/isUpgradeable.js @@ -0,0 +1,30 @@ +var config = require('../config'); +var semver = require('semver'); +var rcVersionRegex = /(\d+\.\d+\.\d+)\-rc(\d+)/i; + +module.exports = function (doc) { + if (/beta|snapshot/i.test(doc._id)) return false; + if (doc._id === config.package.version) return false; + + var packageVersion, packageRcRelease, version, rcRelease; + packageRcRelease = rcRelease = Infinity; + var matches = doc._id.match(rcVersionRegex); + var packageMatches = config.package.version.match(rcVersionRegex); + + if (matches) { + version = matches[1]; + rcRelease = parseInt(matches[2], 10); + } else { + version = doc._id; + } + + if (packageMatches) { + packageVersion = packageMatches[1]; + packageRcRelease = parseInt(packageMatches[2], 10); + } else { + packageVersion = config.package.version; + } + + if (semver.gte(version, packageVersion) && rcRelease >= packageRcRelease) return false; + return true; +}; diff --git a/src/server/lib/migrateConfig.js b/src/server/lib/migrateConfig.js new file mode 100644 index 0000000000000..8cf2d3101ef28 --- /dev/null +++ b/src/server/lib/migrateConfig.js @@ -0,0 +1,29 @@ +var config = require('../config'); +var elasticsearch = require('elasticsearch'); +var upgrade = require('./upgradeConfig'); +var client = new elasticsearch.Client({ + host: config.elasticsearch +}); + +module.exports = function () { + var options = { + index: '.kibana', + type: 'config', + body: { + size: 1000, + sort: [ { buildNum: { order: 'desc' } } ], + query: { + filtered: { + filter: { + bool: { + must_not: [ { query: { match: { _id: '@@version' } } } ] + } + } + } + } + } + }; + + return client.search(options).then(upgrade); +}; + diff --git a/src/server/lib/serverInitialization.js b/src/server/lib/serverInitialization.js new file mode 100644 index 0000000000000..7ee738cc1f570 --- /dev/null +++ b/src/server/lib/serverInitialization.js @@ -0,0 +1,10 @@ +var Promise = require('bluebird'); +var migrateConfig = require('./migrateConfig'); + +module.exports = function () { + var tasks = [ + migrateConfig() + ]; + + return Promise.all(tasks); +}; diff --git a/src/server/lib/upgradeConfig.js b/src/server/lib/upgradeConfig.js new file mode 100644 index 0000000000000..5743b2dbb70a1 --- /dev/null +++ b/src/server/lib/upgradeConfig.js @@ -0,0 +1,28 @@ +var Promise = require('bluebird'); +var isUpgradeable = require('./isUpgradeable'); +var config = require('../config'); +var _ = require('lodash'); +var elasticsearch = require('elasticsearch'); +var client = new elasticsearch.Client({ + host: config.elasticsearch +}); + +module.exports = function (response) { + var newConfig = {}; + // Check to see if there are any doc. If not then we can assume + // nothing needs to be done + if (response.hits.hits.length === 0) return Promise.resolve(null); + + // Look for upgradeable configs. If none of them are upgradeable + // then resolve with null. + var body = _.find(response.hits.hits, isUpgradeable); + if (body) return Promise.resolve(null); + + return client.create({ + index: '.kibana', + type: 'config', + id: config.package.version, + body: body + }); + +}; diff --git a/tasks/config/jshint.js b/tasks/config/jshint.js index 062b86553f5dc..dc9279dfcc5e1 100644 --- a/tasks/config/jshint.js +++ b/tasks/config/jshint.js @@ -7,6 +7,7 @@ module.exports = function (grunt) { 'Gruntfile.js', '<%= root %>/tasks/**/*.js', '<%= src %>/kibana/*.js', + '<%= src %>/server/*.js', '<%= src %>/kibana/{components,directives,factories,filters,plugins,registry,services,utils}/**/*.js', '<%= unitTestDir %>/**/*.js' ] diff --git a/tasks/config/simplemocha.js b/tasks/config/simplemocha.js new file mode 100644 index 0000000000000..0132d321d1cbb --- /dev/null +++ b/tasks/config/simplemocha.js @@ -0,0 +1,8 @@ +module.exports = { + options: { + timeout: 2000, + ignoreLeaks: false, + reporter: 'dot' + }, + all: { src: ['<%= root %>/test/server/unit/**/*.js']} +}; diff --git a/tasks/test.js b/tasks/test.js index 1d16b7bd4bf75..268ee5cd0e821 100644 --- a/tasks/test.js +++ b/tasks/test.js @@ -1,6 +1,6 @@ var _ = require('lodash'); module.exports = function (grunt) { - function getTestTask() { + function addTestTask(tasks) { var testTask = 'mocha:unit'; if (grunt.option('use-sauce') || process.env.TRAVIS) { @@ -13,6 +13,8 @@ module.exports = function (grunt) { } } + tasks.push('simplemocha:all', testTask); + return testTask; } @@ -26,17 +28,17 @@ module.exports = function (grunt) { 'jshint', 'maybe_start_kibana', 'jade', - 'less', - getTestTask() + 'less' ]; + addTestTask(tasks); grunt.task.run(tasks); }); grunt.registerTask('quick-test', function () { var tasks = [ - 'maybe_start_kibana', - getTestTask() + 'maybe_start_kibana' ]; + addTestTask(tasks); grunt.task.run(tasks); }); diff --git a/test/server/unit/lib/isUpgradeable.js b/test/server/unit/lib/isUpgradeable.js new file mode 100644 index 0000000000000..42a8172a57445 --- /dev/null +++ b/test/server/unit/lib/isUpgradeable.js @@ -0,0 +1,27 @@ +var isUpgradeable = require('../../../../src/server/lib/isUpgradeable'); +var expect = require('expect.js'); +var util = require('util'); +var package = require('../../../../package.json'); + +describe('lib/isUpgradeable', function () { + + function upgradeDoc(_id, version, bool) { + it(util.format('should return %s for %s <= %s', bool, _id, version), function () { + var doc = { _id: _id }; + package.version = version; + expect(isUpgradeable(doc)).to.be(bool); + }); + } + + upgradeDoc('1.0.0-beta1', package.version, false); + upgradeDoc(package.version, package.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); + upgradeDoc('4.0.0-rc2', '4.0.2', true); + upgradeDoc('4.0.1', '4.1.0-rc', true); + upgradeDoc('4.0.0-rc1', '4.0.0', true); + upgradeDoc('4.0.0-rc1-snapshot', '4.0.0', false); + upgradeDoc('4.1.0-rc1-snapshot', '4.1.0-rc1', false); + +}); From 253eeabe316f2628699ecc23f0677b7634f64b26 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 23 Jan 2015 11:48:28 -0700 Subject: [PATCH 02/17] Refactoring the else statements out of isUpgradeable --- src/server/lib/isUpgradeable.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/server/lib/isUpgradeable.js b/src/server/lib/isUpgradeable.js index f23d5b52c605f..926430c68bb9c 100644 --- a/src/server/lib/isUpgradeable.js +++ b/src/server/lib/isUpgradeable.js @@ -6,23 +6,21 @@ module.exports = function (doc) { if (/beta|snapshot/i.test(doc._id)) return false; if (doc._id === config.package.version) return false; - var packageVersion, packageRcRelease, version, rcRelease; - packageRcRelease = rcRelease = Infinity; + var packageRcRelease = Infinity; + var rcRelease = Infinity; + var packageVersion = config.package.version; + var version = doc._id; var matches = doc._id.match(rcVersionRegex); var packageMatches = config.package.version.match(rcVersionRegex); if (matches) { version = matches[1]; rcRelease = parseInt(matches[2], 10); - } else { - version = doc._id; } if (packageMatches) { packageVersion = packageMatches[1]; packageRcRelease = parseInt(packageMatches[2], 10); - } else { - packageVersion = config.package.version; } if (semver.gte(version, packageVersion) && rcRelease >= packageRcRelease) return false; From b4714cfde00bffa7c7414b5c3bd4c4154d438b5f Mon Sep 17 00:00:00 2001 From: Spencer Alger Date: Wed, 21 Jan 2015 10:34:12 -0700 Subject: [PATCH 03/17] [aggResponse/pointSeries] format series names with the fieldFormatter --- src/kibana/components/agg_response/point_series/_get_point.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kibana/components/agg_response/point_series/_get_point.js b/src/kibana/components/agg_response/point_series/_get_point.js index c3ae30bcd2a41..5a217818d44ad 100644 --- a/src/kibana/components/agg_response/point_series/_get_point.js +++ b/src/kibana/components/agg_response/point_series/_get_point.js @@ -17,7 +17,7 @@ define(function (require) { } if (series) { - point.series = unwrap(row[series.i]); + point.series = series.agg.fieldFormatter()(unwrap(row[series.i])); } if (yScale) { From 5cca0699c96a1556460c661b423ddd815450fd88 Mon Sep 17 00:00:00 2001 From: Spencer Alger Date: Wed, 21 Jan 2015 11:01:49 -0700 Subject: [PATCH 04/17] [aggResponse/pointSeries] added tests for 0166d56 and fixed existing --- .../agg_response/point_series/_get_point.js | 38 +++++++++++++++++-- .../agg_response/point_series/_get_series.js | 8 ++-- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/test/unit/specs/components/agg_response/point_series/_get_point.js b/test/unit/specs/components/agg_response/point_series/_get_point.js index e4e413eee0325..37b7774acd20f 100644 --- a/test/unit/specs/components/agg_response/point_series/_get_point.js +++ b/test/unit/specs/components/agg_response/point_series/_get_point.js @@ -1,8 +1,11 @@ define(function (require) { return ['getPoint', function () { - + var _ = require('lodash'); var getPoint; + var truthFormatted = { fieldFormatter: _.constant(_.constant(true)) }; + var identFormatted = { fieldFormatter: _.constant(_.identity) }; + beforeEach(module('kibana')); beforeEach(inject(function (Private) { getPoint = Private(require('components/agg_response/point_series/_get_point')); @@ -10,7 +13,11 @@ define(function (require) { it('properly unwraps and scales values without a series', function () { var row = [ { value: 1 }, { value: 2 }]; - var point = getPoint({ i: 0 }, null, 5, row, { i: 1 }); + var xAspect = { i: 0 }; + var seriesAspect = null; + var yScale = 5; + var yAspect = { i: 1 }; + var point = getPoint(xAspect, seriesAspect, yScale, row, yAspect); expect(point) .to.have.property('x', 1) @@ -21,7 +28,11 @@ define(function (require) { it('properly unwraps and scales values with a series', function () { var row = [ { value: 1 }, { value: 2 }, { value: 3 }]; - var point = getPoint({ i: 0 }, { i: 1 }, null, row, { i: 2 }); + var xAspect = { i: 0 }; + var seriesAspect = { i: 1, agg: identFormatted }; + var yScale = null; + var yAspect = { i: 2 }; + var point = getPoint(xAspect, seriesAspect, yScale, row, yAspect); expect(point) .to.have.property('x', 1) @@ -30,9 +41,28 @@ define(function (require) { .and.have.property('aggConfigResult', row[2]); }); + it('properly formats series values', function () { + var row = [ { value: 1 }, { value: 2 }, { value: 3 } ]; + var xAspect = { i: 0 }; + var seriesAspect = { i: 1, agg: truthFormatted }; + var yScale = null; + var yAspect = { i: 2 }; + var point = getPoint(xAspect, seriesAspect, yScale, row, yAspect); + + expect(point) + .to.have.property('x', 1) + .and.have.property('series', true) + .and.have.property('y', 3) + .and.have.property('aggConfigResult', row[2]); + }); + it('ignores points with a y value of NaN', function () { var row = [ { value: 1 }, { value: 'NaN' }]; - var point = getPoint({ i: 0 }, null, 5, row, { i: 1 }); + var xAspect = { i: 0 }; + var seriesAspect = null; + var yScale = 5; + var yAspect = { i: 1 }; + var point = getPoint(xAspect, seriesAspect, yScale, row, yAspect); expect(point).to.be(void 0); }); }]; diff --git a/test/unit/specs/components/agg_response/point_series/_get_series.js b/test/unit/specs/components/agg_response/point_series/_get_series.js index 4b5cb9909e69a..8cbb4ac0e3f19 100644 --- a/test/unit/specs/components/agg_response/point_series/_get_series.js +++ b/test/unit/specs/components/agg_response/point_series/_get_series.js @@ -3,6 +3,8 @@ define(function (require) { var _ = require('lodash'); var getSeries; + var agg = { fieldFormatter: _.constant(_.identity) }; + beforeEach(module('kibana')); beforeEach(inject(function (Private) { getSeries = Private(require('components/agg_response/point_series/_get_series')); @@ -109,7 +111,7 @@ define(function (require) { var chart = { aspects: { x: { i: -1 }, - series: { i: 0 }, + series: { i: 0, agg: agg }, y: { i: 1, col: { title: '0' } } } }; @@ -151,7 +153,7 @@ define(function (require) { var chart = { aspects: { x: { i: -1 }, - series: { i: 0 }, + series: { i: 0, agg: agg }, y: [ { i: 1, col: { title: '0' }, agg: { id: 1 } }, { i: 2, col: { title: '1' }, agg: { id: 2 } } @@ -201,7 +203,7 @@ define(function (require) { var chart = { aspects: { x: { i: -1 }, - series: { i: 0 }, + series: { i: 0, agg: agg }, y: [ { i: 1, col: { title: '0' }, agg: { id: 1 } }, { i: 2, col: { title: '1' }, agg: { id: 2 } } From ad0d7ec2cf6751ba1f17607820ccd236b2ea9c78 Mon Sep 17 00:00:00 2001 From: Spencer Alger Date: Thu, 22 Jan 2015 04:26:50 -0700 Subject: [PATCH 05/17] [mixin] added _.organizeBy --- src/kibana/utils/_mixins_chainable.js | 40 ++++++++++++++++ test/unit/specs/utils/mixins/_organize_by.js | 49 ++++++++++++++++++++ test/unit/specs/utils/mixins/index.js | 1 + 3 files changed, 90 insertions(+) create mode 100644 test/unit/specs/utils/mixins/_organize_by.js diff --git a/src/kibana/utils/_mixins_chainable.js b/src/kibana/utils/_mixins_chainable.js index 6ed63550a6fdd..c84981a8d785e 100644 --- a/src/kibana/utils/_mixins_chainable.js +++ b/src/kibana/utils/_mixins_chainable.js @@ -207,6 +207,46 @@ define(function (require) { // place the obj at it's new index objs.splice(targetI, 0, objs.splice(origI, 1)[0]); + }, + + /** + * Like _.groupBy, but allows specifying multiple groups for a + * single object. + * + * _.organizeBy([{ a: [1, 2, 3] }, { b: true, a: [1, 4] }], 'a') + * // Object {1: Array[2], 2: Array[1], 3: Array[1], 4: Array[1]} + * + * _.groupBy([{ a: [1, 2, 3] }, { b: true, a: [1, 4] }], 'a') + * // Object {'1,2,3': Array[1], '1,4': Array[1]} + * + * @param {array} collection - the list of values to organize + * @param {Function} callback - either a property name, or a callback. + * @return {object} + */ + organizeBy: function (collection, callback) { + var buckets = {}; + var prop = typeof callback === 'function' ? false : callback; + + function add(key, obj) { + if (!buckets[key]) buckets[key] = []; + buckets[key].push(obj); + } + + _.each(collection, function (obj) { + var keys = prop === false ? callback(obj) : obj[prop]; + + if (!_.isArray(keys)) { + add(keys, obj); + return; + } + + var length = keys.length; + while (length-- > 0) { + add(keys[length], obj); + } + }); + + return buckets; } }; }); diff --git a/test/unit/specs/utils/mixins/_organize_by.js b/test/unit/specs/utils/mixins/_organize_by.js new file mode 100644 index 0000000000000..15cb93b9047d8 --- /dev/null +++ b/test/unit/specs/utils/mixins/_organize_by.js @@ -0,0 +1,49 @@ +define(function (require) { + return ['_.organize', function () { + var _ = require('lodash'); + + it('it works', function () { + var col = [ + { + name: 'one', + roles: ['user', 'admin', 'owner'] + }, + { + name: 'two', + roles: ['user'] + }, + { + name: 'three', + roles: ['user'] + }, + { + name: 'four', + roles: ['user', 'admin'] + } + ]; + + var resp = _.organizeBy(col, 'roles'); + expect(resp).to.have.property('user'); + expect(resp.user).to.have.length(4); + + expect(resp).to.have.property('admin'); + expect(resp.admin).to.have.length(2); + + expect(resp).to.have.property('owner'); + expect(resp.owner).to.have.length(1); + }); + + it('behaves just like groupBy in normal scenarios', function () { + var col = [ + { name: 'one' }, + { name: 'two' }, + { name: 'three' }, + { name: 'four' } + ]; + + var orgs = _.organizeBy(col, 'name'); + var groups = _.groupBy(col, 'name'); + expect(orgs).to.eql(groups); + }); + }]; +}); \ No newline at end of file diff --git a/test/unit/specs/utils/mixins/index.js b/test/unit/specs/utils/mixins/index.js index 1b9be8921f323..195407b53fd76 100644 --- a/test/unit/specs/utils/mixins/index.js +++ b/test/unit/specs/utils/mixins/index.js @@ -1,6 +1,7 @@ define(function (require) { describe('lodash mixins', function () { run(require('specs/utils/mixins/_move')); + run(require('specs/utils/mixins/_organize_by')); function run(m) { describe(m[0], m[1]); } }); }); \ No newline at end of file From c65c274dad344c02ff8e321980b50152ef7cae5e Mon Sep 17 00:00:00 2001 From: lukasolson Date: Thu, 22 Jan 2015 14:23:04 -0700 Subject: [PATCH 06/17] Fix proxy to treat request_timeout as milliseconds rather than seconds --- src/server/routes/proxy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/routes/proxy.js b/src/server/routes/proxy.js index 876459ae2793a..ddef350ac147a 100644 --- a/src/server/routes/proxy.js +++ b/src/server/routes/proxy.js @@ -45,7 +45,7 @@ router.use(function (req, res, next) { target: config.elasticsearch, secure: config.kibana.verify_ssl, xfwd: true, - timeout: (config.kibana.request_timeout) * 1000 + timeout: (config.kibana.request_timeout) }; proxy.web(req, res, options); }); From fb984758ec2baddc475cc3642b2f94c8356eb934 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 23 Jan 2015 12:09:21 -0700 Subject: [PATCH 07/17] Adding esvm to test for travis --- tasks/test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/test.js b/tasks/test.js index 268ee5cd0e821..531c78c2a3870 100644 --- a/tasks/test.js +++ b/tasks/test.js @@ -31,6 +31,7 @@ module.exports = function (grunt) { 'less' ]; addTestTask(tasks); + if (process.env.TRAVIS) tasks.shift('esvm:dev'); grunt.task.run(tasks); }); From b42ec9fc536d0f1853c011c74ef054ff85339569 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 23 Jan 2015 11:34:29 -0700 Subject: [PATCH 08/17] Closes #2377 - Migrate config from > GA - Closes #2377 - Added testing framework for server side tests - Fixed jshint - Added config migration - Added framework for server initialization --- tasks/test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/test.js b/tasks/test.js index 531c78c2a3870..c90f22ef04ac7 100644 --- a/tasks/test.js +++ b/tasks/test.js @@ -32,6 +32,7 @@ module.exports = function (grunt) { ]; addTestTask(tasks); if (process.env.TRAVIS) tasks.shift('esvm:dev'); + addTestTask(tasks); grunt.task.run(tasks); }); From da9cdcb104d3ae0771c415d7bee6dae0eef28333 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 23 Jan 2015 12:25:45 -0700 Subject: [PATCH 09/17] Oops... UNSHIFT not SHIFT --- tasks/test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/test.js b/tasks/test.js index c90f22ef04ac7..efe881034c774 100644 --- a/tasks/test.js +++ b/tasks/test.js @@ -31,7 +31,7 @@ module.exports = function (grunt) { 'less' ]; addTestTask(tasks); - if (process.env.TRAVIS) tasks.shift('esvm:dev'); + if (process.env.TRAVIS) tasks.unshift('esvm:dev'); addTestTask(tasks); grunt.task.run(tasks); }); From d1886d8b953f54659f35347070a73f22da4bde4c Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 23 Jan 2015 13:01:19 -0700 Subject: [PATCH 10/17] Fixing esvm:dev --- tasks/config/esvm.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tasks/config/esvm.js b/tasks/config/esvm.js index a09a5fe1d4550..c1f9c8ab77244 100644 --- a/tasks/config/esvm.js +++ b/tasks/config/esvm.js @@ -1,16 +1,22 @@ module.exports = function (grunt) { - var rel = require('path').join.bind(null, __dirname, '../../'); + var join = require('path').join; + var rel = require('path').join.bind(null, grunt.config.get('root')); + var directory = join(__dirname, '../../', 'esvm'); return { options: { - version: '^1.4', + directory: directory, + version: '1.4.2', plugins: [ 'elasticsearch/marvel/latest' ], config: { path: { - data: rel('esvm/data_dir'), - logs: rel('esvm/logs') + home: rel('1.4.2'), + config: rel('1.4.2/config'), + data: rel('data_dir'), + logs: rel('logs'), + plugins: rel('1.4.2/plugins') }, network: { host: '127.0.0.1' @@ -24,4 +30,4 @@ module.exports = function (grunt) { }, dev: {} }; -}; \ No newline at end of file +}; From 46f086340c20e2a08ed637fcd0e68e937ec69314 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 23 Jan 2015 19:07:31 -0700 Subject: [PATCH 11/17] Fixing a bug with missing indices --- src/server/lib/migrateConfig.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/server/lib/migrateConfig.js b/src/server/lib/migrateConfig.js index 8cf2d3101ef28..0fded3d1c12ac 100644 --- a/src/server/lib/migrateConfig.js +++ b/src/server/lib/migrateConfig.js @@ -1,8 +1,15 @@ var config = require('../config'); var elasticsearch = require('elasticsearch'); var upgrade = require('./upgradeConfig'); +var util = require('util'); +var url = require('url'); +var uri = url.parse(config.elasticsearch); +if (config.kibana.elasticsearch_username && config.kibana.elasticsearch_password) { + uri.auth = util.format('%s:%s', config.kibana.elasticsearch_username, config.kibana.elasticsearch_password); +} +console.log(url.format(uri)); var client = new elasticsearch.Client({ - host: config.elasticsearch + host: url.format(uri) }); module.exports = function () { @@ -24,6 +31,10 @@ module.exports = function () { } }; - return client.search(options).then(upgrade); + return client.search(options) + .then(upgrade) + .catch(function (err) { + if (!/^IndexMissingException/.test(err.message)) throw err; + }); }; From 1e6bf202f7a14eea032d7f326bc221851aee6e04 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 27 Jan 2015 17:50:57 -0700 Subject: [PATCH 12/17] Fixing the path config values --- tasks/config/esvm.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tasks/config/esvm.js b/tasks/config/esvm.js index c1f9c8ab77244..79ee315016aef 100644 --- a/tasks/config/esvm.js +++ b/tasks/config/esvm.js @@ -1,7 +1,7 @@ module.exports = function (grunt) { var join = require('path').join; var rel = require('path').join.bind(null, grunt.config.get('root')); - var directory = join(__dirname, '../../', 'esvm'); + var directory = join(grunt.config.get('root'), 'esvm'); return { options: { @@ -13,7 +13,8 @@ module.exports = function (grunt) { config: { path: { home: rel('1.4.2'), - config: rel('1.4.2/config'), + bin: rel('1.4.2/bin'), + conf: rel('1.4.2/config'), data: rel('data_dir'), logs: rel('logs'), plugins: rel('1.4.2/plugins') From 2f70a856be96ba41809403649eeadb3c10e6568a Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 27 Jan 2015 17:58:22 -0700 Subject: [PATCH 13/17] Remvoing config values --- tasks/config/esvm.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tasks/config/esvm.js b/tasks/config/esvm.js index 79ee315016aef..25485fd8d2313 100644 --- a/tasks/config/esvm.js +++ b/tasks/config/esvm.js @@ -11,14 +11,6 @@ module.exports = function (grunt) { 'elasticsearch/marvel/latest' ], config: { - path: { - home: rel('1.4.2'), - bin: rel('1.4.2/bin'), - conf: rel('1.4.2/config'), - data: rel('data_dir'), - logs: rel('logs'), - plugins: rel('1.4.2/plugins') - }, network: { host: '127.0.0.1' }, From fa77a1e08d6be69a1df6d085933abf5198828044 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 28 Jan 2015 11:05:03 -0700 Subject: [PATCH 14/17] Updating the grunt-esvm version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7067d62811354..87ff5be776faa 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "grunt-contrib-less": "~0.10.0", "grunt-contrib-requirejs": "~0.4.4", "grunt-contrib-watch": "~0.5.3", - "grunt-esvm": "~0.2.0", + "grunt-esvm": "~0.3.2", "grunt-mocha": "~0.4.10", "grunt-replace": "^0.7.9", "grunt-run": "^0.2.3", From faaae078cb6b6ccbaeccea9e1942a93c48c77760 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 29 Jan 2015 11:10:54 -0700 Subject: [PATCH 15/17] Adding more tests and removing null from the resolves --- src/server/lib/isUpgradeable.js | 7 ++++++- src/server/lib/upgradeConfig.js | 4 ++-- test/server/unit/lib/isUpgradeable.js | 27 +++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/server/lib/isUpgradeable.js b/src/server/lib/isUpgradeable.js index 926430c68bb9c..68f59eeec4034 100644 --- a/src/server/lib/isUpgradeable.js +++ b/src/server/lib/isUpgradeable.js @@ -4,6 +4,7 @@ var rcVersionRegex = /(\d+\.\d+\.\d+)\-rc(\d+)/i; module.exports = function (doc) { if (/beta|snapshot/i.test(doc._id)) return false; + if (!doc._id) return false; if (doc._id === config.package.version) return false; var packageRcRelease = Infinity; @@ -23,6 +24,10 @@ module.exports = function (doc) { packageRcRelease = parseInt(packageMatches[2], 10); } - if (semver.gte(version, packageVersion) && rcRelease >= packageRcRelease) return false; + try { + if (semver.gte(version, packageVersion) && rcRelease >= packageRcRelease) return false; + } catch (e) { + return false; + } return true; }; diff --git a/src/server/lib/upgradeConfig.js b/src/server/lib/upgradeConfig.js index 5743b2dbb70a1..a8ad8922f70a3 100644 --- a/src/server/lib/upgradeConfig.js +++ b/src/server/lib/upgradeConfig.js @@ -11,12 +11,12 @@ module.exports = function (response) { var newConfig = {}; // Check to see if there are any doc. If not then we can assume // nothing needs to be done - if (response.hits.hits.length === 0) return Promise.resolve(null); + if (response.hits.hits.length === 0) return Promise.resolve(); // Look for upgradeable configs. If none of them are upgradeable // then resolve with null. var body = _.find(response.hits.hits, isUpgradeable); - if (body) return Promise.resolve(null); + if (body) return Promise.resolve(); return client.create({ index: '.kibana', diff --git a/test/server/unit/lib/isUpgradeable.js b/test/server/unit/lib/isUpgradeable.js index 42a8172a57445..b08f3644a930f 100644 --- a/test/server/unit/lib/isUpgradeable.js +++ b/test/server/unit/lib/isUpgradeable.js @@ -24,4 +24,31 @@ describe('lib/isUpgradeable', function () { upgradeDoc('4.0.0-rc1-snapshot', '4.0.0', false); upgradeDoc('4.1.0-rc1-snapshot', '4.1.0-rc1', false); + it('should handle missing _id field', function () { + var doc = { + '_index': '.kibana', + '_type': 'config', + '_score': 1, + '_source': { + 'buildNum': 1.7976931348623157e+308, + 'defaultIndex': '[logstash-]YYYY.MM.DD' + } + }; + expect(isUpgradeable(doc)).to.be(false); + }); + + it('should handle _id of @@version', function () { + var doc = { + '_index': '.kibana', + '_type': 'config', + '_id': '@@version', + '_score': 1, + '_source': { + 'buildNum': 1.7976931348623157e+308, + 'defaultIndex': '[logstash-]YYYY.MM.DD' + } + }; + expect(isUpgradeable(doc)).to.be(false); + }); + }); From 8a1944ee9fb3231294a1cf6489abacc6d470a027 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 29 Jan 2015 11:12:53 -0700 Subject: [PATCH 16/17] Removing debug --- src/server/lib/migrateConfig.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/lib/migrateConfig.js b/src/server/lib/migrateConfig.js index 0fded3d1c12ac..d921a8883ce6f 100644 --- a/src/server/lib/migrateConfig.js +++ b/src/server/lib/migrateConfig.js @@ -7,7 +7,6 @@ var uri = url.parse(config.elasticsearch); if (config.kibana.elasticsearch_username && config.kibana.elasticsearch_password) { uri.auth = util.format('%s:%s', config.kibana.elasticsearch_username, config.kibana.elasticsearch_password); } -console.log(url.format(uri)); var client = new elasticsearch.Client({ host: url.format(uri) }); From 09318b82589b92a2e26f9295f70dcbc3d72500d1 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 29 Jan 2015 11:32:19 -0700 Subject: [PATCH 17/17] Adding requirefrom to reduce the ../../../ effect --- package.json | 3 ++- test/server/unit/lib/isUpgradeable.js | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 82cd461aeed44..8262db9f07aed 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,9 @@ "less-middleware": "1.0.x", "lodash": "^2.4.1", "morgan": "~1.5.1", - "semver": "^4.2.0", "request": "^2.40.0", + "requirefrom": "^0.2.0", + "semver": "^4.2.0", "serve-favicon": "~2.2.0", "ssl-root-cas": "^1.1.7" }, diff --git a/test/server/unit/lib/isUpgradeable.js b/test/server/unit/lib/isUpgradeable.js index b08f3644a930f..15d87507c0153 100644 --- a/test/server/unit/lib/isUpgradeable.js +++ b/test/server/unit/lib/isUpgradeable.js @@ -1,7 +1,8 @@ -var isUpgradeable = require('../../../../src/server/lib/isUpgradeable'); +var root = require('requirefrom')(''); +var isUpgradeable = root('src/server/lib/isUpgradeable'); var expect = require('expect.js'); var util = require('util'); -var package = require('../../../../package.json'); +var package = root('package.json'); describe('lib/isUpgradeable', function () {