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,
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) {
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');
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);