'bridge_ports', 'slaves',
'address', 'netmask', 'gateway',
'address6', 'netmask6', 'gateway6',
+ 'cidr', 'cidr6',
'comments'
],
idProperty: 'iface'
// defines what types of network devices we want to create
// order is always the same
- types: ['bridge', 'bond', 'ovs'],
+ types: ['bridge', 'bond', 'vlan', 'ovs'],
+
+ showApplyBtn: false,
initComponent : function() {
var me = this;
var reload = function() {
var changeitem = me.down('#changes');
+ var apply_btn = me.down('#apply');
+ var revert_btn = me.down('#revert');
Proxmox.Utils.API2Request({
url: baseUrl,
failure: function(response, opts) {
if (changes === undefined || changes === '') {
changes = gettext("No changes");
changeitem.setHidden(true);
+ apply_btn.setDisabled(true);
+ revert_btn.setDisabled(true);
} else {
changeitem.update("<pre>" + Ext.htmlEncode(changes) + "</pre>");
changeitem.setHidden(false);
+ apply_btn.setDisabled(false);
+ revert_btn.setDisabled(false);
}
}
});
}
});
+ var apply_btn = Ext.create('Proxmox.button.Button', {
+ text: gettext('Apply Configuration'),
+ itemId: 'apply',
+ disabled: true,
+ confirmMsg: 'Do you want to apply pending network changes?',
+ hidden: !me.showApplyBtn,
+ handler: function() {
+ Proxmox.Utils.API2Request({
+ url: baseUrl,
+ method: 'PUT',
+ waitMsgTarget: me,
+ success: function(response, opts) {
+ var upid = response.result.data;
+
+ var win = Ext.create('Proxmox.window.TaskProgress', {
+ taskDone: reload,
+ upid: upid
+ });
+ win.show();
+ },
+ failure: function(response, opts) {
+ Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ }
+ });
+ }
+ });
+
var set_button_status = function() {
var grid = me.down('gridpanel');
var sm = grid.getSelectionModel();
var win = Ext.create('Proxmox.node.NetworkEdit', {
nodename: me.nodename,
iftype: 'bridge',
- iface_default: find_next_iface_id('vmbr')
+ iface_default: find_next_iface_id('vmbr'),
+ onlineHelp: 'sysadmin_network_configuration',
});
win.on('destroy', reload);
win.show();
var win = Ext.create('Proxmox.node.NetworkEdit', {
nodename: me.nodename,
iftype: 'bond',
- iface_default: find_next_iface_id('bond')
+ iface_default: find_next_iface_id('bond'),
+ onlineHelp: 'sysadmin_network_configuration',
+ });
+ win.on('destroy', reload);
+ win.show();
+ }
+ });
+ }
+
+ if (me.types.indexOf('vlan') !== -1) {
+ menu_items.push({
+ text: Proxmox.Utils.render_network_iface_type('vlan'),
+ handler: function() {
+ var win = Ext.create('Proxmox.node.NetworkEdit', {
+ nodename: me.nodename,
+ iftype: 'vlan',
+ iface_default: 'interfaceX.1',
+ onlineHelp: 'sysadmin_network_configuration',
});
win.on('destroy', reload);
win.show();
);
}
+ var renderer_generator = function(fieldname) {
+ return function(val, metaData, rec) {
+ var tmp = [];
+ if (rec.data[fieldname]) {
+ tmp.push(rec.data[fieldname]);
+ }
+ if (rec.data[fieldname + '6']) {
+ tmp.push(rec.data[fieldname + '6']);
+ }
+ return tmp.join('<br>') || '';
+ };
+ };
+
Ext.apply(me, {
layout: 'border',
tbar: [
plain: true,
items: menu_items
}
- }, ' ',
+ }, '-',
{
text: gettext('Revert'),
+ itemId: 'revert',
handler: function() {
Proxmox.Utils.API2Request({
url: baseUrl,
}
},
edit_btn,
- del_btn
+ del_btn,
+ '-',
+ apply_btn
],
items: [
{
width: 80,
sortable: true,
dataIndex: 'active',
- trueText: 'Yes',
- falseText: 'No',
- undefinedText: 'No'
+ trueText: Proxmox.Utils.yesText,
+ falseText: Proxmox.Utils.noText,
+ undefinedText: Proxmox.Utils.noText,
},
{
xtype: 'booleancolumn',
width: 80,
sortable: true,
dataIndex: 'autostart',
- trueText: 'Yes',
- falseText: 'No',
- undefinedText: 'No'
+ trueText: Proxmox.Utils.yesText,
+ falseText: Proxmox.Utils.noText,
+ undefinedText: Proxmox.Utils.noText
},
{
xtype: 'booleancolumn',
dataIndex: 'type',
renderer: render_ports
},
+ {
+ header: gettext('Bond Mode'),
+ dataIndex: 'bond_mode',
+ renderer: Proxmox.Utils.render_bond_mode,
+ },
+ {
+ header: gettext('Hash Policy'),
+ hidden: true,
+ dataIndex: 'bond_xmit_hash_policy',
+ },
{
header: gettext('IP address'),
sortable: true,
width: 120,
+ hidden: true,
dataIndex: 'address',
- renderer: function(value, metaData, rec) {
- if (rec.data.address && rec.data.address6) {
- return rec.data.address + "<br>"
- + rec.data.address6 + '/' + rec.data.netmask6;
- } else if (rec.data.address6) {
- return rec.data.address6 + '/' + rec.data.netmask6;
- } else {
- return rec.data.address;
- }
- }
+ renderer: renderer_generator('address'),
},
{
header: gettext('Subnet mask'),
width: 120,
sortable: true,
- dataIndex: 'netmask'
+ hidden: true,
+ dataIndex: 'netmask',
+ renderer: renderer_generator('netmask'),
+ },
+ {
+ header: gettext('CIDR'),
+ width: 120,
+ sortable: true,
+ dataIndex: 'cidr',
+ renderer: renderer_generator('cidr'),
},
{
header: gettext('Gateway'),
width: 120,
sortable: true,
dataIndex: 'gateway',
- renderer: function(value, metaData, rec) {
- if (rec.data.gateway && rec.data.gateway6) {
- return rec.data.gateway + "<br>" + rec.data.gateway6;
- } else if (rec.data.gateway6) {
- return rec.data.gateway6;
- } else {
- return rec.data.gateway;
- }
- }
+ renderer: renderer_generator('gateway'),
},
{
header: gettext('Comment'),
itemId: 'changes',
tbar: [
gettext('Pending changes') + ' (' +
- gettext('Please reboot to activate changes') + ')'
+ gettext("Either reboot or use 'Apply Configuration' (needs ifupdown2) to activate") + ')'
],
split: true,
bodyPadding: 5,