]>
Commit | Line | Data |
---|---|---|
9bbc1e4d DM |
1 | Ext.define('PVE.qemu.CreateWizard', { |
2 | extend: 'PVE.window.Wizard', | |
42902182 | 3 | alias: 'widget.pveQemuCreateWizard', |
8cdfb23f | 4 | mixins: ['Proxmox.Mixin.CBind'], |
9bbc1e4d | 5 | |
8cdfb23f TL |
6 | viewModel: { |
7 | data: { | |
471d03aa DC |
8 | nodename: '', |
9 | current: { | |
f6710aac TL |
10 | scsihw: '', |
11 | }, | |
12 | }, | |
5a2e333c FE |
13 | formulas: { |
14 | cgroupMode: function(get) { | |
15 | const nodeInfo = PVE.data.ResourceStore.getNodes().find( | |
16 | node => node.node === get('nodename'), | |
17 | ); | |
18 | return nodeInfo ? nodeInfo['cgroup-mode'] : 2; | |
19 | }, | |
20 | }, | |
8d4f1d4d EK |
21 | }, |
22 | ||
8cdfb23f | 23 | cbindData: { |
f6710aac | 24 | nodename: undefined, |
8cdfb23f | 25 | }, |
9bbc1e4d | 26 | |
8cdfb23f | 27 | subject: gettext('Virtual Machine'), |
9bbc1e4d | 28 | |
fc3a88ad DC |
29 | // fot the special case that we have 2 cdrom drives |
30 | // | |
31 | // emulates part of the backend bootorder logic, but includes all | |
32 | // cdrom drives since we don't know which one the user put in a bootable iso | |
33 | // and hardcodes the known values (ide0/2, net0) | |
34 | calculateBootOrder: function(values) { | |
35 | // user selected windows + second cdrom | |
36 | if (values.ide0 && values.ide0.match(/media=cdrom/)) { | |
37 | let disk; | |
38 | PVE.Utils.forEachBus(['ide', 'scsi', 'virtio', 'sata'], (type, id) => { | |
39 | let confId = type + id; | |
40 | if (!values[confId]) { | |
41 | return undefined; | |
42 | } | |
43 | if (values[confId].match(/media=cdrom/)) { | |
44 | return undefined; | |
45 | } | |
46 | disk = confId; | |
47 | return false; // abort loop | |
48 | }); | |
49 | ||
50 | let order = []; | |
51 | if (disk) { | |
52 | order.push(disk); | |
53 | } | |
54 | order.push('ide0', 'ide2'); | |
55 | if (values.net0) { | |
56 | order.push('net0'); | |
57 | } | |
58 | ||
59 | return `order=${order.join(';')}`; | |
60 | } | |
61 | return undefined; | |
62 | }, | |
63 | ||
8cdfb23f TL |
64 | items: [ |
65 | { | |
66 | xtype: 'inputpanel', | |
67 | title: gettext('General'), | |
68 | onlineHelp: 'qm_general_settings', | |
69 | column1: [ | |
9bbc1e4d | 70 | { |
8cdfb23f TL |
71 | xtype: 'pveNodeSelector', |
72 | name: 'nodename', | |
73 | cbind: { | |
74 | selectCurNode: '{!nodename}', | |
f6710aac | 75 | preferredValue: '{nodename}', |
8d4f1d4d | 76 | }, |
8cdfb23f | 77 | bind: { |
f6710aac | 78 | value: '{nodename}', |
8cdfb23f TL |
79 | }, |
80 | fieldLabel: gettext('Node'), | |
81 | allowBlank: false, | |
f6710aac | 82 | onlineValidator: true, |
7da4966d | 83 | }, |
8d4f1d4d | 84 | { |
8cdfb23f TL |
85 | xtype: 'pveGuestIDSelector', |
86 | name: 'vmid', | |
87 | guestType: 'qemu', | |
88 | value: '', | |
89 | loadNextFreeID: true, | |
f6710aac | 90 | validateExists: false, |
8d4f1d4d | 91 | }, |
9bbc1e4d | 92 | { |
8cdfb23f TL |
93 | xtype: 'textfield', |
94 | name: 'name', | |
95 | vtype: 'DnsName', | |
96 | value: '', | |
97 | fieldLabel: gettext('Name'), | |
f6710aac TL |
98 | allowBlank: true, |
99 | }, | |
8cdfb23f TL |
100 | ], |
101 | column2: [ | |
9bbc1e4d | 102 | { |
8cdfb23f TL |
103 | xtype: 'pvePoolSelector', |
104 | fieldLabel: gettext('Resource Pool'), | |
105 | name: 'pool', | |
106 | value: '', | |
f6710aac TL |
107 | allowBlank: true, |
108 | }, | |
8cdfb23f | 109 | ], |
29e19e95 DC |
110 | advancedColumn1: [ |
111 | { | |
112 | xtype: 'proxmoxcheckbox', | |
113 | name: 'onboot', | |
114 | uncheckedValue: 0, | |
115 | defaultValue: 0, | |
116 | deleteDefaultValue: true, | |
f6710aac TL |
117 | fieldLabel: gettext('Start at boot'), |
118 | }, | |
29e19e95 DC |
119 | ], |
120 | advancedColumn2: [ | |
121 | { | |
122 | xtype: 'textfield', | |
123 | name: 'order', | |
124 | defaultValue: '', | |
125 | emptyText: 'any', | |
126 | labelWidth: 120, | |
f6710aac | 127 | fieldLabel: gettext('Start/Shutdown order'), |
29e19e95 DC |
128 | }, |
129 | { | |
130 | xtype: 'textfield', | |
131 | name: 'up', | |
132 | defaultValue: '', | |
133 | emptyText: 'default', | |
134 | labelWidth: 120, | |
f6710aac | 135 | fieldLabel: gettext('Startup delay'), |
29e19e95 DC |
136 | }, |
137 | { | |
138 | xtype: 'textfield', | |
139 | name: 'down', | |
140 | defaultValue: '', | |
141 | emptyText: 'default', | |
142 | labelWidth: 120, | |
f6710aac TL |
143 | fieldLabel: gettext('Shutdown timeout'), |
144 | }, | |
29e19e95 | 145 | ], |
ca97f630 DC |
146 | |
147 | advancedColumnB: [ | |
148 | { | |
149 | xtype: 'pveTagFieldSet', | |
150 | name: 'tags', | |
151 | maxHeight: 150, | |
152 | }, | |
153 | ], | |
154 | ||
29e19e95 | 155 | onGetValues: function(values) { |
29e19e95 DC |
156 | ['name', 'pool', 'onboot', 'agent'].forEach(function(field) { |
157 | if (!values[field]) { | |
158 | delete values[field]; | |
159 | } | |
160 | }); | |
161 | ||
162 | var res = PVE.Parser.printStartup({ | |
163 | order: values.order, | |
164 | up: values.up, | |
f6710aac | 165 | down: values.down, |
29e19e95 DC |
166 | }); |
167 | ||
168 | if (res) { | |
169 | values.startup = res; | |
8cdfb23f | 170 | } |
29e19e95 DC |
171 | |
172 | delete values.order; | |
173 | delete values.up; | |
174 | delete values.down; | |
175 | ||
8cdfb23f | 176 | return values; |
f6710aac | 177 | }, |
8cdfb23f TL |
178 | }, |
179 | { | |
180 | xtype: 'container', | |
181 | layout: 'hbox', | |
182 | defaults: { | |
183 | flex: 1, | |
f6710aac | 184 | padding: '0 10', |
8cdfb23f TL |
185 | }, |
186 | title: gettext('OS'), | |
187 | items: [ | |
8d4f1d4d | 188 | { |
8cdfb23f TL |
189 | xtype: 'pveQemuCDInputPanel', |
190 | bind: { | |
f6710aac | 191 | nodename: '{nodename}', |
8cdfb23f TL |
192 | }, |
193 | confid: 'ide2', | |
f6710aac | 194 | insideWizard: true, |
8d4f1d4d | 195 | }, |
9bbc1e4d | 196 | { |
8cdfb23f | 197 | xtype: 'pveQemuOSTypePanel', |
f6710aac | 198 | insideWizard: true, |
5b2e8bd4 DC |
199 | bind: { |
200 | nodename: '{nodename}', | |
201 | }, | |
f6710aac TL |
202 | }, |
203 | ], | |
8cdfb23f | 204 | }, |
471d03aa DC |
205 | { |
206 | xtype: 'pveQemuSystemPanel', | |
207 | title: gettext('System'), | |
208 | isCreate: true, | |
f6710aac | 209 | insideWizard: true, |
471d03aa | 210 | }, |
8cdfb23f | 211 | { |
9dbc4dfa | 212 | xtype: 'pveMultiHDPanel', |
8cdfb23f | 213 | bind: { |
f6710aac | 214 | nodename: '{nodename}', |
8cdfb23f | 215 | }, |
9dbc4dfa | 216 | title: gettext('Disks'), |
8cdfb23f TL |
217 | }, |
218 | { | |
219 | xtype: 'pveQemuProcessorPanel', | |
220 | insideWizard: true, | |
f6710aac | 221 | title: gettext('CPU'), |
8cdfb23f TL |
222 | }, |
223 | { | |
224 | xtype: 'pveQemuMemoryPanel', | |
225 | insideWizard: true, | |
f6710aac | 226 | title: gettext('Memory'), |
8cdfb23f TL |
227 | }, |
228 | { | |
229 | xtype: 'pveQemuNetworkInputPanel', | |
230 | bind: { | |
f6710aac | 231 | nodename: '{nodename}', |
8cdfb23f TL |
232 | }, |
233 | title: gettext('Network'), | |
f6710aac | 234 | insideWizard: true, |
8cdfb23f TL |
235 | }, |
236 | { | |
237 | title: gettext('Confirm'), | |
238 | layout: 'fit', | |
239 | items: [ | |
240 | { | |
241 | xtype: 'grid', | |
242 | store: { | |
243 | model: 'KeyValue', | |
244 | sorters: [{ | |
8058410f | 245 | property: 'key', |
f6710aac TL |
246 | direction: 'ASC', |
247 | }], | |
9bbc1e4d | 248 | }, |
8cdfb23f | 249 | columns: [ |
8058410f TL |
250 | { header: 'Key', width: 150, dataIndex: 'key' }, |
251 | { header: 'Value', flex: 1, dataIndex: 'value' }, | |
f6710aac TL |
252 | ], |
253 | }, | |
8cdfb23f | 254 | ], |
d8e2ae99 TL |
255 | dockedItems: [ |
256 | { | |
257 | xtype: 'proxmoxcheckbox', | |
258 | name: 'start', | |
259 | dock: 'bottom', | |
260 | margin: '5 0 0 0', | |
f6710aac TL |
261 | boxLabel: gettext('Start after created'), |
262 | }, | |
d8e2ae99 | 263 | ], |
8cdfb23f TL |
264 | listeners: { |
265 | show: function(panel) { | |
fc3a88ad DC |
266 | let wizard = this.up('window'); |
267 | var kv = wizard.getValues(); | |
8cdfb23f | 268 | var data = []; |
fc3a88ad DC |
269 | |
270 | let boot = wizard.calculateBootOrder(kv); | |
271 | if (boot) { | |
272 | kv.boot = boot; | |
273 | } | |
274 | ||
8cdfb23f TL |
275 | Ext.Object.each(kv, function(key, value) { |
276 | if (key === 'delete') { // ignore | |
277 | return; | |
278 | } | |
279 | data.push({ key: key, value: value }); | |
280 | }); | |
9bbc1e4d | 281 | |
8cdfb23f TL |
282 | var summarystore = panel.down('grid').getStore(); |
283 | summarystore.suspendEvents(); | |
284 | summarystore.removeAll(); | |
285 | summarystore.add(data); | |
286 | summarystore.sort(); | |
287 | summarystore.resumeEvents(); | |
288 | summarystore.fireEvent('refresh'); | |
f6710aac | 289 | }, |
8cdfb23f TL |
290 | }, |
291 | onSubmit: function() { | |
292 | var wizard = this.up('window'); | |
293 | var kv = wizard.getValues(); | |
399ffa76 | 294 | delete kv.delete; |
8cdfb23f TL |
295 | |
296 | var nodename = kv.nodename; | |
297 | delete kv.nodename; | |
9bbc1e4d | 298 | |
fc3a88ad DC |
299 | let boot = wizard.calculateBootOrder(kv); |
300 | if (boot) { | |
301 | kv.boot = boot; | |
302 | } | |
303 | ||
8cdfb23f TL |
304 | Proxmox.Utils.API2Request({ |
305 | url: '/nodes/' + nodename + '/qemu', | |
306 | waitMsgTarget: wizard, | |
307 | method: 'POST', | |
308 | params: kv, | |
8058410f | 309 | success: function(response) { |
8cdfb23f TL |
310 | wizard.close(); |
311 | }, | |
312 | failure: function(response, opts) { | |
313 | Ext.Msg.alert(gettext('Error'), response.htmlStatus); | |
f6710aac | 314 | }, |
8cdfb23f | 315 | }); |
f6710aac TL |
316 | }, |
317 | }, | |
318 | ], | |
9bbc1e4d DM |
319 | }); |
320 | ||
321 |