]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - node/NetworkView.js
some more eslint fixes
[proxmox-widget-toolkit.git] / node / NetworkView.js
CommitLineData
a58001dd
DM
1Ext.define('proxmox-networks', {
2 extend: 'Ext.data.Model',
3 fields: [
82b8bfb0
TL
4 'active',
5 'address',
6 'address6',
7 'autostart',
8 'bridge_ports',
9 'cidr',
10 'cidr6',
11 'comments',
12 'gateway',
13 'gateway6',
14 'iface',
15 'netmask',
16 'netmask6',
17 'slaves',
18 'type',
a58001dd 19 ],
01031528 20 idProperty: 'iface',
a58001dd
DM
21});
22
23Ext.define('Proxmox.node.NetworkView', {
24 extend: 'Ext.panel.Panel',
25
26 alias: ['widget.proxmoxNodeNetworkView'],
27
7c0e4c25
DC
28 // defines what types of network devices we want to create
29 // order is always the same
8aefd47c 30 types: ['bridge', 'bond', 'vlan', 'ovs'],
7c0e4c25 31
21cd6c09
DC
32 showApplyBtn: false,
33
01031528 34 initComponent: function() {
a58001dd
DM
35 var me = this;
36
37 if (!me.nodename) {
38 throw "no node name specified";
39 }
40
41 var baseUrl = '/nodes/' + me.nodename + '/network';
42
43 var store = Ext.create('Ext.data.Store', {
44 model: 'proxmox-networks',
45 proxy: {
46 type: 'proxmox',
01031528 47 url: '/api2/json' + baseUrl,
a58001dd
DM
48 },
49 sorters: [
50 {
01031528
TL
51 property: 'iface',
52 direction: 'ASC',
53 },
54 ],
a58001dd
DM
55 });
56
57 var reload = function() {
58 var changeitem = me.down('#changes');
21cd6c09 59 var apply_btn = me.down('#apply');
03e93db5 60 var revert_btn = me.down('#revert');
a58001dd
DM
61 Proxmox.Utils.API2Request({
62 url: baseUrl,
63 failure: function(response, opts) {
a58001dd 64 store.loadData({});
b81cf173
DM
65 Proxmox.Utils.setErrorMask(me, response.htmlStatus);
66 changeitem.update('');
89f57452 67 changeitem.setHidden(true);
a58001dd
DM
68 },
69 success: function(response, opts) {
70 var result = Ext.decode(response.responseText);
71 store.loadData(result.data);
72 var changes = result.changes;
73 if (changes === undefined || changes === '') {
74 changes = gettext("No changes");
89f57452 75 changeitem.setHidden(true);
21cd6c09 76 apply_btn.setDisabled(true);
03e93db5 77 revert_btn.setDisabled(true);
89f57452
DM
78 } else {
79 changeitem.update("<pre>" + Ext.htmlEncode(changes) + "</pre>");
80 changeitem.setHidden(false);
21cd6c09 81 apply_btn.setDisabled(false);
03e93db5 82 revert_btn.setDisabled(false);
a58001dd 83 }
01031528 84 },
a58001dd
DM
85 });
86 };
87
88 var run_editor = function() {
89 var grid = me.down('gridpanel');
90 var sm = grid.getSelectionModel();
91 var rec = sm.getSelection()[0];
92 if (!rec) {
93 return;
94 }
95
96 var win = Ext.create('Proxmox.node.NetworkEdit', {
97 nodename: me.nodename,
98 iface: rec.data.iface,
01031528 99 iftype: rec.data.type,
a58001dd
DM
100 });
101 win.show();
102 win.on('destroy', reload);
103 };
104
105 var edit_btn = new Ext.Button({
106 text: gettext('Edit'),
107 disabled: true,
01031528 108 handler: run_editor,
a58001dd
DM
109 });
110
111 var del_btn = new Ext.Button({
112 text: gettext('Remove'),
113 disabled: true,
01031528 114 handler: function() {
a58001dd
DM
115 var grid = me.down('gridpanel');
116 var sm = grid.getSelectionModel();
117 var rec = sm.getSelection()[0];
118 if (!rec) {
119 return;
120 }
121
122 var iface = rec.data.iface;
123
124 Proxmox.Utils.API2Request({
125 url: baseUrl + '/' + iface,
126 method: 'DELETE',
127 waitMsgTarget: me,
128 callback: function() {
129 reload();
130 },
131 failure: function(response, opts) {
132 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
01031528 133 },
a58001dd 134 });
01031528 135 },
a58001dd
DM
136 });
137
21cd6c09
DC
138 var apply_btn = Ext.create('Proxmox.button.Button', {
139 text: gettext('Apply Configuration'),
140 itemId: 'apply',
141 disabled: true,
2877ddea 142 confirmMsg: 'Do you want to apply pending network changes?',
21cd6c09
DC
143 hidden: !me.showApplyBtn,
144 handler: function() {
145 Proxmox.Utils.API2Request({
146 url: baseUrl,
147 method: 'PUT',
148 waitMsgTarget: me,
149 success: function(response, opts) {
150 var upid = response.result.data;
151
152 var win = Ext.create('Proxmox.window.TaskProgress', {
153 taskDone: reload,
01031528 154 upid: upid,
21cd6c09
DC
155 });
156 win.show();
157 },
158 failure: function(response, opts) {
159 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
01031528 160 },
21cd6c09 161 });
01031528 162 },
21cd6c09
DC
163 });
164
a58001dd
DM
165 var set_button_status = function() {
166 var grid = me.down('gridpanel');
167 var sm = grid.getSelectionModel();
168 var rec = sm.getSelection()[0];
169
170 edit_btn.setDisabled(!rec);
171 del_btn.setDisabled(!rec);
172 };
173
a58001dd
DM
174 var render_ports = function(value, metaData, record) {
175 if (value === 'bridge') {
176 return record.data.bridge_ports;
177 } else if (value === 'bond') {
178 return record.data.slaves;
179 } else if (value === 'OVSBridge') {
180 return record.data.ovs_ports;
181 } else if (value === 'OVSBond') {
182 return record.data.ovs_bonds;
183 }
184 };
185
186 var find_next_iface_id = function(prefix) {
187 var next;
188 for (next = 0; next <= 9999; next++) {
189 if (!store.getById(prefix + next.toString())) {
190 break;
191 }
192 }
193 return prefix + next.toString();
194 };
195
7c0e4c25
DC
196 var menu_items = [];
197
198 if (me.types.indexOf('bridge') !== -1) {
199 menu_items.push({
200 text: Proxmox.Utils.render_network_iface_type('bridge'),
201 handler: function() {
202 var win = Ext.create('Proxmox.node.NetworkEdit', {
203 nodename: me.nodename,
204 iftype: 'bridge',
25f37cbf
TL
205 iface_default: find_next_iface_id('vmbr'),
206 onlineHelp: 'sysadmin_network_configuration',
7c0e4c25
DC
207 });
208 win.on('destroy', reload);
209 win.show();
01031528 210 },
7c0e4c25
DC
211 });
212 }
213
214 if (me.types.indexOf('bond') !== -1) {
215 menu_items.push({
216 text: Proxmox.Utils.render_network_iface_type('bond'),
217 handler: function() {
218 var win = Ext.create('Proxmox.node.NetworkEdit', {
219 nodename: me.nodename,
220 iftype: 'bond',
25f37cbf
TL
221 iface_default: find_next_iface_id('bond'),
222 onlineHelp: 'sysadmin_network_configuration',
7c0e4c25
DC
223 });
224 win.on('destroy', reload);
225 win.show();
01031528 226 },
7c0e4c25
DC
227 });
228 }
229
8aefd47c
AD
230 if (me.types.indexOf('vlan') !== -1) {
231 menu_items.push({
232 text: Proxmox.Utils.render_network_iface_type('vlan'),
233 handler: function() {
234 var win = Ext.create('Proxmox.node.NetworkEdit', {
235 nodename: me.nodename,
236 iftype: 'vlan',
25f37cbf
TL
237 iface_default: 'interfaceX.1',
238 onlineHelp: 'sysadmin_network_configuration',
8aefd47c
AD
239 });
240 win.on('destroy', reload);
241 win.show();
01031528 242 },
8aefd47c
AD
243 });
244 }
245
7c0e4c25
DC
246 if (me.types.indexOf('ovs') !== -1) {
247 if (menu_items.length > 0) {
248 menu_items.push({ xtype: 'menuseparator' });
249 }
250
251 menu_items.push(
252 {
253 text: Proxmox.Utils.render_network_iface_type('OVSBridge'),
254 handler: function() {
255 var win = Ext.create('Proxmox.node.NetworkEdit', {
256 nodename: me.nodename,
257 iftype: 'OVSBridge',
01031528 258 iface_default: find_next_iface_id('vmbr'),
7c0e4c25
DC
259 });
260 win.on('destroy', reload);
261 win.show();
01031528 262 },
7c0e4c25
DC
263 },
264 {
265 text: Proxmox.Utils.render_network_iface_type('OVSBond'),
266 handler: function() {
267 var win = Ext.create('Proxmox.node.NetworkEdit', {
268 nodename: me.nodename,
269 iftype: 'OVSBond',
01031528 270 iface_default: find_next_iface_id('bond'),
7c0e4c25
DC
271 });
272 win.on('destroy', reload);
273 win.show();
01031528 274 },
7c0e4c25
DC
275 },
276 {
277 text: Proxmox.Utils.render_network_iface_type('OVSIntPort'),
278 handler: function() {
279 var win = Ext.create('Proxmox.node.NetworkEdit', {
280 nodename: me.nodename,
01031528 281 iftype: 'OVSIntPort',
7c0e4c25
DC
282 });
283 win.on('destroy', reload);
284 win.show();
01031528
TL
285 },
286 },
7c0e4c25
DC
287 );
288 }
289
d0c2b878
DC
290 var renderer_generator = function(fieldname) {
291 return function(val, metaData, rec) {
292 var tmp = [];
293 if (rec.data[fieldname]) {
294 tmp.push(rec.data[fieldname]);
295 }
296 if (rec.data[fieldname + '6']) {
297 tmp.push(rec.data[fieldname + '6']);
298 }
299 return tmp.join('<br>') || '';
300 };
301 };
302
a58001dd
DM
303 Ext.apply(me, {
304 layout: 'border',
305 tbar: [
306 {
307 text: gettext('Create'),
7c0e4c25 308 menu: {
a58001dd 309 plain: true,
01031528
TL
310 items: menu_items,
311 },
1cf31d6b 312 }, '-',
a58001dd
DM
313 {
314 text: gettext('Revert'),
03e93db5 315 itemId: 'revert',
a58001dd
DM
316 handler: function() {
317 Proxmox.Utils.API2Request({
318 url: baseUrl,
319 method: 'DELETE',
320 waitMsgTarget: me,
321 callback: function() {
322 reload();
323 },
324 failure: function(response, opts) {
325 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
01031528 326 },
a58001dd 327 });
01031528 328 },
a58001dd
DM
329 },
330 edit_btn,
21cd6c09 331 del_btn,
1cf31d6b 332 '-',
01031528 333 apply_btn,
a58001dd
DM
334 ],
335 items: [
336 {
337 xtype: 'gridpanel',
338 stateful: true,
339 stateId: 'grid-node-network',
340 store: store,
341 region: 'center',
342 border: false,
343 columns: [
344 {
345 header: gettext('Name'),
a58001dd 346 sortable: true,
01031528 347 dataIndex: 'iface',
a58001dd
DM
348 },
349 {
350 header: gettext('Type'),
a58001dd 351 sortable: true,
869439b1 352 width: 120,
a58001dd 353 renderer: Proxmox.Utils.render_network_iface_type,
01031528 354 dataIndex: 'type',
a58001dd
DM
355 },
356 {
357 xtype: 'booleancolumn',
358 header: gettext('Active'),
359 width: 80,
360 sortable: true,
361 dataIndex: 'active',
9b575917
WL
362 trueText: Proxmox.Utils.yesText,
363 falseText: Proxmox.Utils.noText,
364 undefinedText: Proxmox.Utils.noText,
a58001dd
DM
365 },
366 {
367 xtype: 'booleancolumn',
368 header: gettext('Autostart'),
369 width: 80,
370 sortable: true,
371 dataIndex: 'autostart',
9b575917
WL
372 trueText: Proxmox.Utils.yesText,
373 falseText: Proxmox.Utils.noText,
01031528 374 undefinedText: Proxmox.Utils.noText,
a58001dd 375 },
8947a4fc
WL
376 {
377 xtype: 'booleancolumn',
378 header: gettext('VLAN aware'),
379 width: 80,
380 sortable: true,
381 dataIndex: 'bridge_vlan_aware',
382 trueText: Proxmox.Utils.yesText,
383 falseText: Proxmox.Utils.noText,
01031528 384 undefinedText: Proxmox.Utils.noText,
8947a4fc 385 },
a58001dd
DM
386 {
387 header: gettext('Ports/Slaves'),
388 dataIndex: 'type',
01031528 389 renderer: render_ports,
a58001dd 390 },
211bdf93
DC
391 {
392 header: gettext('Bond Mode'),
393 dataIndex: 'bond_mode',
394 renderer: Proxmox.Utils.render_bond_mode,
395 },
396 {
397 header: gettext('Hash Policy'),
398 hidden: true,
399 dataIndex: 'bond_xmit_hash_policy',
400 },
a58001dd
DM
401 {
402 header: gettext('IP address'),
403 sortable: true,
869439b1 404 width: 120,
4211996a 405 hidden: true,
a58001dd 406 dataIndex: 'address',
d0c2b878 407 renderer: renderer_generator('address'),
a58001dd
DM
408 },
409 {
410 header: gettext('Subnet mask'),
869439b1 411 width: 120,
a58001dd 412 sortable: true,
4211996a 413 hidden: true,
d0c2b878
DC
414 dataIndex: 'netmask',
415 renderer: renderer_generator('netmask'),
416 },
417 {
418 header: gettext('CIDR'),
f4d366dc 419 width: 150,
d0c2b878
DC
420 sortable: true,
421 dataIndex: 'cidr',
422 renderer: renderer_generator('cidr'),
a58001dd
DM
423 },
424 {
425 header: gettext('Gateway'),
f4d366dc 426 width: 150,
a58001dd
DM
427 sortable: true,
428 dataIndex: 'gateway',
d0c2b878 429 renderer: renderer_generator('gateway'),
a58001dd
DM
430 },
431 {
432 header: gettext('Comment'),
433 dataIndex: 'comments',
869439b1 434 flex: 1,
01031528
TL
435 renderer: Ext.String.htmlEncode,
436 },
a58001dd
DM
437 ],
438 listeners: {
439 selectionchange: set_button_status,
01031528
TL
440 itemdblclick: run_editor,
441 },
a58001dd
DM
442 },
443 {
444 border: false,
445 region: 'south',
446 autoScroll: true,
89f57452 447 hidden: true,
a58001dd
DM
448 itemId: 'changes',
449 tbar: [
450 gettext('Pending changes') + ' (' +
01031528 451 gettext("Either reboot or use 'Apply Configuration' (needs ifupdown2) to activate") + ')',
a58001dd
DM
452 ],
453 split: true,
454 bodyPadding: 5,
455 flex: 0.6,
01031528
TL
456 html: gettext("No changes"),
457 },
a58001dd 458 ],
a58001dd
DM
459 });
460
461 me.callParent();
1a68e95d 462 reload();
01031528 463 },
a58001dd 464});