1 Ext
.define('PVE.node.NetworkView', {
2 extend
: 'Ext.panel.Panel',
4 alias
: ['widget.pveNodeNetworkView'],
6 initComponent : function() {
9 var nodename
= me
.pveSelNode
.data
.node
;
11 throw "no node name specified";
14 var store
= Ext
.create('Ext.data.Store', {
15 model
: 'pve-networks',
18 url
: "/api2/json/nodes/" + nodename
+ "/network"
28 var reload = function() {
29 var changeitem
= me
.down('#changes');
30 PVE
.Utils
.API2Request({
31 url
: '/nodes/' + nodename
+ '/network',
32 failure: function(response
, opts
) {
33 changeitem
.update(gettext('Error') + ': ' + response
.htmlStatus
);
36 success: function(response
, opts
) {
37 var result
= Ext
.decode(response
.responseText
);
38 store
.loadData(result
.data
);
39 var changes
= result
.changes
;
40 if (changes
=== undefined || changes
=== '') {
41 changes
= gettext("No changes");
43 changeitem
.update("<pre>" + Ext
.htmlEncode(changes
) + "</pre>");
48 var run_editor = function() {
49 var grid
= me
.down('gridpanel');
50 var sm
= grid
.getSelectionModel();
51 var rec
= sm
.getSelection()[0];
56 var win
= Ext
.create('PVE.node.NetworkEdit', {
57 pveSelNode
: me
.pveSelNode
,
58 iface
: rec
.data
.iface
,
62 win
.on('destroy', reload
);
65 var edit_btn
= new Ext
.Button({
66 text
: gettext('Edit'),
71 var del_btn
= new Ext
.Button({
72 text
: gettext('Remove'),
75 var grid
= me
.down('gridpanel');
76 var sm
= grid
.getSelectionModel();
77 var rec
= sm
.getSelection()[0];
82 var iface
= rec
.data
.iface
;
84 PVE
.Utils
.API2Request({
85 url
: '/nodes/' + nodename
+ '/network/' + iface
,
88 callback: function() {
91 failure: function(response
, opts
) {
92 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
98 var set_button_status = function() {
99 var grid
= me
.down('gridpanel');
100 var sm
= grid
.getSelectionModel();
101 var rec
= sm
.getSelection()[0];
103 edit_btn
.setDisabled(!rec
);
104 del_btn
.setDisabled(!rec
);
107 PVE
.Utils
.monStoreErrors(me
, store
);
109 var render_ports = function(value
, metaData
, record
) {
110 if (value
=== 'bridge') {
111 return record
.data
.bridge_ports
;
112 } else if (value
=== 'bond') {
113 return record
.data
.slaves
;
114 } else if (value
=== 'OVSBridge') {
115 return record
.data
.ovs_ports
;
116 } else if (value
=== 'OVSBond') {
117 return record
.data
.ovs_bonds
;
121 var find_next_iface_id = function(prefix
) {
123 for (next
= 0; next
<= 9999; next
++) {
124 if (!store
.getById(prefix
+ next
.toString())) {
128 return prefix
+ next
.toString();
135 text
: gettext('Create'),
136 menu
: new Ext
.menu
.Menu({
140 text
: PVE
.Utils
.render_network_iface_type('bridge'),
141 handler: function() {
142 var win
= Ext
.create('PVE.node.NetworkEdit', {
143 pveSelNode
: me
.pveSelNode
,
145 iface_default
: find_next_iface_id('vmbr')
147 win
.on('destroy', reload
);
152 text
: PVE
.Utils
.render_network_iface_type('bond'),
153 handler: function() {
154 var win
= Ext
.create('PVE.node.NetworkEdit', {
155 pveSelNode
: me
.pveSelNode
,
157 iface_default
: find_next_iface_id('bond')
159 win
.on('destroy', reload
);
164 text
: PVE
.Utils
.render_network_iface_type('OVSBridge'),
165 handler: function() {
166 var win
= Ext
.create('PVE.node.NetworkEdit', {
167 pveSelNode
: me
.pveSelNode
,
169 iface_default
: find_next_iface_id('vmbr')
171 win
.on('destroy', reload
);
176 text
: PVE
.Utils
.render_network_iface_type('OVSBond'),
177 handler: function() {
178 var win
= Ext
.create('PVE.node.NetworkEdit', {
179 pveSelNode
: me
.pveSelNode
,
181 iface_default
: find_next_iface_id('bond')
183 win
.on('destroy', reload
);
188 text
: PVE
.Utils
.render_network_iface_type('OVSIntPort'),
189 handler: function() {
190 var win
= Ext
.create('PVE.node.NetworkEdit', {
191 pveSelNode
: me
.pveSelNode
,
194 win
.on('destroy', reload
);
202 text
: gettext('Revert changes'),
203 handler: function() {
204 PVE
.Utils
.API2Request({
205 url
: '/nodes/' + nodename
+ '/network',
208 callback: function() {
211 failure: function(response
, opts
) {
212 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
229 header
: gettext('Name'),
235 header
: gettext('Type'),
238 renderer
: PVE
.Utils
.render_network_iface_type
,
242 xtype
: 'booleancolumn',
243 header
: gettext('Active'),
252 xtype
: 'booleancolumn',
253 header
: gettext('Autostart'),
256 dataIndex
: 'autostart',
262 header
: gettext('Ports/Slaves'),
264 renderer
: render_ports
267 header
: gettext('IP address'),
269 dataIndex
: 'address',
270 renderer: function(value
, metaData
, rec
) {
271 if (rec
.data
.address
&& rec
.data
.address6
) {
272 return rec
.data
.address
+ "<br>"
273 + rec
.data
.address6
+ '/' + rec
.data
.netmask6
;
274 } else if (rec
.data
.address6
) {
275 return rec
.data
.address6
+ '/' + rec
.data
.netmask6
;
277 return rec
.data
.address
;
282 header
: gettext('Subnet mask'),
287 header
: gettext('Gateway'),
289 dataIndex
: 'gateway',
290 renderer: function(value
, metaData
, rec
) {
291 if (rec
.data
.gateway
&& rec
.data
.gateway6
) {
292 return rec
.data
.gateway
+ "<br>" + rec
.data
.gateway6
;
293 } else if (rec
.data
.gateway6
) {
294 return rec
.data
.gateway6
;
296 return rec
.data
.gateway
;
302 selectionchange
: set_button_status
,
303 itemdblclick
: run_editor
312 gettext('Pending changes') + ' (' +
313 gettext('Please reboot to activate changes') + ')'
318 html
: gettext("No changes")
330 Ext
.define('pve-networks', {
331 extend
: 'Ext.data.Model',
333 'iface', 'type', 'active', 'autostart',
334 'bridge_ports', 'slaves',
335 'address', 'netmask', 'gateway',
336 'address6', 'netmask6', 'gateway6',