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