this.viewPGStates.emit();
}
+ private readonly permissions = this.authStorageService.getPermissions();
+
readonly data$: Observable<OverviewHealthData> = combineLatest([
this.summaryService.summaryData$.pipe(filter((summary): summary is Summary => !!summary)),
- this.upgradeService.listCached().pipe(
- startWith(null as UpgradeInfoInterface | null),
- catchError(() => of(null))
- )
+ this.permissions?.configOpt?.read
+ ? this.upgradeService.listCached().pipe(
+ startWith(null as UpgradeInfoInterface | null),
+ catchError(() => of(null))
+ )
+ : of(null)
]).pipe(map(([summary, upgrade]) => ({ summary, upgrade })));
- private readonly permissions = this.authStorageService.getPermissions();
-
readonly enabled$: Observable<boolean> = this.permissions?.configOpt?.read
? this.mgrModuleService.getConfig('cephadm').pipe(
map((resp: any) => !!resp?.hw_monitoring),
<div cdsStack="horizontal"
gap="2">
<cd-time-picker
- [dropdwonSize]="'sm'"
- [label]="'Time Span'"
+ dropdownSize="sm"
+ label="Time Span"
(selectedTime)="loadCharts($event)"
+ i18n-label
></cd-time-picker>
</div>
</ng-template>
import { PerformanceData } from '../../models/performance-data';
import { DatePipe } from '@angular/common';
import { NumberFormatterService } from '../../services/number-formatter.service';
+import { AuthStorageService } from '../../services/auth-storage.service';
+import { Permissions } from '../../models/permissions';
describe('PerformanceCardComponent', () => {
let component: PerformanceCardComponent;
let fixture: ComponentFixture<PerformanceCardComponent>;
- let prometheusService: PrometheusService;
let performanceCardService: PerformanceCardService;
let mgrModuleService: MgrModuleService;
transform: jest.fn().mockReturnValue('01 Jan, 00:00:00')
};
+ const authStorageServiceMock = {
+ getPermissions: jest.fn().mockReturnValue(new Permissions({ 'config-opt': ['read'] }))
+ };
+
await TestBed.configureTestingModule({
imports: [HttpClientTestingModule, PerformanceCardComponent],
providers: [
{ provide: PerformanceCardService, useValue: performanceCardServiceMock },
{ provide: MgrModuleService, useValue: mgrModuleServiceMock },
{ provide: NumberFormatterService, useValue: numberFormatterMock },
- { provide: DatePipe, useValue: datePipeMock }
+ { provide: DatePipe, useValue: datePipeMock },
+ { provide: AuthStorageService, useValue: authStorageServiceMock }
]
}).compileComponents();
fixture = TestBed.createComponent(PerformanceCardComponent);
component = fixture.componentInstance;
- prometheusService = TestBed.inject(PrometheusService);
performanceCardService = TestBed.inject(PerformanceCardService);
mgrModuleService = TestBed.inject(MgrModuleService);
});
flush();
}));
- it('should set emptyStateKey when prometheus is not configured', fakeAsync(() => {
- (prometheusService.ifPrometheusConfigured as jest.Mock).mockImplementation((_fn, elseFn) => {
- if (elseFn) {
- elseFn();
- }
- });
+ it('should set emptyStateKey to empty string when user lacks configOpt read', fakeAsync(() => {
+ const auth = TestBed.inject(AuthStorageService);
+ (auth.getPermissions as jest.Mock).mockReturnValue(new Permissions({}));
+
+ fixture = TestBed.createComponent(PerformanceCardComponent);
+ component = fixture.componentInstance;
const time = { start: 1000, end: 2000, step: 14 };
component.loadCharts(time);
tick();
- expect(component.emptyStateKey()).toBe('prometheusNotAvailable');
+ expect(component.emptyStateKey()).toBe('');
}));
it('should cleanup subscriptions on ngOnDestroy', () => {
} from '~/app/shared/models/performance-data';
import { PerformanceCardService } from '../../api/performance-card.service';
import { DropdownModule, GridModule, LayoutModule, ListItem } from 'carbon-components-angular';
-import { Subject, Subscription } from 'rxjs';
+import { of, Subject, Subscription } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { ProductiveCardComponent } from '../productive-card/productive-card.component';
import { CommonModule } from '@angular/common';
import { AreaChartComponent } from '../area-chart/area-chart.component';
import { MgrModuleService } from '../../api/mgr-module.service';
import { toSignal } from '@angular/core/rxjs-interop';
+import { AuthStorageService } from '../../services/auth-storage.service';
@Component({
selector: 'cd-performance-card',
}
];
+ role: string = '';
+
private prometheusService = inject(PrometheusService);
private performanceCardService = inject(PerformanceCardService);
private mgrModuleService = inject(MgrModuleService);
+ private readonly authStorageService = inject(AuthStorageService);
time = { ...this.prometheusService.lastHourDateObject };
private chartSub?: Subscription;
- readonly list = toSignal(this.mgrModuleService.list(), { initialValue: [] });
+ private readonly permissions = this.authStorageService.getPermissions();
+
+ readonly list = this.permissions?.configOpt?.read
+ ? toSignal(this.mgrModuleService.list(), { initialValue: [] })
+ : toSignal(of([]), { initialValue: [] });
ngOnInit() {
this.loadCharts(this.time);
.getChartData(time)
.pipe(takeUntil(this.destroy$))
.subscribe((data) => {
- this.chartDataSignal.set(data);
- this.prometheusService.ifPrometheusConfigured(
- () => {
- let enabled$ = this.list().filter((a) => a.name === 'prometheus')[0].enabled;
- if (enabled$) {
- this.chartDataSignal.set(data);
- this.emptyStateKey.set('');
- } else if (!enabled$) {
- this.emptyStateKey.set('prometheusDisabled');
- } else {
- this.emptyStateKey.set('storageNotAvailable');
- }
- },
- () => {
- this.emptyStateKey.set('prometheusNotAvailable');
- }
- );
+ if (this.permissions?.configOpt?.read) {
+ this.followEmptyStateMsgCheck(data);
+ } else {
+ this.skipEmptyStateMsgCheck(data);
+ }
});
}
+ followEmptyStateMsgCheck(data: PerformanceData) {
+ let enabled$ = this.list().filter((a) => a.name === 'prometheus')[0].enabled;
+ this.chartDataSignal.set(data);
+ if (enabled$) {
+ this.emptyStateKey.set('');
+ } else if (!enabled$) {
+ this.emptyStateKey.set('prometheusDisabled');
+ } else {
+ this.emptyStateKey.set('storageNotAvailable');
+ }
+ }
+
+ skipEmptyStateMsgCheck(data: PerformanceData) {
+ this.chartDataSignal.set(data);
+ this.emptyStateKey.set('');
+ }
+
ngOnDestroy(): void {
this.destroy$.next();
this.destroy$.complete();