Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Delfin UI] Updated the masking views UI. Added support for resource groups #630

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions src/app/business/delfin/delfin.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,52 @@ export class DelfinService {
return this.http.get(url);
}

getAllVolumeGroups(storageId, nativeVolumeGroupId?, name?, limit?, offset?, sort?): Observable<any> {
let query = {};

if(nativeVolumeGroupId){
query['native_volume_group_id'] = nativeVolumeGroupId;
}
if(name){
query['name'] = name;
}
if(limit){
query['limit'] = limit;
}
if(offset){
query['offset'] = offset;
}
if(sort){
query['sort'] = sort;
}
query = '?' + Utils.prePareQuery(query);
let url =this.delfinStoragesUrl + '/' + storageId + '/volume-groups' + query;
return this.http.get(url);
}

getAllPortGroups(storageId, nativePortGroupId?, name?, limit?, offset?, sort?): Observable<any> {
let query = {};

if(nativePortGroupId){
query['native_port_group_id'] = nativePortGroupId;
}
if(name){
query['name'] = name;
}
if(limit){
query['limit'] = limit;
}
if(offset){
query['offset'] = offset;
}
if(sort){
query['sort'] = sort;
}
query = '?' + Utils.prePareQuery(query);
let url =this.delfinStoragesUrl + '/' + storageId + '/port-groups' + query;
return this.http.get(url);
}

getAllStorageHosts(storageId, nativeStorageHostId?, name?, limit?, offset?, sort?): Observable<any> {
let query = {};

Expand Down
269 changes: 264 additions & 5 deletions src/app/business/delfin/masking-views/masking-views.component.html

Large diffs are not rendered by default.

56 changes: 49 additions & 7 deletions src/app/business/delfin/masking-views/masking-views.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,16 @@ export class MaskingViewsComponent implements OnInit {
availabilityZones: "Availability Zones",
initiators: "Initiators",
storage_id: "Storage ID",
native_storage_host_id: "Native Host ID"
native_storage_host_id: "Native Host ID",
native_storage_host_group_id: "Native Storage Host Group ID",
id: "Delfin ID",
};
volumeLabel = {
name: this.i18n.keyID["sds_block_volume_name"],
description: this.i18n.keyID["sds_block_volume_descri"],
wwn: "WWN",
native_volume_id: "Native Volume ID",
native_volume_group_id: "Native Volume Group ID",
storage_id: "Storage ID",
compressed: "Compressed",
deduplicated: "Deduplicated",
Expand All @@ -69,7 +72,9 @@ export class MaskingViewsComponent implements OnInit {
};
portLabel = {
name: this.i18n.keyID["sds_block_volume_name"],
description: this.i18n.keyID["sds_block_volume_descri"],
native_port_id: "Native Port ID",
native_port_group_id:"Native Port Group ID",
storage_id: "Storage ID",
cpu_info: "CPU Info",
soft_version: "Software Version",
Expand Down Expand Up @@ -116,8 +121,18 @@ export class MaskingViewsComponent implements OnInit {
view['storageHostInitiatorsCount'] = 0;
view['volumesCount'] = 0;
view['storageHost'] = {};
if(view['native_storage_host_group_id']){
} else if(view['native_storage_host_id']){
if(view['native_storage_host_group_id'] && view['native_storage_host_group_id'] != ""){
this.ds.getAllStorageHostGroups(storageId, view['native_storage_host_group_id']).subscribe((res)=>{
let storageHostGroup = res.json().storage_host_groups;
view['storageHostGroup'] = storageHostGroup[0];
if(storageHostGroup && storageHostGroup.length){
view['storageHostGroup'] = storageHostGroup[0];
view['storage_hosts'] = storageHostGroup[0].storage_hosts ? storageHostGroup[0].storage_hosts : [];
}
}, (error)=>{
console.log("Something went wrong. Could not fetch storage host group.")
})
} else if(view['native_storage_host_id'] && view['native_storage_host_id'] != ""){
this.ds.getAllStorageHosts(storageId, view['native_storage_host_id']).subscribe((res)=>{
let storageHost = res.json().storage_hosts;
view['storageHost'] = storageHost[0];
Expand All @@ -129,8 +144,17 @@ export class MaskingViewsComponent implements OnInit {
}


if(view['native_volume_group_id']){
} else if(view['native_volume_id']){
if(view['native_volume_group_id'] && view['native_volume_group_id'] != ""){
this.ds.getAllVolumeGroups(storageId, view['native_volume_group_id']).subscribe((res)=>{
let volumeGroup = res.json().volume_groups;
if(volumeGroup && volumeGroup.length){
view['volumeGroup'] = volumeGroup[0];
view['volumes'] = volumeGroup[0].volumes ? volumeGroup[0].volumes : [];
}
}, (error)=>{
console.log("Something went wrong. Could not fetch volume groups.")
})
} else if(view['native_volume_id'] && view['native_volume_id'] != ""){
//view['volumesCount'] = view['volumes'].length;
this.ds.getAllVolumes(storageId, view['native_volume_id']).subscribe((res)=>{
let volume = res.json().volumes[0];
Expand All @@ -147,8 +171,17 @@ export class MaskingViewsComponent implements OnInit {
})
}

if(view['native_port_group_id']){
} else if(view['native_port_id']){
if(view['native_port_group_id'] && view['native_port_group_id'] != ""){
this.ds.getAllPortGroups(storageId, view['native_port_group_id']).subscribe((res)=>{
let portGroup = res.json().port_groups;
if(portGroup && portGroup.length){
view['portGroup'] = portGroup[0];
view['ports'] = portGroup[0].ports ? portGroup[0].ports : [];
}
}, (error)=>{
console.log("Something went wrong. Could not fetch port groups.")
})
} else if(view['native_port_id'] && view['native_port_id'] != ""){
this.ds.getAllPorts(storageId, view['native_port_id']).subscribe((res)=>{
let port = res.json().ports[0];
view['port'] = port;
Expand All @@ -172,6 +205,15 @@ export class MaskingViewsComponent implements OnInit {
switch (src) {
case 'maskingView': this.detailsLabels.heading = "Masking View Details";

break;
case 'storageHostGroup': this.detailsLabels.heading = "Storage Host Group Details";

break;
case 'volumeGroup': this.detailsLabels.heading = "Volume Group Details";

break;
case 'portGroup': this.detailsLabels.heading = "Port Group Details";

break;
case 'storageHost': this.detailsLabels.heading = "Storage Host Details";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { StoragePoolsComponent } from '../storage-pools/storage-pools.component'
import { ControllersComponent } from '../controllers/controllers.component';
import { PortsComponent } from '../ports/ports.component';
import { StorageHostInitiatorsComponent } from '../storage-host-initiators/initiators.component';
import { StorageHostsComponent } from '../storage-hosts/storage-hosts.component';
import { DisksComponent } from '../disks/disks.component';
import { QtreesComponent } from '../qtrees/qtrees.component';
import { FilesystemsComponent } from '../filesystems/filesystems.component';
Expand Down Expand Up @@ -37,6 +38,7 @@ let routers = [{
ControllersComponent,
PortsComponent,
StorageHostInitiatorsComponent,
StorageHostsComponent,
DisksComponent,
QtreesComponent,
FilesystemsComponent,
Expand All @@ -50,6 +52,7 @@ let routers = [{
ControllersComponent,
PortsComponent,
StorageHostInitiatorsComponent,
StorageHostsComponent,
DisksComponent,
QtreesComponent,
FilesystemsComponent,
Expand Down
210 changes: 210 additions & 0 deletions src/app/business/delfin/storage-hosts/storage-hosts.component.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
<div class="table-toolbar">
<div class="left">
</div>
<div class="right">
<div class="ui-inputsearch">
<input type="text" #searchAll pInputText placeholder="{{i18n.keyID['sds_block_volume_search']}}">
<button pButton type="button" icon="fa-search"></button>
</div>
</div>
</div>
<p-dataTable [value]="storageHostsArr" [globalFilter]="searchAll" [lazy]="true" (onLazyLoad)="loadInitiatorsLazy($event)" [expandableRows]="true" [rows]="10" [paginator]="true" [pageLinks]="3" [rowsPerPageOptions]="[10,20,50,100]" [totalRecords]="totalRecords" #spt>
<p-column expander="true" styleClass="col-icon" [style]="{'width': '3%'}"></p-column>
<p-column field="name" header="Name">
<ng-template pTemplate="body" let-storageHost="rowData">
<a (mouseenter)="showStorageHostOverview($event, storageHost, storageHostOverviewPanel)" (mouseleave)="showStorageHostOverview($event, storageHost, storageHostOverviewPanel)">{{storageHost.name}}</a>
</ng-template>
</p-column>
<p-column field="ip_address" header="IP Address">
</p-column>
<p-column field="status" header="Status" [style]="{'width': '8%'}">
<ng-template pTemplate="body" let-storageHost="rowData">
<span class="storage-status-icon" [ngClass]="{normal: storageHost.status=='Normal', abnormal: storageHost.status=='abnormal' || storageHost.status=='unknown' || storageHost.status=='offline'}"><i class="fa fa-circle"></i></span>
<span *ngIf="storageHost.status=='Normal'">Normal</span>
<span *ngIf="storageHost.status=='abnormal' || storageHost.status=='unknown'">Unknown</span>
<span *ngIf="storageHost.status=='offline'">Offline</span>
</ng-template>
</p-column>
<p-column header="Host ID">
<ng-template pTemplate="body" let-storageHost="rowData">
{{storageHost.native_storage_host_id}}
</ng-template>
</p-column>
<ng-template let-storageHost pTemplate="rowexpansion">
<div class="details-basic-info">
<div class="ui-grid ui-grid-responsive ui-grid-pad ui-fluid">
<div class="ui-grid-col-12">
<div class="ui-grid-row details-basic-item-class">
<div class="ui-grid-col-2">
{{label.name}}:
</div>
<div class="ui-grid-col-2 details-basic-item-value-color" *ngIf="storageHost">
{{storageHost.name}}
</div>
<div class="ui-grid-col-2">
{{label.status}}:
</div>
<div class="ui-grid-col-2 details-basic-item-value-color" *ngIf="storageHost">
<span class="storage-status-icon" [ngClass]="{normal: storageHost.status=='Normal', abnormal: storageHost.status=='abnormal' || storageHost.status=='unknown' || storageHost.status=='offline'}"><i class="fa fa-circle"></i></span>
<span *ngIf="storageHost.status=='Normal'">Normal</span>
<span *ngIf="storageHost.status=='abnormal' || storageHost.status=='unknown'">Unknown</span>
<span *ngIf="storageHost.status=='offline'">Offline</span>
</div>
<div class="ui-grid-col-2">
{{label.created_at}}:
</div>
<div class="ui-grid-col-3 details-basic-item-value-color" *ngIf="storageHost">
{{storageHost.created_at ? (storageHost.created_at | date:'long') : '--'}}
</div>


</div>
<div class="ui-grid-row details-basic-item-class">
<div class="ui-grid-col-2">
{{label.ip_address}}:
</div>
<div class="ui-grid-col-2 details-basic-item-value-color" *ngIf="storageHost">
{{storageHost.ip_address ? storageHost.ip_address : '--'}}
</div>
<div class="ui-grid-col-2">
{{label.native_storage_host_id}}:
</div>
<div class="ui-grid-col-2 details-basic-item-value-color" *ngIf="storageHost">
{{storageHost.native_storage_host_id | slice:0:20}}
<a *ngIf="storageHost.native_storage_host_id.length > 20" pTooltip="{{storageHost.native_storage_host_id}}" tooltipPosition="top">
...
</a>
</div>
<div class="ui-grid-col-2">
{{label.updated_at}}:
</div>
<div class="ui-grid-col-3 details-basic-item-value-color" *ngIf="storageHost">
{{storageHost.updated_at ? (storageHost.updated_at | date:'long') : '--'}}
</div>

</div>
<div class="ui-grid-row details-basic-item-class">
<div class="ui-grid-col-2">
{{label.storage_id}}:
</div>
<div class="ui-grid-col-2 details-basic-item-value-color" *ngIf="storageHost">
{{storageHost.storage_id | slice:0:20}}
<a *ngIf="storageHost.storage_id.length > 20" pTooltip="{{storageHost.storage_id}}" tooltipPosition="top">
...
</a>
</div>
<div class="ui-grid-col-2">
{{label.id}}:
</div>
<div class="ui-grid-col-2 details-basic-item-value-color" *ngIf="storageHost">
{{storageHost.id | slice:0:20}}
<a *ngIf="storageHost.id.length > 20" pTooltip="{{storageHost.id}}" tooltipPosition="top">
...
</a>
</div>

<div class="ui-grid-col-2">

</div>
<div class="ui-grid-col-3 details-basic-item-value-color" *ngIf="storageHost">

</div>
</div>
<div class="ui-grid-row details-basic-item-class">
<div class="ui-grid-col-2">
{{label.description}}:
</div>
<div class="ui-grid-col-2 details-basic-item-value-color" *ngIf="storageHost">
<a *ngIf="storageHost.description.length > 20" pTooltip="{{storageHost.description}}" tooltipPosition="top">
...
</a>
</div>
<div class="ui-grid-col-2">

</div>
<div class="ui-grid-col-2 details-basic-item-value-color" *ngIf="storageHost">

</div>
<div class="ui-grid-col-2">

</div>
<div class="ui-grid-col-3 details-basic-item-value-color" *ngIf="storageHost">

</div>
</div>
<div class="ui-grid-row details-basic-item-class">
<div class="ui-grid-col-12">
<h3>Storage Host Initiators</h3>
</div>
</div>
<!-- Show Storage host Initiators List -->
<div *ngIf="selectedStorageHosts && selectedStorageHosts.length">
<app-delfin-storage-host-initiators [selectedStorage]="selectedStorage" [selectedInitiators]="storageHost.storage_host_initiators"></app-delfin-storage-host-initiators>
</div>
</div>
</div>
</div>
</ng-template>
</p-dataTable>

<p-overlayPanel styleClass="overview-panel" #storageHostOverviewPanel>
<div class="ui-g overview-title">
<h4>{{storageHostOverview && storageHostOverview.name}}</h4>
</div>
<div class="ui-g ui-g-nopad overview-item" >
<div class="ui-g-6">
<span class="overview-item-label">Status: </span>
</div>
<div *ngIf="storageHostOverview" class="ui-g-6">
<span class="storage-status-icon" [ngClass]="{normal: storageHostOverview && storageHostOverview.status =='Normal', abnormal: storageHostOverview && storageHostOverview.status =='abnormal' || storageHostOverview.status =='unknown'}"><i class="fa fa-circle"></i></span>
<span *ngIf="storageHostOverview && storageHostOverview.status=='Normal'">Normal</span>
<span *ngIf=" storageHostOverview && storageHostOverview.status=='abnormal' || storageHostOverview.status=='unknown'">Unknown</span>
<span *ngIf=" storageHostOverview && storageHostOverview.status=='offline'">Offline</span>
</div>
</div>
<div class="ui-g overview-item">
<div class="ui-g-6">
<span class="overview-item-label">
Storage ID
</span>
</div>
<div class="ui-g-6">
<span>
{{ storageHostOverview && storageHostOverview.storage_id}}
</span>
</div>
</div>
<div class="ui-g overview-item">
<div class="ui-g-6">
<span class="overview-item-label">
Host ID
</span>
</div>
<div class="ui-g-6">
<span>
{{ storageHostOverview && storageHostOverview.native_storage_host_id}}
</span>
</div>
</div>
<div class="ui-g overview-item">
<div class="ui-g-6">
<span class="overview-item-label">
Storage Serial No.
</span>
</div>
<div class="ui-g-6">
<span>
{{ selectedStorageDetails && selectedStorageDetails.serial_number}}
</span>
</div>
</div>
<div class="ui-g overview-item">
<div class="ui-g-6">
WWN
</div>
<div class="ui-g-6">
{{storageHostOverview && storageHostOverview.ip_address}}}}
</div>
</div>
<hr />
</p-overlayPanel>
Loading