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.
##### 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
Contributions are *very* welcome, either on the documentation or on

View File

@ -25,12 +25,20 @@
"dependencies": {
"bluebird": "^2.2.2",
"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",
"lodash.assign": "^2.4.1",
"lodash.foreach": "^2.4.1",
"lodash.isobject": "^2.4.1",
"lodash.keys": "^2.4.1",
"lodash.pairs": "^2.4.1",
"mkdirp": "^0.5.0",
"multiline": "^0.3.4",
"progress-stream": "^0.5.0",
"sent": "^1.1.0",
"xdg": "^0.1.1",
"xo-lib": "^0.2.0"
},

View File

@ -2,13 +2,24 @@
//====================================================================
require('superstack');
var Bluebird = require('bluebird');
Bluebird.longStackTraces();
var resolveUrl = require('url').resolve;
var chalk = require('chalk');
var eventToPromise = require('event-to-promise');
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 pairs = require('lodash.pairs');
var progressStream = require('progress-stream');
var sent = require('sent');
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) {
return function wrappedValue() {
return val;
@ -186,7 +226,9 @@ function call(args) {
if (!(matches = arg.match(PARAM_RE))) {
throw 'invalid arg: '+arg;
}
var name = matches[1];
var value = matches[2];
if (value === 'true') {
value = true;
}
@ -194,11 +236,47 @@ function call(args) {
value = false;
}
params[matches[1]] = value;
params[name] = value;
});
var baseUrl;
return connect().then(function (xo) {
baseUrl = xo._url;
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;

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 mkdirp = require('mkdirp');
var Promise = require('bluebird');
var mkdirp = promisify(require('mkdirp'));
var xdg = require('xdg');
//====================================================================
@ -17,10 +17,6 @@ var xdg = require('xdg');
var configPath = xdg.basedir.configPath('xo-cli');
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 () {
@ -43,7 +39,7 @@ var save = exports.save = function (config) {
exports.set = function (data) {
return load().then(function (config) {
return save(_.extend(config, data));
return save(assign(config, data));
});
};