1 import { Component, Input, OnChanges, OnInit, TemplateRef, ViewChild } from '@angular/core';
3 import { I18n } from '@ngx-translate/i18n-polyfill';
4 import * as _ from 'lodash';
5 import { NodeEvent, TreeModel } from 'ng2-tree';
7 import { TableComponent } from '../../../shared/datatable/table/table.component';
8 import { Icons } from '../../../shared/enum/icons.enum';
9 import { CdTableColumn } from '../../../shared/models/cd-table-column';
10 import { CdTableSelection } from '../../../shared/models/cd-table-selection';
11 import { IscsiBackstorePipe } from '../../../shared/pipes/iscsi-backstore.pipe';
14 selector: 'cd-iscsi-target-details',
15 templateUrl: './iscsi-target-details.component.html',
16 styleUrls: ['./iscsi-target-details.component.scss']
18 export class IscsiTargetDetailsComponent implements OnChanges, OnInit {
20 selection: CdTableSelection;
24 @ViewChild('highlightTpl', { static: true })
25 highlightTpl: TemplateRef<any>;
27 private detailTable: TableComponent;
28 @ViewChild('detailTable', { static: false })
29 set content(content: TableComponent) {
30 this.detailTable = content;
32 content.updateColumns();
36 columns: CdTableColumn[];
43 constructor(private i18n: I18n, private iscsiBackstorePipe: IscsiBackstorePipe) {}
49 name: this.i18n('Name'),
51 cellTemplate: this.highlightTpl
55 name: this.i18n('Current'),
57 cellTemplate: this.highlightTpl
61 name: this.i18n('Default'),
63 cellTemplate: this.highlightTpl
69 if (this.selection.hasSelection) {
70 this.selectedItem = this.selection.first();
74 this.data = undefined;
77 private generateTree() {
78 this.metadata = { root: this.selectedItem.target_controls };
82 this.selectedItem.cdExecuting
83 ? [Icons.large, Icons.spinner, Icons.spin]
84 : [Icons.large, Icons.bullseye],
89 expanded: _.join([Icons.large, Icons.user], ' '),
90 leaf: _.join([Icons.user], ' ')
93 expanded: _.join([Icons.large, Icons.user], ' '),
94 leaf: _.join([Icons.user], ' ')
97 expanded: _.join([Icons.large, Icons.disk], ' '),
98 leaf: _.join([Icons.disk], ' ')
101 expanded: _.join([Icons.large, Icons.server], ' '),
102 leaf: _.join([Icons.large, Icons.server], ' ')
107 _.forEach(this.selectedItem.disks, (disk) => {
108 const id = 'disk_' + disk.pool + '_' + disk.image;
109 this.metadata[id] = {
110 controls: disk.controls,
111 backstore: disk.backstore
115 value: `${disk.pool}/${disk.image}`,
121 _.forEach(this.selectedItem.portals, (portal) => {
122 portals.push({ value: `${portal.host}:${portal.ip}` });
126 _.forEach(this.selectedItem.clients, (client) => {
127 const client_metadata = _.cloneDeep(client.auth);
129 _.extend(client_metadata, client.info);
130 delete client_metadata['state'];
131 _.forEach(Object.keys(client.info.state), (state) => {
132 client_metadata[state.toLowerCase()] = client.info.state[state];
135 this.metadata['client_' + client.client_iqn] = client_metadata;
138 client.luns.forEach((lun) => {
140 value: `${lun.pool}/${lun.image}`,
141 id: 'disk_' + lun.pool + '_' + lun.image,
143 cssClasses: cssClasses.disks
150 status = Object.keys(client.info.state).includes('LOGGED_IN') ? 'logged_in' : 'logged_out';
153 value: client.client_iqn,
155 id: 'client_' + client.client_iqn,
161 _.forEach(this.selectedItem.groups, (group) => {
163 group.disks.forEach((disk) => {
165 value: `${disk.pool}/${disk.image}`,
166 id: 'disk_' + disk.pool + '_' + disk.image
170 const initiators = [];
171 group.members.forEach((member) => {
174 id: 'client_' + member
179 value: group.group_id,
185 selectionAllowed: false,
186 cssClasses: cssClasses.disks
191 children: initiators,
193 selectionAllowed: false,
194 cssClasses: cssClasses.initiators
202 value: this.selectedItem.target_iqn,
206 cssClasses: cssClasses.target
213 selectionAllowed: false,
214 cssClasses: cssClasses.disks
221 selectionAllowed: false,
222 cssClasses: cssClasses.portals
229 selectionAllowed: false,
230 cssClasses: cssClasses.initiators
237 selectionAllowed: false,
238 cssClasses: cssClasses.groups
245 onNodeSelected(e: NodeEvent) {
247 this.title = e.node.value;
248 const tempData = this.metadata[e.node.id] || {};
250 if (e.node.id === 'root') {
251 this.columns[2].isHidden = false;
252 this.data = _.map(this.settings.target_default_controls, (value, key) => {
256 current: tempData[key] || value
259 } else if (e.node.id.toString().startsWith('disk_')) {
260 this.columns[2].isHidden = false;
261 this.data = _.map(this.settings.disk_default_controls[tempData.backstore], (value, key) => {
265 current: !_.isUndefined(tempData.controls[key]) ? tempData.controls[key] : value
269 displayName: 'backstore',
270 default: this.iscsiBackstorePipe.transform(this.settings.default_backstore),
271 current: this.iscsiBackstorePipe.transform(tempData.backstore)
274 this.columns[2].isHidden = true;
275 this.data = _.map(tempData, (value, key) => {
284 this.data = undefined;
287 if (this.detailTable) {
288 this.detailTable.updateColumns();