From b954da0d0e2dcd545fea9eb3f6b4f2c6e0ce7e37 Mon Sep 17 00:00:00 2001 From: Manuel Romero Date: Fri, 7 Feb 2025 12:15:59 +0100 Subject: [PATCH] create snaps nodejs --- qmi-cloud-common/azurecli.js | 48 ++++++++++++++++++++++++++++++++- qmi-cloud-common/cli.js | 13 ++++++++- server/routes/api-provisions.js | 38 ++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/qmi-cloud-common/azurecli.js b/qmi-cloud-common/azurecli.js index ca00ea3..34c8a95 100644 --- a/qmi-cloud-common/azurecli.js +++ b/qmi-cloud-common/azurecli.js @@ -222,6 +222,51 @@ async function deleteDNSRecord(provision, type = "CNAME"){ return await dnsClient.recordSets.deleteMethod(DNS_RESOURCE_GROUP, DNS_ZONE_NAME, rgName, type ); } +async function createSnapshots(provision) { + + const computeClient = await _getClient(provision.scenario); + const resourceGroupName = _getRgName(provision); + const disks = await computeClient.disks.listByResourceGroup(resourceGroupName); + const now = Date.now(); + try { + var out = []; + await asyncForEach(disks, async function(disk) { + + console.log(`AzureCLI# Start creating snapshot for disk: ${disk.name}: ${disk.id}`); + + // Define snapshot parameters + let snapshotParams = { + location: disk.location, // Example: "eastus" + creationData: { + createOption: "Copy", // Creates a snapshot from an existing disk + sourceResourceId: `/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${resourceGroupName}/providers/Microsoft.Compute/disks/${disk.name}` + } + }; + + let snapshotName = `Snap_${disk.name}_${provision._id}_${now}` + console.log(`AzureCLI# creating.... ${snapshotName}`); + let snapshot = await computeClient.snapshots.beginCreateOrUpdateAndWait( + resourceGroupName, + snapshotName, + snapshotParams + ); + + db.snapshot.add({"resourceID": snapshot.id, "provision": provision._id}); + out.put(snapshot); + + console.log(`AzureCLI# snapshot: ${snapshotName} is DONE!`); + + }); + + return out; + + } catch (error) { + console.error("Error creating snapshot:", error); + return null; + } +} + + module.exports.start = start; module.exports.deallocate = deallocate; module.exports.getResourceGroupVms = getResourceGroupVms; @@ -230,4 +275,5 @@ module.exports.getAllVmsNext = getAllVmsNext; module.exports.updateVmsTags = updateVmsTags; module.exports.getDNSRecords = getDNSRecords; module.exports.createDNSRecord = createDNSRecord; -module.exports.deleteDNSRecord = deleteDNSRecord +module.exports.deleteDNSRecord = deleteDNSRecord; +module.exports.createSnapshots = createSnapshots; diff --git a/qmi-cloud-common/cli.js b/qmi-cloud-common/cli.js index cb8d7dc..33ae1a4 100644 --- a/qmi-cloud-common/cli.js +++ b/qmi-cloud-common/cli.js @@ -65,8 +65,19 @@ async function startDb(provId, userId) { } } +async function createSnapshots(provId) { + try { + let provision = await db.provision.getById(provId); + if ( !provision ) return; + return azurecli.createSnapshots(provision); + } catch (err) { + console.log("CLI# ERROR createSnapshots", err); + } +} + module.exports.deallocate = deallocate; module.exports.start = start; module.exports.updateVmsTags = updateVmsTags; module.exports.stopDb = stopDb; -module.exports.startDb = startDb; \ No newline at end of file +module.exports.startDb = startDb; +module.exports.createSnapshots = createSnapshots; \ No newline at end of file diff --git a/server/routes/api-provisions.js b/server/routes/api-provisions.js index 9c28fe6..c210ac7 100644 --- a/server/routes/api-provisions.js +++ b/server/routes/api-provisions.js @@ -3,6 +3,7 @@ const router = express.Router() const db = require('qmi-cloud-common/mongo'); const passport = require('../passport-okta'); const fs = require('fs-extra'); +const cli = require('qmi-cloud-common/cli'); const MYQUEUES = require('qmi-cloud-common/queues'); @@ -503,6 +504,43 @@ router.post('/:id/createSnaps', passport.ensureAuthenticatedAndAdmin, async (req } }); +/** + * @swagger + * /provisions/{id}/createSnaps2: + * post: + * description: Create Snap from all disks of this provision + * summary: Create Snap from all disks of this provision + * tags: + * - admin + * produces: + * - application/json + * parameters: + * - name: id + * in: path + * type: string + * required: true + * - name: target_rg + * in: query + * required: false + * type: string + * responses: + * 200: + * description: OK + * 404: + * description: Not found + * + */ +router.post('/:id/createSnaps2', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => { + try { + + const snaps = await cli.createSnapshots(req.params.id); + return res.json(snaps); + + } catch (error) { + next(error); + } +}); + /** * @swagger * /provisions/{id}/updatetagsvms: