99 lines
3.8 KiB
JavaScript
99 lines
3.8 KiB
JavaScript
const Docker = require('dockerode');
|
|
const db = require('./mongo.js');
|
|
const docker = new Docker({
|
|
'socketPath': '/home/docker.sock'
|
|
});
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const PROJECT_PATH = process.env.PROJECT_PATH;
|
|
|
|
module.exports = function(job){
|
|
|
|
const logFile = path.resolve(__dirname, 'proc-logs', 'provision', `${job.data.id}.log`);
|
|
|
|
const scenarioPath = path.join(PROJECT_PATH, '..', 'qmi-cloud-provisions', `${job.data.scenario}_${job.data.id}`);
|
|
const templatePath = path.join(PROJECT_PATH, 'server', 'az-tf-templates', job.data.scenario);
|
|
|
|
db.provision.update({
|
|
"id":job.data.id,
|
|
"body":{
|
|
"status": "initializing",
|
|
"jobId": job.id,
|
|
"logFile": `/proc-logs/${job.data.id}.log`,
|
|
"path": scenarioPath
|
|
}
|
|
});
|
|
|
|
// TERRAFORM INIT
|
|
const initContName = `qmi-tf-init-${job.data.id}`;
|
|
const provContName = `qmi-tf-apply-${job.data.id}`;
|
|
console.log(`Processor Apply: will spin up container: '${initContName}'`);
|
|
var processStream = fs.createWriteStream(logFile, {flags:'a'});
|
|
var processStream2;
|
|
|
|
return docker.run('hashicorp/terraform:0.12.14', ['init', '-no-color', '-from-module=/template'], processStream, {
|
|
"Env": ["NODE_ENV=development"],
|
|
"name": initContName,
|
|
"WorkingDir": "/app",
|
|
"HostConfig": {
|
|
"Binds": [
|
|
`${scenarioPath}:/app`,
|
|
`${templatePath}:/template`
|
|
]
|
|
}
|
|
}).then(function(data) {
|
|
var output = data[0];
|
|
var container = data[1];
|
|
console.log(`Processor Apply: '${initContName}' (${container.id}) has finished with code: ${output.StatusCode}`);
|
|
return container.remove();
|
|
}).then(function(data) {
|
|
console.log(`Processor Apply: '${initContName}' removed!`);
|
|
var update = db.provision.update({"id":job.data.id, "body":{"status": "provisioning"}});
|
|
return update;
|
|
}).then(function(mongoUpdated) {
|
|
|
|
// TERRAFORM APPLY
|
|
console.log(`Processor Apply: will spin up container: '${provContName}'`);
|
|
processStream2 = fs.createWriteStream(logFile, {flags:'a', emitClose: true});
|
|
return docker.run('hashicorp/terraform:0.12.14', ['apply', '-no-color', '-var-file=scenario.tfvars', '-var', `provision_id=${job.data.id}`, '-var', `user_id=${job.data.user.displayName}`, '-auto-approve'], processStream2, {
|
|
"Env": ["NODE_ENV=development"],
|
|
"name": provContName,
|
|
"WorkingDir": "/app",
|
|
"HostConfig": {
|
|
"Binds": [
|
|
`${scenarioPath}:/app`,
|
|
"/root/.ssh:/root/.ssh"
|
|
],
|
|
"NetworkMode": "host"
|
|
}
|
|
});
|
|
|
|
|
|
}).then(function(data){
|
|
let output = data[0];
|
|
let container = data[1];
|
|
console.log(`Processor Apply: '${provContName}' (${container.id}) has finished with code: ${output.StatusCode}`);
|
|
return container.remove();
|
|
}).then(function(data) {
|
|
console.log(`Processor Apply: '${provContName}' removed!`);
|
|
const output = fs.readFileSync(logFile);
|
|
let update;
|
|
if ( output.indexOf("Error") !== -1 ) {
|
|
update = db.provision.update({"id":job.data.id, "body":{"status": "error"}});
|
|
} else {
|
|
update = db.provision.update({"id":job.data.id, "body":{"status": "provisioned"}});
|
|
}
|
|
|
|
return update;
|
|
}).then(function(mongoUpdated){
|
|
return Promise.resolve({"success": true, job: mongoUpdated});
|
|
}).catch(function(err) {
|
|
console.log("Processor Apply: err", err);
|
|
db.provision.update({"id":job.data.id, "body":{"status": "error"}});
|
|
return Promise.reject({"success": false, "err": err});
|
|
});
|
|
|
|
}
|
|
|
|
|