]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/Summary.js
1 Ext
.define('PVE.dc.Summary', {
2 extend
: 'Ext.panel.Panel',
3 alias
: 'widget.pveDcSummary',
26 title
: gettext('Resources'),
32 xtype
: 'proxmoxGauge',
37 title
: gettext('CPU'),
41 title
: gettext('Memory'),
45 title
: gettext('Storage'),
52 xtype
: 'pveDcNodeView',
56 title
: gettext('Subscriptions'),
60 itemId
: 'subscriptions',
61 xtype
: 'pveHealthWidget',
66 if (this.component
.userCls
=== 'pointer') {
67 window
.open('https://www.proxmox.com/en/proxmox-ve/pricing', '_blank');
77 resize: function(panel
) {
78 Proxmox
.Utils
.updateColumns(panel
);
82 initComponent: function() {
85 var rstore
= Ext
.create('Proxmox.data.UpdateStore', {
87 storeid
: 'pve-cluster-status',
88 model
: 'pve-dc-nodes',
91 url
: "/api2/json/cluster/status",
95 var gridstore
= Ext
.create('Proxmox.data.DiffStore', {
109 me
.getComponent('nodeview').setStore(gridstore
);
111 var gueststatus
= me
.getComponent('dcGuests');
113 var cpustat
= me
.down('#cpu');
114 var memorystat
= me
.down('#memory');
115 var storagestat
= me
.down('#storage');
116 var sp
= Ext
.state
.Manager
.getProvider();
118 me
.mon(PVE
.data
.ResourceStore
, 'load', function(curstore
, results
) {
119 me
.suspendLayout
= true;
121 let cpu
= 0, maxcpu
= 0;
122 let memory
= 0, maxmem
= 0;
124 let used
= 0, total
= 0;
125 let countedStorage
= {}, usableStorages
= {};
126 let storages
= sp
.get('dash-storages') || '';
127 storages
.split(',').filter(v
=> v
!== '').forEach(storage
=> {
128 usableStorages
[storage
] = true;
145 for (const { data
} of results
) {
148 cpu
+= data
.cpu
* data
.maxcpu
;
149 maxcpu
+= data
.maxcpu
|| 0;
150 memory
+= data
.mem
|| 0;
151 maxmem
+= data
.maxmem
|| 0;
153 if (gridstore
.getById(data
.id
)) {
154 let griditem
= gridstore
.getById(data
.id
);
155 griditem
.set('cpuusage', data
.cpu
);
156 let max
= data
.maxmem
|| 1;
157 let val
= data
.mem
|| 0;
158 griditem
.set('memoryusage', val
/ max
);
159 griditem
.set('uptime', data
.uptime
);
160 griditem
.commit(); // else the store marks the field as dirty
164 let sid
= !data
.shared
|| data
.storage
=== 'local' ? data
.id
: data
.storage
;
165 if (!Ext
.Object
.isEmpty(usableStorages
)) {
166 if (usableStorages
[data
.id
] !== true) {
170 } else if (countedStorage
[sid
]) {
174 total
+= data
.maxdisk
;
175 countedStorage
[sid
] = true;
179 qemu
[data
.template
? 'template' : data
.status
]++;
180 if (data
.hastate
=== 'error') {
185 lxc
[data
.template
? 'template' : data
.status
]++;
186 if (data
.hastate
=== 'error') {
194 let text
= Ext
.String
.format(gettext('of {0} CPU(s)'), maxcpu
);
195 cpustat
.updateValue(cpu
/maxcpu
, text
);
197 text
= Ext
.String
.format(gettext('{0} of {1}'), Proxmox
.Utils
.render_size(memory
), Proxmox
.Utils
.render_size(maxmem
));
198 memorystat
.updateValue(memory
/maxmem
, text
);
200 text
= Ext
.String
.format(gettext('{0} of {1}'), Proxmox
.Utils
.render_size(used
), Proxmox
.Utils
.render_size(total
));
201 storagestat
.updateValue(used
/total
, text
);
203 gueststatus
.updateValues(qemu
, lxc
, error
);
205 me
.suspendLayout
= false;
206 me
.updateLayout(true);
209 let dcHealth
= me
.getComponent('dcHealth');
210 me
.mon(rstore
, 'load', dcHealth
.updateStatus
, dcHealth
);
212 let subs
= me
.down('#subscriptions');
213 me
.mon(rstore
, 'load', function(store
, records
, success
) {
216 for (let i
= 0; i
< records
.length
; i
++) {
217 let node
= records
[i
];
218 if (node
.get('type') !== 'node' || node
.get('status') === 'offline') {
222 let curlevel
= node
.get('level');
223 if (curlevel
=== '') { // no subscription beats all, set it and break the loop
228 if (level
=== undefined) { // save level
230 } else if (level
!== curlevel
) { // detect different levels
236 title
: Proxmox
.Utils
.unknownText
,
237 text
: Proxmox
.Utils
.unknownText
,
238 iconCls
: PVE
.Utils
.get_health_icon(undefined, true),
242 title
: gettext('No Subscription'),
243 iconCls
: PVE
.Utils
.get_health_icon('critical', true),
244 text
: gettext('You have at least one node without subscription.'),
246 subs
.setUserCls('pointer');
249 title
: gettext('Mixed Subscriptions'),
250 iconCls
: PVE
.Utils
.get_health_icon('warning', true),
251 text
: gettext('Warning: Your subscription levels are not the same.'),
253 subs
.setUserCls('pointer');
256 title
: PVE
.Utils
.render_support_level(level
),
257 iconCls
: PVE
.Utils
.get_health_icon('good', true),
258 text
: gettext('Your subscription status is valid.'),
266 me
.on('destroy', function() {
270 me
.mon(sp
, 'statechange', function(provider
, key
, value
) {
271 if (key
!== 'summarycolumns') {
274 Proxmox
.Utils
.updateColumns(me
);
277 rstore
.startUpdate();