]>
Commit | Line | Data |
---|---|---|
711c07d1 DM |
1 | Ext.define('PVE.form.ControllerSelector', { |
2 | extend: 'Ext.form.FieldContainer', | |
42902182 | 3 | alias: 'widget.pveControllerSelector', |
711c07d1 DM |
4 | |
5 | noVirtIO: false, | |
6 | ||
711c07d1 DM |
7 | vmconfig: {}, // used to check for existing devices |
8 | ||
31345b9c | 9 | sortByPreviousUsage: function(vmconfig, controllerList) { |
8c4ec8c7 | 10 | let usedControllers = {}; |
96ed94ad | 11 | for (const type of Object.keys(PVE.Utils.diskControllerMaxIDs)) { |
8c4ec8c7 | 12 | usedControllers[type] = 0; |
31345b9c EK |
13 | } |
14 | ||
96ed94ad | 15 | for (const property of Object.keys(vmconfig)) { |
c7139315 TL |
16 | if (property.match(PVE.Utils.bus_match) && !vmconfig[property].match(/media=cdrom/)) { |
17 | const foundController = property.match(PVE.Utils.bus_match)[1]; | |
18 | usedControllers[foundController]++; | |
f6735a88 | 19 | } |
31345b9c EK |
20 | } |
21 | ||
ca0e7e80 | 22 | var sortPriority = PVE.qemu.OSDefaults.getDefaults(vmconfig.ostype).busPriority; |
31345b9c | 23 | |
f6735a88 | 24 | var sortedList = Ext.clone(controllerList); |
c7139315 | 25 | sortedList.sort(function(a, b) { |
f6735a88 DM |
26 | if (usedControllers[b] == usedControllers[a]) { |
27 | return sortPriority[b] - sortPriority[a]; | |
28 | } | |
29 | return usedControllers[b] - usedControllers[a]; | |
30 | }); | |
c7139315 | 31 | |
f6735a88 | 32 | return sortedList; |
31345b9c EK |
33 | }, |
34 | ||
711c07d1 DM |
35 | setVMConfig: function(vmconfig, autoSelect) { |
36 | var me = this; | |
37 | ||
38 | me.vmconfig = Ext.apply({}, vmconfig); | |
7206af4b EK |
39 | |
40 | var clist = ['ide', 'virtio', 'scsi', 'sata']; | |
0e09929d EK |
41 | var bussel = me.down('field[name=controller]'); |
42 | var deviceid = me.down('field[name=deviceid]'); | |
43 | ||
7206af4b | 44 | if (autoSelect === 'cdrom') { |
7206af4b | 45 | if (!Ext.isDefined(me.vmconfig.ide2)) { |
0e09929d EK |
46 | bussel.setValue('ide'); |
47 | deviceid.setValue(2); | |
7206af4b | 48 | return; |
711c07d1 | 49 | } |
c7139315 | 50 | clist = ['ide', 'scsi', 'sata']; |
7206af4b EK |
51 | } else { |
52 | // in most cases we want to add a disk to the same controller | |
53 | // we previously used | |
54 | clist = me.sortByPreviousUsage(me.vmconfig, clist); | |
55 | } | |
711c07d1 | 56 | |
7dc5c40c | 57 | clist_loop: |
c7139315 | 58 | for (const controller of clist) { |
0e09929d | 59 | bussel.setValue(controller); |
c7139315 TL |
60 | for (let i = 0; i < PVE.Utils.diskControllerMaxIDs[controller]; i++) { |
61 | let confid = controller + i.toString(); | |
7206af4b | 62 | if (!Ext.isDefined(me.vmconfig[confid])) { |
0e09929d | 63 | deviceid.setValue(i); |
7dc5c40c | 64 | break clist_loop; // we found the desired controller/id combo |
711c07d1 | 65 | } |
7206af4b | 66 | } |
c7139315 | 67 | } |
0e09929d | 68 | deviceid.validate(); |
711c07d1 DM |
69 | }, |
70 | ||
71 | initComponent: function() { | |
72 | var me = this; | |
73 | ||
74 | Ext.apply(me, { | |
75 | fieldLabel: gettext('Bus/Device'), | |
76 | layout: 'hbox', | |
711c07d1 | 77 | defaults: { |
f6710aac | 78 | hideLabel: true, |
711c07d1 DM |
79 | }, |
80 | items: [ | |
81 | { | |
42902182 | 82 | xtype: 'pveBusSelector', |
711c07d1 | 83 | name: 'controller', |
39c06c69 | 84 | value: PVE.qemu.OSDefaults.generic.busType, |
711c07d1 | 85 | noVirtIO: me.noVirtIO, |
711c07d1 | 86 | allowBlank: false, |
a1fe04b6 | 87 | flex: 2, |
711c07d1 DM |
88 | listeners: { |
89 | change: function(t, value) { | |
369e3ecd | 90 | if (!value) { |
711c07d1 DM |
91 | return; |
92 | } | |
93 | var field = me.down('field[name=deviceid]'); | |
8c4ec8c7 | 94 | field.setMaxValue(PVE.Utils.diskControllerMaxIDs[value]); |
711c07d1 | 95 | field.validate(); |
f6710aac TL |
96 | }, |
97 | }, | |
711c07d1 DM |
98 | }, |
99 | { | |
bf96f60d | 100 | xtype: 'proxmoxintegerfield', |
711c07d1 DM |
101 | name: 'deviceid', |
102 | minValue: 0, | |
8c4ec8c7 | 103 | maxValue: PVE.Utils.diskControllerMaxIDs.ide, |
711c07d1 | 104 | value: '0', |
a1fe04b6 | 105 | flex: 1, |
bf96f60d | 106 | allowBlank: false, |
711c07d1 | 107 | validator: function(value) { |
711c07d1 DM |
108 | if (!me.rendered) { |
109 | return; | |
110 | } | |
111 | var field = me.down('field[name=controller]'); | |
112 | var controller = field.getValue(); | |
113 | var confid = controller + value; | |
114 | if (Ext.isDefined(me.vmconfig[confid])) { | |
115 | return "This device is already in use."; | |
116 | } | |
117 | return true; | |
f6710aac TL |
118 | }, |
119 | }, | |
120 | ], | |
711c07d1 DM |
121 | }); |
122 | ||
123 | me.callParent(); | |
f6710aac | 124 | }, |
711c07d1 | 125 | }); |