]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/blob
412d750b7ae385b50fb64b89f1ce024ed9c56048
[ceph.git] /
1 import {
2   ChangeDetectionStrategy,
3   Component,
4   EventEmitter,
5   inject,
6   Input,
7   Output,
8   ViewEncapsulation
9 } from '@angular/core';
10 import { SkeletonModule, ButtonModule, LinkModule, TooltipModule } from 'carbon-components-angular';
11 import { ProductiveCardComponent } from '~/app/shared/components/productive-card/productive-card.component';
12 import { RouterModule } from '@angular/router';
13 import { ComponentsModule } from '~/app/shared/components/components.module';
14 import { SummaryService } from '~/app/shared/services/summary.service';
15 import { Summary } from '~/app/shared/models/summary.model';
16 import { combineLatest, Observable, of, ReplaySubject } from 'rxjs';
17 import { CommonModule } from '@angular/common';
18 import { PipesModule } from '~/app/shared/pipes/pipes.module';
19 import { UpgradeInfoInterface } from '~/app/shared/models/upgrade.interface';
20 import { UpgradeService } from '~/app/shared/api/upgrade.service';
21 import { catchError, filter, map, startWith } from 'rxjs/operators';
22 import { HealthIconMap, HealthStatus } from '~/app/shared/models/overview';
23
24 type OverviewHealthData = {
25   summary: Summary;
26   upgrade: UpgradeInfoInterface;
27   currentHealth: Health;
28 };
29
30 type Health = {
31   message: string;
32   title: string;
33   icon: string;
34 };
35
36 const WarnAndErrMessage = $localize`There are active alerts and unresolved health warnings.`;
37
38 const HealthMap: Record<HealthStatus, Health> = {
39   HEALTH_OK: {
40     message: $localize`All core services are running normally`,
41     icon: HealthIconMap['HEALTH_OK'],
42     title: $localize`Healthy`
43   },
44   HEALTH_WARN: {
45     message: WarnAndErrMessage,
46     icon: HealthIconMap['HEALTH_WARN'],
47     title: $localize`Warning`
48   },
49   HEALTH_ERR: {
50     message: WarnAndErrMessage,
51     icon: HealthIconMap['HEALTH_ERR'],
52     title: $localize`Critical`
53   }
54 };
55
56 @Component({
57   selector: 'cd-overview-health-card',
58   imports: [
59     CommonModule,
60     ProductiveCardComponent,
61     SkeletonModule,
62     ButtonModule,
63     RouterModule,
64     ComponentsModule,
65     LinkModule,
66     PipesModule,
67     TooltipModule
68   ],
69   standalone: true,
70   templateUrl: './overview-health-card.component.html',
71   styleUrl: './overview-health-card.component.scss',
72   encapsulation: ViewEncapsulation.None,
73   changeDetection: ChangeDetectionStrategy.OnPush
74 })
75 export class OverviewHealthCardComponent {
76   private readonly summaryService = inject(SummaryService);
77   private readonly upgradeService = inject(UpgradeService);
78
79   @Input() fsid!: string;
80   @Input()
81   set status(value: HealthStatus) {
82     this.health$.next(value);
83   }
84   @Input() incidents!: number;
85   @Output() viewIncidents = new EventEmitter<void>();
86
87   private health$ = new ReplaySubject<HealthStatus>(1);
88
89   readonly data$: Observable<OverviewHealthData> = combineLatest([
90     this.summaryService.summaryData$.pipe(filter((summary): summary is Summary => !!summary)),
91     this.upgradeService.listCached().pipe(
92       startWith(null as UpgradeInfoInterface),
93       catchError(() => of(null))
94     ),
95     this.health$
96   ]).pipe(
97     map(([summary, upgrade, health]) => ({ summary, upgrade, currentHealth: HealthMap?.[health] }))
98   );
99
100   onViewIncidentsClick() {
101     this.viewIncidents.emit();
102   }
103 }