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',
13 Ext
.define('Proxmox.node.NetworkView', {
14 extend
: 'Ext.panel.Panel',
16 alias
: ['widget.proxmoxNodeNetworkView'],
18 initComponent : function() {
22 throw "no node name specified";
25 var baseUrl
= '/nodes/' + me
.nodename
+ '/network';
27 var store
= Ext
.create('Ext.data.Store', {
28 model
: 'proxmox-networks',
31 url
: '/api2/json' + baseUrl
41 var reload = function() {
42 var changeitem
= me
.down('#changes');
43 Proxmox
.Utils
.API2Request({
45 failure: function(response
, opts
) {
46 changeitem
.update(gettext('Error') + ': ' + response
.htmlStatus
);
48 changeitem
.setHidden(true);
50 success: function(response
, opts
) {
51 var result
= Ext
.decode(response
.responseText
);
52 store
.loadData(result
.data
);
53 var changes
= result
.changes
;
54 if (changes
=== undefined || changes
=== '') {
55 changes
= gettext("No changes");
56 changeitem
.setHidden(true);
58 changeitem
.update("<pre>" + Ext
.htmlEncode(changes
) + "</pre>");
59 changeitem
.setHidden(false);
65 var run_editor = function() {
66 var grid
= me
.down('gridpanel');
67 var sm
= grid
.getSelectionModel();
68 var rec
= sm
.getSelection()[0];
73 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
74 nodename
: me
.nodename
,
75 iface
: rec
.data
.iface
,
79 win
.on('destroy', reload
);
82 var edit_btn
= new Ext
.Button({
83 text
: gettext('Edit'),
88 var del_btn
= new Ext
.Button({
89 text
: gettext('Remove'),
92 var grid
= me
.down('gridpanel');
93 var sm
= grid
.getSelectionModel();
94 var rec
= sm
.getSelection()[0];
99 var iface
= rec
.data
.iface
;
101 Proxmox
.Utils
.API2Request({
102 url
: baseUrl
+ '/' + iface
,
105 callback: function() {
108 failure: function(response
, opts
) {
109 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
115 var set_button_status = function() {
116 var grid
= me
.down('gridpanel');
117 var sm
= grid
.getSelectionModel();
118 var rec
= sm
.getSelection()[0];
120 edit_btn
.setDisabled(!rec
);
121 del_btn
.setDisabled(!rec
);
124 Proxmox
.Utils
.monStoreErrors(me
, store
);
126 var render_ports = function(value
, metaData
, record
) {
127 if (value
=== 'bridge') {
128 return record
.data
.bridge_ports
;
129 } else if (value
=== 'bond') {
130 return record
.data
.slaves
;
131 } else if (value
=== 'OVSBridge') {
132 return record
.data
.ovs_ports
;
133 } else if (value
=== 'OVSBond') {
134 return record
.data
.ovs_bonds
;
138 var find_next_iface_id = function(prefix
) {
140 for (next
= 0; next
<= 9999; next
++) {
141 if (!store
.getById(prefix
+ next
.toString())) {
145 return prefix
+ next
.toString();
152 text
: gettext('Create'),
153 menu
: new Ext
.menu
.Menu({
157 text
: Proxmox
.Utils
.render_network_iface_type('bridge'),
158 handler: function() {
159 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
160 nodename
: me
.nodename
,
162 iface_default
: find_next_iface_id('vmbr')
164 win
.on('destroy', reload
);
169 text
: Proxmox
.Utils
.render_network_iface_type('bond'),
170 handler: function() {
171 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
172 nodename
: me
.nodename
,
174 iface_default
: find_next_iface_id('bond')
176 win
.on('destroy', reload
);
181 text
: Proxmox
.Utils
.render_network_iface_type('OVSBridge'),
182 handler: function() {
183 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
184 nodename
: me
.nodename
,
186 iface_default
: find_next_iface_id('vmbr')
188 win
.on('destroy', reload
);
193 text
: Proxmox
.Utils
.render_network_iface_type('OVSBond'),
194 handler: function() {
195 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
196 nodename
: me
.nodename
,
198 iface_default
: find_next_iface_id('bond')
200 win
.on('destroy', reload
);
205 text
: Proxmox
.Utils
.render_network_iface_type('OVSIntPort'),
206 handler: function() {
207 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
208 nodename
: me
.nodename
,
211 win
.on('destroy', reload
);
219 text
: gettext('Revert'),
220 handler: function() {
221 Proxmox
.Utils
.API2Request({
225 callback: function() {
228 failure: function(response
, opts
) {
229 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
241 stateId
: 'grid-node-network',
247 header
: gettext('Name'),
252 header
: gettext('Type'),
255 renderer
: Proxmox
.Utils
.render_network_iface_type
,
259 xtype
: 'booleancolumn',
260 header
: gettext('Active'),
269 xtype
: 'booleancolumn',
270 header
: gettext('Autostart'),
273 dataIndex
: 'autostart',
279 header
: gettext('Ports/Slaves'),
281 renderer
: render_ports
284 header
: gettext('IP address'),
287 dataIndex
: 'address',
288 renderer: function(value
, metaData
, rec
) {
289 if (rec
.data
.address
&& rec
.data
.address6
) {
290 return rec
.data
.address
+ "<br>"
291 + rec
.data
.address6
+ '/' + rec
.data
.netmask6
;
292 } else if (rec
.data
.address6
) {
293 return rec
.data
.address6
+ '/' + rec
.data
.netmask6
;
295 return rec
.data
.address
;
300 header
: gettext('Subnet mask'),
306 header
: gettext('Gateway'),
309 dataIndex
: 'gateway',
310 renderer: function(value
, metaData
, rec
) {
311 if (rec
.data
.gateway
&& rec
.data
.gateway6
) {
312 return rec
.data
.gateway
+ "<br>" + rec
.data
.gateway6
;
313 } else if (rec
.data
.gateway6
) {
314 return rec
.data
.gateway6
;
316 return rec
.data
.gateway
;
321 header
: gettext('Comment'),
322 dataIndex
: 'comments',
324 renderer
: Ext
.String
.htmlEncode
328 selectionchange
: set_button_status
,
329 itemdblclick
: run_editor
339 gettext('Pending changes') + ' (' +
340 gettext('Please reboot to activate changes') + ')'
345 html
: gettext("No changes")