This repository has been archived on 2025-12-25. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
qmi-cloud/server/processor-apply.js
Manuel Romero 69461ddcd5 grab templates
2019-12-10 12:10:13 +01:00

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});
});
}