[plugin/install] plugins need to have their own deps (support no internet installs)

This commit is contained in:
spalger 2015-08-13 15:35:45 -07:00
parent 3a8b664622
commit fb560cf796
4 changed files with 7 additions and 118 deletions

View file

@ -1,69 +0,0 @@
var expect = require('expect.js');
var nock = require('nock');
var glob = require('glob');
var rimraf = require('rimraf');
var fs = require('fs');
var { join } = require('path');
var sinon = require('sinon');
var pluginLogger = require('../pluginLogger');
var npmInstall = require('../npmInstall');
describe('kibana cli', function () {
describe('plugin installer', function () {
describe('npmInstall', function () {
var testWorkingPath = join(__dirname, '.test.data');
var logger;
var statSyncStub;
beforeEach(function () {
statSyncStub = undefined;
logger = pluginLogger(false);
rimraf.sync(testWorkingPath);
sinon.stub(logger, 'log');
sinon.stub(logger, 'error');
});
afterEach(function () {
logger.log.restore();
logger.error.restore();
rimraf.sync(testWorkingPath);
if (statSyncStub) statSyncStub.restore();
});
it('should throw an error if there is no package.json file in the archive', function () {
fs.mkdirSync(testWorkingPath);
var errorStub = sinon.stub();
return npmInstall(testWorkingPath, logger)
.catch(errorStub)
.then(function (data) {
expect(errorStub.called).to.be(true);
expect(errorStub.lastCall.args[0].message).to.match(/package.json/);
});
});
it('should rethrow any errors other than "ENOENT" from fs.statSync', function () {
fs.mkdirSync(testWorkingPath);
statSyncStub = sinon.stub(fs, 'statSync', function () {
throw new Error('This is unexpected.');
});
var errorStub = sinon.stub();
return npmInstall(testWorkingPath, logger)
.catch(errorStub)
.then(function (data) {
expect(errorStub.called).to.be(true);
expect(errorStub.lastCall.args[0].message).to.match(/This is unexpected./);
});
});
});
});
});

View file

@ -1,35 +0,0 @@
var Promise = require('bluebird');
var fs = require('fs');
var path = require('path');
var exec = require('child_process').exec;
module.exports = function (dest, logger) {
return new Promise(function (resolve, reject) {
//throw an exception if package.json does not exist
try {
var packageFile = path.join(dest, 'package.json');
fs.statSync(packageFile);
} catch (e) {
if (e.code !== 'ENOENT') throw e;
return reject(new Error('Plugin does not contain package.json file'));
}
var cmd = '"' + path.resolve(path.dirname(process.execPath), 'npm').replace(/\\/g, '/') + '" install --production';
var child = exec(cmd, { cwd: dest });
child.on('error', function (err) {
reject(err);
});
child.on('exit', function (code, signal) {
if (code === 0) {
resolve();
} else {
reject(new Error('npm install failed with code ' + code));
}
});
logger.error(child.stderr);
logger.log(child.stdout);
});
};

View file

@ -1,7 +1,7 @@
var _ = require('lodash');
var zlib = require('zlib');
var Promise = require('bluebird');
var request = require('request');
var wreck = require('wreck');
var tar = require('tar');
var progressReporter = require('./progressReporter');
@ -48,12 +48,7 @@ module.exports = function (settings, logger) {
var gunzip = zlib.createGunzip();
var tarExtract = new tar.Extract({ path: dest, strip: 1 });
var requestOptions = { url: source };
if (timeout !== 0) {
requestOptions.timeout = timeout;
}
return wrappedRequest(requestOptions)
return wrappedRequest(source, timeout)
.then(function (req) {
var reporter = progressReporter(logger, req);
@ -71,9 +66,11 @@ module.exports = function (settings, logger) {
});
}
function wrappedRequest(requestOptions) {
return Promise.try(function () {
return request.get(requestOptions);
function wrappedRequest(url, timeout) {
if (timeout) timeout = false;
return Promise.fromNode(cb => {
return wreck.defaults({ timeout }).request('GET', url, null, cb);
})
.catch(function (err) {
if (err.message.match(/invalid uri/i)) {

View file

@ -1,6 +1,5 @@
var pluginDownloader = require('./pluginDownloader');
var pluginCleaner = require('./pluginCleaner');
var npmInstall = require('./npmInstall');
var fs = require('fs');
module.exports = {
@ -26,9 +25,6 @@ function install(settings, logger) {
.then(function () {
return downloader.download();
})
.then(function () {
return npmInstall(settings.workingPath, logger);
})
.then(function (curious) {
fs.renameSync(settings.workingPath, settings.pluginPath);
logger.log('Plugin installation complete');