]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/ceph/Status.js
adapt ceph status detail to luminous and make it more robust
[pve-manager.git] / www / manager6 / ceph / Status.js
CommitLineData
bd39c945 1Ext.define('PVE.node.CephStatus', {
946730cd
DC
2 extend: 'Ext.panel.Panel',
3 alias: 'widget.pveNodeCephStatus',
4
ba93a9c6 5 onlineHelp: 'chapter_pveceph',
bd39c945 6
946730cd
DC
7 scrollable: true,
8
9 bodyPadding: '10 0 0 0',
10
11 defaults: {
12 width: 762,
13 userCls: 'inline-block',
14 padding: '0 0 10 10'
15 },
16
17 items: [
18 {
19 xtype: 'panel',
20 title: gettext('Health'),
21 bodyPadding: '0 10 10 10',
22 minHeight: 210,
23 layout: {
24 type: 'hbox',
25 align: 'top'
26 },
27 items: [
28 {
29 flex: 1,
30 itemId: 'overallhealth',
31 xtype: 'pveHealthWidget',
32 title: gettext('Status')
33 },
34 {
35 flex: 2,
36 itemId: 'warnings',
37 stateful: true,
38 stateId: 'ceph-status-warnings',
39 padding: '15 0 0 0',
40 xtype: 'grid',
41 minHeight: 100,
42 // since we load the store manually,
43 // to show the emptytext, we have to
44 // specify an empty store
45 store: { data:[] },
46 emptyText: gettext('No Warnings/Errors'),
47 columns: [
48 {
49 dataIndex: 'severity',
50 header: gettext('Severity'),
51 align: 'center',
52 width: 70,
53 renderer: function(value) {
54 var health = PVE.Utils.map_ceph_health[value];
55 var classes = PVE.Utils.get_health_icon(health);
56
57 return '<i class="fa fa-fw ' + classes + '"></i>';
58 },
59 sorter: {
60 sorterFn: function(a,b) {
61 var healthArr = ['HEALTH_ERR', 'HEALTH_WARN', 'HEALTH_OK'];
62 return healthArr.indexOf(b.data.severity) - healthArr.indexOf(a.data.severity);
63 }
64 }
65 },
66 {
67 dataIndex: 'summary',
68 header: gettext('Summary'),
69 flex: 1
70 }
71 ]
72 }
73 ]
74 },
75 {
76 xtype: 'pveCephStatusDetail',
77 itemId: 'statusdetail',
78 title: gettext('Status')
79 },
80 {
81 xtype: 'panel',
82 title: gettext('Performance'),
83 bodyPadding: '0 10 10 10',
84 layout: {
85 type: 'hbox',
86 align: 'center'
87 },
88 items: [
89 {
90 flex: 1,
91 xtype: 'pveGauge',
92 itemId: 'space',
93 title: gettext('Usage')
94 },
95 {
96 flex: 2,
97 xtype: 'container',
98 defaults: {
99 padding: '0 0 0 30',
100 height: 100
101 },
102 items: [
103 {
104 itemId: 'reads',
105 xtype: 'pveRunningChart',
106 title: gettext('Reads'),
107 renderer: PVE.Utils.render_bandwidth
108 },
109 {
110 itemId: 'writes',
111 xtype: 'pveRunningChart',
112 title: gettext('Writes'),
113 renderer: PVE.Utils.render_bandwidth
114 },
115 {
116 itemId: 'iops',
117 xtype: 'pveRunningChart',
118 hidden: true,
2ce6111f 119 title: 'IOPS', // do not localize
946730cd
DC
120 renderer: Ext.util.Format.numberRenderer('0,000')
121 },
122 {
123 itemId: 'readiops',
124 xtype: 'pveRunningChart',
125 hidden: true,
8f8ec25d 126 title: 'IOPS: ' + gettext('Reads'),
946730cd
DC
127 renderer: Ext.util.Format.numberRenderer('0,000')
128 },
129 {
130 itemId: 'writeiops',
131 xtype: 'pveRunningChart',
132 hidden: true,
8f8ec25d 133 title: 'IOPS: ' + gettext('Writes'),
946730cd
DC
134 renderer: Ext.util.Format.numberRenderer('0,000')
135 }
136 ]
137 }
138 ]
bd39c945 139 }
946730cd 140 ],
bd39c945 141
946730cd
DC
142 updateAll: function(store, records, success) {
143 if (!success || records.length === 0) {
144 return;
145 }
bd39c945 146
946730cd
DC
147 var me = this;
148 var rec = records[0];
bd39c945 149
946730cd 150 // add health panel
dfe6d184 151 me.down('#overallhealth').updateHealth(PVE.Utils.render_ceph_health(rec.data.health || {}));
946730cd
DC
152 // add errors to gridstore
153 me.down('#warnings').getStore().loadRawData(rec.data.health.summary, false);
bd39c945 154
946730cd 155 // update detailstatus panel
4a0bb017
DC
156 me.getComponent('statusdetail').updateAll(
157 rec.data.health || {},
158 rec.data.monmap || {},
159 rec.data.pgmap || {},
160 rec.data.osdmap || {},
161 rec.data.quorum_names || []);
bd39c945 162
946730cd
DC
163 // add performance data
164 var used = rec.data.pgmap.bytes_used;
165 var total = rec.data.pgmap.bytes_total;
bd39c945 166
946730cd
DC
167 var text = Ext.String.format(gettext('{0} of {1}'),
168 PVE.Utils.render_size(used),
169 PVE.Utils.render_size(total)
170 );
bd39c945 171
946730cd
DC
172 // update the usage widget
173 me.down('#space').updateValue(used/total, text);
bd39c945 174
946730cd 175 // TODO: logic for jewel (iops splitted in read/write)
bd39c945 176
946730cd
DC
177 var iops = rec.data.pgmap.op_per_sec;
178 var readiops = rec.data.pgmap.read_op_per_sec;
6783a330 179 var writeiops = rec.data.pgmap.write_op_per_sec;
946730cd
DC
180 var reads = rec.data.pgmap.read_bytes_sec || 0;
181 var writes = rec.data.pgmap.write_bytes_sec || 0;
bd39c945 182
946730cd
DC
183 if (iops !== undefined && me.version !== 'hammer') {
184 me.change_version('hammer');
185 } else if((readiops !== undefined || writeiops !== undefined) && me.version !== 'jewel') {
186 me.change_version('jewel');
187 }
188 // update the graphs
189 me.reads.addDataPoint(reads);
190 me.writes.addDataPoint(writes);
191 me.iops.addDataPoint(iops);
192 me.readiops.addDataPoint(readiops);
193 me.writeiops.addDataPoint(writeiops);
194 },
195
196 change_version: function(version) {
197 var me = this;
198 me.version = version;
199 me.sp.set('ceph-version', version);
200 me.iops.setVisible(version === 'hammer');
201 me.readiops.setVisible(version === 'jewel');
202 me.writeiops.setVisible(version === 'jewel');
203 },
bd39c945 204
946730cd
DC
205 initComponent: function() {
206 var me = this;
bd39c945 207
946730cd
DC
208 var nodename = me.pveSelNode.data.node;
209 if (!nodename) {
210 throw "no node name specified";
211 }
bd39c945 212
946730cd
DC
213 me.callParent();
214 me.store = Ext.create('PVE.data.UpdateStore', {
215 storeid: 'ceph-status-' + nodename,
216 interval: 5000,
217 proxy: {
218 type: 'pve',
219 url: '/api2/json/nodes/' + nodename + '/ceph/status'
bd39c945
DM
220 }
221 });
222
946730cd
DC
223 // save references for the updatefunction
224 me.iops = me.down('#iops');
225 me.readiops = me.down('#readiops');
226 me.writeiops = me.down('#writeiops');
227 me.reads = me.down('#reads');
228 me.writes = me.down('#writes');
229
230 // get ceph version
231 me.sp = Ext.state.Manager.getProvider();
232 me.version = me.sp.get('ceph-version');
233 me.change_version(me.version);
234
235 PVE.Utils.monStoreErrors(me,me.store);
236 me.mon(me.store, 'load', me.updateAll, me);
237 me.on('destroy', me.store.stopUpdate);
238 me.store.startUpdate();
bd39c945 239 }
946730cd 240
bd39c945 241});