vm.export.

This commit is contained in:
Julien Fontanet 2014-09-23 17:31:29 +02:00
parent a7dea95f90
commit 578f842eed
4 changed files with 107 additions and 13 deletions

View File

@ -58,6 +58,18 @@ E.g., adding a new server:
The return value is the identifier of this new server in XO. The return value is the identifier of this new server in XO.
##### VM export
```
> xo-cli vm.export vm=a01667e0-8e29-49fc-a550-17be4226783c > vm.xva
```
##### VM import
```
> xo-cli vm.import host=60a6939e-8b0a-4352-9954-5bde44bcdf7d < vm.xva
```
## Contributing ## Contributing
Contributions are *very* welcome, either on the documentation or on Contributions are *very* welcome, either on the documentation or on

View File

@ -25,12 +25,20 @@
"dependencies": { "dependencies": {
"bluebird": "^2.2.2", "bluebird": "^2.2.2",
"chalk": "^0.5.1", "chalk": "^0.5.1",
"exec-promise": "^0.3.0", "event-to-promise": "^0.3.1",
"exec-promise": "^0.5.0",
"got": "^1.2.0",
"human-format": "^0.1.3",
"l33teral": "^2.0.4", "l33teral": "^2.0.4",
"lodash.assign": "^2.4.1",
"lodash.foreach": "^2.4.1", "lodash.foreach": "^2.4.1",
"lodash.isobject": "^2.4.1",
"lodash.keys": "^2.4.1",
"lodash.pairs": "^2.4.1", "lodash.pairs": "^2.4.1",
"mkdirp": "^0.5.0", "mkdirp": "^0.5.0",
"multiline": "^0.3.4", "multiline": "^0.3.4",
"progress-stream": "^0.5.0",
"sent": "^1.1.0",
"xdg": "^0.1.1", "xdg": "^0.1.1",
"xo-lib": "^0.2.0" "xo-lib": "^0.2.0"
}, },

View File

@ -2,13 +2,24 @@
//==================================================================== //====================================================================
require('superstack');
var Bluebird = require('bluebird'); var Bluebird = require('bluebird');
Bluebird.longStackTraces(); Bluebird.longStackTraces();
var resolveUrl = require('url').resolve;
var chalk = require('chalk'); var chalk = require('chalk');
var eventToPromise = require('event-to-promise');
var forEach = require('lodash.foreach'); var forEach = require('lodash.foreach');
var getKeys = require('lodash.keys');
var got = require('got');
var humanFormat = require('human-format');
var isObject = require('lodash.isobject');
var multiline = require('multiline'); var multiline = require('multiline');
var pairs = require('lodash.pairs'); var pairs = require('lodash.pairs');
var progressStream = require('progress-stream');
var sent = require('sent');
var Xo = require('xo-lib'); var Xo = require('xo-lib');
//-------------------------------------------------------------------- //--------------------------------------------------------------------
@ -37,6 +48,35 @@ function connect() {
}); });
} }
function pipeWithErrors(streams) {
var current;
forEach(streams, function (stream) {
if (!stream) {
return;
}
if (current) {
current.on('error', function forwardError(error) {
stream.emit('error', error);
});
current = current.pipe(stream);
}
else {
current = stream;
}
});
return current;
}
function printProgress(progress) {
console.warn('%s downloaded at %s/s',
humanFormat(progress.transferred),
humanFormat(progress.speed)
);
}
function wrap(val) { function wrap(val) {
return function wrappedValue() { return function wrappedValue() {
return val; return val;
@ -186,7 +226,9 @@ function call(args) {
if (!(matches = arg.match(PARAM_RE))) { if (!(matches = arg.match(PARAM_RE))) {
throw 'invalid arg: '+arg; throw 'invalid arg: '+arg;
} }
var name = matches[1];
var value = matches[2]; var value = matches[2];
if (value === 'true') { if (value === 'true') {
value = true; value = true;
} }
@ -194,11 +236,47 @@ function call(args) {
value = false; value = false;
} }
params[matches[1]] = value; params[name] = value;
}); });
var baseUrl;
return connect().then(function (xo) { return connect().then(function (xo) {
baseUrl = xo._url;
return xo.call(method, params); return xo.call(method, params);
}).then(function handleResult(result) {
var keys, key, url;
if ((
isObject(result) &&
(keys = getKeys(result)).length === 1
)) {
key = keys[0];
if (key === '$getFrom') {
url = resolveUrl(baseUrl, result[key]);
return eventToPromise(pipeWithErrors([
got(url),
progressStream({ time: 1e3 }, printProgress),
process.stdout,
]), 'finish');
}
if (key === '$sendTo') {
url = resolveUrl(baseUrl, result[key]);
return new Bluebird(function (resolve, reject) {
sent(url, process.stdin, function (error, result) {
if (error) {
reject(error);
return;
}
resolve(result);
});
});
}
}
return result;
}); });
}; }
exports.call = call; exports.call = call;

View File

@ -2,14 +2,14 @@
//==================================================================== //====================================================================
var fs = require('fs'); var promisify = require('bluebird').promisify;
//-------------------------------------------------------------------- var readFile = promisify(require('fs').readFile);
var writeFile = promisify(require('fs').writeFile);
var _ = require('lodash'); var assign = require('lodash.assign');
var l33t = require('l33teral'); var l33t = require('l33teral');
var mkdirp = require('mkdirp'); var mkdirp = promisify(require('mkdirp'));
var Promise = require('bluebird');
var xdg = require('xdg'); var xdg = require('xdg');
//==================================================================== //====================================================================
@ -17,10 +17,6 @@ var xdg = require('xdg');
var configPath = xdg.basedir.configPath('xo-cli'); var configPath = xdg.basedir.configPath('xo-cli');
var configFile = configPath +'/config.json'; var configFile = configPath +'/config.json';
var mkdirp = Promise.promisify(mkdirp);
var readFile = Promise.promisify(fs.readFile);
var writeFile = Promise.promisify(fs.writeFile);
//==================================================================== //====================================================================
var load = exports.load = function () { var load = exports.load = function () {
@ -43,7 +39,7 @@ var save = exports.save = function (config) {
exports.set = function (data) { exports.set = function (data) {
return load().then(function (config) { return load().then(function (config) {
return save(_.extend(config, data)); return save(assign(config, data));
}); });
}; };