tooltwist
Version:
Tooltwist Command Line Interface
283 lines (245 loc) • 10.6 kB
JavaScript
/**
* Plugin to create a Docker container
*/
var fs = null,
Log = null,
Gradle = null,
mkdirp = require('mkdirp'),
exec = require('child_process').exec,
Config = null,
Templates = null;
/**
* Set up the plugin
*/
exports.init = function(appDir) {
// console.log('plugins.docker.init()')
// Run requires, based on main app directory (i.e. not relative to the plugin)
Log = require(appDir + '/log');
Config = require(appDir + '/config');
Templates = require(appDir + '/templates');
Gradle = require(appDir + '../../lib/gradle');
fs = require('fs');
//ZZZZZ Check Docker is installed
}
/**
* Create a default config file for the Designer.
*/
exports.commandLineInit = function() {
// console.log('plugins.docker.commandLineInit()')
// Get Docker IP address from the DOCKER_HOST environment variable.
var HOST = '192.168.59.103'; // default for boot2docker
var dockerHost = process.env['DOCKER_HOST'];
if (dockerHost) {
if (dockerHost.indexOf('tcp://') != 0) {
Log.error('Environment variable DOCKER_HOST should be tcp://<host>:<port>');
Log.error('Will use default host (' + HOST + ')');
} else {
dockerHost = dockerHost.substring(6);
var pos = dockerHost.indexOf(':');
if (pos <= 0) {
Log.error('Environment variable DOCKER_HOST should be tcp://<host>:<port>');
Log.error('Will use default host (' + HOST + ')');
} else {
HOST = dockerHost.substring(0, pos);
Log.log('Using Docker IP address from DOCKER_HOST environment variable (' + HOST + ')');
}
}
}
// Use the template to create the initial config file
var from = __dirname + '/templates/' + "docker-tooltwist.js"
Log.debug('from=' + from)
var data = {
MODE: 'docker',
HOST: HOST
};
var creatingExampleTemplate = false;
Templates.copy(from, Config.CONFIG_FILE, creatingExampleTemplate, data);
// Display a nice message.
Log.always();
Log.always('\tSpecification file \'' + Config.CONFIG_FILE + '\' has been created with a default');
Log.always('\tconfiguration to install the demo webdesign project \'ttdemo\' into');
Log.always('\ta Docker container. Modify this file to suit your needs, then run:');
Log.always();
Log.always('\t $ tooltwist docker')
Log.always();
Log.always('\tFor debugging purposes you can also run:')
Log.always();
Log.always('\t $ tooltwist designer')
Log.always();
// Create example templates
var code = exec('tooltwist example-templates', function(error, stdout, stderr) {
Log.always(stdout);
Log.always(stderr);
if (error) {
Log.error('error while creating templates: ', error)
}
process.exit(1);
});
// All done
process.exit(0)
}
exports.beforePhase1 = function() {
// console.log('plugins.docker.beforePhase1()')
var config = Config.getConfig();
// DESIGNER MODE
Config.REPO = config['designer'].repo;
//ZZZ check is set
Config.BRANCH = config['designer'].branch;
// ZZZ check works if undefined
Config.USE_PHASE2 = true;
}
/**
* This function is called as soon as PHASE1 detects that Tomcat is running.
*/
exports.tomcatRunning = function() {
// console.log('\nplugins.docker.tomcatRunning()')
// Display a nice message for Designer users.
//Log.log();
// Log.log(' (Server can be stopped with Control-C)');
// Log.log();
Log.log();
Log.log();
Log.log('\t\t THE SERVER IS NOW RUNNING.')
Log.log();
Log.log('\t\t http://localhost:' + Config.HTTP_PORT + '/ttsvr/login');
Log.log();
Log.log();
// Log.log();
//Log.log(' Default log file is ' + Config.HIDDEN_DIR + '/tooltwist.log')
}
/**
* This function is called after generating the default build files from
* templates, but before starting Phase 2. Note that phase 2 occurs WITHIN
* phase 1, so afterPhase1() has not been called yet.
*/
exports.beforePhase2 = function() {
// console.log("plugins.docker.beforePhase2");
// Set a few extra variables
var config = Config.getConfig();
config.CONTAINER_HTTP_PORT = 6080;
config.DOCKER_HOST = '192.168.59.103'; // Default for boot2docker (I think)
if ( !config['deploy']) {
Log.error()
Log.error('Error: ' + Config.CONFIG_FILE + ' does not have config.deploy section.');
Log.error()
process.exit(1)
}
if (config['deploy'].servers.length < 1) {
Log.error()
Log.error('Error: ' + Config.CONFIG_FILE + ' does not have config.deploy.servers array.');
Log.error()
process.exit(1)
}
// if ( !config['deploy'].servers[0].host) {
// Log.error()
// Log.error('Error: ' + Config.CONFIG_FILE + ' does not define config.deploy.servers[0].host');
// Log.error()
// process.exit(1)
// }
if ( !config['deploy'].servers[0].id) {
Log.error()
Log.error('Error: ' + Config.CONFIG_FILE + ' does not define config.deploy.servers[0].id');
Log.error()
process.exit(1)
}
// if ( !config['deploy'].servers[0].sshPort) {
// Log.error()
// Log.error('Error: ' + Config.CONFIG_FILE + ' does not define config.deploy.servers[0].sshPort');
// Log.error()
// process.exit(1)
// }
// if ( !config['deploy'].servers[0].serverHome) {
// Log.error()
// Log.error('Error: ' + Config.CONFIG_FILE + ' does not define config.deploy.servers[0].serverHome');
// Log.error()
// process.exit(1)
// }
// if ( !config['deploy'].servers[0].fipPort) {
// Log.error()
// Log.error('Error: ' + Config.CONFIG_FILE + ' does not define config.deploy.servers[0].fipPort');
// Log.error()
// process.exit(1)
// }
// if ( !config['deploy'].servers[0].httpPort) {
// Log.error()
// Log.error('Error: ' + Config.CONFIG_FILE + ' does not define config.deploy.servers[0].httpPort');
// Log.error()
// process.exit(1)
// }
config.DOCKER_HOST = config['deploy'].servers[0].host;
config.CONTAINER_NAME = config['deploy'].servers[0].id;
config.CONTAINER_HTTP_PORT = config['deploy'].servers[0].httpPort;
//config.SERVER_HOME = config['deploy'].servers[0].serverHome;
Log.info('DOCKER_HOST=' + config.DOCKER_HOST);
Log.info('CONTAINER_NAME=' + config.CONTAINER_NAME);
// Log.info('SERVER_HOME=' + config.SERVER_HOME);
// Log.info('CONTAINER_HTTP_PORT=' + config.CONTAINER_HTTP_PORT);
/*
* Generate files for PHASE2 (Grunt), Docker, and installing.
*/
var templateDir = __dirname + '/templates';
// PHASE2 (generate, build docker, install, etc)
mkdirp.sync(Config.HIDDEN_DIR + '/PHASE2');
Templates.copyTemplate(templateDir, 'docker-PHASE2-DOIT', 'PHASE2/DOIT', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/PHASE2/DOIT', '744');
Templates.copyTemplate(templateDir, 'docker-PHASE2-package.json', 'PHASE2/package.json', Config.getConfig())
Templates.copyTemplate(templateDir, 'docker-PHASE2-Gruntfile.js', 'PHASE2/Gruntfile.js', Config.getConfig())
// Create production config files
var outputsDir = Config.HIDDEN_DIR + '/outputs';
var creatingExamples = false;
Templates.copyTemplateDirectory(templateDir, 'production', 'docker-production-', creatingExamples, outputsDir, Config.getConfig());
// Docker stuff
mkdirp.sync(Config.HIDDEN_DIR + '/do_docker');
Templates.copyTemplate(templateDir, 'docker-docker-Dockerfile', 'do_docker/Dockerfile', Config.getConfig())
Templates.copyTemplate(templateDir, 'docker-docker-build.sh', 'do_docker/build.sh', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/do_docker/build.sh', '744');
Templates.copyTemplate(templateDir, 'docker-docker-run.sh', 'do_docker/run.sh', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/do_docker/run.sh', '744');
Templates.copyTemplate(templateDir, 'docker-docker-stop.sh', 'do_docker/stop.sh', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/do_docker/stop.sh', '744');
Templates.copyTemplate(templateDir, 'docker-docker-commit.sh', 'do_docker/commit.sh', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/do_docker/commit.sh', '744');
Templates.copyTemplate(templateDir, 'docker-docker-publish.sh', 'do_docker/publish.sh', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/do_docker/publish.sh', '744');
Templates.copyTemplate(templateDir, 'docker-docker-login.sh', 'do_docker/login.sh', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/do_docker/login.sh', '744');
Templates.copyTemplate(templateDir, 'docker-docker-opendemo.sh', 'do_docker/opendemo.sh', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/do_docker/opendemo.sh', '744');
Templates.copyTemplate(templateDir, 'docker-docker-openroot.sh', 'do_docker/openroot.sh', Config.getConfig())
fs.chmodSync(Config.HIDDEN_DIR+'/do_docker/openroot.sh', '744');
// // Install stuff
// mkdirp.sync(Config.HIDDEN_DIR + '/do_install');
// Templates.copyTemplate(templateDir, 'docker-install-DOIT', 'do_install/DOIT', Config.getConfig())
// fs.chmodSync(Config.HIDDEN_DIR+'/do_install/DOIT', '744');
// Templates.copyTemplate(templateDir, 'docker-install-pair.sh', 'do_install/pair.sh', Config.getConfig())
// fs.chmodSync(Config.HIDDEN_DIR+'/do_install/pair.sh', '744');
// Templates.copyTemplate(templateDir, 'docker-install-build.gradle', 'do_install/build.gradle', Config.getConfig())
// Templates.copyTemplate(templateDir, 'docker-install-rules', 'do_install/rules', Config.getConfig())
// // Save the configuration as JSON into the install directory, for use by InstallerUtil.
// var configJson = JSON.stringify(Config.getConfig(), null, 2);
// fs.writeFileSync(Config.HIDDEN_DIR + '/do_install/tooltwistJsAsJson.json', configJson)
// // Create gradle wrapper files
// Gradle.checkGradleWrapper(Config.HIDDEN_DIR + '/do_install');
// Ensure that required directories exist
mkdirp.sync(Config.HIDDEN_DIR + '/do_generate/work');
mkdirp.sync(Config.HIDDEN_DIR + '/do_generate/logs');
mkdirp.sync(Config.HIDDEN_DIR + '/image');
mkdirp.sync(Config.HIDDEN_DIR + '/image/webdesign-projects/config');
fs.writeFileSync(Config.HIDDEN_DIR + '/image/webdesign-projects/config/_empty', '')
}
exports.afterPhase2 = function() {
// console.log("plugins.docker.afterPhase2");
// Create Dockerfile
//ZZZZ
}
exports.afterPhase1 = function(code) {
// console.log('\nplugins.docker.afterPhase1()')
}
exports.createExampleTemplates = function() {
// console.log('\nplugins.docker.createExampleTemplates()')
var templateDir = __dirname + '/templates';
Templates.copyExampleTemplate(templateDir, 'PHASE2/'+Config.mode+'-Gruntfile.js');
Templates.copyExampleTemplate(templateDir, 'PHASE2/'+Config.mode+'-package.json');
// Templates.copyTemplate(templateDir, 'docker-PHASE2-package.json', 'PHASE2/package.json', Config.getConfig())
// Templates.copyTemplate(templateDir, 'docker-PHASE2-Gruntfile.js', 'PHASE2/Gruntfile.js', Config.getConfig())
}