]>
Commit | Line | Data |
---|---|---|
df15b3da | 1 | /*jslint confusion: true */ |
d5e771ce | 2 | /* 'change' property is assigned a string and then a function */ |
df15b3da DM |
3 | Ext.define('PVE.qemu.HDInputPanel', { |
4 | extend: 'PVE.panel.InputPanel', | |
85806e47 | 5 | alias: 'widget.pveQemuHDInputPanel', |
c8802a60 | 6 | onlineHelp: 'qm_hard_disk', |
df15b3da DM |
7 | |
8 | insideWizard: false, | |
9 | ||
10 | unused: false, // ADD usused disk imaged | |
11 | ||
12 | vmconfig: {}, // used to select usused disks | |
13 | ||
180d7ef5 DM |
14 | controller: { |
15 | ||
16 | xclass: 'Ext.app.ViewController', | |
17 | ||
18 | onControllerChange: function(field) { | |
19 | var value = field.getValue(); | |
ed1ac8f4 TL |
20 | |
21 | var allowIOthread = value.match(/^(virtio|scsi)/); | |
22 | this.lookup('iothread').setDisabled(!allowIOthread); | |
23 | if (!allowIOthread) { | |
24 | this.lookup('iothread').setValue(false); | |
25 | } | |
36958639 | 26 | |
42bd6556 EK |
27 | var scsi = value.match(/^scsi/); |
28 | this.lookup('discard').setDisabled(!scsi); | |
29 | if (!scsi) { | |
36958639 TL |
30 | this.lookup('discard').setValue(false); |
31 | } | |
42bd6556 | 32 | this.lookup('scsiController').setVisible(scsi); |
180d7ef5 DM |
33 | }, |
34 | ||
35 | control: { | |
9cac6b75 | 36 | 'field[name=controller]': { |
180d7ef5 DM |
37 | change: 'onControllerChange', |
38 | afterrender: 'onControllerChange' | |
9cac6b75 | 39 | }, |
2414ef15 EK |
40 | 'field[name=iothread]' : { |
41 | change: function(f, value) { | |
42 | if (!this.getView().insideWizard) { | |
43 | return; | |
44 | } | |
45 | var vmScsiType = value ? 'virtio-scsi-single': 'virtio-scsi-pci'; | |
46 | this.lookupReference('scsiController').setValue(vmScsiType); | |
47 | } | |
180d7ef5 DM |
48 | } |
49 | } | |
50 | }, | |
51 | ||
df15b3da DM |
52 | onGetValues: function(values) { |
53 | var me = this; | |
54 | ||
9a8a5735 | 55 | var params = {}; |
df15b3da | 56 | var confid = me.confid || (values.controller + values.deviceid); |
7a6e0635 | 57 | |
df15b3da DM |
58 | if (me.unused) { |
59 | me.drive.file = me.vmconfig[values.unusedId]; | |
60 | confid = values.controller + values.deviceid; | |
d5e771ce | 61 | } else if (me.isCreate) { |
df15b3da DM |
62 | if (values.hdimage) { |
63 | me.drive.file = values.hdimage; | |
64 | } else { | |
65 | me.drive.file = values.hdstorage + ":" + values.disksize; | |
66 | } | |
67 | me.drive.format = values.diskformat; | |
68 | } | |
7a6e0635 | 69 | |
df15b3da DM |
70 | if (values.nobackup) { |
71 | me.drive.backup = 'no'; | |
72 | } else { | |
73 | delete me.drive.backup; | |
74 | } | |
75 | ||
1b6f87ab EK |
76 | if (values.noreplicate) { |
77 | me.drive.replicate = 'no'; | |
78 | } else { | |
79 | delete me.drive.replicate; | |
80 | } | |
81 | ||
df15b3da DM |
82 | if (values.discard) { |
83 | me.drive.discard = 'on'; | |
84 | } else { | |
85 | delete me.drive.discard; | |
86 | } | |
87 | ||
ed1ac8f4 | 88 | if (values.iothread) { |
df15b3da DM |
89 | me.drive.iothread = 'on'; |
90 | } else { | |
91 | delete me.drive.iothread; | |
92 | } | |
93 | ||
94 | if (values.cache) { | |
95 | me.drive.cache = values.cache; | |
96 | } else { | |
97 | delete me.drive.cache; | |
98 | } | |
99 | ||
2414ef15 EK |
100 | if (values.scsihw) { |
101 | params.scsihw = values.scsihw; | |
102 | } | |
103 | ||
df15b3da | 104 | params[confid] = PVE.Parser.printQemuDrive(me.drive); |
7a6e0635 TL |
105 | |
106 | return params; | |
df15b3da DM |
107 | }, |
108 | ||
109 | setVMConfig: function(vmconfig) { | |
110 | var me = this; | |
111 | ||
112 | me.vmconfig = vmconfig; | |
113 | ||
114 | if (me.bussel) { | |
7206af4b | 115 | me.bussel.setVMConfig(vmconfig); |
42bd6556 | 116 | me.scsiController.setValue(vmconfig.scsihw); |
df15b3da DM |
117 | } |
118 | if (me.unusedDisks) { | |
7a6e0635 | 119 | var disklist = []; |
df15b3da DM |
120 | Ext.Object.each(vmconfig, function(key, value) { |
121 | if (key.match(/^unused\d+$/)) { | |
122 | disklist.push([key, value]); | |
123 | } | |
124 | }); | |
125 | me.unusedDisks.store.loadData(disklist); | |
126 | me.unusedDisks.setValue(me.confid); | |
127 | } | |
128 | }, | |
129 | ||
130 | setDrive: function(drive) { | |
131 | var me = this; | |
132 | ||
133 | me.drive = drive; | |
134 | ||
135 | var values = {}; | |
136 | var match = drive.file.match(/^([^:]+):/); | |
137 | if (match) { | |
138 | values.hdstorage = match[1]; | |
139 | } | |
140 | ||
141 | values.hdimage = drive.file; | |
142 | values.nobackup = !PVE.Parser.parseBoolean(drive.backup, 1); | |
1b6f87ab | 143 | values.noreplicate = !PVE.Parser.parseBoolean(drive.replicate, 1); |
df15b3da | 144 | values.diskformat = drive.format || 'raw'; |
ac7db8f7 | 145 | values.cache = drive.cache || '__default__'; |
df15b3da DM |
146 | values.discard = (drive.discard === 'on'); |
147 | values.iothread = PVE.Parser.parseBoolean(drive.iothread); | |
148 | ||
149 | me.setValues(values); | |
150 | }, | |
151 | ||
152 | setNodename: function(nodename) { | |
153 | var me = this; | |
771aec96 DC |
154 | me.down('#hdstorage').setNodename(nodename); |
155 | me.down('#hdimage').setStorage(undefined, nodename); | |
df15b3da DM |
156 | }, |
157 | ||
158 | initComponent : function() { | |
159 | var me = this; | |
160 | ||
161 | me.drive = {}; | |
162 | ||
163 | me.column1 = []; | |
164 | me.column2 = []; | |
165 | ||
166 | if (!me.confid || me.unused) { | |
42902182 | 167 | me.bussel = Ext.create('PVE.form.ControllerSelector', { |
df15b3da DM |
168 | vmconfig: me.insideWizard ? {ide2: 'cdrom'} : {} |
169 | }); | |
170 | me.column1.push(me.bussel); | |
2414ef15 | 171 | |
42bd6556 | 172 | me.scsiController = Ext.create('Ext.form.field.Display', { |
2414ef15 | 173 | name: 'scsihw', |
42bd6556 EK |
174 | fieldLabel: gettext('SCSI Controller'), |
175 | reference: 'scsiController', | |
176 | renderer: PVE.Utils.render_scsihw, | |
2414ef15 EK |
177 | // do not change a VM wide option after creation |
178 | submitValue: me.insideWizard, | |
42bd6556 EK |
179 | hidden: true |
180 | }); | |
181 | me.column1.push(me.scsiController); | |
df15b3da DM |
182 | } |
183 | ||
184 | if (me.unused) { | |
09cacce7 | 185 | me.unusedDisks = Ext.create('Proxmox.form.KVComboBox', { |
7a6e0635 | 186 | name: 'unusedId', |
df15b3da DM |
187 | fieldLabel: gettext('Disk image'), |
188 | matchFieldWidth: false, | |
189 | listConfig: { | |
190 | width: 350 | |
191 | }, | |
192 | data: [], | |
193 | allowBlank: false | |
194 | }); | |
195 | me.column1.push(me.unusedDisks); | |
d5e771ce | 196 | } else if (me.isCreate) { |
771aec96 DC |
197 | me.column1.push({ |
198 | xtype: 'pveDiskStorageSelector', | |
df15b3da | 199 | storageContent: 'images', |
771aec96 | 200 | name: 'disk', |
df15b3da | 201 | nodename: me.nodename, |
771aec96 | 202 | autoSelect: me.insideWizard |
df15b3da | 203 | }); |
df15b3da DM |
204 | } else { |
205 | me.column1.push({ | |
206 | xtype: 'textfield', | |
207 | disabled: true, | |
208 | submitValue: false, | |
209 | fieldLabel: gettext('Disk image'), | |
210 | name: 'hdimage' | |
211 | }); | |
212 | } | |
213 | ||
214 | me.column2.push({ | |
215 | xtype: 'CacheTypeSelector', | |
216 | name: 'cache', | |
ca6372bd | 217 | value: '__default__', |
df15b3da | 218 | fieldLabel: gettext('Cache') |
2d06e723 TL |
219 | }, |
220 | { | |
896c0d50 | 221 | xtype: 'proxmoxcheckbox', |
df15b3da DM |
222 | fieldLabel: gettext('No backup'), |
223 | name: 'nobackup' | |
2d06e723 TL |
224 | }, |
225 | { | |
896c0d50 | 226 | xtype: 'proxmoxcheckbox', |
1b6f87ab EK |
227 | hidden: me.insideWizard, |
228 | fieldLabel: gettext('Skip replication'), | |
229 | name: 'noreplicate' | |
2d06e723 TL |
230 | }, |
231 | { | |
896c0d50 | 232 | xtype: 'proxmoxcheckbox', |
df15b3da | 233 | fieldLabel: gettext('Discard'), |
36958639 TL |
234 | disabled: me.confid && !me.confid.match(/^scsi/), |
235 | reference: 'discard', | |
df15b3da | 236 | name: 'discard' |
2d06e723 TL |
237 | }, |
238 | { | |
896c0d50 | 239 | xtype: 'proxmoxcheckbox', |
ed1ac8f4 | 240 | disabled: me.confid && !me.confid.match(/^(virtio|scsi)/), |
a1af3e38 | 241 | fieldLabel: 'IO thread', |
180d7ef5 | 242 | reference: 'iothread', |
df15b3da DM |
243 | name: 'iothread' |
244 | }); | |
245 | ||
246 | me.callParent(); | |
247 | } | |
248 | }); | |
d5e771ce | 249 | /*jslint confusion: false */ |
df15b3da DM |
250 | |
251 | Ext.define('PVE.qemu.HDEdit', { | |
252 | extend: 'PVE.window.Edit', | |
253 | ||
254 | isAdd: true, | |
255 | ||
256 | initComponent : function() { | |
257 | var me = this; | |
258 | ||
259 | var nodename = me.pveSelNode.data.node; | |
7a6e0635 TL |
260 | if (!nodename) { |
261 | throw "no node name specified"; | |
df15b3da DM |
262 | } |
263 | ||
264 | var unused = me.confid && me.confid.match(/^unused\d+$/); | |
265 | ||
d5e771ce | 266 | me.isCreate = me.confid ? unused : true; |
df15b3da DM |
267 | |
268 | var ipanel = Ext.create('PVE.qemu.HDInputPanel', { | |
269 | confid: me.confid, | |
270 | nodename: nodename, | |
271 | unused: unused, | |
d5e771ce | 272 | isCreate: me.isCreate |
df15b3da DM |
273 | }); |
274 | ||
275 | var subject; | |
276 | if (unused) { | |
277 | me.subject = gettext('Unused Disk'); | |
d5e771ce | 278 | } else if (me.isCreate) { |
df15b3da DM |
279 | me.subject = gettext('Hard Disk'); |
280 | } else { | |
281 | me.subject = gettext('Hard Disk') + ' (' + me.confid + ')'; | |
282 | } | |
283 | ||
284 | me.items = [ ipanel ]; | |
285 | ||
286 | me.callParent(); | |
d5e771ce EK |
287 | /*jslint confusion: true*/ |
288 | /* 'data' is assigned an empty array in same file, and here we | |
289 | * use it like an object | |
290 | */ | |
df15b3da DM |
291 | me.load({ |
292 | success: function(response, options) { | |
293 | ipanel.setVMConfig(response.result.data); | |
294 | if (me.confid) { | |
295 | var value = response.result.data[me.confid]; | |
296 | var drive = PVE.Parser.parseQemuDrive(me.confid, value); | |
297 | if (!drive) { | |
185a77e5 | 298 | Ext.Msg.alert(gettext('Error'), 'Unable to parse drive options'); |
df15b3da DM |
299 | me.close(); |
300 | return; | |
301 | } | |
302 | ipanel.setDrive(drive); | |
303 | me.isValid(); // trigger validation | |
304 | } | |
305 | } | |
306 | }); | |
d5e771ce | 307 | /*jslint confusion: false*/ |
df15b3da DM |
308 | } |
309 | }); |