import { HttpClientTestingModule } from '@angular/common/http/testing';
-import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs';
import { PerformanceCounterModule } from '~/app/ceph/performance-counter/performance-counter.module';
+import { RgwDaemon } from '~/app/ceph/rgw/models/rgw-daemon';
+import { RgwDaemonService } from '~/app/shared/api/rgw-daemon.service';
import { RgwSiteService } from '~/app/shared/api/rgw-site.service';
import { Permissions } from '~/app/shared/models/permissions';
import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
let fixture: ComponentFixture<RgwDaemonListComponent>;
let getPermissionsSpy: jasmine.Spy;
let getRealmsSpy: jasmine.Spy;
+ let listDaemonsSpy: jest.SpyInstance;
const permissions = new Permissions({ grafana: ['read'] });
+ const daemon: RgwDaemon = {
+ id: '8000',
+ service_map_id: '4803',
+ version: 'ceph version',
+ server_hostname: 'ceph',
+ realm_name: 'realm1',
+ zonegroup_name: 'zg1-realm1',
+ zone_name: 'zone1-zg1-realm1',
+ default: true
+ };
const expectTabsAndHeading = (length: number, heading: string) => {
const tabs = TabHelper.getTextContents(fixture);
getPermissionsSpy.and.returnValue(new Permissions({}));
getRealmsSpy = spyOn(TestBed.inject(RgwSiteService), 'get');
getRealmsSpy.and.returnValue(of([]));
+ listDaemonsSpy = jest
+ .spyOn(TestBed.inject(RgwDaemonService), 'list')
+ .mockReturnValue(of([daemon]));
fixture = TestBed.createComponent(RgwDaemonListComponent);
component = fixture.componentInstance;
});
expect(component).toBeTruthy();
});
+ it('should show a row with daemon info', fakeAsync(() => {
+ fixture.detectChanges();
+ tick();
+ expect(listDaemonsSpy).toHaveBeenCalledTimes(1);
+ expect(component.daemons).toEqual([daemon]);
+ expect(fixture.debugElement.query(By.css('cd-table')).nativeElement.textContent).toContain(
+ 'total 1'
+ );
+
+ fixture.destroy();
+ }));
+
it('should only show Daemons List tab', () => {
fixture.detectChanges();
import { Component, OnInit } from '@angular/core';
-import { take } from 'rxjs/operators';
-
import { RgwDaemon } from '~/app/ceph/rgw/models/rgw-daemon';
import { RgwDaemonService } from '~/app/shared/api/rgw-daemon.service';
import { RgwSiteService } from '~/app/shared/api/rgw-site.service';
})
export class RgwDaemonListComponent extends ListWithDetails implements OnInit {
columns: CdTableColumn[] = [];
- daemons: object[] = [];
+ daemons: RgwDaemon[] = [];
grafanaPermission: Permission;
isMultiSite: boolean;
prop: 'server_hostname',
flexGrow: 2
},
+ {
+ name: $localize`Zone`,
+ prop: 'zone_name',
+ flexGrow: 2
+ },
{
name: $localize`Zone Group`,
prop: 'zonegroup_name',
flexGrow: 2
},
{
- name: $localize`Zone`,
- prop: 'zone_name',
+ name: $localize`Realm`,
+ prop: 'realm_name',
flexGrow: 2
},
{
}
getDaemonList(context: CdTableFetchDataContext) {
- this.rgwDaemonService.daemons$.pipe(take(1)).subscribe(
- (resp: RgwDaemon[]) => {
- this.daemons = resp;
- },
- () => {
- context.error();
- }
- );
+ this.rgwDaemonService.list().subscribe(this.updateDaemons, () => {
+ context.error();
+ });
}
+
+ private updateDaemons = (daemons: RgwDaemon[]) => {
+ this.daemons = daemons;
+ };
}
import _ from 'lodash';
import { BehaviorSubject, Observable, of, throwError } from 'rxjs';
-import { mergeMap, retryWhen, take, tap } from 'rxjs/operators';
+import { mergeMap, take, tap } from 'rxjs/operators';
import { RgwDaemon } from '~/app/ceph/rgw/models/rgw-daemon';
import { cdEncode } from '~/app/shared/decorators/cd-encode';
request(next: (params: HttpParams) => Observable<any>) {
return this.selectedDaemon.pipe(
mergeMap((daemon: RgwDaemon) =>
- // If there is no selected daemon, retrieve daemon list (default daemon will be selected)
- // and try again if daemon list is not empty.
+ // If there is no selected daemon, retrieve daemon list so default daemon will be selected.
_.isEmpty(daemon)
- ? this.list().pipe(mergeMap((daemons) => throwError(!_.isEmpty(daemons))))
+ ? this.list().pipe(
+ mergeMap((daemons) =>
+ _.isEmpty(daemons) ? throwError('No RGW daemons found!') : this.selectedDaemon$
+ )
+ )
: of(daemon)
),
- retryWhen((error) =>
- error.pipe(
- mergeMap((hasToRetry) => (hasToRetry ? error : throwError('No RGW daemons found!')))
- )
- ),
take(1),
mergeMap((daemon: RgwDaemon) => {
let params = new HttpParams();