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', '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 Proxmox
.Utils
.API2Request({
53 failure: function(response
, opts
) {
55 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
56 changeitem
.update('');
57 changeitem
.setHidden(true);
59 success: function(response
, opts
) {
60 var result
= Ext
.decode(response
.responseText
);
61 store
.loadData(result
.data
);
62 var changes
= result
.changes
;
63 if (changes
=== undefined || changes
=== '') {
64 changes
= gettext("No changes");
65 changeitem
.setHidden(true);
66 apply_btn
.setDisabled(true);
68 changeitem
.update("<pre>" + Ext
.htmlEncode(changes
) + "</pre>");
69 changeitem
.setHidden(false);
70 apply_btn
.setDisabled(false);
76 var run_editor = function() {
77 var grid
= me
.down('gridpanel');
78 var sm
= grid
.getSelectionModel();
79 var rec
= sm
.getSelection()[0];
84 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
85 nodename
: me
.nodename
,
86 iface
: rec
.data
.iface
,
90 win
.on('destroy', reload
);
93 var edit_btn
= new Ext
.Button({
94 text
: gettext('Edit'),
99 var del_btn
= new Ext
.Button({
100 text
: gettext('Remove'),
103 var grid
= me
.down('gridpanel');
104 var sm
= grid
.getSelectionModel();
105 var rec
= sm
.getSelection()[0];
110 var iface
= rec
.data
.iface
;
112 Proxmox
.Utils
.API2Request({
113 url
: baseUrl
+ '/' + iface
,
116 callback: function() {
119 failure: function(response
, opts
) {
120 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
126 var apply_btn
= Ext
.create('Proxmox.button.Button', {
127 text
: gettext('Apply Configuration'),
130 hidden
: !me
.showApplyBtn
,
131 handler: function() {
132 Proxmox
.Utils
.API2Request({
136 success: function(response
, opts
) {
137 var upid
= response
.result
.data
;
139 var win
= Ext
.create('Proxmox.window.TaskProgress', {
145 failure: function(response
, opts
) {
146 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
152 var set_button_status = function() {
153 var grid
= me
.down('gridpanel');
154 var sm
= grid
.getSelectionModel();
155 var rec
= sm
.getSelection()[0];
157 edit_btn
.setDisabled(!rec
);
158 del_btn
.setDisabled(!rec
);
161 var render_ports = function(value
, metaData
, record
) {
162 if (value
=== 'bridge') {
163 return record
.data
.bridge_ports
;
164 } else if (value
=== 'bond') {
165 return record
.data
.slaves
;
166 } else if (value
=== 'OVSBridge') {
167 return record
.data
.ovs_ports
;
168 } else if (value
=== 'OVSBond') {
169 return record
.data
.ovs_bonds
;
173 var find_next_iface_id = function(prefix
) {
175 for (next
= 0; next
<= 9999; next
++) {
176 if (!store
.getById(prefix
+ next
.toString())) {
180 return prefix
+ next
.toString();
185 if (me
.types
.indexOf('bridge') !== -1) {
187 text
: Proxmox
.Utils
.render_network_iface_type('bridge'),
188 handler: function() {
189 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
190 nodename
: me
.nodename
,
192 iface_default
: find_next_iface_id('vmbr')
194 win
.on('destroy', reload
);
200 if (me
.types
.indexOf('bond') !== -1) {
202 text
: Proxmox
.Utils
.render_network_iface_type('bond'),
203 handler: function() {
204 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
205 nodename
: me
.nodename
,
207 iface_default
: find_next_iface_id('bond')
209 win
.on('destroy', reload
);
215 if (me
.types
.indexOf('ovs') !== -1) {
216 if (menu_items
.length
> 0) {
217 menu_items
.push({ xtype
: 'menuseparator' });
222 text
: Proxmox
.Utils
.render_network_iface_type('OVSBridge'),
223 handler: function() {
224 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
225 nodename
: me
.nodename
,
227 iface_default
: find_next_iface_id('vmbr')
229 win
.on('destroy', reload
);
234 text
: Proxmox
.Utils
.render_network_iface_type('OVSBond'),
235 handler: function() {
236 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
237 nodename
: me
.nodename
,
239 iface_default
: find_next_iface_id('bond')
241 win
.on('destroy', reload
);
246 text
: Proxmox
.Utils
.render_network_iface_type('OVSIntPort'),
247 handler: function() {
248 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
249 nodename
: me
.nodename
,
252 win
.on('destroy', reload
);
259 var renderer_generator = function(fieldname
) {
260 return function(val
, metaData
, rec
) {
262 if (rec
.data
[fieldname
]) {
263 tmp
.push(rec
.data
[fieldname
]);
265 if (rec
.data
[fieldname
+ '6']) {
266 tmp
.push(rec
.data
[fieldname
+ '6']);
268 return tmp
.join('<br>') || '';
276 text
: gettext('Create'),
283 text
: gettext('Revert'),
284 handler: function() {
285 Proxmox
.Utils
.API2Request({
289 callback: function() {
292 failure: function(response
, opts
) {
293 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
307 stateId
: 'grid-node-network',
313 header
: gettext('Name'),
318 header
: gettext('Type'),
321 renderer
: Proxmox
.Utils
.render_network_iface_type
,
325 xtype
: 'booleancolumn',
326 header
: gettext('Active'),
330 trueText
: Proxmox
.Utils
.yesText
,
331 falseText
: Proxmox
.Utils
.noText
,
332 undefinedText
: Proxmox
.Utils
.noText
,
335 xtype
: 'booleancolumn',
336 header
: gettext('Autostart'),
339 dataIndex
: 'autostart',
340 trueText
: Proxmox
.Utils
.yesText
,
341 falseText
: Proxmox
.Utils
.noText
,
342 undefinedText
: Proxmox
.Utils
.noText
345 xtype
: 'booleancolumn',
346 header
: gettext('VLAN aware'),
349 dataIndex
: 'bridge_vlan_aware',
350 trueText
: Proxmox
.Utils
.yesText
,
351 falseText
: Proxmox
.Utils
.noText
,
352 undefinedText
: Proxmox
.Utils
.noText
355 header
: gettext('Ports/Slaves'),
357 renderer
: render_ports
360 header
: gettext('Bond Mode'),
361 dataIndex
: 'bond_mode',
362 renderer
: Proxmox
.Utils
.render_bond_mode
,
365 header
: gettext('Hash Policy'),
367 dataIndex
: 'bond_xmit_hash_policy',
370 header
: gettext('IP address'),
374 dataIndex
: 'address',
375 renderer
: renderer_generator('address'),
378 header
: gettext('Subnet mask'),
382 dataIndex
: 'netmask',
383 renderer
: renderer_generator('netmask'),
386 header
: gettext('CIDR'),
390 renderer
: renderer_generator('cidr'),
393 header
: gettext('Gateway'),
396 dataIndex
: 'gateway',
397 renderer
: renderer_generator('gateway'),
400 header
: gettext('Comment'),
401 dataIndex
: 'comments',
403 renderer
: Ext
.String
.htmlEncode
407 selectionchange
: set_button_status
,
408 itemdblclick
: run_editor
418 gettext('Pending changes') + ' (' +
419 gettext('Please reboot or apply to activate changes') + ')'
424 html
: gettext("No changes")