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', `${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', 'scenarios_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'}); 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}'`); var processStream2 = fs.createWriteStream(logFile, {flags:'a'}); return docker.run('hashicorp/terraform:0.12.14', ['apply', '-no-color', '-var-file=scenario.tfvars', '-var', `provision_id=${job.data.id}`, '-auto-approve'], processStream2, { "Env": ["NODE_ENV=development"], "name": provContName, "WorkingDir": "/app", "HostConfig": { "Binds": [ `${scenarioPath}:/app` ], "NetworkMode": "host" } }) }).then(function(data){ var output = data[0]; var 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!`); var 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}); }); }