]>
Commit | Line | Data |
---|---|---|
195c7c8c DC |
1 | Ext.define('PVE.ceph.StatusDetail', { |
2 | extend: 'Ext.panel.Panel', | |
3 | alias: 'widget.pveCephStatusDetail', | |
4 | ||
5 | layout: { | |
6 | type: 'hbox', | |
7 | align: 'stretch' | |
8 | }, | |
9 | ||
27b91275 | 10 | bodyPadding: '0 5', |
195c7c8c DC |
11 | defaults: { |
12 | xtype: 'box', | |
13 | style: { | |
14 | 'text-align':'center' | |
15 | } | |
16 | }, | |
17 | ||
18 | items: [{ | |
195c7c8c DC |
19 | flex: 1, |
20 | itemId: 'osds', | |
7f58689d DC |
21 | maxHeight: 250, |
22 | scrollable: true, | |
23 | padding: '0 10 5 10', | |
195c7c8c DC |
24 | data: { |
25 | total: 0, | |
26 | upin: 0, | |
27 | upout: 0, | |
28 | downin: 0, | |
c0c2e401 DC |
29 | downout: 0, |
30 | oldosds: [] | |
195c7c8c DC |
31 | }, |
32 | tpl: [ | |
838258a3 | 33 | '<h3>' + 'OSDs' + '</h3>', |
195c7c8c DC |
34 | '<table class="osds">', |
35 | '<tr><td></td>', | |
36 | '<td><i class="fa fa-fw good fa-circle"></i>', | |
37 | gettext('In'), | |
38 | '</td>', | |
39 | '<td><i class="fa fa-fw warning fa-circle-o"></i>', | |
40 | gettext('Out'), | |
41 | '</td>', | |
42 | '</tr>', | |
43 | '<tr>', | |
44 | '<td><i class="fa fa-fw good fa-arrow-circle-up"></i>', | |
45 | gettext('Up'), | |
46 | '</td>', | |
47 | '<td>{upin}</td>', | |
48 | '<td>{upout}</td>', | |
49 | '</tr>', | |
50 | '<tr>', | |
51 | '<td><i class="fa fa-fw critical fa-arrow-circle-down"></i>', | |
52 | gettext('Down'), | |
53 | '</td>', | |
54 | '<td>{downin}</td>', | |
55 | '<td>{downout}</td>', | |
56 | '</tr>', | |
57 | '</table>', | |
58 | '<br /><div>', | |
59 | gettext('Total'), | |
60 | ': {total}', | |
7f58689d | 61 | '</div><br />', |
c0c2e401 | 62 | '<tpl if="oldosds.length > 0">', |
7f58689d DC |
63 | '<i class="fa fa-refresh warning"></i> ' + gettext('Outdated OSDs') + "<br>", |
64 | '<div class="osds">', | |
65 | '<tpl for="oldosds">', | |
66 | '<div class="left-aligned">osd.{id}:</div>', | |
67 | '<div class="right-aligned">{version}</div><br />', | |
68 | '<div style="clear:both"></div>', | |
69 | '</tpl>', | |
70 | '</div>', | |
71 | '</tpl>' | |
195c7c8c DC |
72 | ] |
73 | }, | |
f73a2d36 DC |
74 | { |
75 | flex: 1, | |
76 | border: false, | |
77 | itemId: 'pgchart', | |
78 | xtype: 'polar', | |
79 | height: 184, | |
80 | innerPadding: 5, | |
81 | insetPadding: 5, | |
82 | colors: [ | |
83 | '#CFCFCF', | |
84 | '#21BF4B', | |
85 | '#FFCC00', | |
86 | '#FF6C59' | |
87 | ], | |
88 | store: { }, | |
89 | series: [ | |
90 | { | |
91 | type: 'pie', | |
92 | donut: 60, | |
93 | angleField: 'count', | |
94 | tooltip: { | |
95 | trackMouse: true, | |
96 | renderer: function(tooltip, record, ctx) { | |
97 | var html = record.get('text'); | |
98 | html += '<br>'; | |
99 | record.get('states').forEach(function(state) { | |
100 | html += '<br>' + | |
101 | state.state_name + ': ' + state.count.toString(); | |
102 | }); | |
103 | tooltip.setHtml(html); | |
104 | } | |
105 | }, | |
106 | subStyle: { | |
107 | strokeStyle: false | |
108 | } | |
109 | } | |
110 | ] | |
111 | }, | |
195c7c8c DC |
112 | { |
113 | flex: 1.6, | |
114 | itemId: 'pgs', | |
115 | padding: '0 10', | |
f73a2d36 DC |
116 | maxHeight: 250, |
117 | scrollable: true, | |
195c7c8c | 118 | data: { |
d18bf116 | 119 | states: [] |
195c7c8c DC |
120 | }, |
121 | tpl: [ | |
838258a3 | 122 | '<h3>' + 'PGs' + '</h3>', |
d18bf116 | 123 | '<tpl for="states">', |
f73a2d36 | 124 | '<div class="left-aligned"><i class ="fa fa-circle {cls}"></i> {state_name}:</div>', |
195c7c8c DC |
125 | '<div class="right-aligned">{count}</div><br />', |
126 | '<div style="clear:both"></div>', | |
127 | '</tpl>' | |
128 | ] | |
129 | }], | |
130 | ||
f73a2d36 DC |
131 | // similar to mgr dashboard |
132 | pgstates: { | |
133 | // clean | |
134 | clean: 1, | |
135 | active: 1, | |
136 | ||
137 | // working | |
138 | activating: 2, | |
139 | backfill_wait: 2, | |
140 | backfilling: 2, | |
141 | creating: 2, | |
142 | deep: 2, | |
143 | degraded: 2, | |
144 | forced_backfill: 2, | |
145 | forced_recovery: 2, | |
146 | peered: 2, | |
147 | peering: 2, | |
148 | recovering: 2, | |
149 | recovery_wait: 2, | |
150 | repair: 2, | |
151 | scrubbing: 2, | |
152 | snaptrim: 2, | |
153 | snaptrim_wait: 2, | |
154 | ||
155 | // error | |
156 | backfill_toofull: 3, | |
157 | backfill_unfound: 3, | |
158 | down: 3, | |
159 | incomplete: 3, | |
160 | inconsistent: 3, | |
161 | recovery_toofull: 3, | |
162 | recovery_unfound: 3, | |
163 | remapped: 3, | |
164 | snaptrim_error: 3, | |
165 | stale: 3, | |
166 | undersized: 3 | |
167 | }, | |
168 | ||
169 | statecategories: [ | |
170 | { | |
171 | text: gettext('Unknown'), | |
172 | count: 0, | |
173 | states: [], | |
174 | cls: 'faded' | |
175 | }, | |
176 | { | |
177 | text: gettext('Clean'), | |
178 | cls: 'good' | |
179 | }, | |
180 | { | |
181 | text: gettext('Working'), | |
182 | cls: 'warning' | |
183 | }, | |
184 | { | |
185 | text: gettext('Error'), | |
186 | cls: 'critical' | |
187 | } | |
188 | ], | |
189 | ||
0bf3c581 | 190 | updateAll: function(metadata, status) { |
195c7c8c DC |
191 | var me = this; |
192 | me.suspendLayout = true; | |
193 | ||
fcb30b49 | 194 | var maxversion = "0"; |
7f58689d | 195 | Object.values(metadata.version || {}).forEach(function(version) { |
4f71a0ff | 196 | if (PVE.Utils.compare_ceph_versions(version, maxversion) > 0) { |
7f58689d DC |
197 | maxversion = version; |
198 | } | |
199 | }); | |
200 | ||
201 | var oldosds = []; | |
202 | ||
203 | if (metadata.osd) { | |
204 | metadata.osd.forEach(function(osd) { | |
205 | var version = PVE.Utils.parse_ceph_version(osd); | |
206 | if (version != maxversion) { | |
207 | oldosds.push({ | |
208 | id: osd.id, | |
209 | version: version | |
210 | }); | |
211 | } | |
212 | }); | |
213 | } | |
214 | ||
0bf3c581 DC |
215 | var pgmap = status.pgmap || {}; |
216 | var health = status.health || {}; | |
217 | var osdmap = status.osdmap || { osdmap: {} }; | |
218 | ||
219 | ||
195c7c8c | 220 | // update pgs sorted |
4a0bb017 | 221 | var pgs_by_state = pgmap.pgs_by_state || []; |
195c7c8c DC |
222 | pgs_by_state.sort(function(a,b){ |
223 | return (a.state_name < b.state_name)?-1:(a.state_name === b.state_name)?0:1; | |
224 | }); | |
f73a2d36 DC |
225 | |
226 | me.statecategories.forEach(function(cat) { | |
227 | cat.count = 0; | |
228 | cat.states = []; | |
229 | }); | |
230 | ||
231 | pgs_by_state.forEach(function(state) { | |
232 | var i; | |
233 | var states = state.state_name.split(/[^a-z]+/); | |
234 | var result = 0; | |
235 | for (i = 0; i < states.length; i++) { | |
236 | if (me.pgstates[states[i]] > result) { | |
237 | result = me.pgstates[states[i]]; | |
238 | } | |
239 | } | |
240 | // for the list | |
241 | state.cls = me.statecategories[result].cls; | |
242 | ||
243 | me.statecategories[result].count += state.count; | |
244 | me.statecategories[result].states.push(state); | |
245 | }); | |
246 | ||
247 | me.getComponent('pgchart').getStore().setData(me.statecategories); | |
d18bf116 | 248 | me.getComponent('pgs').update({states: pgs_by_state}); |
195c7c8c | 249 | |
60a14a04 | 250 | var downinregex = /(\d+) osds down/; |
4a0bb017 | 251 | var downin_osds = 0; |
195c7c8c | 252 | |
4a0bb017 DC |
253 | // we collect monitor/osd information from the checks |
254 | Ext.Object.each(health.checks, function(key, value, obj) { | |
255 | var found = null; | |
256 | if (key === 'OSD_DOWN') { | |
37f01f69 | 257 | found = value.summary.message.match(downinregex); |
4a0bb017 | 258 | if (found !== null) { |
195c7c8c | 259 | downin_osds = parseInt(found[1],10); |
4a0bb017 DC |
260 | } |
261 | } | |
195c7c8c DC |
262 | }); |
263 | ||
4a0bb017 DC |
264 | // update osds counts |
265 | ||
266 | var total_osds = osdmap.osdmap.num_osds || 0; | |
267 | var in_osds = osdmap.osdmap.num_in_osds || 0; | |
268 | var up_osds = osdmap.osdmap.num_up_osds || 0; | |
269 | var out_osds = total_osds - in_osds; | |
270 | var down_osds = total_osds - up_osds; | |
271 | ||
195c7c8c DC |
272 | var downout_osds = down_osds - downin_osds; |
273 | var upin_osds = in_osds - downin_osds; | |
274 | var upout_osds = up_osds - upin_osds; | |
275 | var osds = { | |
276 | total: total_osds, | |
277 | upin: upin_osds, | |
278 | upout: upout_osds, | |
279 | downin: downin_osds, | |
7f58689d DC |
280 | downout: downout_osds, |
281 | oldosds: oldosds | |
195c7c8c | 282 | }; |
28786da6 DC |
283 | var osdcomponent = me.getComponent('osds'); |
284 | osdcomponent.update(Ext.apply(osdcomponent.data, osds)); | |
195c7c8c | 285 | |
195c7c8c DC |
286 | me.suspendLayout = false; |
287 | me.updateLayout(); | |
288 | } | |
289 | }); | |
290 |