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 { CdTableColumn } from '../../../shared/models/cd-table-column';
9 import { CdTableSelection } from '../../../shared/models/cd-table-selection';
10 import { IscsiBackstorePipe } from '../../../shared/pipes/iscsi-backstore.pipe';
13 selector: 'cd-iscsi-target-details',
14 templateUrl: './iscsi-target-details.component.html',
15 styleUrls: ['./iscsi-target-details.component.scss']
17 export class IscsiTargetDetailsComponent implements OnChanges, OnInit {
19 selection: CdTableSelection;
23 @ViewChild('highlightTpl')
24 highlightTpl: TemplateRef<any>;
26 private detailTable: TableComponent;
27 @ViewChild('detailTable')
28 set content(content: TableComponent) {
29 this.detailTable = content;
31 content.updateColumns();
35 columns: CdTableColumn[];
42 constructor(private i18n: I18n, private iscsiBackstorePipe: IscsiBackstorePipe) {}
48 name: this.i18n('Name'),
50 cellTemplate: this.highlightTpl
54 name: this.i18n('Current'),
56 cellTemplate: this.highlightTpl
60 name: this.i18n('Default'),
62 cellTemplate: this.highlightTpl
68 if (this.selection.hasSelection) {
69 this.selectedItem = this.selection.first();
73 this.data = undefined;
76 private generateTree() {
77 this.metadata = { root: this.selectedItem.target_controls };
81 expanded: 'fa fa-fw fa-bullseye fa-lg'
84 expanded: 'fa fa-fw fa-user fa-lg',
85 leaf: 'fa fa-fw fa-user'
88 expanded: 'fa fa-fw fa-users fa-lg',
89 leaf: 'fa fa-fw fa-users'
92 expanded: 'fa fa-fw fa-hdd-o fa-lg',
93 leaf: 'fa fa-fw fa-hdd-o'
96 expanded: 'fa fa-fw fa-server fa-lg',
97 leaf: 'fa fa-fw fa-server fa-lg'
102 _.forEach(this.selectedItem.disks, (disk) => {
103 const id = 'disk_' + disk.pool + '_' + disk.image;
104 this.metadata[id] = {
105 controls: disk.controls,
106 backstore: disk.backstore
110 value: `${disk.pool}/${disk.image}`,
116 _.forEach(this.selectedItem.portals, (portal) => {
117 portals.push({ value: `${portal.host}:${portal.ip}` });
121 _.forEach(this.selectedItem.clients, (client) => {
122 const client_metadata = _.cloneDeep(client.auth);
123 _.extend(client_metadata, client.info);
124 delete client_metadata['state'];
125 _.forEach(Object.keys(client.info.state), (state) => {
126 client_metadata[state.toLowerCase()] = client.info.state[state];
128 this.metadata['client_' + client.client_iqn] = client_metadata;
131 client.luns.forEach((lun) => {
133 value: `${lun.pool}/${lun.image}`,
134 id: 'disk_' + lun.pool + '_' + lun.image,
136 cssClasses: cssClasses.disks
142 value: client.client_iqn,
143 status: Object.keys(client.info.state).includes('LOGGED_IN') ? 'logged_in' : 'logged_out',
144 id: 'client_' + client.client_iqn,
150 _.forEach(this.selectedItem.groups, (group) => {
152 group.disks.forEach((disk) => {
154 value: `${disk.pool}/${disk.image}`,
155 id: 'disk_' + disk.pool + '_' + disk.image
159 const initiators = [];
160 group.members.forEach((member) => {
163 id: 'client_' + member
168 value: group.group_id,
174 selectionAllowed: false,
175 cssClasses: cssClasses.disks
180 children: initiators,
182 selectionAllowed: false,
183 cssClasses: cssClasses.initiators
191 value: this.selectedItem.target_iqn,
195 cssClasses: cssClasses.target
202 selectionAllowed: false,
203 cssClasses: cssClasses.disks
210 selectionAllowed: false,
211 cssClasses: cssClasses.portals
218 selectionAllowed: false,
219 cssClasses: cssClasses.initiators
226 selectionAllowed: false,
227 cssClasses: cssClasses.groups
234 onNodeSelected(e: NodeEvent) {
236 this.title = e.node.value;
237 const tempData = this.metadata[e.node.id] || {};
239 if (e.node.id === 'root') {
240 this.columns[2].isHidden = false;
241 this.data = _.map(this.settings.target_default_controls, (value, key) => {
245 current: tempData[key] || value
248 } else if (e.node.id.toString().startsWith('disk_')) {
249 this.columns[2].isHidden = false;
250 this.data = _.map(this.settings.disk_default_controls[tempData.backstore], (value, key) => {
254 current: !_.isUndefined(tempData.controls[key]) ? tempData.controls[key] : value
258 displayName: 'backstore',
259 default: this.iscsiBackstorePipe.transform(this.settings.default_backstore),
260 current: this.iscsiBackstorePipe.transform(tempData.backstore)
263 this.columns[2].isHidden = true;
264 this.data = _.map(tempData, (value, key) => {
273 this.data = undefined;
276 if (this.detailTable) {
277 this.detailTable.updateColumns();