]>
Commit | Line | Data |
---|---|---|
a58001dd DM |
1 | Ext.define('Proxmox.node.NetworkEdit', { |
2 | extend: 'Proxmox.window.Edit', | |
3 | alias: ['widget.proxmoxNodeNetworkEdit'], | |
4 | ||
5 | initComponent : function() { | |
6 | var me = this; | |
7 | ||
8 | if (!me.nodename) { | |
9 | throw "no node name specified"; | |
10 | } | |
11 | ||
12 | if (!me.iftype) { | |
13 | throw "no network device type specified"; | |
14 | } | |
15 | ||
b33f451f | 16 | me.isCreate = !me.iface; |
a58001dd DM |
17 | |
18 | var iface_vtype; | |
19 | ||
20 | if (me.iftype === 'bridge') { | |
21 | iface_vtype = 'BridgeName'; | |
22 | } else if (me.iftype === 'bond') { | |
23 | iface_vtype = 'BondName'; | |
b33f451f | 24 | } else if (me.iftype === 'eth' && !me.isCreate) { |
a58001dd | 25 | iface_vtype = 'InterfaceName'; |
8aefd47c AD |
26 | } else if (me.iftype === 'vlan') { |
27 | iface_vtype = 'VlanName'; | |
a58001dd DM |
28 | } else if (me.iftype === 'OVSBridge') { |
29 | iface_vtype = 'BridgeName'; | |
30 | } else if (me.iftype === 'OVSBond') { | |
31 | iface_vtype = 'BondName'; | |
32 | } else if (me.iftype === 'OVSIntPort') { | |
33 | iface_vtype = 'InterfaceName'; | |
34 | } else if (me.iftype === 'OVSPort') { | |
35 | iface_vtype = 'InterfaceName'; | |
36 | } else { | |
37 | console.log(me.iftype); | |
38 | throw "unknown network device type specified"; | |
39 | } | |
40 | ||
41 | me.subject = Proxmox.Utils.render_network_iface_type(me.iftype); | |
42 | ||
5c833def TL |
43 | let column1 = [], |
44 | column2 = [], | |
1aaba242 | 45 | columnB = [], |
5c833def TL |
46 | advancedColumn1 = [], |
47 | advancedColumn2 = []; | |
a58001dd | 48 | |
5c833def | 49 | if (!(me.iftype === 'OVSIntPort' || me.iftype === 'OVSPort' || me.iftype === 'OVSBond')) { |
a58001dd | 50 | column2.push({ |
fccec7c6 | 51 | xtype: 'proxmoxcheckbox', |
a58001dd DM |
52 | fieldLabel: gettext('Autostart'), |
53 | name: 'autostart', | |
54 | uncheckedValue: 0, | |
b33f451f | 55 | checked: me.isCreate ? true : undefined |
a58001dd DM |
56 | }); |
57 | } | |
58 | ||
59 | if (me.iftype === 'bridge') { | |
60 | column2.push({ | |
fccec7c6 | 61 | xtype: 'proxmoxcheckbox', |
a58001dd DM |
62 | fieldLabel: gettext('VLAN aware'), |
63 | name: 'bridge_vlan_aware', | |
b33f451f | 64 | deleteEmpty: !me.isCreate |
a58001dd DM |
65 | }); |
66 | column2.push({ | |
67 | xtype: 'textfield', | |
68 | fieldLabel: gettext('Bridge ports'), | |
69 | name: 'bridge_ports' | |
70 | }); | |
71 | } else if (me.iftype === 'OVSBridge') { | |
72 | column2.push({ | |
73 | xtype: 'textfield', | |
74 | fieldLabel: gettext('Bridge ports'), | |
75 | name: 'ovs_ports' | |
76 | }); | |
77 | column2.push({ | |
78 | xtype: 'textfield', | |
79 | fieldLabel: gettext('OVS options'), | |
80 | name: 'ovs_options' | |
81 | }); | |
82 | } else if (me.iftype === 'OVSPort' || me.iftype === 'OVSIntPort') { | |
83 | column2.push({ | |
b33f451f | 84 | xtype: me.isCreate ? 'PVE.form.BridgeSelector' : 'displayfield', |
a58001dd DM |
85 | fieldLabel: Proxmox.Utils.render_network_iface_type('OVSBridge'), |
86 | allowBlank: false, | |
87 | nodename: me.nodename, | |
88 | bridgeType: 'OVSBridge', | |
89 | name: 'ovs_bridge' | |
90 | }); | |
91 | column2.push({ | |
92 | xtype: 'pveVlanField', | |
b33f451f | 93 | deleteEmpty: !me.isCreate, |
a58001dd DM |
94 | name: 'ovs_tag', |
95 | value: '' | |
96 | }); | |
97 | column2.push({ | |
98 | xtype: 'textfield', | |
99 | fieldLabel: gettext('OVS options'), | |
100 | name: 'ovs_options' | |
101 | }); | |
8aefd47c AD |
102 | } else if (me.iftype === 'vlan') { |
103 | ||
ea7da80c | 104 | if (!me.isCreate) { |
8aefd47c | 105 | |
ea7da80c TL |
106 | me.disablevlanid = false; |
107 | me.disablevlanrawdevice = false; | |
108 | me.vlanrawdevicevalue = ''; | |
109 | me.vlanidvalue = ''; | |
8aefd47c | 110 | |
ea7da80c TL |
111 | if (Proxmox.Utils.VlanInterface_match.test(me.iface)) { |
112 | me.disablevlanid = true; | |
113 | me.disablevlanrawdevice = true; | |
114 | var arr = Proxmox.Utils.VlanInterface_match.exec(me.iface); | |
115 | me.vlanrawdevicevalue = arr[1]; | |
116 | me.vlanidvalue = arr[2]; | |
8aefd47c | 117 | |
ea7da80c TL |
118 | } else if (Proxmox.Utils.Vlan_match.test(me.iface)) { |
119 | me.disablevlanid = true; | |
120 | var arr = Proxmox.Utils.Vlan_match.exec(me.iface); | |
121 | me.vlanidvalue = arr[1]; | |
122 | } | |
123 | } else { | |
8aefd47c | 124 | |
ea7da80c TL |
125 | me.disablevlanid = true; |
126 | me.disablevlanrawdevice = true; | |
8aefd47c AD |
127 | } |
128 | ||
129 | column2.push({ | |
130 | xtype: 'textfield', | |
131 | fieldLabel: gettext('Vlan raw device'), | |
132 | name: 'vlan-raw-device', | |
ea7da80c | 133 | value: me.vlanrawdevicevalue, |
8aefd47c AD |
134 | disabled: me.disablevlanrawdevice |
135 | }); | |
136 | ||
137 | column2.push({ | |
138 | xtype: 'pveVlanField', | |
139 | name: 'vlan-id', | |
ea7da80c | 140 | value: me.vlanidvalue, |
8aefd47c | 141 | disabled: me.disablevlanid |
1aaba242 | 142 | }); |
8aefd47c | 143 | |
1aaba242 TL |
144 | columnB.push({ |
145 | xtype: 'label', | |
146 | userCls: 'pmx-hint', | |
147 | text: 'Either add the VLAN number to an existing interface name, or choose your own name and set the VLAN raw device (for the latter ifupdown1 supports vlanXY naming only)', | |
8aefd47c AD |
148 | }); |
149 | ||
a58001dd DM |
150 | } else if (me.iftype === 'bond') { |
151 | column2.push({ | |
152 | xtype: 'textfield', | |
153 | fieldLabel: gettext('Slaves'), | |
154 | name: 'slaves' | |
155 | }); | |
156 | ||
157 | var policySelector = Ext.createWidget('bondPolicySelector', { | |
158 | fieldLabel: gettext('Hash policy'), | |
159 | name: 'bond_xmit_hash_policy', | |
b33f451f | 160 | deleteEmpty: !me.isCreate, |
a58001dd DM |
161 | disabled: true |
162 | }); | |
163 | ||
b154853a AD |
164 | var primaryfield = Ext.createWidget('textfield', { |
165 | fieldLabel: gettext('bond-primary'), | |
166 | name: 'bond-primary', | |
167 | value: '', | |
168 | disabled: true | |
169 | }); | |
170 | ||
a58001dd DM |
171 | column2.push({ |
172 | xtype: 'bondModeSelector', | |
173 | fieldLabel: gettext('Mode'), | |
174 | name: 'bond_mode', | |
b33f451f | 175 | value: me.isCreate ? 'balance-rr' : undefined, |
a58001dd DM |
176 | listeners: { |
177 | change: function(f, value) { | |
178 | if (value === 'balance-xor' || | |
179 | value === '802.3ad') { | |
180 | policySelector.setDisabled(false); | |
b154853a AD |
181 | primaryfield.setDisabled(true); |
182 | primaryfield.setValue(''); | |
183 | } else if (value === 'active-backup') { | |
184 | primaryfield.setDisabled(false); | |
185 | policySelector.setDisabled(true); | |
186 | policySelector.setValue(''); | |
a58001dd DM |
187 | } else { |
188 | policySelector.setDisabled(true); | |
189 | policySelector.setValue(''); | |
b154853a AD |
190 | primaryfield.setDisabled(true); |
191 | primaryfield.setValue(''); | |
a58001dd DM |
192 | } |
193 | } | |
194 | }, | |
195 | allowBlank: false | |
196 | }); | |
197 | ||
198 | column2.push(policySelector); | |
b154853a | 199 | column2.push(primaryfield); |
a58001dd DM |
200 | |
201 | } else if (me.iftype === 'OVSBond') { | |
202 | column2.push({ | |
b33f451f | 203 | xtype: me.isCreate ? 'PVE.form.BridgeSelector' : 'displayfield', |
a58001dd DM |
204 | fieldLabel: Proxmox.Utils.render_network_iface_type('OVSBridge'), |
205 | allowBlank: false, | |
206 | nodename: me.nodename, | |
207 | bridgeType: 'OVSBridge', | |
208 | name: 'ovs_bridge' | |
209 | }); | |
210 | column2.push({ | |
211 | xtype: 'pveVlanField', | |
b33f451f | 212 | deleteEmpty: !me.isCreate, |
a58001dd DM |
213 | name: 'ovs_tag', |
214 | value: '' | |
215 | }); | |
216 | column2.push({ | |
217 | xtype: 'textfield', | |
218 | fieldLabel: gettext('OVS options'), | |
219 | name: 'ovs_options' | |
220 | }); | |
221 | } | |
222 | ||
223 | column2.push({ | |
224 | xtype: 'textfield', | |
225 | fieldLabel: gettext('Comment'), | |
226 | allowBlank: true, | |
227 | nodename: me.nodename, | |
228 | name: 'comments' | |
229 | }); | |
230 | ||
231 | var url; | |
232 | var method; | |
233 | ||
b33f451f | 234 | if (me.isCreate) { |
a58001dd DM |
235 | url = "/api2/extjs/nodes/" + me.nodename + "/network"; |
236 | method = 'POST'; | |
237 | } else { | |
238 | url = "/api2/extjs/nodes/" + me.nodename + "/network/" + me.iface; | |
239 | method = 'PUT'; | |
240 | } | |
241 | ||
5c833def | 242 | column1.push({ |
ea7da80c TL |
243 | xtype: 'hiddenfield', |
244 | name: 'type', | |
245 | value: me.iftype | |
246 | }, | |
247 | { | |
248 | xtype: me.isCreate ? 'textfield' : 'displayfield', | |
249 | fieldLabel: gettext('Name'), | |
250 | name: 'iface', | |
251 | value: me.iface, | |
252 | vtype: iface_vtype, | |
253 | allowBlank: false, | |
254 | listeners: { | |
255 | change: function(f, value) { | |
256 | if (me.isCreate && iface_vtype === 'VlanName') { | |
257 | var vlanidField = me.down('field[name=vlan-id]'); | |
258 | var vlanrawdeviceField = me.down('field[name=vlan-raw-device]'); | |
259 | if (Proxmox.Utils.VlanInterface_match.test(value)) { | |
260 | vlanidField.setDisabled(true); | |
261 | vlanrawdeviceField.setDisabled(true); | |
262 | } else if (Proxmox.Utils.Vlan_match.test(value)) { | |
263 | vlanidField.setDisabled(true); | |
264 | vlanrawdeviceField.setDisabled(false); | |
265 | } else { | |
266 | vlanidField.setDisabled(false); | |
267 | vlanrawdeviceField.setDisabled(false); | |
268 | } | |
269 | } | |
270 | } | |
a58001dd | 271 | } |
5c833def | 272 | }); |
a58001dd DM |
273 | |
274 | if (me.iftype === 'OVSBond') { | |
275 | column1.push( | |
276 | { | |
277 | xtype: 'bondModeSelector', | |
278 | fieldLabel: gettext('Mode'), | |
279 | name: 'bond_mode', | |
280 | openvswitch: true, | |
b33f451f | 281 | value: me.isCreate ? 'active-backup' : undefined, |
a58001dd DM |
282 | allowBlank: false |
283 | }, | |
284 | { | |
285 | xtype: 'textfield', | |
286 | fieldLabel: gettext('Slaves'), | |
287 | name: 'ovs_bonds' | |
288 | } | |
289 | ); | |
290 | } else { | |
291 | ||
292 | column1.push( | |
293 | { | |
a0ec1620 | 294 | xtype: 'proxmoxtextfield', |
b33f451f | 295 | deleteEmpty: !me.isCreate, |
8e2d096c DC |
296 | fieldLabel: 'IPv4/CIDR', |
297 | vtype: 'IPCIDRAddress', | |
298 | name: 'cidr' | |
a58001dd DM |
299 | }, |
300 | { | |
a0ec1620 | 301 | xtype: 'proxmoxtextfield', |
b33f451f | 302 | deleteEmpty: !me.isCreate, |
8e2d096c | 303 | fieldLabel: gettext('Gateway') + ' (IPv4)', |
a58001dd DM |
304 | vtype: 'IPAddress', |
305 | name: 'gateway' | |
306 | }, | |
307 | { | |
a0ec1620 | 308 | xtype: 'proxmoxtextfield', |
b33f451f | 309 | deleteEmpty: !me.isCreate, |
8e2d096c DC |
310 | fieldLabel: 'IPv6/CIDR', |
311 | vtype: 'IP6CIDRAddress', | |
312 | name: 'cidr6' | |
a58001dd DM |
313 | }, |
314 | { | |
a0ec1620 | 315 | xtype: 'proxmoxtextfield', |
b33f451f | 316 | deleteEmpty: !me.isCreate, |
8e2d096c | 317 | fieldLabel: gettext('Gateway') + ' (IPv6)', |
a58001dd DM |
318 | vtype: 'IP6Address', |
319 | name: 'gateway6' | |
aedaf2b6 | 320 | }, |
5c833def TL |
321 | ); |
322 | advancedColumn1. push( | |
aedaf2b6 AD |
323 | { |
324 | xtype: 'proxmoxintegerfield', | |
325 | minValue: 1280, | |
326 | maxValue: 65520, | |
327 | deleteEmpty: !me.isCreate, | |
5c833def | 328 | emptyText: 1500, |
aedaf2b6 AD |
329 | fieldLabel: 'MTU', |
330 | name: 'mtu' | |
5c833def | 331 | }, |
a58001dd DM |
332 | ); |
333 | } | |
334 | ||
335 | Ext.applyIf(me, { | |
336 | url: url, | |
337 | method: method, | |
338 | items: { | |
339 | xtype: 'inputpanel', | |
340 | column1: column1, | |
5c833def | 341 | column2: column2, |
1aaba242 | 342 | columnB: columnB, |
5c833def TL |
343 | advancedColumn1: advancedColumn1, |
344 | advancedColumn2: advancedColumn2, | |
a58001dd DM |
345 | } |
346 | }); | |
347 | ||
348 | me.callParent(); | |
349 | ||
b33f451f | 350 | if (me.isCreate) { |
a58001dd DM |
351 | me.down('field[name=iface]').setValue(me.iface_default); |
352 | } else { | |
353 | me.load({ | |
354 | success: function(response, options) { | |
355 | var data = response.result.data; | |
356 | if (data.type !== me.iftype) { | |
357 | var msg = "Got unexpected device type"; | |
358 | Ext.Msg.alert(gettext('Error'), msg, function() { | |
359 | me.close(); | |
360 | }); | |
361 | return; | |
362 | } | |
363 | me.setValues(data); | |
364 | me.isValid(); // trigger validation | |
365 | } | |
366 | }); | |
367 | } | |
368 | } | |
369 | }); |