]>
Commit | Line | Data |
---|---|---|
a2f57991 | 1 | /*jslint confusion: true */ |
aff192e6 DM |
2 | Ext.define('PVE.openvz.CreateWizard', { |
3 | extend: 'PVE.window.Wizard', | |
4 | ||
5 | initComponent: function() { | |
6 | var me = this; | |
7 | ||
c6594d0e DM |
8 | var summarystore = Ext.create('Ext.data.Store', { |
9 | model: 'KeyValue', | |
10 | sorters: [ | |
11 | { | |
12 | property : 'key', | |
13 | direction: 'ASC' | |
14 | } | |
15 | ] | |
16 | }); | |
17 | ||
9f767883 DM |
18 | var storagesel = Ext.create('PVE.form.StorageSelector', { |
19 | name: 'storage', | |
f3bb9bb6 | 20 | fieldLabel: gettext('Storage'), |
9f767883 DM |
21 | storageContent: 'rootdir', |
22 | autoSelect: true, | |
23 | allowBlank: false | |
24 | }); | |
25 | ||
c6594d0e DM |
26 | var tmplsel = Ext.create('PVE.form.FileSelector', { |
27 | name: 'ostemplate', | |
28 | storageContent: 'vztmpl', | |
f3bb9bb6 | 29 | fieldLabel: gettext('Template'), |
c6594d0e DM |
30 | allowBlank: false |
31 | }); | |
32 | ||
df4bd3ad DM |
33 | var tmplstoragesel = Ext.create('PVE.form.StorageSelector', { |
34 | name: 'tmplstorage', | |
f3bb9bb6 | 35 | fieldLabel: gettext('Storage'), |
df4bd3ad DM |
36 | storageContent: 'vztmpl', |
37 | autoSelect: true, | |
38 | allowBlank: false, | |
39 | listeners: { | |
40 | change: function(f, value) { | |
41 | tmplsel.setStorage(value); | |
42 | } | |
43 | } | |
44 | }); | |
45 | ||
c6594d0e DM |
46 | var bridgesel = Ext.create('PVE.form.BridgeSelector', { |
47 | name: 'bridge', | |
0070ee37 | 48 | fieldLabel: gettext('Bridge'), |
c6594d0e DM |
49 | labelAlign: 'right', |
50 | autoSelect: true, | |
51 | disabled: true, | |
52 | allowBlank: false | |
53 | }); | |
54 | ||
aff192e6 | 55 | Ext.applyIf(me, { |
58eb5905 | 56 | subject: gettext('OpenVZ Container'), |
aff192e6 DM |
57 | items: [ |
58 | { | |
c6594d0e | 59 | xtype: 'inputpanel', |
f3bb9bb6 | 60 | title: gettext('General'), |
c6594d0e DM |
61 | column1: [ |
62 | { | |
63 | xtype: 'PVE.form.NodeSelector', | |
64 | name: 'nodename', | |
f3bb9bb6 | 65 | fieldLabel: gettext('Node'), |
c6594d0e DM |
66 | allowBlank: false, |
67 | onlineValidator: true, | |
68 | listeners: { | |
69 | change: function(f, value) { | |
df4bd3ad DM |
70 | tmplstoragesel.setNodename(value); |
71 | tmplsel.setStorage(undefined, value); | |
c6594d0e | 72 | bridgesel.setNodename(value); |
9f767883 | 73 | storagesel.setNodename(value); |
c6594d0e DM |
74 | } |
75 | } | |
76 | }, | |
77 | { | |
04f5d98e | 78 | xtype: 'pveVMIDSelector', |
c6594d0e | 79 | name: 'vmid', |
e893439e DM |
80 | value: '', |
81 | loadNextFreeVMID: true, | |
04f5d98e | 82 | validateExists: false |
c6594d0e DM |
83 | }, |
84 | { | |
85 | xtype: 'pvetextfield', | |
86 | name: 'hostname', | |
b2fe56d8 | 87 | vtype: 'DnsName', |
c6594d0e | 88 | value: '', |
0070ee37 | 89 | fieldLabel: gettext('Hostname'), |
c6594d0e | 90 | skipEmptyText: true, |
b2fe56d8 | 91 | allowBlank: true |
c6594d0e DM |
92 | } |
93 | ], | |
94 | column2: [ | |
c92c67a6 DM |
95 | { |
96 | xtype: 'pvePoolSelector', | |
97 | fieldLabel: gettext('Resource Pool'), | |
98 | name: 'pool', | |
99 | value: '', | |
100 | allowBlank: true | |
101 | }, | |
9f767883 | 102 | storagesel, |
c6594d0e DM |
103 | { |
104 | xtype: 'textfield', | |
105 | inputType: 'password', | |
106 | name: 'password', | |
107 | value: '', | |
f3bb9bb6 | 108 | fieldLabel: gettext('Password'), |
c6594d0e DM |
109 | allowBlank: false, |
110 | minLength: 5, | |
111 | change: function(f, value) { | |
112 | if (!me.rendered) { | |
113 | return; | |
114 | } | |
115 | me.down('field[name=confirmpw]').validate(); | |
116 | } | |
117 | }, | |
118 | { | |
119 | xtype: 'textfield', | |
120 | inputType: 'password', | |
121 | name: 'confirmpw', | |
122 | value: '', | |
f3bb9bb6 | 123 | fieldLabel: gettext('Confirm password'), |
c6594d0e DM |
124 | allowBlank: false, |
125 | validator: function(value) { | |
126 | var pw = me.down('field[name=password]').getValue(); | |
127 | if (pw !== value) { | |
8989e847 | 128 | return "Passwords does not match!"; |
c6594d0e DM |
129 | } |
130 | return true; | |
131 | } | |
132 | } | |
133 | ], | |
134 | onGetValues: function(values) { | |
135 | delete values.confirmpw; | |
c92c67a6 DM |
136 | if (!values.pool) { |
137 | delete values.pool; | |
138 | } | |
c6594d0e DM |
139 | return values; |
140 | } | |
141 | }, | |
142 | { | |
143 | xtype: 'inputpanel', | |
f3bb9bb6 | 144 | title: gettext('Template'), |
df4bd3ad | 145 | column1: [ tmplstoragesel, tmplsel] |
c6594d0e DM |
146 | }, |
147 | { | |
d9f0ffa9 | 148 | xtype: 'pveOpenVZResourceInputPanel', |
f3bb9bb6 | 149 | title: gettext('Resources') |
c6594d0e DM |
150 | }, |
151 | { | |
152 | xtype: 'inputpanel', | |
f3bb9bb6 | 153 | title: gettext('Network'), |
c6594d0e DM |
154 | column1: [ |
155 | { | |
156 | xtype: 'radiofield', | |
157 | name: 'networkmode', | |
158 | inputValue: 'routed', | |
159 | boxLabel: 'Routed mode (venet)', | |
160 | checked: true, | |
161 | listeners: { | |
162 | change: function(f, value) { | |
163 | if (!me.rendered) { | |
164 | return; | |
165 | } | |
166 | me.down('field[name=ip_address]').setDisabled(!value); | |
167 | me.down('field[name=ip_address]').validate(); | |
168 | } | |
169 | } | |
170 | }, | |
171 | { | |
172 | xtype: 'textfield', | |
173 | name: 'ip_address', | |
ba777999 | 174 | vtype: 'IP64Address', |
c6594d0e | 175 | value: '', |
f3bb9bb6 | 176 | fieldLabel: gettext('IP address'), |
c6594d0e DM |
177 | labelAlign: 'right', |
178 | allowBlank: false | |
179 | } | |
180 | ], | |
181 | column2: [ | |
182 | { | |
183 | xtype: 'radiofield', | |
184 | name: 'networkmode', | |
185 | inputValue: 'bridge', | |
0070ee37 | 186 | boxLabel: gettext('Bridged mode'), |
c6594d0e DM |
187 | checked: false, |
188 | listeners: { | |
189 | change: function(f, value) { | |
190 | if (!me.rendered) { | |
191 | return; | |
192 | } | |
c165567b | 193 | me.down('field[name=firewall]').setDisabled(!value); |
c6594d0e DM |
194 | me.down('field[name=bridge]').setDisabled(!value); |
195 | me.down('field[name=bridge]').validate(); | |
196 | } | |
197 | } | |
198 | }, | |
c165567b DM |
199 | bridgesel, |
200 | { | |
201 | xtype: 'pvecheckbox', | |
202 | fieldLabel: gettext('Firewall'), | |
203 | name: 'firewall', | |
204 | checked: false, | |
205 | disabled: true | |
206 | } | |
c6594d0e DM |
207 | ], |
208 | onGetValues: function(values) { | |
877d3f6d | 209 | if (values.networkmode === 'bridge') { |
c165567b DM |
210 | var netif = PVE.Parser.printOpenVZNetIf({ |
211 | eth0: { | |
212 | ifname: "eth0", | |
213 | bridge: values.bridge, | |
214 | firewall: values.firewall | |
215 | } | |
216 | }); | |
217 | return { netif: netif }; | |
877d3f6d DM |
218 | } else { |
219 | return { ip_address: values.ip_address }; | |
220 | } | |
c6594d0e DM |
221 | } |
222 | }, | |
223 | { | |
224 | xtype: 'inputpanel', | |
225 | title: 'DNS', | |
226 | column1: [ | |
227 | { | |
228 | xtype: 'pvetextfield', | |
229 | name: 'searchdomain', | |
230 | skipEmptyText: true, | |
0070ee37 | 231 | fieldLabel: gettext('DNS domain'), |
c6594d0e DM |
232 | emptyText: 'use host settings', |
233 | allowBlank: true, | |
234 | listeners: { | |
235 | change: function(f, value) { | |
236 | if (!me.rendered) { | |
237 | return; | |
238 | } | |
a2f57991 | 239 | var field = me.down('#dns1'); |
c6594d0e DM |
240 | field.setDisabled(!value); |
241 | field.clearInvalid(); | |
a2f57991 | 242 | field = me.down('#dns2'); |
c6594d0e DM |
243 | field.setDisabled(!value); |
244 | field.clearInvalid(); | |
245 | } | |
246 | } | |
247 | }, | |
248 | { | |
249 | xtype: 'pvetextfield', | |
e4e3bdd4 | 250 | fieldLabel: gettext('DNS server') + " 1", |
c6594d0e DM |
251 | vtype: 'IPAddress', |
252 | allowBlank: true, | |
253 | disabled: true, | |
254 | name: 'nameserver', | |
255 | itemId: 'dns1' | |
256 | }, | |
257 | { | |
258 | xtype: 'pvetextfield', | |
e4e3bdd4 | 259 | fieldLabel: gettext('DNS server') + " 2", |
c6594d0e DM |
260 | vtype: 'IPAddress', |
261 | skipEmptyText: true, | |
262 | disabled: true, | |
263 | name: 'nameserver', | |
264 | itemId: 'dns2' | |
265 | } | |
266 | ] | |
267 | }, | |
268 | { | |
f3bb9bb6 | 269 | title: gettext('Confirm'), |
aff192e6 | 270 | layout: 'fit', |
c6594d0e DM |
271 | items: [ |
272 | { | |
f3bb9bb6 | 273 | title: gettext('Settings'), |
c6594d0e DM |
274 | xtype: 'grid', |
275 | store: summarystore, | |
276 | columns: [ | |
277 | {header: 'Key', width: 150, dataIndex: 'key'}, | |
278 | {header: 'Value', flex: 1, dataIndex: 'value'} | |
279 | ] | |
280 | } | |
281 | ], | |
282 | listeners: { | |
283 | show: function(panel) { | |
284 | var form = me.down('form').getForm(); | |
285 | var kv = me.getValues(); | |
286 | var data = []; | |
287 | Ext.Object.each(kv, function(key, value) { | |
df4bd3ad | 288 | if (key === 'delete' || key === 'tmplstorage') { // ignore |
c6594d0e DM |
289 | return; |
290 | } | |
291 | if (key === 'password') { // don't show pw | |
292 | return; | |
293 | } | |
294 | var html = Ext.htmlEncode(Ext.JSON.encode(value)); | |
295 | data.push({ key: key, value: value }); | |
296 | }); | |
297 | summarystore.suspendEvents(); | |
298 | summarystore.removeAll(); | |
299 | summarystore.add(data); | |
300 | summarystore.sort(); | |
301 | summarystore.resumeEvents(); | |
302 | summarystore.fireEvent('datachanged', summarystore); | |
303 | } | |
304 | }, | |
305 | onSubmit: function() { | |
306 | var kv = me.getValues(); | |
307 | delete kv['delete']; | |
308 | ||
309 | var nodename = kv.nodename; | |
310 | delete kv.nodename; | |
df4bd3ad | 311 | delete kv.tmplstorage; |
c6594d0e DM |
312 | |
313 | PVE.Utils.API2Request({ | |
314 | url: '/nodes/' + nodename + '/openvz', | |
315 | waitMsgTarget: me, | |
316 | method: 'POST', | |
317 | params: kv, | |
4545bfda DM |
318 | success: function(response, opts){ |
319 | var upid = response.result.data; | |
320 | ||
321 | var win = Ext.create('PVE.window.TaskViewer', { | |
322 | upid: upid | |
323 | }); | |
324 | win.show(); | |
c6594d0e DM |
325 | me.close(); |
326 | }, | |
327 | failure: function(response, opts) { | |
f3bb9bb6 | 328 | Ext.Msg.alert(gettext('Error'), response.htmlStatus); |
c6594d0e DM |
329 | } |
330 | }); | |
331 | } | |
aff192e6 DM |
332 | } |
333 | ] | |
334 | }); | |
335 | ||
336 | me.callParent(); | |
337 | } | |
338 | }); | |
339 | ||
340 | ||
341 |