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

[YUNIKORN-1923] update apps columns #131

Closed
wants to merge 1 commit into from
Closed
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
40 changes: 40 additions & 0 deletions json-db.json
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,46 @@
"hasReserved": false,
"reservations": [],
"maxRequestPriority": -2147483648
},
{
"applicationID": "application-sleep-0006",
"usedResource": {
"memory": 0,
"pods": 0,
"vcore": 0
},
"maxUsedResource": {
"memory": 150000000,
"pods": 3,
"vcore": 30
},
"pendingResource": {
"memory": 150000000,
"pods": 3,
"vcore": 30
},
"partition": "default",
"queueName": "root.default",
"submissionTime": 1683692669425545686,
"finishedTime": null,
"requests": [],
"allocations": [],
"applicationState": "Accepted",
"user": "nobody",
"groups": [
"nobody"
],
"rejectedMessage": "",
"stateLog": [
{
"time": 1683692671425545686,
"applicationState": "Accepted"
}
],
"placeholderData": [],
"hasReserved": false,
"reservations": [],
"maxRequestPriority": -2147483648
}
],
"appHistory": [
Expand Down
82 changes: 27 additions & 55 deletions src/app/components/apps-view/apps-view.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,7 @@
<div class="dropdown-wrapper">
<label class="dropdown-label">Partition: </label>
<mat-form-field>
<mat-select
[(value)]="partitionSelected"
(selectionChange)="onPartitionSelectionChanged($event)"
>
<mat-select [(value)]="partitionSelected" (selectionChange)="onPartitionSelectionChanged($event)">
<mat-option *ngFor="let part of partitionList" [value]="part.value">
{{ part.name }}
</mat-option>
Expand All @@ -44,20 +41,9 @@
</div>
<div class="right-side">
<mat-form-field class="search-wrapper white-mat-form-field">
<input
matInput
type="text"
[(ngModel)]="searchText"
placeholder="Search By Application ID"
#searchInput
/>
<button
class="clear-btn"
*ngIf="searchText"
(click)="onClearSearch()"
matTooltip="Clear Search"
matTooltipShowDelay="500"
>
<input matInput type="text" [(ngModel)]="searchText" placeholder="Search By Application ID" #searchInput />
<button class="clear-btn" *ngIf="searchText" (click)="onClearSearch()" matTooltip="Clear Search"
matTooltipShowDelay="500">
<i class="far fa-times-circle"></i>
</button>
<i *ngIf="!searchText" class="fas fa-search search-icon"></i>
Expand All @@ -84,7 +70,8 @@
</ng-container>

<ng-template #renderNext_1>
<ng-container *ngIf="columnDef.colId === 'usedResource'; else renderNext_1">
<ng-container
*ngIf="columnDef.colId === 'usedResource' || columnDef.colId === 'pendingResource'; else renderNext_1">
<mat-cell *matCellDef="let element">
<ng-container *ngIf="columnDef.colFormatter; else showAppRawData">
<ng-container *ngIf="columnDef.colFormatter(element[columnDef.colId]) as colValue">
Expand Down Expand Up @@ -138,25 +125,16 @@

<mat-header-row *matHeaderRowDef="appColumnIds"></mat-header-row>

<mat-row
*matRowDef="let row; columns: appColumnIds"
[class.selected-row]="selectedRow === row"
(click)="toggleRowSelection(row)"
></mat-row>
<mat-row *matRowDef="let row; columns: appColumnIds" [class.selected-row]="selectedRow === row"
(click)="toggleRowSelection(row)"></mat-row>

<mat-footer-row
*matFooterRowDef="['noRecord']"
[ngStyle]="{ display: isAppDataSourceEmpty() ? '' : 'none' }"
></mat-footer-row>
<mat-footer-row *matFooterRowDef="['noRecord']"
[ngStyle]="{ display: isAppDataSourceEmpty() ? '' : 'none' }"></mat-footer-row>
</mat-table>

<mat-paginator
#appsViewMatPaginator
[pageSizeOptions]="[10, 20, 50, 100]"
[ngStyle]="{ display: isAppDataSourceEmpty() ? 'none' : '' }"
(page)="onPaginatorChanged()"
showFirstLastButtons
></mat-paginator>
<mat-paginator #appsViewMatPaginator [pageSizeOptions]="[10, 20, 50, 100]"
[ngStyle]="{ display: isAppDataSourceEmpty() ? 'none' : '' }" (page)="onPaginatorChanged()"
showFirstLastButtons></mat-paginator>
</div>

<div class="app-allocations" [ngStyle]="{ display: selectedRow ? '' : 'none' }">
Expand All @@ -172,16 +150,16 @@ <h3>Allocations</h3>
<mat-cell *matCellDef="let element">
<ng-container *ngIf="columnDef.colFormatter; else showAllocRowData;">
<ng-container *ngIf="columnDef.colFormatter(element[columnDef.colId]) as colValue">
<ul class="mat-res-ul">
<ng-container *ngFor="let resource of formatResources(colValue); let i = index">
<li class="mat-res-li" *ngIf="i<2">
{{resource}}
</li>
<li class="mat-res-li" *ngIf="i>=2 && detailToggle">
{{resource}}
</li>
</ng-container>
</ul>
<ul class="mat-res-ul">
<ng-container *ngFor="let resource of formatResources(colValue); let i = index">
<li class="mat-res-li" *ngIf="i<2">
{{resource}}
</li>
<li class="mat-res-li" *ngIf="i>=2 && detailToggle">
{{resource}}
</li>
</ng-container>
</ul>
</ng-container>
</ng-container>
<ng-template #showAllocRowData>
Expand All @@ -205,18 +183,12 @@ <h3>Allocations</h3>

<mat-row *matRowDef="let row; columns: allocColumnIds"></mat-row>

<mat-footer-row
*matFooterRowDef="['noRecord']"
[ngStyle]="{ display: isAllocDataSourceEmpty() ? '' : 'none' }"
></mat-footer-row>
<mat-footer-row *matFooterRowDef="['noRecord']"
[ngStyle]="{ display: isAllocDataSourceEmpty() ? '' : 'none' }"></mat-footer-row>
</mat-table>

<mat-paginator
#allocationMatPaginator
[pageSizeOptions]="[10, 20, 50, 100]"
[ngStyle]="{ display: isAllocDataSourceEmpty() ? 'none' : '' }"
showFirstLastButtons
></mat-paginator>
<mat-paginator #allocationMatPaginator [pageSizeOptions]="[10, 20, 50, 100]"
[ngStyle]="{ display: isAllocDataSourceEmpty() ? 'none' : '' }" showFirstLastButtons></mat-paginator>
</div>
</div>
</div>
38 changes: 33 additions & 5 deletions src/app/components/apps-view/apps-view.component.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@
* limitations under the License.
*/

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { DebugElement } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing';
import { HAMMER_LOADER } from '@angular/platform-browser';
import { NgxSpinnerService } from 'ngx-spinner';
import { configureTestSuite } from 'ng-bullet';
import { FormsModule } from '@angular/forms';
import { MatTableModule } from '@angular/material/table';
import { MatPaginatorModule } from '@angular/material/paginator';
Expand All @@ -30,16 +31,19 @@ import { MatSortModule } from '@angular/material/sort';
import { MatInputModule } from '@angular/material/input';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatSelectModule } from '@angular/material/select';
import { of } from 'rxjs';

import { AppsViewComponent } from './apps-view.component';
import { AppInfo } from '@app/models/app-info.model';
import { AllocationInfo } from '@app/models/alloc-info.model';
import { SchedulerService } from '@app/services/scheduler/scheduler.service';
import { MockSchedulerService, MockNgxSpinnerService } from '@app/testing/mocks';

describe('AppsViewComponent', () => {
let component: AppsViewComponent;
let fixture: ComponentFixture<AppsViewComponent>;

configureTestSuite(() => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [AppsViewComponent],
imports: [
Expand All @@ -59,8 +63,8 @@ describe('AppsViewComponent', () => {
{ provide: NgxSpinnerService, useValue: MockNgxSpinnerService },
{ provide: HAMMER_LOADER, useValue: () => new Promise(() => {}) },
],
});
});
}).compileComponents();
}));

beforeEach(() => {
fixture = TestBed.createComponent(AppsViewComponent);
Expand All @@ -71,4 +75,28 @@ describe('AppsViewComponent', () => {
it('should create the component', () => {
expect(component).toBeTruthy();
});

it('should have usedResource and pendingResource column', () => {
let service: SchedulerService;
service = TestBed.inject(SchedulerService);
let appInfo = new AppInfo(
'app1',
"Memory: 500.0 KB, CPU: 10, pods: 1",
"Memory: 0.0 bytes, CPU: 0, pods: n/a",
'',
1,
2,
[],
2,
'RUNNING',
[]
);
spyOn(service, 'fetchAppList').and.returnValue(of([appInfo]));
component.fetchAppListForPartitionAndQueue("default", "root");
component.toggle();
fixture.detectChanges();
const debugEl: DebugElement = fixture.debugElement;
expect(debugEl.query(By.css('mat-cell.mat-column-usedResource')).nativeElement.innerText).toContain('Memory: 500.0 KB\nCPU: 10\npods: 1');
expect(debugEl.query(By.css('mat-cell.mat-column-pendingResource')).nativeElement.innerText).toContain('Memory: 0.0 bytes\nCPU: 0\npods: n/a');
});
});
7 changes: 5 additions & 2 deletions src/app/components/apps-view/apps-view.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ export class AppsViewComponent implements OnInit {

this.appColumnDef = [
{ colId: 'applicationId', colName: 'Application ID' },
{ colId: 'queueName', colName: 'Queue Name' },
{ colId: 'applicationState', colName: 'Application State' },
{
colId: 'lastStateChangeTime',
Expand All @@ -91,7 +90,11 @@ export class AppsViewComponent implements OnInit {
colName: 'Used Resource',
colFormatter: CommonUtil.resourceColumnFormatter,
},
{ colId: 'partition', colName: 'Partition' },
{
colId: 'pendingResource',
colName: 'Pending Resource',
colFormatter: CommonUtil.resourceColumnFormatter,
},
{
colId: 'submissionTime',
colName: 'Submission Time',
Expand Down
3 changes: 1 addition & 2 deletions src/app/models/app-info.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,8 @@ export class AppInfo {
constructor(
public applicationId: string,
public usedResource: string,
public pendingResource: string,
public maxUsedResource: string,
public partition: string,
public queueName: string,
public submissionTime: number,
public finishedTime: null | number,
public stateLog: Array<StateLog>,
Expand Down
3 changes: 1 addition & 2 deletions src/app/services/scheduler/scheduler.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,8 @@ export class SchedulerService {
const appInfo = new AppInfo(
app['applicationID'],
this.formatResource(app['usedResource'] as SchedulerResourceInfo),
this.formatResource(app['pendingResource'] as SchedulerResourceInfo),
this.formatResource(app['maxUsedResource'] as SchedulerResourceInfo),
app['partition'],
app['queueName'],
app['submissionTime'],
app['lastStateChangeTime'],
app['stateLog'],
Expand Down
2 changes: 2 additions & 0 deletions src/app/testing/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
*/

import { of } from 'rxjs';
import { AppInfo } from '@app/models/app-info.model';
import { CommonUtil } from '@app/utils/common.util';

export const noopFn = () => {};

Expand Down