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/server/routes/api-snapshots.js
Manuel Romero e09075134d Copy and sattus
2025-02-12 12:34:37 +01:00

249 lines
5.8 KiB
JavaScript

const express = require('express');
const router = express.Router();
const db = require('@QMI/qmi-cloud-common/mongo');
const passport = require('../passport-okta');
const MYQUEUES = require('@QMI/qmi-cloud-common/queues');
const queues = MYQUEUES.queues;
const SYNAPSE_QUEUE = MYQUEUES.SYNAPSE_QUEUE;
/**
* @swagger
* /snapshots:
* get:
* description: Get all snaphots
* summary: Get all snaphots
* tags:
* - admin
* parameters:
* - name: filter
* in: query
* required: false
* type: object
* content:
* application/json:
* schema:
* type: object
* produces:
* - application/json
* responses:
* 200:
* description: User
*/
router.get('/', passport.ensureAuthenticated, async (req, res, next) => {
try {
const filter = req.query.filter? JSON.parse(req.query.filter) : {};
const result = await db.snapshot.get(filter, null, null, null, '["provision", "owner"]');
return res.json(result);
} catch (error) {
next(error);
}
});
/**
* @swagger
* /snapshots/{id}:
* get:
* description: Get snapshot details
* summary: Get snapshot details
* tags:
* - admin
* parameters:
* - name: id
* in: path
* type: string
* required: true
* produces:
* - application/json
* responses:
* 200:
* description: User
*/
router.get('/:id', passport.ensureAuthenticated, async (req, res, next) => {
try {
const result = await db.snapshot.getById(req.params.id);
if (!result){
return res.status(404).json({"msg": "Not found"});
}
return res.json(result);
} catch (error) {
next(error);
}
});
/**
* @swagger
* /snapshots/{id}:
* put:
* description: Update a Snapshot
* summary: Update a Snapshot
* tags:
* - admin
* produces:
* - application/json
* parameters:
* - name: id
* in: path
* type: string
* required: true
* - in: body
* name: body
* description: Snapshot object
* required: true
* responses:
* 200:
* description: WEBHOOK
*/
router.put('/:id', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
try {
var patch = req.body;
patch.owner = req.user._id;
const result = await db.snapshot.update(req.params.id, patch);
return res.json(result);
} catch (error) {
next(error);
}
});
/**
* @swagger
* /snapshots/{id}/copy:
* post:
* description: Copy snapshots into regions
* summary: Copy snapshots into regions
* tags:
* - admin
* produces:
* - application/json
* parameters:
* - name: id
* in: path
* type: string
* required: true
* - name: regions
* in: query
* required: false
* type: string
* responses:
* 200:
* description: OK
* 404:
* description: Not found
*
*/
router.post('/:id/copy', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
try {
const snap = await db.snapshot.getById(req.params.id);
if (!snap){
return res.status(404).json({"msg": "Not found"});
}
if (snap.status === "copy.init" ) {
return res.json({"msg": "Snapshots already being copyed", "success": true});
}
let regions = req.query.regions? req.query.regions : '"europe asia eastus"';
queues[SYNAPSE_QUEUE].add("synapse_job", {
snapId: snap._id,
provision: snap.provision,
snapName: snap.name,
regions: regions,
tasktype: "copy-snapshots"
});
await db.snapshot.update(req.params.id, {"status": "copy.init"});
return res.json({"msg": "Snapshots are being copyed into "+regions, "success": true});
} catch (error) {
next(error);
}
});
/**
* @swagger
* /snapshots/{id}/copystatus:
* get:
* description: Get Status of copy snapshots into regions
* summary: Get Status of copy snapshots into regions
* tags:
* - admin
* produces:
* - application/json
* parameters:
* - name: id
* in: path
* type: string
* required: true
* responses:
* 200:
* description: OK
* 404:
* description: Not found
*
*/
router.get('/:id/copystatus', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
try {
const snap = await db.snapshot.getById(req.params.id);
if (!snap){
return res.status(404).json({"msg": "Not found"});
}
queues[SYNAPSE_QUEUE].add("synapse_job", {
snapId: snap._id,
provision: snap.provision,
snapName: snap.name,
tasktype: "check-copy-snapshots"
});
return res.json({"msg": "Snapshots are being checked", "success": true});
} catch (error) {
next(error);
}
});
/**
* @swagger
* /snapshots/{id}/logs:
* get:
* description: Get logs for snapshots
* summary: Get logs for snapshots
* tags:
* - admin
* produces:
* - application/json
* parameters:
* - name: id
* in: path
* type: string
* required: true
* responses:
* 200:
* description: OK
* 404:
* description: Not found
*
*/
router.get('/:id/logs', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
try {
const snap = await db.snapshot.getById(req.params.id);
if (!snap){
return res.status(404).json({"msg": "Not found"});
}
return res.sendFile(`/logs/snapshot/${snap._id}.log`);
} catch (error) {
next(error);
}
});
module.exports = router;