From 8912ae5f3c062c6e4d4a8748069d5ba563f9cc33 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Fri, 8 Sep 2023 20:48:33 +0000 Subject: [PATCH] update resource data format, add names to pci and cpu list resources --- config/template.localdb.json | 72 ++++++++++++++++++++++++------------ src/routes/cluster.js | 4 +- src/utils.js | 40 +++++++++++--------- 3 files changed, 74 insertions(+), 42 deletions(-) diff --git a/config/template.localdb.json b/config/template.localdb.json index ebe052f..28bd429 100644 --- a/config/template.localdb.json +++ b/config/template.localdb.json @@ -23,7 +23,7 @@ "display": false }, "cores": { - "title": "vCPU", + "name": "vCPU", "type": "numeric", "multiplier": 1, "base": 1024, @@ -32,7 +32,7 @@ "display": true }, "memory": { - "title": "RAM", + "name": "RAM", "type": "numeric", "multiplier": 1048576, "base": 1024, @@ -41,7 +41,7 @@ "display": true }, "swap": { - "title": "SWAP", + "name": "SWAP", "type": "numeric", "multiplier": 1048576, "base": 1024, @@ -50,7 +50,7 @@ "display": true }, "local": { - "title": "local", + "name": "local", "type": "storage", "multiplier": 1, "base": 1024, @@ -65,7 +65,7 @@ "display": true }, "cephpl": { - "title": "cephpl", + "name": "cephpl", "type": "storage", "multiplier": 1, "base": 1024, @@ -80,8 +80,8 @@ "display": true }, "network": { - "title": "Network", - "type": "network", + "name": "Network", + "type": "numeric", "multiplier": 1000000, "base": 1000, "compact": true, @@ -122,22 +122,48 @@ "users": { "exampleuser@examplepool": { "resources": { - "max": { - "cpu": [ - "kvm64", - "host" - ], - "cores": 128, - "memory": 131072, - "swap": 131072, - "local": 1099511627776, - "cephpl": 1099511627776, - "network": 100000, - "pci": [ - "Device Name Matcher 1", - "Device Name Matcher 2" - ] - } + "cpu": [ + { + "match": "kvm64", + "name": "kvm64", + "max": 1 + }, + { + "match": "host", + "name": "host", + "max": 1 + } + ], + "cores": { + "max": 128 + }, + "memory": { + "max": 131072 + }, + "swap": { + "max": 131072 + }, + "local": { + "max": 1099511627776 + }, + "cephpl": { + "max": 1099511627776 + }, + "network": { + "max": 100000 + }, + "pci": [ + { + "match": "Device Name Matcher 1", + "name": "Device Display Name", + "max": 1 + }, + { + "match": "Device Name Matcher 2", + "name": "Device Display Name", + "max": 1 + } + ] }, "nodes": [ "examplenode1", diff --git a/src/routes/cluster.js b/src/routes/cluster.js index aac6a77..ffd6b1b 100644 --- a/src/routes/cluster.js +++ b/src/routes/cluster.js @@ -44,11 +44,11 @@ router.get(`/:node(${nodeRegexP})/pci`, async (req, res) => { return; } // get remaining user resources - const userAvailPci = (await getUserResources(req, req.cookies.username)).avail.pci; + const userAvailPci = (await getUserResources(req, req.cookies.username)).pci; // get node avail devices let nodeAvailPci = await getNodeAvailDevices(params.node, req.cookies); nodeAvailPci = nodeAvailPci.filter(nodeAvail => userAvailPci.some((userAvail) => { - return nodeAvail.device_name && nodeAvail.device_name.includes(userAvail); + return nodeAvail.device_name && nodeAvail.device_name.includes(userAvail.match) && userAvail.avail > 0; })); res.status(200).send(nodeAvailPci); res.end(); diff --git a/src/utils.js b/src/utils.js index b59b74e..e360f7e 100644 --- a/src/utils.js +++ b/src/utils.js @@ -49,21 +49,25 @@ export async function getUserResources (req, username) { const db = global.db; const dbResources = db.getGlobalConfig().resources; const used = await getUsedResources(req, dbResources); - const max = db.getUserConfig(username).resources.max; - const avail = {}; - Object.keys(max).forEach((k) => { + const userResources = db.getUserConfig(username).resources; + Object.keys(userResources).forEach((k) => { if (dbResources[k] && dbResources[k].type === "list") { - avail[k] = structuredClone(max[k]); + userResources[k].forEach((listResource) => { + listResource.used = 0; + listResource.avail = listResource.max; + }); used[k].forEach((usedDeviceName) => { - const index = avail[k].findIndex((maxElement) => usedDeviceName.includes(maxElement)); - avail[k].splice(index, 1); + const index = userResources[k].findIndex((availEelement) => usedDeviceName.includes(availEelement.match)); + userResources[k][index].used++; + userResources[k][index].avail--; }); } else { - avail[k] = max[k] - used[k]; + userResources[k].used = used[k]; + userResources[k].avail = userResources[k].max - used[k]; } }); - return { used, max, avail, resources: dbResources }; + return userResources; } /** @@ -74,24 +78,26 @@ export async function getUserResources (req, username) { * @returns {boolean} true if the available resources can fullfill the requested resources, false otherwise. */ export async function approveResources (req, username, request) { - const user = await getUserResources(req, username); - const avail = user.avail; - const resources = user.resources; + const db = global.db; + const dbResources = db.getGlobalConfig().resources; + const userResources = await getUserResources(req, username); let approved = true; Object.keys(request).forEach((key) => { - if (!(key in avail)) { // if requested resource is not in avail, block + if (!(key in userResources)) { // if requested resource is not in avail, block approved = false; } - else if (resources[key].type === "list") { - const inAvail = avail[key].some(availElem => request[key].includes(availElem)); - if (inAvail !== resources[key].whitelist) { + else if (dbResources[key].type === "list") { // if the resource type is list, check if the requested resource exists in the list + const index = userResources[key].findIndex((availElement) => request[key].includes(availElement.match)); + // if no matching resource when index == -1, then remaining is -1 otherwise use the remaining value + const avail = index === -1 ? false : userResources[key][index].avail > 0; + if (avail !== dbResources[key].whitelist) { approved = false; } } - else if (isNaN(avail[key]) || isNaN(request[key])) { // if either the requested or avail resource is NaN, block + else if (isNaN(userResources[key].avail) || isNaN(request[key])) { // if either the requested or avail resource is NaN, block approved = false; } - else if (avail[key] - request[key] < 0) { // if the avail resources is less than the requested resources, block + else if (userResources[key].avail - request[key] < 0) { // if the avail resources is less than the requested resources, block approved = false; } });