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
) {
47 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
48 changeitem
.update('');
49 changeitem
.setHidden(true);
51 success: function(response
, opts
) {
52 var result
= Ext
.decode(response
.responseText
);
53 store
.loadData(result
.data
);
54 var changes
= result
.changes
;
55 if (changes
=== undefined || changes
=== '') {
56 changes
= gettext("No changes");
57 changeitem
.setHidden(true);
59 changeitem
.update("<pre>" + Ext
.htmlEncode(changes
) + "</pre>");
60 changeitem
.setHidden(false);
66 var run_editor = function() {
67 var grid
= me
.down('gridpanel');
68 var sm
= grid
.getSelectionModel();
69 var rec
= sm
.getSelection()[0];
74 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
75 nodename
: me
.nodename
,
76 iface
: rec
.data
.iface
,
80 win
.on('destroy', reload
);
83 var edit_btn
= new Ext
.Button({
84 text
: gettext('Edit'),
89 var del_btn
= new Ext
.Button({
90 text
: gettext('Remove'),
93 var grid
= me
.down('gridpanel');
94 var sm
= grid
.getSelectionModel();
95 var rec
= sm
.getSelection()[0];
100 var iface
= rec
.data
.iface
;
102 Proxmox
.Utils
.API2Request({
103 url
: baseUrl
+ '/' + iface
,
106 callback: function() {
109 failure: function(response
, opts
) {
110 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
116 var set_button_status = function() {
117 var grid
= me
.down('gridpanel');
118 var sm
= grid
.getSelectionModel();
119 var rec
= sm
.getSelection()[0];
121 edit_btn
.setDisabled(!rec
);
122 del_btn
.setDisabled(!rec
);
125 var render_ports = function(value
, metaData
, record
) {
126 if (value
=== 'bridge') {
127 return record
.data
.bridge_ports
;
128 } else if (value
=== 'bond') {
129 return record
.data
.slaves
;
130 } else if (value
=== 'OVSBridge') {
131 return record
.data
.ovs_ports
;
132 } else if (value
=== 'OVSBond') {
133 return record
.data
.ovs_bonds
;
137 var find_next_iface_id = function(prefix
) {
139 for (next
= 0; next
<= 9999; next
++) {
140 if (!store
.getById(prefix
+ next
.toString())) {
144 return prefix
+ next
.toString();
151 text
: gettext('Create'),
152 menu
: new Ext
.menu
.Menu({
156 text
: Proxmox
.Utils
.render_network_iface_type('bridge'),
157 handler: function() {
158 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
159 nodename
: me
.nodename
,
161 iface_default
: find_next_iface_id('vmbr')
163 win
.on('destroy', reload
);
168 text
: Proxmox
.Utils
.render_network_iface_type('bond'),
169 handler: function() {
170 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
171 nodename
: me
.nodename
,
173 iface_default
: find_next_iface_id('bond')
175 win
.on('destroy', reload
);
180 text
: Proxmox
.Utils
.render_network_iface_type('OVSBridge'),
181 handler: function() {
182 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
183 nodename
: me
.nodename
,
185 iface_default
: find_next_iface_id('vmbr')
187 win
.on('destroy', reload
);
192 text
: Proxmox
.Utils
.render_network_iface_type('OVSBond'),
193 handler: function() {
194 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
195 nodename
: me
.nodename
,
197 iface_default
: find_next_iface_id('bond')
199 win
.on('destroy', reload
);
204 text
: Proxmox
.Utils
.render_network_iface_type('OVSIntPort'),
205 handler: function() {
206 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
207 nodename
: me
.nodename
,
210 win
.on('destroy', reload
);
218 text
: gettext('Revert'),
219 handler: function() {
220 Proxmox
.Utils
.API2Request({
224 callback: function() {
227 failure: function(response
, opts
) {
228 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
240 stateId
: 'grid-node-network',
246 header
: gettext('Name'),
251 header
: gettext('Type'),
254 renderer
: Proxmox
.Utils
.render_network_iface_type
,
258 xtype
: 'booleancolumn',
259 header
: gettext('Active'),
268 xtype
: 'booleancolumn',
269 header
: gettext('Autostart'),
272 dataIndex
: 'autostart',
278 header
: gettext('Ports/Slaves'),
280 renderer
: render_ports
283 header
: gettext('IP address'),
286 dataIndex
: 'address',
287 renderer: function(value
, metaData
, rec
) {
288 if (rec
.data
.address
&& rec
.data
.address6
) {
289 return rec
.data
.address
+ "<br>"
290 + rec
.data
.address6
+ '/' + rec
.data
.netmask6
;
291 } else if (rec
.data
.address6
) {
292 return rec
.data
.address6
+ '/' + rec
.data
.netmask6
;
294 return rec
.data
.address
;
299 header
: gettext('Subnet mask'),
305 header
: gettext('Gateway'),
308 dataIndex
: 'gateway',
309 renderer: function(value
, metaData
, rec
) {
310 if (rec
.data
.gateway
&& rec
.data
.gateway6
) {
311 return rec
.data
.gateway
+ "<br>" + rec
.data
.gateway6
;
312 } else if (rec
.data
.gateway6
) {
313 return rec
.data
.gateway6
;
315 return rec
.data
.gateway
;
320 header
: gettext('Comment'),
321 dataIndex
: 'comments',
323 renderer
: Ext
.String
.htmlEncode
327 selectionchange
: set_button_status
,
328 itemdblclick
: run_editor
338 gettext('Pending changes') + ' (' +
339 gettext('Please reboot to activate changes') + ')'
344 html
: gettext("No changes")