12 } from '@angular/core';
14 import _ from 'lodash';
15 import { Observable, Subscription } from 'rxjs';
17 import { CephServiceService } from '~/app/shared/api/ceph-service.service';
18 import { HostService } from '~/app/shared/api/host.service';
19 import { OrchestratorService } from '~/app/shared/api/orchestrator.service';
20 import { TableComponent } from '~/app/shared/datatable/table/table.component';
21 import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
22 import { Icons } from '~/app/shared/enum/icons.enum';
23 import { CdTableColumn } from '~/app/shared/models/cd-table-column';
24 import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
25 import { Daemon } from '~/app/shared/models/daemon.interface';
26 import { CephServiceSpec } from '~/app/shared/models/service.interface';
27 import { RelativeDatePipe } from '~/app/shared/pipes/relative-date.pipe';
30 selector: 'cd-service-daemon-list',
31 templateUrl: './service-daemon-list.component.html',
32 styleUrls: ['./service-daemon-list.component.scss']
34 export class ServiceDaemonListComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {
35 @ViewChild('statusTpl', { static: true })
36 statusTpl: TemplateRef<any>;
38 @ViewChild('listTpl', { static: true })
39 listTpl: TemplateRef<any>;
41 @ViewChildren('daemonsTable')
42 daemonsTableTpls: QueryList<TemplateRef<TableComponent>>;
55 daemons: Daemon[] = [];
56 services: Array<CephServiceSpec> = [];
57 columns: CdTableColumn[] = [];
58 serviceColumns: CdTableColumn[] = [];
60 hasOrchestrator = false;
63 private daemonsTable: TableComponent;
64 private daemonsTableTplsSub: Subscription;
65 private serviceSub: Subscription;
68 private hostService: HostService,
69 private cephServiceService: CephServiceService,
70 private orchService: OrchestratorService,
71 private relativeDatePipe: RelativeDatePipe
77 name: $localize`Hostname`,
83 name: $localize`Daemon type`,
89 name: $localize`Daemon ID`,
95 name: $localize`Container ID`,
99 cellTransformation: CellTemplate.truncate,
100 customTemplateConfig: {
105 name: $localize`Container Image name`,
106 prop: 'container_image_name',
111 name: $localize`Container Image ID`,
112 prop: 'container_image_id',
115 cellTransformation: CellTemplate.truncate,
116 customTemplateConfig: {
121 name: $localize`Version`,
127 name: $localize`Status`,
131 cellTemplate: this.statusTpl
134 name: $localize`Last Refreshed`,
135 prop: 'last_refresh',
136 pipe: this.relativeDatePipe,
140 name: $localize`Daemon Events`,
143 cellTemplate: this.listTpl
147 this.serviceColumns = [
149 name: $localize`Service Name`,
150 prop: 'service_name',
155 name: $localize`Service Type`,
156 prop: 'service_type',
161 name: $localize`Service Events`,
164 cellTemplate: this.listTpl
168 this.orchService.status().subscribe((data: { available: boolean }) => {
169 this.hasOrchestrator = data.available;
170 this.showDocPanel = !data.available;
175 if (!_.isUndefined(this.daemonsTable)) {
176 this.daemonsTable.reloadData();
181 this.daemonsTableTplsSub = this.daemonsTableTpls.changes.subscribe(
182 (tableRefs: QueryList<TableComponent>) => {
183 this.daemonsTable = tableRefs.first;
189 if (this.daemonsTableTplsSub) {
190 this.daemonsTableTplsSub.unsubscribe();
192 if (this.serviceSub) {
193 this.serviceSub.unsubscribe();
197 getStatusClass(row: Daemon): string {
200 '-1': 'badge-danger',
201 '0': 'badge-warning',
209 getDaemons(context: CdTableFetchDataContext) {
210 let observable: Observable<Daemon[]>;
212 observable = this.hostService.getDaemons(this.hostname);
213 } else if (this.serviceName) {
214 observable = this.cephServiceService.getDaemons(this.serviceName);
219 observable.subscribe(
220 (daemons: Daemon[]) => {
221 this.daemons = daemons;
230 getServices(context: CdTableFetchDataContext) {
231 this.serviceSub = this.cephServiceService.list(this.serviceName).subscribe(
232 (services: CephServiceSpec[]) => {
233 this.services = services;
242 trackByFn(_index: any, item: any) {