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
);
49 success: function(response
, opts
) {
50 var result
= Ext
.decode(response
.responseText
);
51 store
.loadData(result
.data
);
52 var changes
= result
.changes
;
53 if (changes
=== undefined || changes
=== '') {
54 changes
= gettext("No changes");
56 changeitem
.update("<pre>" + Ext
.htmlEncode(changes
) + "</pre>");
61 var run_editor = function() {
62 var grid
= me
.down('gridpanel');
63 var sm
= grid
.getSelectionModel();
64 var rec
= sm
.getSelection()[0];
69 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
70 nodename
: me
.nodename
,
71 iface
: rec
.data
.iface
,
75 win
.on('destroy', reload
);
78 var edit_btn
= new Ext
.Button({
79 text
: gettext('Edit'),
84 var del_btn
= new Ext
.Button({
85 text
: gettext('Remove'),
88 var grid
= me
.down('gridpanel');
89 var sm
= grid
.getSelectionModel();
90 var rec
= sm
.getSelection()[0];
95 var iface
= rec
.data
.iface
;
97 Proxmox
.Utils
.API2Request({
98 url
: baseUrl
+ '/' + iface
,
101 callback: function() {
104 failure: function(response
, opts
) {
105 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
111 var set_button_status = function() {
112 var grid
= me
.down('gridpanel');
113 var sm
= grid
.getSelectionModel();
114 var rec
= sm
.getSelection()[0];
116 edit_btn
.setDisabled(!rec
);
117 del_btn
.setDisabled(!rec
);
120 Proxmox
.Utils
.monStoreErrors(me
, store
);
122 var render_ports = function(value
, metaData
, record
) {
123 if (value
=== 'bridge') {
124 return record
.data
.bridge_ports
;
125 } else if (value
=== 'bond') {
126 return record
.data
.slaves
;
127 } else if (value
=== 'OVSBridge') {
128 return record
.data
.ovs_ports
;
129 } else if (value
=== 'OVSBond') {
130 return record
.data
.ovs_bonds
;
134 var find_next_iface_id = function(prefix
) {
136 for (next
= 0; next
<= 9999; next
++) {
137 if (!store
.getById(prefix
+ next
.toString())) {
141 return prefix
+ next
.toString();
148 text
: gettext('Create'),
149 menu
: new Ext
.menu
.Menu({
153 text
: Proxmox
.Utils
.render_network_iface_type('bridge'),
154 handler: function() {
155 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
156 nodename
: me
.nodename
,
158 iface_default
: find_next_iface_id('vmbr')
160 win
.on('destroy', reload
);
165 text
: Proxmox
.Utils
.render_network_iface_type('bond'),
166 handler: function() {
167 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
168 nodename
: me
.nodename
,
170 iface_default
: find_next_iface_id('bond')
172 win
.on('destroy', reload
);
177 text
: Proxmox
.Utils
.render_network_iface_type('OVSBridge'),
178 handler: function() {
179 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
180 nodename
: me
.nodename
,
182 iface_default
: find_next_iface_id('vmbr')
184 win
.on('destroy', reload
);
189 text
: Proxmox
.Utils
.render_network_iface_type('OVSBond'),
190 handler: function() {
191 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
192 nodename
: me
.nodename
,
194 iface_default
: find_next_iface_id('bond')
196 win
.on('destroy', reload
);
201 text
: Proxmox
.Utils
.render_network_iface_type('OVSIntPort'),
202 handler: function() {
203 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
204 nodename
: me
.nodename
,
207 win
.on('destroy', reload
);
215 text
: gettext('Revert'),
216 handler: function() {
217 Proxmox
.Utils
.API2Request({
221 callback: function() {
224 failure: function(response
, opts
) {
225 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
237 stateId
: 'grid-node-network',
243 header
: gettext('Name'),
249 header
: gettext('Type'),
252 renderer
: Proxmox
.Utils
.render_network_iface_type
,
256 xtype
: 'booleancolumn',
257 header
: gettext('Active'),
266 xtype
: 'booleancolumn',
267 header
: gettext('Autostart'),
270 dataIndex
: 'autostart',
276 header
: gettext('Ports/Slaves'),
278 renderer
: render_ports
281 header
: gettext('IP address'),
283 dataIndex
: 'address',
284 renderer: function(value
, metaData
, rec
) {
285 if (rec
.data
.address
&& rec
.data
.address6
) {
286 return rec
.data
.address
+ "<br>"
287 + rec
.data
.address6
+ '/' + rec
.data
.netmask6
;
288 } else if (rec
.data
.address6
) {
289 return rec
.data
.address6
+ '/' + rec
.data
.netmask6
;
291 return rec
.data
.address
;
296 header
: gettext('Subnet mask'),
301 header
: gettext('Gateway'),
303 dataIndex
: 'gateway',
304 renderer: function(value
, metaData
, rec
) {
305 if (rec
.data
.gateway
&& rec
.data
.gateway6
) {
306 return rec
.data
.gateway
+ "<br>" + rec
.data
.gateway6
;
307 } else if (rec
.data
.gateway6
) {
308 return rec
.data
.gateway6
;
310 return rec
.data
.gateway
;
315 header
: gettext('Comment'),
316 dataIndex
: 'comments',
317 renderer
: Ext
.String
.htmlEncode
321 selectionchange
: set_button_status
,
322 itemdblclick
: run_editor
331 gettext('Pending changes') + ' (' +
332 gettext('Please reboot to activate changes') + ')'
337 html
: gettext("No changes")