]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - node/NetworkView.js
use Proxmox.window.TaskProgress instead of PVE.window.TaskProgress
[proxmox-widget-toolkit.git] / node / NetworkView.js
CommitLineData
a58001dd
DM
1Ext.define('proxmox-networks', {
2 extend: 'Ext.data.Model',
3 fields: [
4 'iface', 'type', 'active', 'autostart',
5 'bridge_ports', 'slaves',
6 'address', 'netmask', 'gateway',
7 'address6', 'netmask6', 'gateway6',
8 'comments'
9 ],
10 idProperty: 'iface'
11});
12
13Ext.define('Proxmox.node.NetworkView', {
14 extend: 'Ext.panel.Panel',
15
16 alias: ['widget.proxmoxNodeNetworkView'],
17
18 initComponent : function() {
19 var me = this;
20
21 if (!me.nodename) {
22 throw "no node name specified";
23 }
24
25 var baseUrl = '/nodes/' + me.nodename + '/network';
26
27 var store = Ext.create('Ext.data.Store', {
28 model: 'proxmox-networks',
29 proxy: {
30 type: 'proxmox',
31 url: '/api2/json' + baseUrl
32 },
33 sorters: [
34 {
35 property : 'iface',
36 direction: 'ASC'
37 }
38 ]
39 });
40
41 var reload = function() {
42 var changeitem = me.down('#changes');
43 Proxmox.Utils.API2Request({
44 url: baseUrl,
45 failure: function(response, opts) {
a58001dd 46 store.loadData({});
b81cf173
DM
47 Proxmox.Utils.setErrorMask(me, response.htmlStatus);
48 changeitem.update('');
89f57452 49 changeitem.setHidden(true);
a58001dd
DM
50 },
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");
89f57452
DM
57 changeitem.setHidden(true);
58 } else {
59 changeitem.update("<pre>" + Ext.htmlEncode(changes) + "</pre>");
60 changeitem.setHidden(false);
a58001dd 61 }
a58001dd
DM
62 }
63 });
64 };
65
66 var run_editor = function() {
67 var grid = me.down('gridpanel');
68 var sm = grid.getSelectionModel();
69 var rec = sm.getSelection()[0];
70 if (!rec) {
71 return;
72 }
73
74 var win = Ext.create('Proxmox.node.NetworkEdit', {
75 nodename: me.nodename,
76 iface: rec.data.iface,
77 iftype: rec.data.type
78 });
79 win.show();
80 win.on('destroy', reload);
81 };
82
83 var edit_btn = new Ext.Button({
84 text: gettext('Edit'),
85 disabled: true,
86 handler: run_editor
87 });
88
89 var del_btn = new Ext.Button({
90 text: gettext('Remove'),
91 disabled: true,
92 handler: function(){
93 var grid = me.down('gridpanel');
94 var sm = grid.getSelectionModel();
95 var rec = sm.getSelection()[0];
96 if (!rec) {
97 return;
98 }
99
100 var iface = rec.data.iface;
101
102 Proxmox.Utils.API2Request({
103 url: baseUrl + '/' + iface,
104 method: 'DELETE',
105 waitMsgTarget: me,
106 callback: function() {
107 reload();
108 },
109 failure: function(response, opts) {
110 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
111 }
112 });
113 }
114 });
115
116 var set_button_status = function() {
117 var grid = me.down('gridpanel');
118 var sm = grid.getSelectionModel();
119 var rec = sm.getSelection()[0];
120
121 edit_btn.setDisabled(!rec);
122 del_btn.setDisabled(!rec);
123 };
124
a58001dd
DM
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;
134 }
135 };
136
137 var find_next_iface_id = function(prefix) {
138 var next;
139 for (next = 0; next <= 9999; next++) {
140 if (!store.getById(prefix + next.toString())) {
141 break;
142 }
143 }
144 return prefix + next.toString();
145 };
146
147 Ext.apply(me, {
148 layout: 'border',
149 tbar: [
150 {
151 text: gettext('Create'),
152 menu: new Ext.menu.Menu({
153 plain: true,
154 items: [
155 {
156 text: Proxmox.Utils.render_network_iface_type('bridge'),
157 handler: function() {
158 var win = Ext.create('Proxmox.node.NetworkEdit', {
159 nodename: me.nodename,
160 iftype: 'bridge',
161 iface_default: find_next_iface_id('vmbr')
162 });
163 win.on('destroy', reload);
164 win.show();
165 }
166 },
167 {
168 text: Proxmox.Utils.render_network_iface_type('bond'),
169 handler: function() {
170 var win = Ext.create('Proxmox.node.NetworkEdit', {
171 nodename: me.nodename,
172 iftype: 'bond',
173 iface_default: find_next_iface_id('bond')
174 });
175 win.on('destroy', reload);
176 win.show();
177 }
178 }, '-',
179 {
180 text: Proxmox.Utils.render_network_iface_type('OVSBridge'),
181 handler: function() {
182 var win = Ext.create('Proxmox.node.NetworkEdit', {
183 nodename: me.nodename,
184 iftype: 'OVSBridge',
185 iface_default: find_next_iface_id('vmbr')
186 });
187 win.on('destroy', reload);
188 win.show();
189 }
190 },
191 {
192 text: Proxmox.Utils.render_network_iface_type('OVSBond'),
193 handler: function() {
194 var win = Ext.create('Proxmox.node.NetworkEdit', {
195 nodename: me.nodename,
196 iftype: 'OVSBond',
197 iface_default: find_next_iface_id('bond')
198 });
199 win.on('destroy', reload);
200 win.show();
201 }
202 },
203 {
204 text: Proxmox.Utils.render_network_iface_type('OVSIntPort'),
205 handler: function() {
206 var win = Ext.create('Proxmox.node.NetworkEdit', {
207 nodename: me.nodename,
208 iftype: 'OVSIntPort'
209 });
210 win.on('destroy', reload);
211 win.show();
212 }
213 }
214 ]
215 })
216 }, ' ',
217 {
218 text: gettext('Revert'),
219 handler: function() {
220 Proxmox.Utils.API2Request({
221 url: baseUrl,
222 method: 'DELETE',
223 waitMsgTarget: me,
224 callback: function() {
225 reload();
226 },
227 failure: function(response, opts) {
228 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
229 }
230 });
231 }
232 },
233 edit_btn,
234 del_btn
235 ],
236 items: [
237 {
238 xtype: 'gridpanel',
239 stateful: true,
240 stateId: 'grid-node-network',
241 store: store,
242 region: 'center',
243 border: false,
244 columns: [
245 {
246 header: gettext('Name'),
a58001dd
DM
247 sortable: true,
248 dataIndex: 'iface'
249 },
250 {
251 header: gettext('Type'),
a58001dd 252 sortable: true,
869439b1 253 width: 120,
a58001dd
DM
254 renderer: Proxmox.Utils.render_network_iface_type,
255 dataIndex: 'type'
256 },
257 {
258 xtype: 'booleancolumn',
259 header: gettext('Active'),
260 width: 80,
261 sortable: true,
262 dataIndex: 'active',
263 trueText: 'Yes',
264 falseText: 'No',
265 undefinedText: 'No'
266 },
267 {
268 xtype: 'booleancolumn',
269 header: gettext('Autostart'),
270 width: 80,
271 sortable: true,
272 dataIndex: 'autostart',
273 trueText: 'Yes',
274 falseText: 'No',
275 undefinedText: 'No'
276 },
277 {
278 header: gettext('Ports/Slaves'),
279 dataIndex: 'type',
280 renderer: render_ports
281 },
282 {
283 header: gettext('IP address'),
284 sortable: true,
869439b1 285 width: 120,
a58001dd
DM
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;
293 } else {
294 return rec.data.address;
295 }
296 }
297 },
298 {
299 header: gettext('Subnet mask'),
869439b1 300 width: 120,
a58001dd
DM
301 sortable: true,
302 dataIndex: 'netmask'
303 },
304 {
305 header: gettext('Gateway'),
869439b1 306 width: 120,
a58001dd
DM
307 sortable: true,
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;
314 } else {
315 return rec.data.gateway;
316 }
317 }
318 },
319 {
320 header: gettext('Comment'),
321 dataIndex: 'comments',
869439b1 322 flex: 1,
a58001dd
DM
323 renderer: Ext.String.htmlEncode
324 }
325 ],
326 listeners: {
327 selectionchange: set_button_status,
328 itemdblclick: run_editor
329 }
330 },
331 {
332 border: false,
333 region: 'south',
334 autoScroll: true,
89f57452 335 hidden: true,
a58001dd
DM
336 itemId: 'changes',
337 tbar: [
338 gettext('Pending changes') + ' (' +
339 gettext('Please reboot to activate changes') + ')'
340 ],
341 split: true,
342 bodyPadding: 5,
343 flex: 0.6,
344 html: gettext("No changes")
345 }
346 ],
a58001dd
DM
347 });
348
349 me.callParent();
1a68e95d 350 reload();
a58001dd
DM
351 }
352});