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/qmi-cloud-common/azurecli.js
2020-07-30 09:07:05 +02:00

139 lines
4.9 KiB
JavaScript

const MsRest = require('ms-rest-azure');
const computeManagementClient = require('azure-arm-compute');
const db = require("./mongo");
const sendEmail = require("./send-email");
const SUBSCRIPTION_ID = "62ebff8f-c40b-41be-9239-252d6c0c8ad9";
function _getRgName(provision) {
let rgName = provision.scenario.toUpperCase();
rgName = rgName.replace(/AZQMI/g, 'QMI');
rgName = rgName + "-" + provision._id.toString();
return rgName;
}
async function _getClient(scenarioName) {
var id = SUBSCRIPTION_ID;
if (scenarioName){
var scenario = await db.scenario.getOne({"name": scenarioName});
id = scenario.subscription? scenario.subscription.subsId : SUBSCRIPTION_ID;
}
var credentials = await MsRest.loginWithMSI({ port: 50342 });
//console.log("Azure CLI authenticated", credentials);
return new computeManagementClient(credentials, id);
}
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
async function deallocate(provId, isSendEmailAfter ) {
let provision = await db.provision.getById(provId);
if ( !provision ) return;
let rgName = _getRgName(provision);
console.log("Deallocating VMs for resource group: "+rgName);
var computeClient = await _getClient(provision.scenario);
let finalResult = await computeClient.virtualMachines.list(rgName);
if ( finalResult && finalResult.length > 0 ) {
db.provision.update(provision._id, {"statusVms": "Stopping"});
}
await asyncForEach(finalResult, async function(vm) {
await computeClient.virtualMachines.deallocate(rgName, vm.name);
});
let timeRunning = db.utils.getNewTimeRunning(provision);
await db.provision.update(provision._id.toString(), {"statusVms": "Stopped", "timeRunning": timeRunning, "stoppedFrom": new Date(), "pendingNextAction": undefined});
if ( isSendEmailAfter && provision._scenarioDoc ) {
await sendEmail.sendVMsStopped(provision, provision._scenarioDoc);
}
console.log("All VMs DEALLOCATED for resource group: "+rgName);
}
async function start(provId){
let provision = await db.provision.getById(provId);
if ( !provision ) return;
let rgName = _getRgName(provision);
console.log("Starting VMs for resource group: "+rgName);
var computeClient = await _getClient(provision.scenario);
let finalResult = await computeClient.virtualMachines.list(rgName);
if ( finalResult && finalResult.length > 0 ) {
db.provision.update(provision._id, {"statusVms": "Starting"});
}
await asyncForEach(finalResult, async function(vm) {
await computeClient.virtualMachines.start(rgName, vm.name);
});
let countExtend = db.utils.getNewCountExtend(provision);
await db.provision.update(provision._id.toString(), {"statusVms": "Running", "runningFrom": new Date(), "countExtend": countExtend, "pendingNextAction": undefined});
console.log("All VMs RUNNING for resource group: "+rgName);
}
async function getResourceGroupVms(rgName){
var computeClient = await _getClient();
return await computeClient.virtualMachines.list(rgName);
}
async function getAllVms(){
var computeClient = await _getClient();
return await computeClient.virtualMachines.listAll(rgName);
}
async function updateVmsTags(provId, tagsEdit) {
if ( !tagsEdit ){ return {} ; }
let provision = await db.provision.getById(provId);
if ( !provision ){ return };
let rgName = _getRgName(provision);
console.log("Updating TAGS in VMs for resource group: "+rgName);
var computeClient = await _getClient(provision.scenario);
let finalResult = await computeClient.virtualMachines.list(rgName);
if (finalResult && finalResult.length > 0) {
var toDelete = [];
var toAdd = [];
for(let tag in tagsEdit ) {
if ( !tagsEdit[tag] ) {
toDelete.push(tag);
} else {
toAdd.push({"key": tag, "value": tagsEdit[tag]});
}
}
var result = {};
if ( toDelete.length > 0 || toAdd.length > 0 ) {
await asyncForEach(finalResult, async function(vm) {
var tags = vm.tags;
toDelete.forEach(t=>{
delete tags[t];
});
toAdd.forEach(t=>{
tags[t.key] = t.value;
});
tags["ProvId"] = provision._id.toString();
result[vm.name] = tags;
console.log(`VM ${vm.name} new tags: `, tags );
computeClient.virtualMachines.update(rgName, vm.name, {"tags": tags} );
});
}
return result;
} else {
return {}
}
};
module.exports.start = start;
module.exports.deallocate = deallocate;
module.exports.getResourceGroupVms = getResourceGroupVms;
module.exports.getAllVms = getAllVms;
module.exports.updateVmsTags = updateVmsTags;