add pci device resource to config,

implement endpoints for getting available devices,
update used resource calculation to include pci devices
This commit is contained in:
2023-06-21 05:06:38 +00:00
parent 6c434263e3
commit 53c101ac4a
5 changed files with 98 additions and 17 deletions

View File

@@ -71,12 +71,18 @@ export async function getUsedResources(req, resourceMeta) {
let used = {};
let diskprefixes = [];
for (let resourceName of Object.keys(resourceMeta)) {
used[resourceName] = 0;
if (resourceMeta[resourceName].type === "storage") {
used[resourceName] = 0;
for (let diskPrefix of resourceMeta[resourceName].disks) {
diskprefixes.push(diskPrefix);
}
}
else if (resourceMeta[resourceName].type === "list") {
used[resourceName] = [];
}
else {
used[resourceName] = 0;
}
}
for (let instance of response.data.data) {
if (instance.type === "lxc" || instance.type === "qemu") {
@@ -92,9 +98,13 @@ export async function getUsedResources(req, resourceMeta) {
used[diskInfo.storage] += Number(diskInfo.size);
}
}
else if (key.startsWith("net")) {
if (config[key].includes("rate=")) { // only count instances with a rate limit
used.network += Number(config[key].split("rate=")[1].split(",")[0]);
else if (key.startsWith("net") && config[key].includes("rate=")) { // only count net instances with a rate limit
used.network += Number(config[key].split("rate=")[1].split(",")[0]);
}
else if (key.startsWith("hostpci")) {
let deviceInfo = await getDeviceInfo(instance.node, instance.type, instance.vmid, config[key].split(",")[0]);
if (deviceInfo) { // only count if device exists
used.pci.push(deviceInfo);
}
}
}
@@ -115,4 +125,21 @@ export async function getDiskInfo(node, type, vmid, disk) {
catch {
return null;
}
}
export async function getDeviceInfo(node, type, vmid, qid) {
try {
let result = (await requestPVE(`/nodes/${node}/hardware/pci`, "GET", null, null, pveAPIToken)).data.data;
let deviceData = [];
result.forEach((element) => {
if (element.id.startsWith(qid)) {
deviceData.push(element);
}
});
deviceData.sort((a, b) => { return a.id < b.id })
return deviceData[0].device_name;
}
catch {
return null;
}
}