1 <div *
ngIf=
"healthData && enabledFeature$ | async as enabledFeature"
2 class=
"container-fluid">
3 <cd-info-group groupTitle=
"Status"
5 *
ngIf=
"healthData.health?.status
6 || healthData.mon_status
9 || healthData.hosts != null
10 || healthData.rgw != null
12 || healthData.iscsi_daemons != null">
14 <cd-info-card cardTitle=
"Cluster Status"
16 class=
"cd-status-card"
17 contentClass=
"content-highlight"
18 *
ngIf=
"healthData.health?.status">
19 <ng-container *
ngIf=
"healthData.health?.checks?.length > 0">
20 <ng-template #healthChecks
>
21 <ng-container *
ngTemplateOutlet=
"logsLink"></ng-container>
23 <li *
ngFor=
"let check of healthData.health.checks">
24 <span [ngStyle]=
"check.severity | healthColor">{{ check.type }}
</span>: {{ check.summary.message }}
28 <div class=
"info-card-content-clickable"
29 [ngStyle]=
"healthData.health.status | healthColor"
30 [popover]=
"healthChecks"
32 #
healthChecksTarget=
"bs-popover"
35 containerClass=
"info-card-popover-cluster-status"
36 (click)=
"healthChecksTarget.toggle()">
37 {{ healthData.health.status }}
40 <ng-container *
ngIf=
"!healthData.health?.checks?.length">
41 <div [ngStyle]=
"healthData.health.status | healthColor">
42 {{ healthData.health.status }}
47 <cd-info-card cardTitle=
"Monitors"
50 class=
"cd-status-card"
51 contentClass=
"content-highlight"
52 *
ngIf=
"healthData.mon_status">
53 {{ healthData.mon_status | monSummary }}
56 <cd-info-card cardTitle=
"OSDs"
59 class=
"cd-status-card"
60 *
ngIf=
"(healthData.osd_map | osdSummary) as transformedResult"
61 contentClass=
"content-highlight">
62 <span *
ngFor=
"let result of transformedResult"
63 [ngClass]=
"result.class">
68 <cd-info-card cardTitle=
"Manager Daemons"
70 class=
"cd-status-card"
71 contentClass=
"content-highlight"
72 *
ngIf=
"healthData.mgr_map">
73 <span *
ngFor=
"let result of (healthData.mgr_map | mgrSummary)"
74 [ngClass]=
"result.class"
75 [title]=
"result.titleText != null ? result.titleText : ''">
80 <cd-info-card cardTitle=
"Hosts"
83 class=
"cd-status-card"
84 contentClass=
"content-highlight"
85 *
ngIf=
"healthData.hosts != null">
86 {{ healthData.hosts }} total
89 <cd-info-card cardTitle=
"Object Gateways"
92 class=
"cd-status-card"
93 contentClass=
"content-highlight"
94 *
ngIf=
"enabledFeature.rgw && healthData.rgw != null">
95 {{ healthData.rgw }} total
98 <cd-info-card cardTitle=
"Metadata Servers"
100 class=
"cd-status-card"
101 *
ngIf=
"((enabledFeature.cephfs && healthData.fs_map) | mdsSummary) as transformedResult"
102 [contentClass]=
"(transformedResult.length > 1 ? 'text-area-size-2' : '') + ' content-highlight'">
103 <!-- TODO: check text-area-size-2 -->
104 <span *
ngFor=
"let result of transformedResult"
105 [ngClass]=
"result.class"
106 [title]=
"result.titleText != null ? result.titleText : ''">
111 <cd-info-card cardTitle=
"iSCSI Gateways"
114 class=
"cd-status-card"
115 contentClass=
"content-highlight"
116 *
ngIf=
"enabledFeature.iscsi && healthData.iscsi_daemons != null">
117 {{ healthData.iscsi_daemons.up + healthData.iscsi_daemons.down }} total
118 <span class=
"card-text-line-break"></span>
119 {{ healthData.iscsi_daemons.up }} up,
120 <span [ngClass]=
"{'card-text-error': healthData.iscsi_daemons.down > 0}">{{ healthData.iscsi_daemons.down }} down
</span>
124 <cd-info-group groupTitle=
"Performance"
126 *
ngIf=
"healthData.client_perf || healthData.scrub_status">
128 <cd-info-card cardTitle=
"Client IOPS"
130 class=
"cd-performance-card"
131 contentClass=
"content-highlight"
132 *
ngIf=
"healthData.client_perf">
133 {{ (healthData.client_perf.read_op_per_sec + healthData.client_perf.write_op_per_sec) | round:
1 }}
136 <cd-info-card cardTitle=
"Client Throughput"
138 class=
"cd-performance-card"
139 contentClass=
"content-highlight"
140 *
ngIf=
"healthData.client_perf">
141 {{ ((healthData.client_perf.read_bytes_sec + healthData.client_perf.write_bytes_sec) | dimlessBinary) + '/s' }}
144 <cd-info-card cardTitle=
"Client Read/Write"
146 class=
"cd-performance-card"
147 [contentClass]=
"isClientReadWriteChartShowable() ? 'content-chart': 'content-highlight'"
148 *
ngIf=
"healthData.client_perf">
149 <cd-health-pie *
ngIf=
"isClientReadWriteChartShowable()"
151 (prepareFn)=
"prepareReadWriteRatio($event[0], $event[1])">
153 <span *
ngIf=
"!isClientReadWriteChartShowable()">
158 <cd-info-card cardTitle=
"Recovery Throughput"
160 class=
"cd-performance-card"
161 contentClass=
"content-highlight"
162 *
ngIf=
"healthData.client_perf">
163 {{ (healthData.client_perf.recovering_bytes_per_sec | dimlessBinary) + '/s' }}
166 <cd-info-card cardTitle=
"Scrub"
168 class=
"cd-performance-card"
169 contentClass=
"content-highlight"
170 *
ngIf=
"healthData.scrub_status">
171 {{ healthData.scrub_status }}
175 <cd-info-group groupTitle=
"Capacity"
177 *
ngIf=
"healthData.pools
179 || healthData.pg_info">
180 <cd-info-card cardTitle=
"Pools"
183 class=
"cd-capacity-card order-md-1 order-lg-4 order-xl-1"
184 contentClass=
"content-highlight"
185 *
ngIf=
"healthData.pools">
186 {{ healthData.pools.length }}
189 <cd-info-card cardTitle=
"Raw Capacity"
191 class=
"cd-capacity-card order-md-3 order-lg-1 order-xl-2"
192 contentClass=
"content-chart"
193 *
ngIf=
"healthData.df">
194 <cd-health-pie [data]=
"healthData"
195 [config]=
"rawCapacityChartConfig"
197 (prepareFn)=
"prepareRawUsage($event[0], $event[1])">
201 <cd-info-card cardTitle=
"Objects"
203 class=
"cd-capacity-card order-md-4 order-lg-2 order-xl-3"
204 contentClass=
"content-chart"
205 *
ngIf=
"healthData.pg_info?.object_stats?.num_objects != null">
206 <cd-health-pie [data]=
"healthData"
207 [config]=
"objectsChartConfig"
208 (prepareFn)=
"prepareObjects($event[0], $event[1])">
212 <cd-info-card cardTitle=
"PGs per OSD"
214 class=
"cd-capacity-card order-md-2 order-lg-5 order-xl-4"
215 contentClass=
"content-highlight"
216 *
ngIf=
"healthData.pg_info">
217 {{ healthData.pg_info.pgs_per_osd | dimless }}
220 <cd-info-card cardTitle=
"PG Status"
222 class=
"cd-capacity-card order-md-5 order-lg-3 order-xl-5"
223 contentClass=
"content-chart"
224 (click)=
"pgStatusTarget.toggle()"
225 *
ngIf=
"healthData.pg_info">
226 <ng-template #pgStatus
>
227 <ng-container *
ngTemplateOutlet=
"logsLink"></ng-container>
229 <li *
ngFor=
"let pgStatesText of healthData.pg_info.statuses | keyvalue">
230 {{ pgStatesText.key }}: {{ pgStatesText.value }}
234 <div class=
"pg-status-popover-wrapper">
235 <div [popover]=
"pgStatus"
237 #
pgStatusTarget=
"bs-popover"
239 <cd-health-pie [data]=
"healthData"
240 [config]=
"pgStatusChartConfig"
241 (prepareFn)=
"preparePgStatus($event[0], $event[1])">
248 <ng-template #logsLink
>
249 <ng-container *
ngIf=
"permissions.log.read">
251 i18n
><i [ngClass]=
"[icons.infoCircle]"></i> See
<a routerLink=
"/logs">Logs
</a> for more details.
</p>