From e9386f5204d75753d218b312030276e00af55c41 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Wed, 14 Jun 2023 04:49:43 +0000 Subject: [PATCH] implement proc type in /instance/resources --- config/localdb.json.template | 38 ++++++++++++++++++++++++------------ src/main.js | 14 ++++++++++--- src/utils.js | 12 ++++++++++-- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/config/localdb.json.template b/config/localdb.json.template index 9f8362c..e0fa594 100644 --- a/config/localdb.json.template +++ b/config/localdb.json.template @@ -1,37 +1,45 @@ { "application": { - "pveAPI": "https://pve.mydomain/api2/json", + "pveAPI": "https://pve.mydoamin/api2/json", "pveAPIToken": { "user": "proxmoxaas-api", "realm": "pve", "id": "token", - "uuid": "secret-key" + "uuid": "token-secret-value" }, "listenPort": 80, "hostname": "client.mydomain", "domain": "mydomain" }, "resources": { + "cpu": { + "type": "list", + "blacklist": false, + "display": false + }, "cores": { "type": "numeric", "multiplier": 1, "base": 1024, "compact": false, - "unit": "Cores" + "unit": "Cores", + "display": true }, "memory": { "type": "numeric", "multiplier": 1048576, "base": 1024, "compact": true, - "unit": "B" + "unit": "B", + "display": true }, "swap": { "type": "numeric", "multiplier": 1048576, "base": 1024, "compact": true, - "unit": "B" + "unit": "B", + "display": true }, "local": { "type": "storage", @@ -44,7 +52,8 @@ "mp", "sata", "unused" - ] + ], + "display": true }, "cephpl": { "type": "storage", @@ -57,20 +66,23 @@ "mp", "sata", "unused" - ] + ], + "display": true }, "network": { "type": "network", "multiplier": 1000000, "base": 1000, "compact": true, - "unit": "B/s" + "unit": "B/s", + "display": true } }, "users": { - "exampleuser@realm": { + "exampleuser@authrealm": { "resources": { "max": { + "cpu": ["kvm64", "host"], "cores": 0, "memory": 0, "swap": 0, @@ -80,16 +92,16 @@ } }, "nodes": [ - "node-0-id", - "node-1-id" + "node1", + "node2" ], "instances": { "vmid": { "min": 100, "max": 199 }, - "pool": "examplepool", - "vlan": "100", + "pool": "exampleuserpool", + "vlan": "10", "templates": { "lxc": { "net0": { diff --git a/src/main.js b/src/main.js index f3842a5..17b94cf 100644 --- a/src/main.js +++ b/src/main.js @@ -572,7 +572,7 @@ app.delete("/api/instance/network/delete", async (req, res) => { return; } // setup action - let action = JSON.stringify({ delete: `net${req.body.netid}`}); + let action = JSON.stringify({ delete: `net${req.body.netid}` }); let method = req.body.type === "qemu" ? "POST" : "PUT"; // commit action let result = await requestPVE(`${vmpath}/config`, method, req.cookies, action, pveAPIToken); @@ -624,8 +624,9 @@ app.get("/api/instance/pci", async (req, res) => { * - node: String - vm host node id * - type: String - vm type (lxc, qemu) * - vmid: Number - vm id number - * - cores: Number - new number of cores for instance - * - memory: Number - new amount of memory for instance + * - proctype: String - vm processor type + * - cores: Number, optional - number of processor cores for instance + * - memory: Number - amount of memory for instance * - swap: Number, optional - new amount of swap for instance * responses: * - 200: PVE Task Object @@ -647,6 +648,9 @@ app.post("/api/instance/resources", async (req, res) => { if (req.body.type === "lxc") { request.swap = Number(req.body.swap) - Number(currentConfig.data.data.swap); } + else if (req.body.type === "qemu") { + request.cpu = req.body.proctype; + } // check resource approval if (!await approveResources(req, req.cookies.username, request)) { res.status(500).send({ request: request, error: `Could not fulfil request.` }); @@ -658,6 +662,10 @@ app.post("/api/instance/resources", async (req, res) => { if (req.body.type === "lxc") { action.swap = Number(req.body.swap); } + else if (req.body.type === "qemu") { + action.cpu = req.body.proctype; + } + console.log(action) action = JSON.stringify(action); let method = req.body.type === "qemu" ? "POST" : "PUT"; // commit action diff --git a/src/utils.js b/src/utils.js index 05b9c1a..c6320fb 100644 --- a/src/utils.js +++ b/src/utils.js @@ -35,16 +35,24 @@ export async function getUserResources(req, username) { Object.keys(max).forEach((k) => { avail[k] = max[k] - used[k]; }); - return { used: used, max: max, avail: avail, units: dbResources }; + return { used: used, max: max, avail: avail, resources: dbResources }; } export async function approveResources(req, username, request) { - let avail = (await getUserResources(req, username)).avail; + let user = await getUserResources(req, username) + let avail = user.avail; + let resources = user.resources; + let max = user.max; let approved = true; Object.keys(request).forEach((key) => { if (!(key in avail)) { // if requested resource is not in avail, block approved = false; } + else if (resources[key].type === "list") { + if (max[key].includes(request[key]) != resources[key].whitelist) { + approved = false; + } + } else if (isNaN(avail[key]) || isNaN(request[key])) { // if either the requested or avail resource is NaN, block approved = false; }