kuber-cli
Version:
CLI for using Kubernetes
127 lines (109 loc) • 4.37 kB
JavaScript
var sh = require('exec-sh');
var path = require('path');
var fs = require('fs');
var os = require('os');
var chalk = require('chalk');
var which = require('which');
var docker = which.sync('docker');
var Spinner = require('cli-spinner').Spinner;
var spinner = new Spinner('Loading container... %s ');
spinner.setSpinnerString('⣾⣽⣻⢿⡿⣟⣯⣷');
function getKubernetesCliContainer(isHelpCommand) {
spinner.start();
return new Promise((resolve, reject) => {
sh(`docker pull blackbaudcfm/kubernetes-cli-container:latest`, true, (err, stderr, stdout) => {
if (err) reject(err.message);
spinner.stop(true);
console.info(
chalk.green('Executing command inside ') +
chalk.white('blackbaudcfm/kubernetes-cli-container:latest') +
(isHelpCommand ? '' : "\n")
);
resolve();
});
});
}
function enableWin7() {
if (os.platform() == 'win32' && os.release().indexOf('6.1') === 0) {
return new Promise((resolve, reject) => {
console.log('If docker commands fail, you may need to run: docker-machine env --shell powershell');
resolve();
});
}
return Promise.resolve();
}
function runCommand(command) {
var homedir = require('os').homedir();
var kuberPath = path.join(homedir, '.kuber');
if (!fs.existsSync(kuberPath)) {
fs.mkdirSync(kuberPath);
}
var azurePath = path.join(kuberPath, '.azure');
if (!fs.existsSync(azurePath)) {
fs.mkdirSync(azurePath);
}
if (os.platform() == 'win32') {
kuberPath = kuberPath
.replace(/\\/g, '/')
.replace(/^([A-Za-z]{1})\:/, '/$1/');
} else {
// on non-Windows platforms, enable access to docker from within container
kuberPath = `/var/run/docker.sock:/var/run/docker.sock -v ${kuberPath}`;
}
command = command.trim();
var isHelpCommand = command.indexOf('--help ') >= 0 ||command.indexOf(' --help') == command.length - 7;
var versionString = require('../package.json').version;
versionString = 'v' + versionString;
versionString = padRight(versionString, 8, ' ');
return enableWin7()
.then(() => getKubernetesCliContainer(isHelpCommand))
.then(() => new Promise((resolve, reject) => {
if (isHelpCommand) {
console.info(
chalk.green(`
██ ▄█▀ █ ██ ▄▄▄▄ ▓█████ ██▀███
██▄█▒ ██ ▓██▒▓█████▄ ▓█ ▀ ▓██ ▒ ██▒
▓███▄░ ▓██ ▒██░▒██▒ ▄██▒███ ▓██ ░▄█ ▒
▓██ █▄ ▓▓█ ░██░▒██░█▀ ▒▓█ ▄ ▒██▀▀█▄
▒██▒ █▄▒▒█████▓ ░▓█ ▀█▓░▒████▒░██▓ ▒██▒
▒ ▒▒ ▓▒░▒▓▒ ▒ ▒ ░▒▓███▀▒░░ ▒░ ░░ ▒▓ ░▒▓░
░ ░▒ ▒░░░▒░ ░ ░ ▒░▒ ░ ░ ░ ░ ░▒ ░ ▒░
░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░░ ░
░ ░ ░ ░ ░ ░ ░ ░
░ ░
` + chalk.bgGreen.black(' by blackbaud ') + ` ░ ` + versionString + ` ░
░`)
);
}
var portMappings = [];
if (command.indexOf('proxy') === 0) {
portMappings.push('-p 18001:18001');
}
if (command.toLowerCase() === 'bash') {
// use whatever shell is default inside container
command = '';
} else if (command.indexOf('az account set') === 0 || command.indexOf('az account list') === 0) {
// add a space, set output to table
// allows user to set their azure subscription
command = ' ' + command + ' -o table';
} else {
command = ` kubernetes-cli ${command}`;
}
sh(`docker run --rm -it -u 0 -e KUBER_IS_CLI=true ${portMappings.join(' ')} -v ${kuberPath}/.azure:/kubernetes-cli/.azure blackbaudcfm/kubernetes-cli-container:latest${command}`, {}, (err) => {
if (err) reject();
resolve();
})
}));
}
function padRight(s, c, n) {
if (! s || ! c || s.length >= n) return s;
var max = (n - s.length) / c.length;
for (var i = 0; i < max; i++) {
s += c;
}
return s;
}
module.exports = {
getKubernetesCliContainer: getKubernetesCliContainer,
runCommand: runCommand
};