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'],
23 initComponent : function() {
27 throw "no node name specified";
30 var baseUrl
= '/nodes/' + me
.nodename
+ '/network';
32 var store
= Ext
.create('Ext.data.Store', {
33 model
: 'proxmox-networks',
36 url
: '/api2/json' + baseUrl
46 var reload = function() {
47 var changeitem
= me
.down('#changes');
48 Proxmox
.Utils
.API2Request({
50 failure: function(response
, opts
) {
52 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
53 changeitem
.update('');
54 changeitem
.setHidden(true);
56 success: function(response
, opts
) {
57 var result
= Ext
.decode(response
.responseText
);
58 store
.loadData(result
.data
);
59 var changes
= result
.changes
;
60 if (changes
=== undefined || changes
=== '') {
61 changes
= gettext("No changes");
62 changeitem
.setHidden(true);
64 changeitem
.update("<pre>" + Ext
.htmlEncode(changes
) + "</pre>");
65 changeitem
.setHidden(false);
71 var run_editor = function() {
72 var grid
= me
.down('gridpanel');
73 var sm
= grid
.getSelectionModel();
74 var rec
= sm
.getSelection()[0];
79 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
80 nodename
: me
.nodename
,
81 iface
: rec
.data
.iface
,
85 win
.on('destroy', reload
);
88 var edit_btn
= new Ext
.Button({
89 text
: gettext('Edit'),
94 var del_btn
= new Ext
.Button({
95 text
: gettext('Remove'),
98 var grid
= me
.down('gridpanel');
99 var sm
= grid
.getSelectionModel();
100 var rec
= sm
.getSelection()[0];
105 var iface
= rec
.data
.iface
;
107 Proxmox
.Utils
.API2Request({
108 url
: baseUrl
+ '/' + iface
,
111 callback: function() {
114 failure: function(response
, opts
) {
115 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
121 var set_button_status = function() {
122 var grid
= me
.down('gridpanel');
123 var sm
= grid
.getSelectionModel();
124 var rec
= sm
.getSelection()[0];
126 edit_btn
.setDisabled(!rec
);
127 del_btn
.setDisabled(!rec
);
130 var render_ports = function(value
, metaData
, record
) {
131 if (value
=== 'bridge') {
132 return record
.data
.bridge_ports
;
133 } else if (value
=== 'bond') {
134 return record
.data
.slaves
;
135 } else if (value
=== 'OVSBridge') {
136 return record
.data
.ovs_ports
;
137 } else if (value
=== 'OVSBond') {
138 return record
.data
.ovs_bonds
;
142 var find_next_iface_id = function(prefix
) {
144 for (next
= 0; next
<= 9999; next
++) {
145 if (!store
.getById(prefix
+ next
.toString())) {
149 return prefix
+ next
.toString();
154 if (me
.types
.indexOf('bridge') !== -1) {
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
);
169 if (me
.types
.indexOf('bond') !== -1) {
171 text
: Proxmox
.Utils
.render_network_iface_type('bond'),
172 handler: function() {
173 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
174 nodename
: me
.nodename
,
176 iface_default
: find_next_iface_id('bond')
178 win
.on('destroy', reload
);
184 if (me
.types
.indexOf('ovs') !== -1) {
185 if (menu_items
.length
> 0) {
186 menu_items
.push({ xtype
: 'menuseparator' });
191 text
: Proxmox
.Utils
.render_network_iface_type('OVSBridge'),
192 handler: function() {
193 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
194 nodename
: me
.nodename
,
196 iface_default
: find_next_iface_id('vmbr')
198 win
.on('destroy', reload
);
203 text
: Proxmox
.Utils
.render_network_iface_type('OVSBond'),
204 handler: function() {
205 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
206 nodename
: me
.nodename
,
208 iface_default
: find_next_iface_id('bond')
210 win
.on('destroy', reload
);
215 text
: Proxmox
.Utils
.render_network_iface_type('OVSIntPort'),
216 handler: function() {
217 var win
= Ext
.create('Proxmox.node.NetworkEdit', {
218 nodename
: me
.nodename
,
221 win
.on('destroy', reload
);
228 var renderer_generator = function(fieldname
) {
229 return function(val
, metaData
, rec
) {
231 if (rec
.data
[fieldname
]) {
232 tmp
.push(rec
.data
[fieldname
]);
234 if (rec
.data
[fieldname
+ '6']) {
235 tmp
.push(rec
.data
[fieldname
+ '6']);
237 return tmp
.join('<br>') || '';
245 text
: gettext('Create'),
252 text
: gettext('Revert'),
253 handler: function() {
254 Proxmox
.Utils
.API2Request({
258 callback: function() {
261 failure: function(response
, opts
) {
262 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
274 stateId
: 'grid-node-network',
280 header
: gettext('Name'),
285 header
: gettext('Type'),
288 renderer
: Proxmox
.Utils
.render_network_iface_type
,
292 xtype
: 'booleancolumn',
293 header
: gettext('Active'),
297 trueText
: Proxmox
.Utils
.yesText
,
298 falseText
: Proxmox
.Utils
.noText
,
299 undefinedText
: Proxmox
.Utils
.noText
,
302 xtype
: 'booleancolumn',
303 header
: gettext('Autostart'),
306 dataIndex
: 'autostart',
307 trueText
: Proxmox
.Utils
.yesText
,
308 falseText
: Proxmox
.Utils
.noText
,
309 undefinedText
: Proxmox
.Utils
.noText
312 xtype
: 'booleancolumn',
313 header
: gettext('VLAN aware'),
316 dataIndex
: 'bridge_vlan_aware',
317 trueText
: Proxmox
.Utils
.yesText
,
318 falseText
: Proxmox
.Utils
.noText
,
319 undefinedText
: Proxmox
.Utils
.noText
322 header
: gettext('Ports/Slaves'),
324 renderer
: render_ports
327 header
: gettext('IP address'),
330 dataIndex
: 'address',
331 renderer
: renderer_generator('address'),
334 header
: gettext('Subnet mask'),
337 dataIndex
: 'netmask',
338 renderer
: renderer_generator('netmask'),
341 header
: gettext('CIDR'),
345 renderer
: renderer_generator('cidr'),
348 header
: gettext('Gateway'),
351 dataIndex
: 'gateway',
352 renderer
: renderer_generator('gateway'),
355 header
: gettext('Comment'),
356 dataIndex
: 'comments',
358 renderer
: Ext
.String
.htmlEncode
362 selectionchange
: set_button_status
,
363 itemdblclick
: run_editor
373 gettext('Pending changes') + ' (' +
374 gettext('Please reboot to activate changes') + ')'
379 html
: gettext("No changes")