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