]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/dc/Summary.js
followup code cleanup
[pve-manager.git] / www / manager6 / dc / Summary.js
CommitLineData
7c53ee24
DM
1Ext.define('PVE.dc.Summary', {
2 extend: 'Ext.panel.Panel',
cf8b372a 3 alias: 'widget.pveDcSummary',
7c53ee24 4
cf8b372a
DC
5 scrollable: true,
6
5da98a05 7 bodyPadding: 5,
cf8b372a
DC
8
9 layout: 'column',
10
11 defaults: {
5da98a05
DC
12 padding: 5,
13 plugins: 'responsive',
14 responsiveConfig: {
15 'width < 1900': {
16 columnWidth: 1
17 },
18 'width >= 1900': {
19 columnWidth: 0.5
20 }
21 }
cf8b372a
DC
22 },
23
24 items: [
50a1eb7d
DC
25 {
26 itemId: 'dcHealth',
27 xtype: 'pveDcHealth'
28 },
29 {
30 itemId: 'dcGuests',
31 xtype: 'pveDcGuests'
32 },
33 {
8f8ec25d 34 title: gettext('Resources'),
50a1eb7d 35 xtype: 'panel',
5da98a05
DC
36 minHeight: 250,
37 bodyPadding: 5,
701acf20 38 layout: 'hbox',
50a1eb7d 39 defaults: {
5683fb60 40 xtype: 'proxmoxGauge',
701acf20 41 flex: 1
50a1eb7d
DC
42 },
43 items:[
44 {
45 title: gettext('CPU'),
46 itemId: 'cpu'
47 },
48 {
49 title: gettext('Memory'),
50 itemId: 'memory'
51 },
52 {
53 title: gettext('Storage'),
54 itemId: 'storage'
55 }
56 ]
57 },
cf8b372a
DC
58 {
59 itemId: 'nodeview',
60 xtype: 'pveDcNodeView',
61 height: 250
f734486b
DC
62 },
63 {
64 title: gettext('Subscriptions'),
65 height: 220,
66 items: [
67 {
68 itemId: 'subscriptions',
841f1ed4
DC
69 xtype: 'pveHealthWidget',
70 userCls: 'pointer',
71 listeners: {
72 element: 'el',
73 click: function() {
74 if (this.component.userCls === 'pointer') {
75 window.open('https://www.proxmox.com/en/proxmox-ve/pricing', '_blank');
76 }
77 }
78 }
f734486b
DC
79 }
80 ]
cf8b372a
DC
81 }
82 ],
7c53ee24
DM
83
84 initComponent: function() {
85 var me = this;
86
0c7c0d6b 87 var rstore = Ext.create('Proxmox.data.UpdateStore', {
cf8b372a
DC
88 interval: 3000,
89 storeid: 'pve-cluster-status',
90 model: 'pve-dc-nodes',
91 proxy: {
56a353b9 92 type: 'proxmox',
cf8b372a
DC
93 url: "/api2/json/cluster/status"
94 }
7c53ee24
DM
95 });
96
eaa018d7 97 var gridstore = Ext.create('Proxmox.data.DiffStore', {
cf8b372a
DC
98 rstore: rstore,
99 filters: {
100 property: 'type',
101 value: 'node'
102 },
103 sorters: {
104 property: 'id',
105 direction: 'ASC'
7c53ee24
DM
106 }
107 });
108
109 me.callParent();
cf8b372a
DC
110
111 me.getComponent('nodeview').setStore(gridstore);
112
50a1eb7d
DC
113 var gueststatus = me.getComponent('dcGuests');
114
115 var cpustat = me.down('#cpu');
116 var memorystat = me.down('#memory');
117 var storagestat = me.down('#storage');
0d1c1267 118 var sp = Ext.state.Manager.getProvider();
50a1eb7d
DC
119
120 me.mon(PVE.data.ResourceStore, 'load', function(curstore, results) {
121 me.suspendLayout = true;
122
123 var cpu = 0;
124 var maxcpu = 0;
125
126 var nodes = 0;
127
128 var memory = 0;
129 var maxmem = 0;
130
131 var countedStorages = {};
132 var used = 0;
133 var total = 0;
0d1c1267
DC
134 var usableStorages = {};
135 var storages = sp.get('dash-storages') || '';
136 storages.split(',').forEach(function(storage){
137 if (storage !== '') {
138 usableStorages[storage] = true;
139 }
140 });
50a1eb7d
DC
141
142 var qemu = {
143 running: 0,
144 paused: 0,
145 stopped: 0,
146 template: 0
147 };
148 var lxc = {
149 running: 0,
150 paused: 0,
151 stopped: 0,
152 template: 0
153 };
154 var error = 0;
155
156 var i;
157
158 for (i = 0; i < results.length; i++) {
159 var item = results[i];
160 switch(item.data.type) {
161 case 'node':
162 cpu += (item.data.cpu * item.data.maxcpu);
163 maxcpu += item.data.maxcpu || 0;
164 memory += item.data.mem || 0;
165 maxmem += item.data.maxmem || 0;
166 nodes++;
167
168 // update grid also
169 var griditem = gridstore.getById(item.data.id);
170 if (griditem) {
171 griditem.set('cpuusage', item.data.cpu);
172 var max = item.data.maxmem || 1;
173 var val = item.data.mem || 0;
174 griditem.set('memoryusage', val/max);
175 griditem.set('uptime', item.data.uptime);
176 griditem.commit(); //else it marks the fields as dirty
177 }
178 break;
179 case 'storage':
0d1c1267
DC
180 if (!Ext.Object.isEmpty(usableStorages)) {
181 if (usableStorages[item.data.id] === true) {
182 used += item.data.disk;
183 total += item.data.maxdisk;
184 }
185 break;
186 }
50a1eb7d
DC
187 if (!countedStorages[item.data.storage] ||
188 (item.data.storage === 'local' &&
189 !countedStorages[item.data.id])) {
190 used += item.data.disk;
191 total += item.data.maxdisk;
192
193 countedStorages[item.data.storage === 'local'?item.data.id:item.data.storage] = true;
194 }
195 break;
196 case 'qemu':
197 qemu[item.data.template ? 'template' : item.data.status]++;
198 if (item.data.hastate === 'error') {
199 error++;
200 }
201 break;
202 case 'lxc':
203 lxc[item.data.template ? 'template' : item.data.status]++;
204 if (item.data.hastate === 'error') {
205 error++;
206 }
207 break;
208 default: break;
209 }
210 }
211
212 var text = Ext.String.format(gettext('of {0} CPU(s)'), maxcpu);
213 cpustat.updateValue((cpu/maxcpu), text);
214
215 text = Ext.String.format(gettext('{0} of {1}'), PVE.Utils.render_size(memory), PVE.Utils.render_size(maxmem));
216 memorystat.updateValue((memory/maxmem), text);
217
218 text = Ext.String.format(gettext('{0} of {1}'), PVE.Utils.render_size(used), PVE.Utils.render_size(total));
219 storagestat.updateValue((used/total), text);
220
221 gueststatus.updateValues(qemu,lxc,error);
222
223 me.suspendLayout = false;
224 me.updateLayout(true);
225 });
226
227 var dcHealth = me.getComponent('dcHealth');
228 me.mon(rstore, 'load', dcHealth.updateStatus, dcHealth);
229
f734486b
DC
230 var subs = me.down('#subscriptions');
231 me.mon(rstore, 'load', function(store, records, success) {
232 var i;
233 var level;
234 var curlevel;
235 for (i = 0; i < records.length; i++) {
236 if (records[i].get('type') !== 'node') {
237 continue;
238 }
595d0457
DC
239 var node = records[i];
240 if (node.get('status') === 'offline') {
241 continue;
242 }
243
244 curlevel = node.get('level');
245
3512569d 246 if (curlevel === '') { // no subscription trumps all, set and break
595d0457
DC
247 level = '';
248 break;
249 }
f734486b 250
3512569d 251 if (level === undefined) { // save level
f734486b
DC
252 level = curlevel;
253 continue;
254 }
3512569d 255 if (level !== curlevel) { // detect different levels
f734486b
DC
256 break;
257 }
258 }
259
595d0457
DC
260 var data = {
261 title: Proxmox.Utils.unknownText,
262 text: Proxmox.Utils.unknownText,
263 iconCls: PVE.Utils.get_health_icon(undefined, true)
264 };
f734486b 265 if (level === '') {
595d0457 266 data = {
f734486b
DC
267 title: gettext('No Subscription'),
268 iconCls: PVE.Utils.get_health_icon('critical', true),
269 text: gettext('You have at least one node without subscription.')
595d0457 270 };
841f1ed4 271 subs.setUserCls('pointer');
f734486b 272 } else if (level !== curlevel) {
595d0457 273 data = {
f734486b
DC
274 title: gettext('Mixed Subscriptions'),
275 iconCls: PVE.Utils.get_health_icon('warning', true),
276 text: gettext('Warning: Your subscription levels are not the same.')
595d0457 277 };
841f1ed4 278 subs.setUserCls('pointer');
595d0457
DC
279 } else if (level) {
280 data = {
f734486b
DC
281 title: PVE.Utils.render_support_level(level),
282 iconCls: PVE.Utils.get_health_icon('good', true),
283 text: gettext('Your subscription status is valid.')
595d0457 284 };
841f1ed4 285 subs.setUserCls('');
f734486b 286 }
595d0457
DC
287
288 subs.setData(data);
f734486b
DC
289 });
290
cf8b372a
DC
291 me.on('destroy', function(){
292 rstore.stopUpdate();
293 });
294
295 rstore.startUpdate();
7c53ee24 296 }
50a1eb7d 297
7c53ee24 298});