const Docker = require('dockerode'); const docker = new Docker({ 'socketPath': '/home/docker.sock' //'socketPath': '/var/run/docker.sock' }); const fs = require("fs"); const path = require("path"); const SSHPATH = process.env.SSHPATH; const DOCKERIMAGE = "mcr.microsoft.com/azure-cli"; const PROJECT_PATH = process.env.PROJECT_PATH; const pause = function(provision) { if ( provision.scenario !== 'azqmi-synapse' ) { console.log(`SynapseAzCLI# provision (${provision._id}) is not AZ SYNAPSE`); return {"message": `Won't do anything, provision (${provision._id}) is not AZ SYNAPSE`}; } if ( !provision.outputs ) { console.log(`SynapseAzCLI# provision (${provision._id}) AZ SYNAPSE has NO outputs`); return {"message": `Won't do anything, provision (${provision._id}) AZ SYNAPSE has NO outputs`}; } const name = `qmi-synpause-${provision._id}`; console.log(`SynapseAzCLI# Pause Synapse: ${name}`); var processStream = fs.createWriteStream(provision.logFile, {flags:'a'}); var exec = ['synpause', provision.outputs.Synapse_WS_ID, provision.outputs.Synapse_Database]; console.log('SynapseAzCLI# Pause Synapse: exec: '+exec.join(" ")); return docker.run(DOCKERIMAGE, exec, processStream, { //"Env": vars.envs, "name": name, //"WorkingDir": "/app", "HostConfig": { "Binds": [ `${provision.path}/synpause.sh:/bin/synpause`, `${SSHPATH}:/root/.ssh` ] } }).then(function(data) { var container = data[1]; console.log(`SynapseAzCLI# Pause Synapse: '${name}' (${container.id}) has finished with code: ${data[0].StatusCode}`); return container.remove().then(function(){ console.log(`SynapseAzCLI# Pause Synapse: Container '${name}' removed!`); return data[0].StatusCode; }); }).then(async function(statusCode) { return {"output": fs.readFileSync(provision.logFile), "statusCode": statusCode}; }); } const resume = function(provision) { if ( provision.scenario !== 'azqmi-synapse' ) { console.log(`SynapseAzCLI# provision (${provision._id}) is not AZ SYNAPSE`); return {"message": `Won't do anything, provision (${provision._id}) is not AZ SYNAPSE`}; } if ( !provision.outputs ) { console.log(`SynapseAzCLI# provision (${provision._id}) AZ SYNAPSE has NO outputs`); return {"message": `Won't do anything, provision (${provision._id}) AZ SYNAPSE has NO outputs`}; } const name = `qmi-synresume-${provision._id}`; console.log(`SynapseAzCLI# Resume Synapse: ${name}`); var processStream = fs.createWriteStream(provision.logFile, {flags:'a'}); var exec = ['synresume', provision.outputs.Synapse_WS_ID, provision.outputs.Synapse_Database]; console.log('SynapseAzCLI# Resume Synapse: exec: '+exec.join(" ")); return docker.run(DOCKERIMAGE, exec, processStream, { //"Env": vars.envs, "name": name, //"WorkingDir": "/app", "HostConfig": { "Binds": [ `${provision.path}/synresume.sh:/bin/synresume`, `${SSHPATH}:/root/.ssh` ] } }).then(function(data) { var container = data[1]; console.log(`SynapseAzCLI# Resume Synapse: '${name}' (${container.id}) has finished with code: ${data[0].StatusCode}`); return container.remove().then(function(){ console.log(`SynapseAzCLI# Resume Synapse: Container '${name}' removed!`); return data[0].StatusCode; }); }).then(async function(statusCode) { return {"output": fs.readFileSync(provision.logFile), "statusCode": statusCode}; }); } const copySnapshots = function(data) { let snapName = data.snapName; let regions = data.regions; const name = `qmi-copysnaps`; console.log(`CopySnapsAzCLI# container: ${name}`); var processStream = fs.createWriteStream("/logs/general/qmi-snapshots.log", {flags:'a'}); var exec = ['copy-snapshots-to-sa', snapName, regions]; console.log('CopySnapsAzCLI# exec: '+exec.join(" ")); let scriptPath = path.join(PROJECT_PATH,'..'); return docker.run(DOCKERIMAGE, exec, processStream, { //"Env": vars.envs, "name": name, //"WorkingDir": "/app", "HostConfig": { "Binds": [ `${scriptPath}/copy-snapshots-to-sa.sh:/bin/copy-snapshots-to-sa`, `${SSHPATH}:/root/.ssh` ] } }).then(function(data) { var container = data[1]; console.log(`CopySnapsAzCLI# '${name}' (${container.id}) has finished with code: ${data[0].StatusCode}`); return container.remove().then(function(){ console.log(`CopySnapsAzCLI# Container '${name}' removed!`); return data[0].StatusCode; }); }).then(async function(statusCode) { return {"output": fs.readFileSync("/logs/general/qmi-snapshots.log"), "statusCode": statusCode}; }); } const checkCopySnapshots = function(data) { let snapName = data.snapName; const name = `qmi-checkcopysnaps`; console.log(`CheckCopySnapsAzCLI# container: ${name}`); var processStream = fs.createWriteStream("/logs/general/qmi-snapshots.log", {flags:'a'}); var exec = ['checkcopystatus', snapName]; console.log('CheckCopySnapsAzCLI# exec: '+exec.join(" ")); let scriptPath = path.join(PROJECT_PATH,'..'); return docker.run(DOCKERIMAGE, exec, processStream, { //"Env": vars.envs, "name": name, //"WorkingDir": "/app", "HostConfig": { "Binds": [ `${scriptPath}/checkcopystatus.sh:/bin/checkcopystatus`, `${SSHPATH}:/root/.ssh` ] } }).then(function(data) { var container = data[1]; console.log(`CheckCopySnapsAzCLI# '${name}' (${container.id}) has finished with code: ${data[0].StatusCode}`); return container.remove().then(function(){ console.log(`CheckCopySnapsAzCLI# Container '${name}' removed!`); return data[0].StatusCode; }); }).then(async function(statusCode) { return {"output": fs.readFileSync("/logs/general/qmi-snapshots.log"), "statusCode": statusCode}; }); } module.exports.pause = pause; module.exports.resume = resume; module.exports.copySnapshots = copySnapshots; module.exports.checkCopySnapshots = checkCopySnapshots;