Skip to content

Commit

Permalink
[UI] support to stop sbom scanning #20200
Browse files Browse the repository at this point in the history
Signed-off-by: xuelichao <[email protected]>
  • Loading branch information
xuelichao authored and wy65701436 committed Apr 8, 2024
1 parent f42c204 commit 5b3b09a
Show file tree
Hide file tree
Showing 34 changed files with 1,896 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ export enum ADDITIONS {
SUMMARY = 'readme.md',
VALUES = 'values.yaml',
DEPENDENCIES = 'dependencies',
SBOMS = 'sboms',
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@ import { ErrorHandler } from '../../../../../shared/units/error-handler';
@Injectable()
export class ArtifactListPageService {
private _scanBtnState: ClrLoadingState;
private _sbomBtnState: ClrLoadingState;
private _hasEnabledScanner: boolean = false;
private _hasScannerSupportVulnerability: boolean = false;
private _hasScannerSupportSBOM: boolean = false;
private _hasAddLabelImagePermission: boolean = false;
private _hasRetagImagePermission: boolean = false;
private _hasDeleteImagePermission: boolean = false;
private _hasScanImagePermission: boolean = false;
private _hasSbomPermission: boolean = false;

constructor(
private scanningService: ScanningResultService,
Expand All @@ -26,6 +30,10 @@ export class ArtifactListPageService {
return this._scanBtnState;
}

getSbomBtnState(): ClrLoadingState {
return this._sbomBtnState;
}

hasEnabledScanner(): boolean {
return this._hasEnabledScanner;
}
Expand All @@ -46,14 +54,53 @@ export class ArtifactListPageService {
return this._hasScanImagePermission;
}

hasSbomPermission(): boolean {
return this._hasSbomPermission;
}

hasScannerSupportVulnerability(): boolean {
return this._hasScannerSupportVulnerability;
}

hasScannerSupportSBOM(): boolean {
return this._hasScannerSupportSBOM;
}

init(projectId: number) {
this._getProjectScanner(projectId);
this._getPermissionRule(projectId);
}

updateStates(
enabledScanner: boolean,
scanState?: ClrLoadingState,
sbomState?: ClrLoadingState
) {
if (scanState) {
this._scanBtnState = scanState;
}
if (sbomState) {
this._sbomBtnState = sbomState;
}
this._hasEnabledScanner = enabledScanner;
}

updateCapabilities(capabilities?: any) {
if (capabilities) {
if (capabilities?.support_vulnerability !== undefined) {
this._hasScannerSupportVulnerability =
capabilities.support_vulnerability;
}
if (capabilities?.support_sbom !== undefined) {
this._hasScannerSupportSBOM = capabilities.support_sbom;
}
}
}

private _getProjectScanner(projectId: number): void {
this._hasEnabledScanner = false;
this._scanBtnState = ClrLoadingState.LOADING;
this._sbomBtnState = ClrLoadingState.LOADING;
this.scanningService.getProjectScanner(projectId).subscribe(
response => {
if (
Expand All @@ -62,14 +109,28 @@ export class ArtifactListPageService {
!response.disabled &&
response.health === 'healthy'
) {
this._scanBtnState = ClrLoadingState.SUCCESS;
this._hasEnabledScanner = true;
this.updateStates(
true,
ClrLoadingState.SUCCESS,
ClrLoadingState.SUCCESS
);
if (response?.capabilities) {
this.updateCapabilities(response?.capabilities);
}
} else {
this._scanBtnState = ClrLoadingState.ERROR;
this.updateStates(
false,
ClrLoadingState.ERROR,
ClrLoadingState.ERROR
);
}
},
error => {
this._scanBtnState = ClrLoadingState.ERROR;
this.updateStates(
false,
ClrLoadingState.ERROR,
ClrLoadingState.ERROR
);
}
);
}
Expand All @@ -94,6 +155,11 @@ export class ArtifactListPageService {
action: USERSTATICPERMISSION.REPOSITORY_TAG_SCAN_JOB.VALUE
.CREATE,
},
{
resource: USERSTATICPERMISSION.REPOSITORY_TAG_SBOM_JOB.KEY,
action: USERSTATICPERMISSION.REPOSITORY_TAG_SBOM_JOB.VALUE
.CREATE,
},
];
this.userPermissionService
.hasProjectPermissions(projectId, permissions)
Expand All @@ -103,6 +169,9 @@ export class ArtifactListPageService {
this._hasRetagImagePermission = results[1];
this._hasDeleteImagePermission = results[2];
this._hasScanImagePermission = results[3];
this._hasSbomPermission = results?.[4] ?? false;
// TODO need to remove the static code
this._hasSbomPermission = true;
},
error => this.errorHandlerService.error(error)
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,34 @@
<clr-icon shape="stop" size="16"></clr-icon>&nbsp;
<span>{{ 'VULNERABILITY.STOP_NOW' | translate }}</span>
</button>
<button
*ngIf="hasEnabledSbom()"
id="generate-sbom-btn"
[clrLoading]="generateSbomBtnState"
type="button"
class="btn btn-secondary"
[disabled]="true"
(click)="generateSbom()">
<clr-icon shape="file" size="16"></clr-icon>&nbsp;
<span>{{ 'SBOM.GENERATE' | translate }}</span>
</button>
<button
id="stop-sbom-btn"
*ngIf="hasEnabledSbom()"
[clrLoading]="stopBtnState"
type="button"
class="btn btn-secondary scan-btn"
[disabled]="
!(
canStopSbom() &&
hasSbomPermission &&
hasEnabledScanner
)
"
(click)="stopSbom()">
<clr-icon shape="stop" size="16"></clr-icon>&nbsp;
<span>{{ 'SBOM.STOP' | translate }}</span>
</button>
<clr-dropdown class="btn btn-link" *ngIf="!depth">
<span
clrDropdownTrigger
Expand Down Expand Up @@ -174,23 +202,29 @@
{{ 'REPOSITORY.VULNERABILITY' | translate }}
</ng-template>
</clr-dg-column>
<clr-dg-column class="annotations-column">
<clr-dg-column class="sbom-column">
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[6] }">
{{ 'REPOSITORY.SBOM' | translate }}
</ng-template>
</clr-dg-column>
<clr-dg-column class="annotations-column">
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[7] }">
{{ 'ARTIFACT.ANNOTATION' | translate }}
</ng-template>
</clr-dg-column>
<clr-dg-column>
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[7] }">
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[8] }">
{{ 'REPOSITORY.LABELS' | translate }}
</ng-template>
</clr-dg-column>
<clr-dg-column [clrDgSortBy]="pushComparator">
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[8] }">
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[9] }">
{{ 'REPOSITORY.PUSH_TIME' | translate }}
</ng-template>
</clr-dg-column>
<clr-dg-column [clrDgSortBy]="pullComparator">
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[9] }">
<ng-template
[clrDgHideableColumn]="{ hidden: hiddenArray[10] }">
{{ 'REPOSITORY.PULL_TIME' | translate }}
</ng-template>
</clr-dg-column>
Expand Down Expand Up @@ -389,6 +423,26 @@
</hbr-vulnerability-bar>
</div>
</clr-dg-cell>
<clr-dg-cell>
<div class="cell">
<span *ngIf="!hasScannerSupportSBOM">
{{ 'ARTIFACT.SBOM_UNSUPPORTED' | translate }}
</span>
<hbr-sbom-bar
(submitStopFinish)="submitSbomStopFinish($event)"
(scanFinished)="sbomFinished($event)"
*ngIf="hasScannerSupportSBOM"
[inputScanner]="artifact?.sbom_overview?.scanner"
(submitFinish)="submitSbomFinish($event)"
[projectName]="projectName"
[projectId]="projectId"
[repoName]="repoName"
[artifactDigest]="artifact?.digest"
[sbomDigest]="artifact?.sbomDigest"
[sbomOverview]="artifact?.sbom_overview">
</hbr-sbom-bar>
</div>
</clr-dg-cell>
<clr-dg-cell>
<div class="cell" *ngIf="artifact.annotationsArray?.length">
<div class="bar-state">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,10 @@
width: 11rem !important;
}

.sbom-column {
width: 6rem !important;
}

.annotations-column {
width: 5rem !important;
}
Expand Down
Loading

0 comments on commit 5b3b09a

Please sign in to comment.