]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/node/Config.js
gui: ceph: add ServiceList component and use it
[pve-manager.git] / www / manager6 / node / Config.js
1 Ext.define('PVE.node.Config', {
2 extend: 'PVE.panel.Config',
3 alias: 'widget.PVE.node.Config',
4
5 onlineHelp: 'chapter_system_administration',
6
7 initComponent: function() {
8 var me = this;
9
10 var nodename = me.pveSelNode.data.node;
11 if (!nodename) {
12 throw "no node name specified";
13 }
14
15 var caps = Ext.state.Manager.get('GuiCap');
16
17 me.statusStore = Ext.create('Proxmox.data.ObjectStore', {
18 url: "/api2/json/nodes/" + nodename + "/status",
19 interval: 1000
20 });
21
22 var node_command = function(cmd) {
23 Proxmox.Utils.API2Request({
24 params: { command: cmd },
25 url: '/nodes/' + nodename + '/status',
26 method: 'POST',
27 waitMsgTarget: me,
28 failure: function(response, opts) {
29 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
30 }
31 });
32 };
33
34 var actionBtn = Ext.create('Ext.Button', {
35 text: gettext('Bulk Actions'),
36 iconCls: 'fa fa-fw fa-ellipsis-v',
37 disabled: !caps.nodes['Sys.PowerMgmt'],
38 menu: new Ext.menu.Menu({
39 items: [
40 {
41 text: gettext('Bulk Start'),
42 iconCls: 'fa fa-fw fa-play',
43 handler: function() {
44 var win = Ext.create('PVE.window.BulkAction', {
45 nodename: nodename,
46 title: gettext('Bulk Start'),
47 btnText: gettext('Start'),
48 action: 'startall'
49 });
50 win.show();
51 }
52 },
53 {
54 text: gettext('Bulk Stop'),
55 iconCls: 'fa fa-fw fa-stop',
56 handler: function() {
57 var win = Ext.create('PVE.window.BulkAction', {
58 nodename: nodename,
59 title: gettext('Bulk Stop'),
60 btnText: gettext('Stop'),
61 action: 'stopall'
62 });
63 win.show();
64 }
65 },
66 {
67 text: gettext('Bulk Migrate'),
68 iconCls: 'fa fa-fw fa-send-o',
69 handler: function() {
70 var win = Ext.create('PVE.window.BulkAction', {
71 nodename: nodename,
72 title: gettext('Bulk Migrate'),
73 btnText: gettext('Migrate'),
74 action: 'migrateall'
75 });
76 win.show();
77 }
78 }
79 ]
80 })
81 });
82
83 var restartBtn = Ext.create('Proxmox.button.Button', {
84 text: gettext('Reboot'),
85 disabled: !caps.nodes['Sys.PowerMgmt'],
86 dangerous: true,
87 confirmMsg: Ext.String.format(gettext("Reboot node '{0}'?"), nodename),
88 handler: function() {
89 node_command('reboot');
90 },
91 iconCls: 'fa fa-undo'
92 });
93
94 var shutdownBtn = Ext.create('Proxmox.button.Button', {
95 text: gettext('Shutdown'),
96 disabled: !caps.nodes['Sys.PowerMgmt'],
97 dangerous: true,
98 confirmMsg: Ext.String.format(gettext("Shutdown node '{0}'?"), nodename),
99 handler: function() {
100 node_command('shutdown');
101 },
102 iconCls: 'fa fa-power-off'
103 });
104
105 var shellBtn = Ext.create('PVE.button.ConsoleButton', {
106 disabled: !caps.nodes['Sys.Console'],
107 text: gettext('Shell'),
108 consoleType: 'shell',
109 nodename: nodename
110 });
111
112 me.items = [];
113
114 Ext.apply(me, {
115 title: gettext('Node') + " '" + nodename + "'",
116 hstateid: 'nodetab',
117 defaults: { statusStore: me.statusStore },
118 tbar: [ restartBtn, shutdownBtn, shellBtn, actionBtn]
119 });
120
121 if (caps.nodes['Sys.Audit']) {
122 me.items.push(
123 {
124 title: gettext('Summary'),
125 iconCls: 'fa fa-book',
126 itemId: 'summary',
127 xtype: 'pveNodeSummary'
128 },
129 {
130 title: gettext('Notes'),
131 iconCls: 'fa fa-sticky-note-o',
132 itemId: 'notes',
133 xtype: 'pveNotesView'
134 }
135 );
136 }
137
138 if (caps.nodes['Sys.Console']) {
139 me.items.push(
140 {
141 title: gettext('Shell'),
142 iconCls: 'fa fa-terminal',
143 itemId: 'jsconsole',
144 xtype: 'pveNoVncConsole',
145 consoleType: 'shell',
146 xtermjs: true,
147 nodename: nodename
148 }
149 );
150 }
151
152 if (caps.nodes['Sys.Audit']) {
153 me.items.push(
154 {
155 title: gettext('System'),
156 iconCls: 'fa fa-cogs',
157 itemId: 'services',
158 expandedOnInit: true,
159 startOnlyServices: {
160 'pveproxy': true,
161 'pvedaemon': true,
162 'pve-cluster': true
163 },
164 nodename: nodename,
165 onlineHelp: 'pve_service_daemons',
166 xtype: 'proxmoxNodeServiceView'
167 },
168 {
169 title: gettext('Network'),
170 iconCls: 'fa fa-exchange',
171 itemId: 'network',
172 groups: ['services'],
173 nodename: nodename,
174 onlineHelp: 'sysadmin_network_configuration',
175 xtype: 'proxmoxNodeNetworkView'
176 },
177 {
178 title: gettext('Certificates'),
179 iconCls: 'fa fa-certificate',
180 itemId: 'certificates',
181 groups: ['services'],
182 nodename: nodename,
183 xtype: 'pveCertificatesView'
184 },
185 {
186 title: gettext('DNS'),
187 iconCls: 'fa fa-globe',
188 groups: ['services'],
189 itemId: 'dns',
190 nodename: nodename,
191 onlineHelp: 'sysadmin_network_configuration',
192 xtype: 'proxmoxNodeDNSView'
193 },
194 {
195 title: gettext('Hosts'),
196 iconCls: 'fa fa-globe',
197 groups: ['services'],
198 itemId: 'hosts',
199 nodename: nodename,
200 onlineHelp: 'sysadmin_network_configuration',
201 xtype: 'proxmoxNodeHostsView'
202 },
203 {
204 title: gettext('Time'),
205 itemId: 'time',
206 groups: ['services'],
207 nodename: nodename,
208 xtype: 'proxmoxNodeTimeView',
209 iconCls: 'fa fa-clock-o'
210 });
211 }
212
213 if (caps.nodes['Sys.Syslog']) {
214 me.items.push({
215 title: 'Syslog',
216 iconCls: 'fa fa-list',
217 groups: ['services'],
218 disabled: !caps.nodes['Sys.Syslog'],
219 itemId: 'syslog',
220 xtype: 'proxmoxJournalView',
221 url: "/api2/extjs/nodes/" + nodename + "/journal"
222 });
223
224 if (caps.nodes['Sys.Modify']) {
225 me.items.push({
226 title: gettext('Updates'),
227 iconCls: 'fa fa-refresh',
228 disabled: !caps.nodes['Sys.Console'],
229 // do we want to link to system updates instead?
230 itemId: 'apt',
231 xtype: 'proxmoxNodeAPT',
232 upgradeBtn: {
233 xtype: 'pveConsoleButton',
234 disabled: Proxmox.UserName !== 'root@pam',
235 text: gettext('Upgrade'),
236 consoleType: 'upgrade',
237 nodename: nodename
238 },
239 nodename: nodename
240 });
241 }
242 }
243
244 if (caps.nodes['Sys.Audit']) {
245 me.items.push(
246 {
247 xtype: 'pveFirewallRules',
248 iconCls: 'fa fa-shield',
249 title: gettext('Firewall'),
250 allow_iface: true,
251 base_url: '/nodes/' + nodename + '/firewall/rules',
252 list_refs_url: '/cluster/firewall/refs',
253 itemId: 'firewall'
254 },
255 {
256 xtype: 'pveFirewallOptions',
257 title: gettext('Options'),
258 iconCls: 'fa fa-gear',
259 onlineHelp: 'pve_firewall_host_specific_configuration',
260 groups: ['firewall'],
261 base_url: '/nodes/' + nodename + '/firewall/options',
262 fwtype: 'node',
263 itemId: 'firewall-options'
264 });
265 }
266
267
268 if (caps.nodes['Sys.Audit']) {
269 me.items.push(
270 {
271 title: gettext('Disks'),
272 itemId: 'storage',
273 expandedOnInit: true,
274 iconCls: 'fa fa-hdd-o',
275 xtype: 'pveNodeDiskList'
276 },
277 {
278 title: 'LVM',
279 itemId: 'lvm',
280 onlineHelp: 'chapter_lvm',
281 iconCls: 'fa fa-square',
282 groups: ['storage'],
283 xtype: 'pveLVMList'
284 },
285 {
286 title: 'LVM-Thin',
287 itemId: 'lvmthin',
288 onlineHelp: 'chapter_lvm',
289 iconCls: 'fa fa-square-o',
290 groups: ['storage'],
291 xtype: 'pveLVMThinList'
292 },
293 {
294 title: Proxmox.Utils.directoryText,
295 itemId: 'directory',
296 onlineHelp: 'chapter_storage',
297 iconCls: 'fa fa-folder',
298 groups: ['storage'],
299 xtype: 'pveDirectoryList'
300 },
301 {
302 title: 'ZFS',
303 itemId: 'zfs',
304 onlineHelp: 'chapter_zfs',
305 iconCls: 'fa fa-th-large',
306 groups: ['storage'],
307 xtype: 'pveZFSList'
308 },
309 {
310 title: 'Ceph',
311 itemId: 'ceph',
312 iconCls: 'fa fa-ceph',
313 xtype: 'pveNodeCephStatus'
314 },
315 {
316 xtype: 'pveReplicaView',
317 iconCls: 'fa fa-retweet',
318 title: gettext('Replication'),
319 itemId: 'replication'
320 },
321 {
322 xtype: 'pveNodeCephConfigCrush',
323 title: gettext('Configuration'),
324 iconCls: 'fa fa-gear',
325 groups: ['ceph'],
326 itemId: 'ceph-config'
327 },
328 {
329 xtype: 'pveNodeCephMonMgr',
330 title: gettext('Monitor'),
331 iconCls: 'fa fa-tv',
332 groups: ['ceph'],
333 itemId: 'ceph-monlist'
334 },
335 {
336 xtype: 'pveNodeCephOsdTree',
337 title: 'OSD',
338 iconCls: 'fa fa-hdd-o',
339 groups: ['ceph'],
340 itemId: 'ceph-osdtree'
341 },
342 {
343 xtype: 'pveNodeCephFSPanel',
344 title: 'CephFS',
345 iconCls: 'fa fa-folder',
346 groups: ['ceph'],
347 nodename: nodename,
348 itemId: 'ceph-cephfspanel'
349 },
350 {
351 xtype: 'pveNodeCephPoolList',
352 title: 'Pools',
353 iconCls: 'fa fa-sitemap',
354 groups: ['ceph'],
355 itemId: 'ceph-pools'
356 }
357 );
358 }
359
360 if (caps.nodes['Sys.Syslog']) {
361 me.items.push(
362 {
363 xtype: 'proxmoxLogView',
364 title: gettext('Log'),
365 iconCls: 'fa fa-list',
366 groups: ['firewall'],
367 onlineHelp: 'chapter_pve_firewall',
368 url: '/api2/extjs/nodes/' + nodename + '/firewall/log',
369 itemId: 'firewall-fwlog'
370 },
371 {
372 title: gettext('Log'),
373 itemId: 'ceph-log',
374 iconCls: 'fa fa-list',
375 groups: ['ceph'],
376 onlineHelp: 'chapter_pveceph',
377 xtype: 'cephLogView',
378 url: "/api2/extjs/nodes/" + nodename + "/ceph/log",
379 nodename: nodename
380 });
381 }
382
383 me.items.push(
384 {
385 title: gettext('Task History'),
386 iconCls: 'fa fa-list',
387 itemId: 'tasks',
388 nodename: nodename,
389 xtype: 'proxmoxNodeTasks'
390 },
391 {
392 title: gettext('Subscription'),
393 iconCls: 'fa fa-support',
394 itemId: 'support',
395 xtype: 'pveNodeSubscription',
396 nodename: nodename
397 }
398 );
399
400 me.callParent();
401
402 me.mon(me.statusStore, 'load', function(s, records, success) {
403 var uptimerec = s.data.get('uptime');
404 var powermgmt = uptimerec ? uptimerec.data.value : false;
405 if (!caps.nodes['Sys.PowerMgmt']) {
406 powermgmt = false;
407 }
408 restartBtn.setDisabled(!powermgmt);
409 shutdownBtn.setDisabled(!powermgmt);
410 shellBtn.setDisabled(!powermgmt);
411 });
412
413 me.on('afterrender', function() {
414 me.statusStore.startUpdate();
415 });
416
417 me.on('destroy', function() {
418 me.statusStore.stopUpdate();
419 });
420 }
421 });