From 6a947db0489839eeb2f5efa8cb50972c6a89202b Mon Sep 17 00:00:00 2001 From: Guillaume Wintzer Date: Mon, 23 Oct 2017 17:49:25 +0200 Subject: [PATCH] retarget branch optimize-task-in-kibana-plugin-cli on last master --- src/cli_plugin/cli.js | 2 + src/cli_plugin/install/index.js | 5 +++ src/cli_plugin/install/kibana.js | 7 ++++ src/cli_plugin/install/settings.js | 3 +- src/cli_plugin/list/index.js | 1 + src/cli_plugin/optimize/__tests__/index.js | 41 ++++++++++++++++++ src/cli_plugin/optimize/__tests__/settings.js | 42 +++++++++++++++++++ src/cli_plugin/optimize/index.js | 35 ++++++++++++++++ src/cli_plugin/optimize/optimize.js | 16 +++++++ src/cli_plugin/optimize/settings.js | 10 +++++ 10 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 src/cli_plugin/optimize/__tests__/index.js create mode 100644 src/cli_plugin/optimize/__tests__/settings.js create mode 100644 src/cli_plugin/optimize/index.js create mode 100644 src/cli_plugin/optimize/optimize.js create mode 100644 src/cli_plugin/optimize/settings.js diff --git a/src/cli_plugin/cli.js b/src/cli_plugin/cli.js index bd7023d639ab96..cea8ef1a9463b8 100644 --- a/src/cli_plugin/cli.js +++ b/src/cli_plugin/cli.js @@ -3,6 +3,7 @@ import { pkg } from '../utils'; import Command from '../cli/command'; import listCommand from './list'; import installCommand from './install'; +import optimizeCommand from './optimize'; import removeCommand from './remove'; const argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) : process.argv.slice(); @@ -17,6 +18,7 @@ program listCommand(program); installCommand(program); +optimizeCommand(program); removeCommand(program); program diff --git a/src/cli_plugin/install/index.js b/src/cli_plugin/install/index.js index 243f9bd0e55ca2..aafb604a547960 100644 --- a/src/cli_plugin/install/index.js +++ b/src/cli_plugin/install/index.js @@ -40,6 +40,11 @@ export default function pluginInstall(program) { 'path to the directory where plugins are stored', fromRoot('plugins') ) + .option( + '--skip-optimize', + 'avoid the mandatory optimization after each plugin installation. \n' + + 'Require a manual "kibana-plugin optimize" command to update bundle and reload the available plugins list' + ) .description('install a plugin', `Common examples: install x-pack diff --git a/src/cli_plugin/install/kibana.js b/src/cli_plugin/install/kibana.js index d14f9a83d73048..e7375481e03a92 100644 --- a/src/cli_plugin/install/kibana.js +++ b/src/cli_plugin/install/kibana.js @@ -18,6 +18,13 @@ export function existingInstall(settings, logger) { } export async function rebuildCache(settings, logger) { + + if (settings.skipOptimize) { + logger.log('Skip optimize task due to given settings (--skip-optimize). ' + + 'Remember to run a dedicated optimization task before starting Kibana !'); + return; + } + logger.log('Optimizing and caching browser bundles...'); const serverConfig = _.merge( readYamlConfig(settings.config), diff --git a/src/cli_plugin/install/settings.js b/src/cli_plugin/install/settings.js index 628ae5b72203dc..c60b7560ea0982 100644 --- a/src/cli_plugin/install/settings.js +++ b/src/cli_plugin/install/settings.js @@ -29,7 +29,8 @@ export function parse(command, options, kbnPackage) { config: options.config || '', plugin: command, version: kbnPackage.version, - pluginDir: options.pluginDir || '' + pluginDir: options.pluginDir || '', + skipOptimize: options.skipOptimize || false }; settings.urls = generateUrls(settings); diff --git a/src/cli_plugin/list/index.js b/src/cli_plugin/list/index.js index 72e0ddc5ae2b90..ae229696c2df52 100644 --- a/src/cli_plugin/list/index.js +++ b/src/cli_plugin/list/index.js @@ -15,6 +15,7 @@ function processCommand(command, options) { } const logger = new Logger(settings); + logWarnings(settings, logger); list(settings, logger); } diff --git a/src/cli_plugin/optimize/__tests__/index.js b/src/cli_plugin/optimize/__tests__/index.js new file mode 100644 index 00000000000000..daadb16a178771 --- /dev/null +++ b/src/cli_plugin/optimize/__tests__/index.js @@ -0,0 +1,41 @@ +import expect from 'expect.js'; +import sinon from 'sinon'; +import index from '../index'; + +describe('kibana cli', function () { + + describe('plugin installer', function () { + + describe('commander options', function () { + + const program = { + command: function () { return program; }, + description: function () { return program; }, + option: function () { return program; }, + action: function () { return program; } + }; + + it('should define the command', function () { + sinon.spy(program, 'command'); + + index(program); + expect(program.command.calledWith('optimize')).to.be(true); + + program.command.restore(); + }); + + it('should define the description', function () { + sinon.spy(program, 'description'); + + index(program); + expect(program.description.calledWith('force the optimization for all plugins')).to.be(true); + + program.description.restore(); + }); + + + }); + + }); + +}); diff --git a/src/cli_plugin/optimize/__tests__/settings.js b/src/cli_plugin/optimize/__tests__/settings.js new file mode 100644 index 00000000000000..2089f6c26fbaea --- /dev/null +++ b/src/cli_plugin/optimize/__tests__/settings.js @@ -0,0 +1,42 @@ +import expect from 'expect.js'; +import { fromRoot } from '../../../utils'; +import { parse } from '../settings'; + +describe('kibana cli', function () { + + describe('plugin optimizer', function () { + + describe('command line option parsing', function () { + + describe('parse function', function () { + + let command; + const options = {}; + beforeEach(function () { + command = { pluginDir: fromRoot('plugins') }; + }); + + describe('pluginDir option', function () { + + it('should default to plugins', function () { + const settings = parse(command, options); + + expect(settings.pluginDir).to.be(fromRoot('plugins')); + }); + + it('should set settings.config property', function () { + command.pluginDir = 'foo bar baz'; + const settings = parse(command, options); + + expect(settings.pluginDir).to.be('foo bar baz'); + }); + + }); + + }); + + }); + + }); + +}); diff --git a/src/cli_plugin/optimize/index.js b/src/cli_plugin/optimize/index.js new file mode 100644 index 00000000000000..d6ea92c8a2c98b --- /dev/null +++ b/src/cli_plugin/optimize/index.js @@ -0,0 +1,35 @@ +import { fromRoot } from '../../utils'; +import optimize from './optimize'; +import Logger from '../lib/logger'; +import { parse } from './settings'; +import logWarnings from '../lib/log_warnings'; + +function processCommand(command) { + let settings; + try { + settings = parse(command); + + } catch (ex) { + //The logger has not yet been initialized. + console.error(ex.message); + process.exit(64); // eslint-disable-line no-process-exit + } + + const logger = new Logger(settings); + logWarnings(settings, logger); + optimize(settings, logger); +} + +export default function pluginOptimize(program) { + program + .command('optimize') + .option('-q, --quiet', 'disable all process messaging except errors') + .option('-s, --silent', 'disable all process messaging') + .option( + '-d, --plugin-dir ', + 'path to the directory where plugins are stored', + fromRoot('plugins') + ) + .description('force the optimization for all plugins') + .action(processCommand); +} diff --git a/src/cli_plugin/optimize/optimize.js b/src/cli_plugin/optimize/optimize.js new file mode 100644 index 00000000000000..f0071ae8dd788d --- /dev/null +++ b/src/cli_plugin/optimize/optimize.js @@ -0,0 +1,16 @@ +import { cleanArtifacts } from '../install/cleanup'; +import { rebuildCache } from '../install/kibana'; + +export default async function optimize(settings, logger) { + try { + logger.log('Start stand-alone plugins optimization'); + + await rebuildCache(settings, logger); + + logger.log('Plugin optimization complete'); + } catch (err) { + logger.error(`Plugin optimization was unsuccessful due to error "${err.message}"`); + cleanArtifacts(settings); + process.exit(70); // eslint-disable-line no-process-exit + } +} diff --git a/src/cli_plugin/optimize/settings.js b/src/cli_plugin/optimize/settings.js new file mode 100644 index 00000000000000..6526828d6f1b26 --- /dev/null +++ b/src/cli_plugin/optimize/settings.js @@ -0,0 +1,10 @@ +export function parse(command) { + + const settings = { + quiet: command.quiet || false, + silent: command.silent || false, + pluginDir: command.pluginDir || '' + }; + + return settings; +}