This commit is contained in:
Manuel Romero
2020-03-23 09:54:19 +01:00
parent 952d9c7bd1
commit 5c783ae798
3 changed files with 121 additions and 6 deletions

View File

@@ -24,8 +24,9 @@ async function asyncForEach(array, callback) {
}
}
function deallocate(resourceGroupName, cb){
function deallocate(resourceGroupName, cb) {
try {
console.log("Deallocating VMs for resource group: "+resourceGroupName);
auth(async function(computeClient){
let finalResult = await computeClient.virtualMachines.list(resourceGroupName);
let out = [];
@@ -33,9 +34,11 @@ function deallocate(resourceGroupName, cb){
let res = await computeClient.virtualMachines.deallocate(resourceGroupName, vm.name);
out.push(res);
});
console.log("All VMs DEALLOCATED for resource group: "+resourceGroupName);
cb(null, out);
})
} catch (err) {
console.log("Error deallocating VMs for resource group: "+resourceGroupName);
cb(err, null);
}
@@ -43,6 +46,7 @@ function deallocate(resourceGroupName, cb){
function start(resourceGroupName, cb){
try {
console.log("Starting VMs for resource group: "+resourceGroupName);
auth(async function(computeClient){
let finalResult = await computeClient.virtualMachines.list(resourceGroupName);
let out = [];
@@ -50,9 +54,11 @@ function start(resourceGroupName, cb){
let res = await computeClient.virtualMachines.start(resourceGroupName, vm.name);
out.push(res);
});
console.log("All VMs RUNNING for resource group: "+resourceGroupName);
cb(null,out);
});
} catch (err) {
console.log("Error starting VMs for resource group: "+resourceGroupName);
cb(err, null);
}

View File

@@ -3,7 +3,10 @@ mongoose.set('useFindAndModify', false);
//mongoose.set('debug', true)
const provisionSchema = new mongoose.Schema({
userId: String,
userId: {
type: String,
index: true
},
created: {
type: Date,
default: Date.now
@@ -31,6 +34,10 @@ const provisionSchema = new mongoose.Schema({
type: Boolean,
default: false
},
statusVms: {
type: String,
default: "Running"
}
});

View File

@@ -1,8 +1,9 @@
const express = require('express')
const router = express.Router()
const db = require('../mongo.js');
const db = require('../mongo');
const passport = require('../passport');
const fs = require('fs-extra');
const azurecli = require('../azurecli');
import { queues, TF_APPLY_QUEUE, TF_APPLY_QSEOK_QUEUE, TF_DESTROY_QUEUE } from '../queues';
@@ -196,11 +197,11 @@ router.delete('/:userId/provisions/:id', passport.ensureAuthenticatedAndIsMe, as
try {
const mongoJob = await db.provision.getSingle(req.params.id);
if (!mongoJob){
return res.status(404).json({"msg": "Not found"});
return res.status(404).json({"msg": "Not found privision with id "+req.params.id});
}
const toDestroy = await db.destroy.get({"provId": req.params.id});
const delDest = await db.destroy.del(toDestroy[0]._id.toString());
const delProv = await db.provision.del(req.params.id);
const delProv = await db.provision.update(req.params.id, {"isDeleted": true});
//Move folder
fs.moveSync(`/provisions/${mongoJob.scenario}_${req.params.id}`, `/provisions/deleted/${mongoJob.scenario}_${req.params.id}`, { overwrite: true })
@@ -211,6 +212,107 @@ router.delete('/:userId/provisions/:id', passport.ensureAuthenticatedAndIsMe, as
}
});
/**
* @swagger
* /users/{userId}/provisions/{id}/deallocatevms:
* delete:
* description: Stop all VMs for this provision
* summary: Stop all VMs for this provision
* produces:
* - application/json
* parameters:
* - name: userId
* in: path
* type: string
* required: true
* - name: id
* in: path
* type: string
* required: true
* responses:
* 200:
* description: Provision
* 404:
* description: Not found
*
*/
router.post('/:userId/provisions/:id/deallocatevms', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
try {
let mongoJob = await db.provision.getSingle(req.params.id);
if (!mongoJob){
return res.status(404).json({"msg": "Not found privision with id "+req.params.id});
}
let rgName = mongoJob.scenario.toUpperCase();
rgName = rgName.replace(/AZQMI/g, 'QMI');
rgName = rgName + "-" + mongoJob._id.toString();
db.provision.update(req.params.id, {"statusVms": "Stopping"});
azurecli.deallocate(rgName, function(err, res){
if (err) {
db.provision.update(req.params.id, {"statusVms": "Error_Stopping"});
} else {
db.provision.update(req.params.id, {"statusVms": "Stopped"});
}
});
return res.json({"statusVms": "Stopping"});
} catch (error) {
next(error);
}
});
/**
* @swagger
* /users/{userId}/provisions/{id}/startvms:
* delete:
* description: Start all VMs for this provision
* summary: Start all VMs for this provision
* produces:
* - application/json
* parameters:
* - name: userId
* in: path
* type: string
* required: true
* - name: id
* in: path
* type: string
* required: true
* responses:
* 200:
* description: Provision
* 404:
* description: Not found
*
*/
router.post('/:userId/provisions/:id/startvms', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
try {
let mongoJob = await db.provision.getSingle(req.params.id);
if (!mongoJob){
return res.status(404).json({"msg": "Not found privision with id "+req.params.id});
}
let rgName = mongoJob.scenario.toUpperCase();
rgName = rgName.replace(/AZQMI/g, 'QMI');
rgName = rgName + "-" + mongoJob._id.toString();
db.provision.update(req.params.id, {"statusVms": "Starting"});
azurecli.start(rgName, function(err, res){
if (err) {
db.provision.update(req.params.id, {"statusVms": "Error_Starting"});
} else {
db.provision.update(req.params.id, {"statusVms": "Running"});
}
});
return res.json({"statusVms": "Starting"});
} catch (error) {
next(error);
}
});
/**
* @swagger
* /users/{userId}/destroyprovisions:
@@ -284,7 +386,7 @@ router.post('/:userId/destroyprovisions', passport.ensureAuthenticatedAndIsMe, a
router.get('/:userId/provisions', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
try {
const result = await db.provision.get({"userId": req.params.userId});
const result = await db.provision.get({"userId": req.params.userId, "isDeleted": false});
return res.json(result);
} catch (error) {
next(error);