]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/qemu/CreateWizard.js
update shipped appliance info index
[pve-manager.git] / www / manager6 / qemu / CreateWizard.js
CommitLineData
9bbc1e4d
DM
1Ext.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