summaryrefslogtreecommitdiffstats
path: root/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.spec.ts')
-rw-r--r--src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.spec.ts253
1 files changed, 253 insertions, 0 deletions
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.spec.ts
new file mode 100644
index 000000000..31739a7c2
--- /dev/null
+++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.spec.ts
@@ -0,0 +1,253 @@
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import _ from 'lodash';
+import { NgxPipeFunctionModule } from 'ngx-pipe-function';
+import { ToastrModule } from 'ngx-toastr';
+import { of } from 'rxjs';
+
+import { CephModule } from '~/app/ceph/ceph.module';
+import { CoreModule } from '~/app/core/core.module';
+import { CephServiceService } from '~/app/shared/api/ceph-service.service';
+import { HostService } from '~/app/shared/api/host.service';
+import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
+import { SharedModule } from '~/app/shared/shared.module';
+import { configureTestBed } from '~/testing/unit-test-helper';
+import { ServiceDaemonListComponent } from './service-daemon-list.component';
+
+describe('ServiceDaemonListComponent', () => {
+ let component: ServiceDaemonListComponent;
+ let fixture: ComponentFixture<ServiceDaemonListComponent>;
+
+ const daemons = [
+ {
+ hostname: 'osd0',
+ container_id: '003c10beafc8c27b635bcdfed1ed832e4c1005be89bb1bb05ad4cc6c2b98e41b',
+ container_image_id: 'e70344c77bcbf3ee389b9bf5128f635cf95f3d59e005c5d8e67fc19bcc74ed23',
+ container_image_name: 'docker.io/ceph/daemon-base:latest-master-devel',
+ daemon_id: '3',
+ daemon_type: 'osd',
+ daemon_name: 'osd.3',
+ version: '15.1.0-1174-g16a11f7',
+ memory_usage: '17.7',
+ cpu_percentage: '3.54%',
+ status: 1,
+ status_desc: 'running',
+ last_refresh: '2020-02-25T04:33:26.465699',
+ events: [
+ { created: '2020-02-24T04:33:26.465699' },
+ { created: '2020-02-25T04:33:26.465699' },
+ { created: '2020-02-26T04:33:26.465699' }
+ ]
+ },
+ {
+ hostname: 'osd0',
+ container_id: 'baeec41a01374b3ed41016d542d19aef4a70d69c27274f271e26381a0cc58e7a',
+ container_image_id: 'e70344c77bcbf3ee389b9bf5128f635cf95f3d59e005c5d8e67fc19bcc74ed23',
+ container_image_name: 'docker.io/ceph/daemon-base:latest-master-devel',
+ daemon_id: '4',
+ daemon_type: 'osd',
+ daemon_name: 'osd.4',
+ version: '15.1.0-1174-g16a11f7',
+ memory_usage: '17.7',
+ cpu_percentage: '3.54%',
+ status: 1,
+ status_desc: 'running',
+ last_refresh: '2020-02-25T04:33:26.465822',
+ events: []
+ },
+ {
+ hostname: 'osd0',
+ container_id: '8483de277e365bea4365cee9e1f26606be85c471e4da5d51f57e4b85a42c616e',
+ container_image_id: 'e70344c77bcbf3ee389b9bf5128f635cf95f3d59e005c5d8e67fc19bcc74ed23',
+ container_image_name: 'docker.io/ceph/daemon-base:latest-master-devel',
+ daemon_id: '5',
+ daemon_type: 'osd',
+ daemon_name: 'osd.5',
+ version: '15.1.0-1174-g16a11f7',
+ memory_usage: '17.7',
+ cpu_percentage: '3.54%',
+ status: 1,
+ status_desc: 'running',
+ last_refresh: '2020-02-25T04:33:26.465886',
+ events: []
+ },
+ {
+ hostname: 'mon0',
+ container_id: '6ca0574f47e300a6979eaf4e7c283a8c4325c2235ae60358482fc4cd58844a21',
+ container_image_id: 'e70344c77bcbf3ee389b9bf5128f635cf95f3d59e005c5d8e67fc19bcc74ed23',
+ container_image_name: 'docker.io/ceph/daemon-base:latest-master-devel',
+ daemon_id: 'a',
+ daemon_name: 'mon.a',
+ daemon_type: 'mon',
+ version: '15.1.0-1174-g16a11f7',
+ memory_usage: '17.7',
+ cpu_percentage: '3.54%',
+ status: 1,
+ status_desc: 'running',
+ last_refresh: '2020-02-25T04:33:26.465886',
+ events: []
+ }
+ ];
+
+ const services = [
+ {
+ service_type: 'osd',
+ service_name: 'osd',
+ status: {
+ container_image_id: 'e70344c77bcbf3ee389b9bf5128f635cf95f3d59e005c5d8e67fc19bcc74ed23',
+ container_image_name: 'docker.io/ceph/daemon-base:latest-master-devel',
+ size: 3,
+ running: 3,
+ last_refresh: '2020-02-25T04:33:26.465699'
+ },
+ events: '2021-03-22T07:34:48.582163Z service:osd [INFO] "service was created"'
+ },
+ {
+ service_type: 'crash',
+ service_name: 'crash',
+ status: {
+ container_image_id: 'e70344c77bcbf3ee389b9bf5128f635cf95f3d59e005c5d8e67fc19bcc74ed23',
+ container_image_name: 'docker.io/ceph/daemon-base:latest-master-devel',
+ size: 1,
+ running: 1,
+ last_refresh: '2020-02-25T04:33:26.465766'
+ },
+ events: '2021-03-22T07:34:48.582163Z service:osd [INFO] "service was created"'
+ }
+ ];
+
+ const getDaemonsByHostname = (hostname?: string) => {
+ return hostname ? _.filter(daemons, { hostname: hostname }) : daemons;
+ };
+
+ const getDaemonsByServiceName = (serviceName?: string) => {
+ return serviceName ? _.filter(daemons, { daemon_type: serviceName }) : daemons;
+ };
+
+ configureTestBed({
+ imports: [
+ HttpClientTestingModule,
+ CephModule,
+ CoreModule,
+ NgxPipeFunctionModule,
+ SharedModule,
+ ToastrModule.forRoot()
+ ]
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ServiceDaemonListComponent);
+ component = fixture.componentInstance;
+ const hostService = TestBed.inject(HostService);
+ const cephServiceService = TestBed.inject(CephServiceService);
+ spyOn(hostService, 'getDaemons').and.callFake(() =>
+ of(getDaemonsByHostname(component.hostname))
+ );
+ spyOn(cephServiceService, 'getDaemons').and.callFake(() =>
+ of(getDaemonsByServiceName(component.serviceName))
+ );
+ spyOn(cephServiceService, 'list').and.returnValue(of(services));
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+
+ it('should list daemons by host', () => {
+ component.hostname = 'mon0';
+ component.getDaemons(new CdTableFetchDataContext(() => undefined));
+ expect(component.daemons.length).toBe(1);
+ });
+
+ it('should list daemons by service', () => {
+ component.serviceName = 'osd';
+ component.getDaemons(new CdTableFetchDataContext(() => undefined));
+ expect(component.daemons.length).toBe(3);
+ });
+
+ it('should list services', () => {
+ component.getServices(new CdTableFetchDataContext(() => undefined));
+ expect(component.services.length).toBe(2);
+ });
+
+ it('should not display doc panel if orchestrator is available', () => {
+ expect(component.showDocPanel).toBeFalsy();
+ });
+
+ it('should call daemon action', () => {
+ const daemon = daemons[0];
+ component.selection.selected = [daemon];
+ component['daemonService'].action = jest.fn(() => of());
+ for (const action of ['start', 'stop', 'restart', 'redeploy']) {
+ component.daemonAction(action);
+ expect(component['daemonService'].action).toHaveBeenCalledWith(daemon.daemon_name, action);
+ }
+ });
+
+ it('should disable daemon actions', () => {
+ const daemon = {
+ daemon_type: 'osd',
+ status_desc: 'running'
+ };
+
+ const states = {
+ start: true,
+ stop: false,
+ restart: false,
+ redeploy: false
+ };
+ const expectBool = (toExpect: boolean, arg: boolean) => {
+ if (toExpect === true) {
+ expect(arg).toBeTruthy();
+ } else {
+ expect(arg).toBeFalsy();
+ }
+ };
+
+ component.selection.selected = [daemon];
+ for (const action of ['start', 'stop', 'restart', 'redeploy']) {
+ expectBool(states[action], component.actionDisabled(action));
+ }
+
+ daemon.status_desc = 'stopped';
+ states.start = false;
+ states.stop = true;
+ component.selection.selected = [daemon];
+ for (const action of ['start', 'stop', 'restart', 'redeploy']) {
+ expectBool(states[action], component.actionDisabled(action));
+ }
+ });
+
+ it('should disable daemon actions in mgr and mon daemon', () => {
+ const daemon = {
+ daemon_type: 'mgr',
+ status_desc: 'running'
+ };
+ for (const action of ['start', 'stop', 'restart', 'redeploy']) {
+ expect(component.actionDisabled(action)).toBeTruthy();
+ }
+ daemon.daemon_type = 'mon';
+ for (const action of ['start', 'stop', 'restart', 'redeploy']) {
+ expect(component.actionDisabled(action)).toBeTruthy();
+ }
+ });
+
+ it('should disable daemon actions if no selection', () => {
+ component.selection.selected = [];
+ for (const action of ['start', 'stop', 'restart', 'redeploy']) {
+ expect(component.actionDisabled(action)).toBeTruthy();
+ }
+ });
+
+ it('should sort daemons events', () => {
+ component.sortDaemonEvents();
+ const daemon = daemons[0];
+ for (let i = 1; i < daemon.events.length; i++) {
+ const t1 = new Date(daemon.events[i - 1].created).getTime();
+ const t2 = new Date(daemon.events[i].created).getTime();
+ expect(t1 >= t2).toBeTruthy();
+ }
+ });
+});