]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/form/ControllerSelector.js
Move bus priority list to OSDefaults
[pve-manager.git] / www / manager6 / form / ControllerSelector.js
1 Ext.define('PVE.form.ControllerSelector', {
2 extend: 'Ext.form.FieldContainer',
3 alias: 'widget.pveControllerSelector',
4
5 statics: {
6 maxIds: {
7 ide: 3,
8 sata: 5,
9 virtio: 15,
10 scsi: 13
11 }
12 },
13
14 noVirtIO: false,
15
16 noScsi: false,
17
18 vmconfig: {}, // used to check for existing devices
19
20 sortByPreviousUsage: function(vmconfig, controllerList) {
21 var sortedList = [];
22
23 var usedControllers = Ext.clone(PVE.form.ControllerSelector.maxIds);
24
25 var type;
26 for (type in usedControllers) {
27 if(usedControllers.hasOwnProperty(type)) {
28 usedControllers[type] = 0;
29 }
30 }
31
32 var property;
33 for (property in vmconfig) {
34 if (vmconfig.hasOwnProperty(property)) {
35 if (property.match(PVE.Utils.bus_match) && !vmconfig[property].match(/media=cdrom/)) {
36 var foundController = property.match(PVE.Utils.bus_match)[1];
37 usedControllers[foundController]++;
38 }
39 }
40 }
41
42 var vmDefaults = PVE.qemu.OSDefaults[vmconfig.ostype];
43
44 var sortPriority = vmDefaults && vmDefaults.busPriority
45 ? vmDefaults.busPriority : PVE.qemu.OSDefaults.generic;
46
47 var sortedList = Ext.clone(controllerList);
48 sortedList.sort(function(a,b) {
49 if (usedControllers[b] == usedControllers[a]) {
50 return sortPriority[b] - sortPriority[a];
51 }
52 return usedControllers[b] - usedControllers[a];
53 });
54
55 return sortedList;
56 },
57
58 setVMConfig: function(vmconfig, autoSelect) {
59 var me = this;
60
61 me.vmconfig = Ext.apply({}, vmconfig);
62 if (autoSelect) {
63 var clist = ['ide', 'virtio', 'scsi', 'sata'];
64 if (autoSelect === 'cdrom') {
65 clist = ['ide', 'scsi', 'sata'];
66 if (!Ext.isDefined(me.vmconfig.ide2)) {
67 me.down('field[name=controller]').setValue('ide');
68 me.down('field[name=deviceid]').setValue(2);
69 return;
70 }
71 } else {
72 // in most cases we want to add a disk to the same controller
73 // we previously used
74 clist = me.sortByPreviousUsage(me.vmconfig, clist);
75 }
76
77 Ext.Array.each(clist, function(controller) {
78 var confid, i;
79 if ((controller === 'virtio' && me.noVirtIO) ||
80 (controller === 'scsi' && me.noScsi)) {
81 return; //continue
82 }
83 me.down('field[name=controller]').setValue(controller);
84 for (i = 0; i <= PVE.form.ControllerSelector.maxIds[controller]; i++) {
85 confid = controller + i.toString();
86 if (!Ext.isDefined(me.vmconfig[confid])) {
87 me.down('field[name=deviceid]').setValue(i);
88 return false; // break
89 }
90 }
91 });
92 }
93 me.down('field[name=deviceid]').validate();
94 },
95
96 initComponent: function() {
97 var me = this;
98
99 Ext.apply(me, {
100 fieldLabel: gettext('Bus/Device'),
101 layout: 'hbox',
102 defaults: {
103 flex: 1,
104 hideLabel: true
105 },
106 items: [
107 {
108 xtype: 'pveBusSelector',
109 name: 'controller',
110 value: PVE.qemu.OSDefaults.generic.busType,
111 noVirtIO: me.noVirtIO,
112 noScsi: me.noScsi,
113 allowBlank: false,
114 listeners: {
115 change: function(t, value) {
116 if (!me.rendered || !value) {
117 return;
118 }
119 var field = me.down('field[name=deviceid]');
120 field.setMaxValue(PVE.form.ControllerSelector.maxIds[value]);
121 field.validate();
122 }
123 }
124 },
125 {
126 xtype: 'numberfield',
127 name: 'deviceid',
128 minValue: 0,
129 maxValue: PVE.form.ControllerSelector.maxIds.ide,
130 value: '0',
131 validator: function(value) {
132 /*jslint confusion: true */
133 if (!me.rendered) {
134 return;
135 }
136 var field = me.down('field[name=controller]');
137 var controller = field.getValue();
138 var confid = controller + value;
139 if (Ext.isDefined(me.vmconfig[confid])) {
140 return "This device is already in use.";
141 }
142 return true;
143 }
144 }
145 ]
146 });
147
148 me.callParent();
149 }
150 });