]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/blob
16c23f3b5790f4467f473d1ce1f21b04303f01db
[ceph-ci.git] /
1 import {
2   AfterViewInit,
3   Component,
4   Input,
5   OnChanges,
6   OnDestroy,
7   OnInit,
8   QueryList,
9   TemplateRef,
10   ViewChild,
11   ViewChildren
12 } from '@angular/core';
13
14 import * as _ from 'lodash';
15 import { Observable, Subscription } from 'rxjs';
16
17 import { CephServiceService } from '../../../../shared/api/ceph-service.service';
18 import { HostService } from '../../../../shared/api/host.service';
19 import { OrchestratorService } from '../../../../shared/api/orchestrator.service';
20 import { TableComponent } from '../../../../shared/datatable/table/table.component';
21 import { CellTemplate } from '../../../../shared/enum/cell-template.enum';
22 import { CdTableColumn } from '../../../../shared/models/cd-table-column';
23 import { CdTableFetchDataContext } from '../../../../shared/models/cd-table-fetch-data-context';
24 import { Daemon } from '../../../../shared/models/daemon.interface';
25
26 @Component({
27   selector: 'cd-service-daemon-list',
28   templateUrl: './service-daemon-list.component.html',
29   styleUrls: ['./service-daemon-list.component.scss']
30 })
31 export class ServiceDaemonListComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {
32   @ViewChild('statusTpl', { static: true })
33   statusTpl: TemplateRef<any>;
34
35   @ViewChildren('daemonsTable')
36   daemonsTableTpls: QueryList<TemplateRef<TableComponent>>;
37
38   @Input()
39   serviceName?: string;
40
41   @Input()
42   hostname?: string;
43
44   daemons: Daemon[] = [];
45   columns: CdTableColumn[] = [];
46
47   hasOrchestrator = false;
48
49   private daemonsTable: TableComponent;
50   private daemonsTableTplsSub: Subscription;
51
52   constructor(
53     private hostService: HostService,
54     private cephServiceService: CephServiceService,
55     private orchService: OrchestratorService
56   ) {}
57
58   ngOnInit() {
59     this.columns = [
60       {
61         name: $localize`Hostname`,
62         prop: 'hostname',
63         flexGrow: 1,
64         filterable: true
65       },
66       {
67         name: $localize`Daemon type`,
68         prop: 'daemon_type',
69         flexGrow: 1,
70         filterable: true
71       },
72       {
73         name: $localize`Daemon ID`,
74         prop: 'daemon_id',
75         flexGrow: 1,
76         filterable: true
77       },
78       {
79         name: $localize`Container ID`,
80         prop: 'container_id',
81         flexGrow: 3,
82         filterable: true,
83         cellTransformation: CellTemplate.truncate,
84         customTemplateConfig: {
85           length: 12
86         }
87       },
88       {
89         name: $localize`Container Image name`,
90         prop: 'container_image_name',
91         flexGrow: 3,
92         filterable: true
93       },
94       {
95         name: $localize`Container Image ID`,
96         prop: 'container_image_id',
97         flexGrow: 3,
98         filterable: true,
99         cellTransformation: CellTemplate.truncate,
100         customTemplateConfig: {
101           length: 12
102         }
103       },
104       {
105         name: $localize`Version`,
106         prop: 'version',
107         flexGrow: 1,
108         filterable: true
109       },
110       {
111         name: $localize`Status`,
112         prop: 'status_desc',
113         flexGrow: 1,
114         filterable: true,
115         cellTemplate: this.statusTpl
116       },
117       {
118         name: $localize`Last Refreshed`,
119         prop: 'last_refresh',
120         flexGrow: 2
121       }
122     ];
123
124     this.orchService.status().subscribe((data: { available: boolean }) => {
125       this.hasOrchestrator = data.available;
126     });
127   }
128
129   ngOnChanges() {
130     if (!_.isUndefined(this.daemonsTable)) {
131       this.daemonsTable.reloadData();
132     }
133   }
134
135   ngAfterViewInit() {
136     this.daemonsTableTplsSub = this.daemonsTableTpls.changes.subscribe(
137       (tableRefs: QueryList<TableComponent>) => {
138         this.daemonsTable = tableRefs.first;
139       }
140     );
141   }
142
143   ngOnDestroy() {
144     if (this.daemonsTableTplsSub) {
145       this.daemonsTableTplsSub.unsubscribe();
146     }
147   }
148
149   getStatusClass(status: number) {
150     return _.get(
151       {
152         '-1': 'badge-danger',
153         '0': 'badge-warning',
154         '1': 'badge-success'
155       },
156       status,
157       'badge-dark'
158     );
159   }
160
161   getDaemons(context: CdTableFetchDataContext) {
162     let observable: Observable<Daemon[]>;
163     if (this.hostname) {
164       observable = this.hostService.getDaemons(this.hostname);
165     } else if (this.serviceName) {
166       observable = this.cephServiceService.getDaemons(this.serviceName);
167     } else {
168       this.daemons = [];
169       return;
170     }
171     observable.subscribe(
172       (daemons: Daemon[]) => {
173         this.daemons = daemons;
174       },
175       () => {
176         this.daemons = [];
177         context.error();
178       }
179     );
180   }
181 }