mirror of
https://github.com/docker/docs.git
synced 2026-04-05 10:48:55 +07:00
Moving Machine, VBox & Docker management utils to utils dir
This commit is contained in:
169
src/utils/DockerMachineUtil.js
Normal file
169
src/utils/DockerMachineUtil.js
Normal file
@@ -0,0 +1,169 @@
|
||||
var _ = require('underscore');
|
||||
var path = require('path');
|
||||
var Promise = require('bluebird');
|
||||
var _ = require('underscore');
|
||||
var fs = require('fs');
|
||||
var util = require('./Util');
|
||||
|
||||
var NAME = 'dev';
|
||||
|
||||
var DockerMachine = {
|
||||
command: function () {
|
||||
return path.join(process.cwd(), 'resources', 'docker-machine-' + this.version());
|
||||
},
|
||||
name: function () {
|
||||
return NAME;
|
||||
},
|
||||
version: function () {
|
||||
try {
|
||||
return util.packagejson()['docker-machine-version'];
|
||||
} catch (err) {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
isoversion: function () {
|
||||
try {
|
||||
var data = fs.readFileSync(path.join(util.home(), '.docker', 'machine', 'machines', NAME, 'boot2docker.iso'), 'utf8');
|
||||
var match = data.match(/Boot2Docker-v(\d+\.\d+\.\d+)/);
|
||||
if (match) {
|
||||
return match[1];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} catch (err) {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
info: function () {
|
||||
return util.exec([DockerMachine.command(), 'ls']).then(stdout => {
|
||||
var lines = stdout.trim().split('\n').filter(line => line.indexOf('time=') === -1);
|
||||
var machines = {};
|
||||
lines.slice(1, lines.length).forEach(line => {
|
||||
var tokens = line.trim().split(/[\s]+/).filter(token => token !== '*');
|
||||
var machine = {
|
||||
name: tokens[0],
|
||||
driver: tokens[1],
|
||||
state: tokens[2],
|
||||
url: tokens[3] || ''
|
||||
};
|
||||
machines[machine.name] = machine;
|
||||
});
|
||||
if (machines[NAME]) {
|
||||
return machines[NAME];
|
||||
} else {
|
||||
throw new Error('Machine does not exist.');
|
||||
}
|
||||
});
|
||||
},
|
||||
exists: function () {
|
||||
return DockerMachine.info().then(() => {
|
||||
return true;
|
||||
}).catch(() => {
|
||||
return false;
|
||||
});
|
||||
},
|
||||
|
||||
create: function () {
|
||||
var dockerversion = util.packagejson()['docker-version'];
|
||||
return util.exec([DockerMachine.command(), '-D', 'create', '-d', 'virtualbox', '--virtualbox-boot2docker-url', path.join(process.cwd(), 'resources', 'boot2docker-' + dockerversion + '.iso'), '--virtualbox-memory', '2048', NAME]);
|
||||
},
|
||||
start: function () {
|
||||
return util.exec([DockerMachine.command(), '-D', 'start', NAME]);
|
||||
},
|
||||
stop: function () {
|
||||
return util.exec([DockerMachine.command(), 'stop', NAME]);
|
||||
},
|
||||
upgrade: function () {
|
||||
return util.exec([DockerMachine.command(), 'upgrade', NAME]);
|
||||
},
|
||||
rm: function () {
|
||||
return util.exec([DockerMachine.command(), 'rm', '-f', NAME]);
|
||||
},
|
||||
ip: function () {
|
||||
return util.exec([DockerMachine.command(), '-D', 'ip', NAME]).then(stdout => {
|
||||
return Promise.resolve(stdout.trim().replace('\n', ''));
|
||||
});
|
||||
},
|
||||
regenerateCerts: function () {
|
||||
return util.exec([DockerMachine.command(), 'tls-regenerate-certs', '-f', NAME]);
|
||||
},
|
||||
state: function () {
|
||||
return DockerMachine.info().then(info => {
|
||||
return info ? info.state : null;
|
||||
});
|
||||
},
|
||||
disk: function () {
|
||||
return util.exec([DockerMachine.command(), 'ssh', NAME, 'df']).then(stdout => {
|
||||
try {
|
||||
var lines = stdout.split('\n');
|
||||
var dataline = _.find(lines, function (line) {
|
||||
return line.indexOf('/dev/sda1') !== -1;
|
||||
});
|
||||
var tokens = dataline.split(' ');
|
||||
tokens = tokens.filter(function (token) {
|
||||
return token !== '';
|
||||
});
|
||||
var usedGb = parseInt(tokens[2], 10) / 1000000;
|
||||
var totalGb = parseInt(tokens[3], 10) / 1000000;
|
||||
var percent = parseInt(tokens[4].replace('%', ''), 10);
|
||||
return {
|
||||
used_gb: usedGb.toFixed(2),
|
||||
total_gb: totalGb.toFixed(2),
|
||||
percent: percent
|
||||
};
|
||||
} catch (err) {
|
||||
return Promise.reject(err);
|
||||
}
|
||||
});
|
||||
},
|
||||
memory: function () {
|
||||
return util.exec([this.command(), 'ssh', NAME, 'free -m']).then(stdout => {
|
||||
try {
|
||||
var lines = stdout.split('\n');
|
||||
var dataline = _.find(lines, function (line) {
|
||||
return line.indexOf('-/+ buffers') !== -1;
|
||||
});
|
||||
var tokens = dataline.split(' ');
|
||||
tokens = tokens.filter(function(token) {
|
||||
return token !== '';
|
||||
});
|
||||
var usedGb = parseInt(tokens[2], 10) / 1000;
|
||||
var freeGb = parseInt(tokens[3], 10) / 1000;
|
||||
var totalGb = usedGb + freeGb;
|
||||
var percent = Math.round(usedGb / totalGb * 100);
|
||||
return {
|
||||
used_gb: usedGb.toFixed(2),
|
||||
total_gb: totalGb.toFixed(2),
|
||||
free_gb: freeGb.toFixed(2),
|
||||
percent: percent
|
||||
};
|
||||
} catch (err) {
|
||||
return Promise.reject(err);
|
||||
}
|
||||
});
|
||||
},
|
||||
stats: function () {
|
||||
DockerMachine.state().then(state => {
|
||||
if (state === 'Stopped') {
|
||||
return Promise.resolve({state: state});
|
||||
}
|
||||
var memory = DockerMachine.memory();
|
||||
var disk = DockerMachine.disk();
|
||||
return Promise.all([memory, disk]).spread((memory, disk) => {
|
||||
return Promise.resolve({
|
||||
memory: memory,
|
||||
disk: disk
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
dockerTerminal: function () {
|
||||
var terminal = path.join(process.cwd(), 'resources', 'terminal');
|
||||
this.info().then(machine => {
|
||||
var cmd = [terminal, `DOCKER_HOST=${machine.url} DOCKER_CERT_PATH=${path.join(process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'], '.docker/machine/machines/' + machine.name)} DOCKER_TLS_VERIFY=1 $SHELL`];
|
||||
util.exec(cmd).then(() => {});
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = DockerMachine;
|
||||
Reference in New Issue
Block a user