]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - node/NetworkEdit.js
utils: some eslint fixes and refactoring
[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
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});