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';
12 selector: 'cd-iscsi-target-details',
13 templateUrl: './iscsi-target-details.component.html',
14 styleUrls: ['./iscsi-target-details.component.scss']
16 export class IscsiTargetDetailsComponent implements OnChanges, OnInit {
18 selection: CdTableSelection;
22 @ViewChild('highlightTpl')
23 highlightTpl: TemplateRef<any>;
25 private detailTable: TableComponent;
26 @ViewChild('detailTable')
27 set content(content: TableComponent) {
28 this.detailTable = content;
30 content.updateColumns();
34 columns: CdTableColumn[];
41 constructor(private i18n: I18n) {}
47 name: this.i18n('Name'),
49 cellTemplate: this.highlightTpl
53 name: this.i18n('Current'),
55 cellTemplate: this.highlightTpl
59 name: this.i18n('Default'),
61 cellTemplate: this.highlightTpl
67 if (this.selection.hasSelection) {
68 this.selectedItem = this.selection.first();
72 this.data = undefined;
75 private generateTree() {
76 this.metadata = { root: this.selectedItem.target_controls };
80 expanded: 'fa fa-fw fa-bullseye fa-lg'
83 expanded: 'fa fa-fw fa-user fa-lg',
84 leaf: 'fa fa-fw fa-user'
87 expanded: 'fa fa-fw fa-users fa-lg',
88 leaf: 'fa fa-fw fa-users'
91 expanded: 'fa fa-fw fa-hdd-o fa-lg',
92 leaf: 'fa fa-fw fa-hdd-o'
95 expanded: 'fa fa-fw fa-server fa-lg',
96 leaf: 'fa fa-fw fa-server fa-lg'
101 _.forEach(this.selectedItem.disks, (disk) => {
102 const id = 'disk_' + disk.pool + '_' + disk.image;
103 this.metadata[id] = {
104 controls: disk.controls,
105 backstore: disk.backstore
109 value: `${disk.pool}/${disk.image}`,
115 _.forEach(this.selectedItem.portals, (portal) => {
116 portals.push({ value: `${portal.host}:${portal.ip}` });
120 _.forEach(this.selectedItem.clients, (client) => {
121 this.metadata['client_' + client.client_iqn] = client.auth;
124 client.luns.forEach((lun) => {
126 value: `${lun.pool}/${lun.image}`,
127 id: 'disk_' + lun.pool + '_' + lun.image,
129 cssClasses: cssClasses.disks
135 value: client.client_iqn,
136 id: 'client_' + client.client_iqn,
142 _.forEach(this.selectedItem.groups, (group) => {
144 group.disks.forEach((disk) => {
146 value: `${disk.pool}/${disk.image}`,
147 id: 'disk_' + disk.pool + '_' + disk.image
151 const initiators = [];
152 group.members.forEach((member) => {
155 id: 'client_' + member
160 value: group.group_id,
166 selectionAllowed: false,
167 cssClasses: cssClasses.disks
172 children: initiators,
174 selectionAllowed: false,
175 cssClasses: cssClasses.initiators
183 value: this.selectedItem.target_iqn,
187 cssClasses: cssClasses.target
194 selectionAllowed: false,
195 cssClasses: cssClasses.disks
202 selectionAllowed: false,
203 cssClasses: cssClasses.portals
210 selectionAllowed: false,
211 cssClasses: cssClasses.initiators
218 selectionAllowed: false,
219 cssClasses: cssClasses.groups
226 onNodeSelected(e: NodeEvent) {
228 this.title = e.node.value;
229 const tempData = this.metadata[e.node.id] || {};
231 if (e.node.id === 'root') {
232 this.columns[2].isHidden = false;
233 this.data = _.map(this.settings.target_default_controls, (value, key) => {
237 current: tempData[key] || value
240 } else if (e.node.id.toString().startsWith('disk_')) {
241 this.columns[2].isHidden = false;
242 this.data = _.map(this.settings.disk_default_controls[tempData.backstore], (value, key) => {
246 current: !_.isUndefined(tempData.controls[key]) ? tempData.controls[key] : value
250 displayName: 'backstore',
251 default: this.settings.default_backstore,
252 current: tempData.backstore
255 this.columns[2].isHidden = true;
256 this.data = _.map(tempData, (value, key) => {
265 this.data = undefined;
268 if (this.detailTable) {
269 this.detailTable.updateColumns();