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