ui: refactor sortByPreviousUsage and nextFreeDisk

we'll use them outside of the controllerSelector soon

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2021-09-22 11:27:40 +02:00 committed by Thomas Lamprecht
parent 3d0b402b03
commit 2aa645dad7
2 changed files with 54 additions and 37 deletions

View File

@ -1757,6 +1757,52 @@ Ext.define('PVE.Utils', {
return true;
},
sortByPreviousUsage: function(vmconfig, controllerList) {
if (!controllerList) {
controllerList = ['ide', 'virtio', 'scsi', 'sata'];
}
let usedControllers = {};
for (const type of Object.keys(PVE.Utils.diskControllerMaxIDs)) {
usedControllers[type] = 0;
}
for (const property of Object.keys(vmconfig)) {
if (property.match(PVE.Utils.bus_match) && !vmconfig[property].match(/media=cdrom/)) {
const foundController = property.match(PVE.Utils.bus_match)[1];
usedControllers[foundController]++;
}
}
let sortPriority = PVE.qemu.OSDefaults.getDefaults(vmconfig.ostype).busPriority;
let sortedList = Ext.clone(controllerList);
sortedList.sort(function(a, b) {
if (usedControllers[b] === usedControllers[a]) {
return sortPriority[b] - sortPriority[a];
}
return usedControllers[b] - usedControllers[a];
});
return sortedList;
},
nextFreeDisk: function(controllers, config) {
for (const controller of controllers) {
for (let i = 0; i < PVE.Utils.diskControllerMaxIDs[controller]; i++) {
let confid = controller + i.toString();
if (!Ext.isDefined(config[confid])) {
return {
controller,
id: i,
confid,
};
}
}
}
return undefined;
},
},
singleton: true,

View File

@ -6,44 +6,15 @@ Ext.define('PVE.form.ControllerSelector', {
vmconfig: {}, // used to check for existing devices
sortByPreviousUsage: function(vmconfig, controllerList) {
let usedControllers = {};
for (const type of Object.keys(PVE.Utils.diskControllerMaxIDs)) {
usedControllers[type] = 0;
}
for (const property of Object.keys(vmconfig)) {
if (property.match(PVE.Utils.bus_match) && !vmconfig[property].match(/media=cdrom/)) {
const foundController = property.match(PVE.Utils.bus_match)[1];
usedControllers[foundController]++;
}
}
let sortPriority = PVE.qemu.OSDefaults.getDefaults(vmconfig.ostype).busPriority;
let sortedList = Ext.clone(controllerList);
sortedList.sort(function(a, b) {
if (usedControllers[b] === usedControllers[a]) {
return sortPriority[b] - sortPriority[a];
}
return usedControllers[b] - usedControllers[a];
});
return sortedList;
},
setToFree: function(controllers, busField, deviceIDField) {
let me = this;
for (const controller of controllers) {
busField.setValue(controller);
for (let i = 0; i < PVE.Utils.diskControllerMaxIDs[controller]; i++) {
let confid = controller + i.toString();
if (!Ext.isDefined(me.vmconfig[confid])) {
deviceIDField.setValue(i);
return;
}
}
let freeId = PVE.Utils.nextFreeDisk(controllers, me.vmconfig);
if (freeId !== undefined) {
busField.setValue(freeId.controller);
deviceIDField.setValue(freeId.id);
}
},
setVMConfig: function(vmconfig, autoSelect) {
@ -54,7 +25,7 @@ Ext.define('PVE.form.ControllerSelector', {
let bussel = me.down('field[name=controller]');
let deviceid = me.down('field[name=deviceid]');
let clist = ['ide', 'virtio', 'scsi', 'sata'];
let clist;
if (autoSelect === 'cdrom') {
if (!Ext.isDefined(me.vmconfig.ide2)) {
bussel.setValue('ide');
@ -64,7 +35,7 @@ Ext.define('PVE.form.ControllerSelector', {
clist = ['ide', 'scsi', 'sata'];
} else {
// in most cases we want to add a disk to the same controller we previously used
clist = me.sortByPreviousUsage(me.vmconfig, clist);
clist = PVE.Utils.sortByPreviousUsage(me.vmconfig);
}
me.setToFree(clist, bussel, deviceid);