1 Ext
.define('proxmox-networks', {
2 extend
: 'Ext.data.Model',
4 'iface', 'type', 'active', 'autostart',
5 'bridge_ports', 'slaves',
6 'address', 'netmask', 'gateway',
7 'address6', 'netmask6', 'gateway6',
14 Ext
.define('Proxmox.node.NetworkView', {
15 extend
: 'Ext.panel.Panel',
17 alias
: ['widget.proxmoxNodeNetworkView'],
19 // defines what types of network devices we want to create
20 // order is always the same
21 types
: ['bridge', 'bond', 'vlan', 'ovs'],
25 initComponent : function() {
29 throw "no node name specified";
32 var baseUrl
= '/nodes/' + me
.nodename
+ '/network';
34 var store
= Ext
.create('Ext.data.Store', {
35 model
: 'proxmox-networks',
38 url
: '/api2/json' + baseUrl
48 var reload = function() {
49 var changeitem
= me
.down('#changes');
50 var apply_btn
= me
.down('#apply');
51 var revert_btn
= me
.down('#revert');
52 Proxmox
.Utils
.API2Request({
54 failure: function(response
, opts
) {
56 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
57 changeitem
.update('');
58 changeitem
.setHidden(true);
60 success: function(response
, opts
) {
61 var result
= Ext
.decode(response
.responseText
);
62 store
.loadData(result
.data
);
63 var changes
= result
.changes
;
64 if (changes
=== undefined || changes
=== '') {
65 changes
= gettext("No changes");
66 changeitem
.setHidden(true);
67 apply_btn
.setDisabled(true);
68 revert_btn
.setDisabled(true);
70 changeitem
.update("<pre>" + Ext
.htmlEncode(changes
) + "</pre>");
71 changeitem
.setHidden(false);
72 apply_btn
.setDisabled(false);
73 revert_btn
.setDisabled(false);
79 var run_editor = function() {
80 var grid
= me
.down('gridpanel');
81 var sm
= grid
.getSelectionModel();
82 var rec
= sm
.getSelection()[0];
87 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
88 nodename
: me
.nodename
,
89 iface
: rec
.data
.iface
,
93 win
.on('destroy', reload
);
96 var edit_btn
= new Ext
.Button({
97 text
: gettext('Edit'),
102 var del_btn
= new Ext
.Button({
103 text
: gettext('Remove'),
106 var grid
= me
.down('gridpanel');
107 var sm
= grid
.getSelectionModel();
108 var rec
= sm
.getSelection()[0];
113 var iface
= rec
.data
.iface
;
115 Proxmox
.Utils
.API2Request({
116 url
: baseUrl
+ '/' + iface
,
119 callback: function() {
122 failure: function(response
, opts
) {
123 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
129 var apply_btn
= Ext
.create('Proxmox.button.Button', {
130 text
: gettext('Apply Configuration'),
133 confirmMsg
: 'Do you want to apply pending network changes?',
134 hidden
: !me
.showApplyBtn
,
135 handler: function() {
136 Proxmox
.Utils
.API2Request({
140 success: function(response
, opts
) {
141 var upid
= response
.result
.data
;
143 var win
= Ext
.create('Proxmox.window.TaskProgress', {
149 failure: function(response
, opts
) {
150 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
156 var set_button_status = function() {
157 var grid
= me
.down('gridpanel');
158 var sm
= grid
.getSelectionModel();
159 var rec
= sm
.getSelection()[0];
161 edit_btn
.setDisabled(!rec
);
162 del_btn
.setDisabled(!rec
);
165 var render_ports = function(value
, metaData
, record
) {
166 if (value
=== 'bridge') {
167 return record
.data
.bridge_ports
;
168 } else if (value
=== 'bond') {
169 return record
.data
.slaves
;
170 } else if (value
=== 'OVSBridge') {
171 return record
.data
.ovs_ports
;
172 } else if (value
=== 'OVSBond') {
173 return record
.data
.ovs_bonds
;
177 var find_next_iface_id = function(prefix
) {
179 for (next
= 0; next
<= 9999; next
++) {
180 if (!store
.getById(prefix
+ next
.toString())) {
184 return prefix
+ next
.toString();
189 if (me
.types
.indexOf('bridge') !== -1) {
191 text
: Proxmox
.Utils
.render_network_iface_type('bridge'),
192 handler: function() {
193 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
194 nodename
: me
.nodename
,
196 iface_default
: find_next_iface_id('vmbr'),
197 onlineHelp
: 'sysadmin_network_configuration',
199 win
.on('destroy', reload
);
205 if (me
.types
.indexOf('bond') !== -1) {
207 text
: Proxmox
.Utils
.render_network_iface_type('bond'),
208 handler: function() {
209 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
210 nodename
: me
.nodename
,
212 iface_default
: find_next_iface_id('bond'),
213 onlineHelp
: 'sysadmin_network_configuration',
215 win
.on('destroy', reload
);
221 if (me
.types
.indexOf('vlan') !== -1) {
223 text
: Proxmox
.Utils
.render_network_iface_type('vlan'),
224 handler: function() {
225 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
226 nodename
: me
.nodename
,
228 iface_default
: 'interfaceX.1',
229 onlineHelp
: 'sysadmin_network_configuration',
231 win
.on('destroy', reload
);
237 if (me
.types
.indexOf('ovs') !== -1) {
238 if (menu_items
.length
> 0) {
239 menu_items
.push({ xtype
: 'menuseparator' });
244 text
: Proxmox
.Utils
.render_network_iface_type('OVSBridge'),
245 handler: function() {
246 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
247 nodename
: me
.nodename
,
249 iface_default
: find_next_iface_id('vmbr')
251 win
.on('destroy', reload
);
256 text
: Proxmox
.Utils
.render_network_iface_type('OVSBond'),
257 handler: function() {
258 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
259 nodename
: me
.nodename
,
261 iface_default
: find_next_iface_id('bond')
263 win
.on('destroy', reload
);
268 text
: Proxmox
.Utils
.render_network_iface_type('OVSIntPort'),
269 handler: function() {
270 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
271 nodename
: me
.nodename
,
274 win
.on('destroy', reload
);
281 var renderer_generator = function(fieldname
) {
282 return function(val
, metaData
, rec
) {
284 if (rec
.data
[fieldname
]) {
285 tmp
.push(rec
.data
[fieldname
]);
287 if (rec
.data
[fieldname
+ '6']) {
288 tmp
.push(rec
.data
[fieldname
+ '6']);
290 return tmp
.join('<br>') || '';
298 text
: gettext('Create'),
305 text
: gettext('Revert'),
307 handler: function() {
308 Proxmox
.Utils
.API2Request({
312 callback: function() {
315 failure: function(response
, opts
) {
316 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
330 stateId
: 'grid-node-network',
336 header
: gettext('Name'),
341 header
: gettext('Type'),
344 renderer
: Proxmox
.Utils
.render_network_iface_type
,
348 xtype
: 'booleancolumn',
349 header
: gettext('Active'),
353 trueText
: Proxmox
.Utils
.yesText
,
354 falseText
: Proxmox
.Utils
.noText
,
355 undefinedText
: Proxmox
.Utils
.noText
,
358 xtype
: 'booleancolumn',
359 header
: gettext('Autostart'),
362 dataIndex
: 'autostart',
363 trueText
: Proxmox
.Utils
.yesText
,
364 falseText
: Proxmox
.Utils
.noText
,
365 undefinedText
: Proxmox
.Utils
.noText
368 xtype
: 'booleancolumn',
369 header
: gettext('VLAN aware'),
372 dataIndex
: 'bridge_vlan_aware',
373 trueText
: Proxmox
.Utils
.yesText
,
374 falseText
: Proxmox
.Utils
.noText
,
375 undefinedText
: Proxmox
.Utils
.noText
378 header
: gettext('Ports/Slaves'),
380 renderer
: render_ports
383 header
: gettext('Bond Mode'),
384 dataIndex
: 'bond_mode',
385 renderer
: Proxmox
.Utils
.render_bond_mode
,
388 header
: gettext('Hash Policy'),
390 dataIndex
: 'bond_xmit_hash_policy',
393 header
: gettext('IP address'),
397 dataIndex
: 'address',
398 renderer
: renderer_generator('address'),
401 header
: gettext('Subnet mask'),
405 dataIndex
: 'netmask',
406 renderer
: renderer_generator('netmask'),
409 header
: gettext('CIDR'),
413 renderer
: renderer_generator('cidr'),
416 header
: gettext('Gateway'),
419 dataIndex
: 'gateway',
420 renderer
: renderer_generator('gateway'),
423 header
: gettext('Comment'),
424 dataIndex
: 'comments',
426 renderer
: Ext
.String
.htmlEncode
430 selectionchange
: set_button_status
,
431 itemdblclick
: run_editor
441 gettext('Pending changes') + ' (' +
442 gettext("Either reboot or use 'Apply Configuration' (needs ifupdown2) to activate") + ')'
447 html
: gettext("No changes")