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