mirror of https://github.com/goharbor/harbor.git
update scan type for scan and stop sbom request
Signed-off-by: xuelichao <xuel@vmware.com>
This commit is contained in:
parent
71d4aecc13
commit
2b2f4053d7
|
@ -4744,7 +4744,7 @@ paths:
|
|||
summary: Get job log by job id
|
||||
description: Get job log by job id, it is only used by administrator
|
||||
produces:
|
||||
- text/plain
|
||||
- text/plain
|
||||
tags:
|
||||
- jobservice
|
||||
parameters:
|
||||
|
@ -4875,7 +4875,6 @@ paths:
|
|||
'200':
|
||||
description: Get scheduler status successfully.
|
||||
schema:
|
||||
type: object
|
||||
$ref: '#/definitions/SchedulerStatus'
|
||||
'401':
|
||||
$ref: '#/responses/401'
|
||||
|
@ -6097,7 +6096,7 @@ paths:
|
|||
description: Specify whether the dangerous Artifact are included inside summary information
|
||||
type: boolean
|
||||
required: false
|
||||
default: false
|
||||
default: false
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
|
@ -6116,15 +6115,15 @@ paths:
|
|||
get:
|
||||
summary: Get the vulnerability list.
|
||||
description: |
|
||||
Get the vulnerability list. use q to pass the query condition,
|
||||
Get the vulnerability list. use q to pass the query condition,
|
||||
supported conditions:
|
||||
cve_id(exact match)
|
||||
cvss_score_v3(range condition)
|
||||
severity(exact match)
|
||||
repository_name(exact match)
|
||||
project_id(exact match)
|
||||
repository_name(exact match)
|
||||
project_id(exact match)
|
||||
package(exact match)
|
||||
tag(exact match)
|
||||
tag(exact match)
|
||||
digest(exact match)
|
||||
tags:
|
||||
- securityhub
|
||||
|
@ -6776,10 +6775,6 @@ definitions:
|
|||
type: object
|
||||
description: 'The generate SBOM overview information'
|
||||
properties:
|
||||
report_id:
|
||||
type: string
|
||||
description: 'id of the native sbom report'
|
||||
example: '5f62c830-f996-11e9-957f-0242c0a89008'
|
||||
start_time:
|
||||
type: string
|
||||
format: date-time
|
||||
|
@ -6805,8 +6800,6 @@ definitions:
|
|||
format: int64
|
||||
description: 'Time in seconds required to create the report'
|
||||
example: 300
|
||||
scanner:
|
||||
$ref: '#/definitions/Scanner'
|
||||
NativeReportSummary:
|
||||
type: object
|
||||
description: 'The summary for the native report'
|
||||
|
@ -7228,6 +7221,10 @@ definitions:
|
|||
type: string
|
||||
description: 'Whether scan images automatically when pushing. The valid values are "true", "false".'
|
||||
x-nullable: true
|
||||
auto_sbom_generation:
|
||||
type: string
|
||||
description: 'Whether generating SBOM automatically when pushing a subject artifact. The valid values are "true", "false".'
|
||||
x-nullable: true
|
||||
reuse_sys_cve_allowlist:
|
||||
type: string
|
||||
description: 'Whether this project reuse the system level CVE allowlist as the allowlist of its own. The valid values are "true", "false".
|
||||
|
@ -7720,8 +7717,9 @@ definitions:
|
|||
description: The level of the robot, project or system
|
||||
duration:
|
||||
type: integer
|
||||
x-nullable: true
|
||||
format: int64
|
||||
description: The duration of the robot in days
|
||||
description: The duration of the robot in days, duration must be either -1(Never) or a positive integer
|
||||
editable:
|
||||
type: boolean
|
||||
x-omitempty: false
|
||||
|
@ -7768,7 +7766,7 @@ definitions:
|
|||
duration:
|
||||
type: integer
|
||||
format: int64
|
||||
description: The duration of the robot in days
|
||||
description: The duration of the robot in days, duration must be either -1(Never) or a positive integer
|
||||
permissions:
|
||||
type: array
|
||||
items:
|
||||
|
@ -8058,7 +8056,7 @@ definitions:
|
|||
type: string
|
||||
description: |
|
||||
The schedule type. The valid values are 'Hourly', 'Daily', 'Weekly', 'Custom', 'Manual', 'None' and 'Schedule'.
|
||||
'Manual' means to trigger it right away, 'Schedule' means to trigger it by a specified cron schedule and
|
||||
'Manual' means to trigger it right away, 'Schedule' means to trigger it by a specified cron schedule and
|
||||
'None' means to cancel the schedule.
|
||||
enum:
|
||||
- Hourly
|
||||
|
@ -9888,12 +9886,12 @@ definitions:
|
|||
type: object
|
||||
description: the dangerous CVE information
|
||||
properties:
|
||||
cve_id:
|
||||
cve_id:
|
||||
type: string
|
||||
description: the cve id
|
||||
severity:
|
||||
type: string
|
||||
description: the severity of the CVE
|
||||
description: the severity of the CVE
|
||||
cvss_score_v3:
|
||||
type: number
|
||||
format: float64
|
||||
|
@ -9903,7 +9901,7 @@ definitions:
|
|||
description: the description of the CVE
|
||||
package:
|
||||
type: string
|
||||
description: the package of the CVE
|
||||
description: the package of the CVE
|
||||
version:
|
||||
type: string
|
||||
description: the version of the package
|
||||
|
@ -9911,14 +9909,14 @@ definitions:
|
|||
type: object
|
||||
description: the dangerous artifact information
|
||||
properties:
|
||||
project_id:
|
||||
project_id:
|
||||
type: integer
|
||||
format: int64
|
||||
description: the project id of the artifact
|
||||
repository_name:
|
||||
type: string
|
||||
description: the repository name of the artifact
|
||||
digest:
|
||||
digest:
|
||||
type: string
|
||||
description: the digest of the artifact
|
||||
critical_cnt:
|
||||
|
@ -9978,7 +9976,7 @@ definitions:
|
|||
description: The description of the vulnerability
|
||||
links:
|
||||
type: array
|
||||
items:
|
||||
items:
|
||||
type: string
|
||||
description: Links of the vulnerability
|
||||
ScanType:
|
||||
|
@ -9987,4 +9985,4 @@ definitions:
|
|||
scan_type:
|
||||
type: string
|
||||
description: 'The scan type for the scan request. Two options are currently supported, vulnerability and sbom'
|
||||
enum: [ vulnerability, sbom ]
|
||||
enum: [ vulnerability, sbom ]
|
|
@ -281,4 +281,13 @@ describe('CreateEditRuleComponent (inline template)', () => {
|
|||
expect(ruleNameInput).toBeTruthy();
|
||||
expect(ruleNameInput.value.trim()).toEqual('sync_01');
|
||||
}));
|
||||
|
||||
it('List all Registries Response', fakeAsync(() => {
|
||||
fixture.detectChanges();
|
||||
comp.ngOnInit();
|
||||
comp.getAllRegistries();
|
||||
fixture.whenStable();
|
||||
tick(5000);
|
||||
expect(comp.targetList.length).toBe(4);
|
||||
}));
|
||||
});
|
||||
|
|
|
@ -6,6 +6,7 @@ import {
|
|||
USERSTATICPERMISSION,
|
||||
} from '../../../../../shared/services';
|
||||
import { ErrorHandler } from '../../../../../shared/units/error-handler';
|
||||
import { Scanner } from '../../../../left-side-nav/interrogation-services/scanner/scanner';
|
||||
|
||||
@Injectable()
|
||||
export class ArtifactListPageService {
|
||||
|
@ -19,6 +20,7 @@ export class ArtifactListPageService {
|
|||
private _hasDeleteImagePermission: boolean = false;
|
||||
private _hasScanImagePermission: boolean = false;
|
||||
private _hasSbomPermission: boolean = false;
|
||||
private _scanner: Scanner = undefined;
|
||||
|
||||
constructor(
|
||||
private scanningService: ScanningResultService,
|
||||
|
@ -26,6 +28,10 @@ export class ArtifactListPageService {
|
|||
private errorHandlerService: ErrorHandler
|
||||
) {}
|
||||
|
||||
getProjectScanner(): Scanner {
|
||||
return this._scanner;
|
||||
}
|
||||
|
||||
getScanBtnState(): ClrLoadingState {
|
||||
return this._scanBtnState;
|
||||
}
|
||||
|
@ -103,29 +109,28 @@ export class ArtifactListPageService {
|
|||
this._sbomBtnState = ClrLoadingState.LOADING;
|
||||
this.scanningService.getProjectScanner(projectId).subscribe(
|
||||
response => {
|
||||
if (
|
||||
response &&
|
||||
'{}' !== JSON.stringify(response) &&
|
||||
!response.disabled &&
|
||||
response.health === 'healthy'
|
||||
) {
|
||||
this.updateStates(
|
||||
true,
|
||||
ClrLoadingState.SUCCESS,
|
||||
ClrLoadingState.SUCCESS
|
||||
);
|
||||
if (response?.capabilities) {
|
||||
this.updateCapabilities(response?.capabilities);
|
||||
if (response && '{}' !== JSON.stringify(response)) {
|
||||
this._scanner = response;
|
||||
if (!response.disabled && response.health === 'healthy') {
|
||||
this.updateStates(
|
||||
true,
|
||||
ClrLoadingState.SUCCESS,
|
||||
ClrLoadingState.SUCCESS
|
||||
);
|
||||
if (response?.capabilities) {
|
||||
this.updateCapabilities(response?.capabilities);
|
||||
}
|
||||
} else {
|
||||
this.updateStates(
|
||||
false,
|
||||
ClrLoadingState.ERROR,
|
||||
ClrLoadingState.ERROR
|
||||
);
|
||||
}
|
||||
} else {
|
||||
this.updateStates(
|
||||
false,
|
||||
ClrLoadingState.ERROR,
|
||||
ClrLoadingState.ERROR
|
||||
);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this._scanner = null;
|
||||
this.updateStates(
|
||||
false,
|
||||
ClrLoadingState.ERROR,
|
||||
|
|
|
@ -33,16 +33,6 @@
|
|||
>
|
||||
<span>{{ 'VULNERABILITY.SCAN_NOW' | translate }}</span>
|
||||
</button>
|
||||
<button
|
||||
id="stop-scan"
|
||||
[clrLoading]="stopBtnState"
|
||||
type="button"
|
||||
class="btn btn-secondary scan-btn"
|
||||
[disabled]="!(canStopScan() && hasScanImagePermission)"
|
||||
(click)="stopNow()">
|
||||
<clr-icon shape="stop" size="16"></clr-icon>
|
||||
<span>{{ 'VULNERABILITY.STOP_NOW' | translate }}</span>
|
||||
</button>
|
||||
<button
|
||||
*ngIf="hasEnabledSbom()"
|
||||
id="generate-sbom-btn"
|
||||
|
@ -59,26 +49,10 @@
|
|||
)
|
||||
"
|
||||
(click)="generateSbom()">
|
||||
<clr-icon shape="file" size="16"></clr-icon>
|
||||
<clr-icon shape="sbom" size="16"></clr-icon>
|
||||
<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>
|
||||
<span>{{ 'SBOM.STOP' | translate }}</span>
|
||||
</button>
|
||||
|
||||
<clr-dropdown class="btn btn-link" *ngIf="!depth">
|
||||
<span
|
||||
clrDropdownTrigger
|
||||
|
@ -91,6 +65,45 @@
|
|||
class="action-dropdown"
|
||||
clrPosition="bottom-left"
|
||||
*clrIfOpen>
|
||||
<div
|
||||
class="dropdown-divider"
|
||||
role="separator"
|
||||
aria-hidden="true"></div>
|
||||
<button
|
||||
clrDropdownItem
|
||||
id="stop-scan"
|
||||
[clrLoading]="stopBtnState"
|
||||
type="button"
|
||||
class="btn btn-secondary scan-btn action-dropdown-item"
|
||||
[disabled]="
|
||||
!(canStopScan() && hasScanImagePermission)
|
||||
"
|
||||
(click)="stopNow()">
|
||||
<span>{{
|
||||
'VULNERABILITY.STOP_NOW' | translate
|
||||
}}</span>
|
||||
</button>
|
||||
<button
|
||||
clrDropdownItem
|
||||
id="stop-sbom-btn"
|
||||
*ngIf="hasEnabledSbom()"
|
||||
[clrLoading]="stopBtnState"
|
||||
type="button"
|
||||
class="btn btn-secondary scan-btn action-dropdown-item"
|
||||
[disabled]="
|
||||
!(
|
||||
canStopSbom() &&
|
||||
hasSbomPermission &&
|
||||
hasEnabledScanner
|
||||
)
|
||||
"
|
||||
(click)="stopSbom()">
|
||||
<span>{{ 'SBOM.STOP' | translate }}</span>
|
||||
</button>
|
||||
<div
|
||||
class="dropdown-divider"
|
||||
role="separator"
|
||||
aria-hidden="true"></div>
|
||||
<div
|
||||
id="artifact-list-copy-digest"
|
||||
class="action-dropdown-item no-border"
|
||||
|
@ -102,6 +115,10 @@
|
|||
(click)="showDigestId()">
|
||||
{{ 'REPOSITORY.COPY_DIGEST_ID' | translate }}
|
||||
</div>
|
||||
<div
|
||||
class="dropdown-divider"
|
||||
role="separator"
|
||||
aria-hidden="true"></div>
|
||||
<clr-dropdown>
|
||||
<button
|
||||
id="artifact-list-add-labels"
|
||||
|
@ -115,6 +132,10 @@
|
|||
">
|
||||
{{ 'REPOSITORY.ADD_LABELS' | translate }}
|
||||
</button>
|
||||
<div
|
||||
class="dropdown-divider"
|
||||
role="separator"
|
||||
aria-hidden="true"></div>
|
||||
<clr-dropdown-menu
|
||||
[hidden]="!selectedRow.length">
|
||||
<div class="filter-grid">
|
||||
|
@ -441,7 +462,7 @@
|
|||
(submitStopFinish)="submitSbomStopFinish($event)"
|
||||
(scanFinished)="sbomFinished($event)"
|
||||
*ngIf="hasScannerSupportSBOM"
|
||||
[inputScanner]="artifact?.sbom_overview?.scanner"
|
||||
[inputScanner]="projectScanner"
|
||||
(submitFinish)="submitSbomFinish($event)"
|
||||
[projectName]="projectName"
|
||||
[projectId]="projectId"
|
||||
|
|
|
@ -27,11 +27,17 @@ import { ArtifactModule } from '../../../artifact.module';
|
|||
import {
|
||||
SBOM_SCAN_STATUS,
|
||||
VULNERABILITY_SCAN_STATUS,
|
||||
} from 'src/app/shared/units/utils';
|
||||
} from '../../../../../../../shared/units/utils';
|
||||
import { Scanner } from '../../../../../../left-side-nav/interrogation-services/scanner/scanner';
|
||||
|
||||
describe('ArtifactListTabComponent', () => {
|
||||
let comp: ArtifactListTabComponent;
|
||||
let fixture: ComponentFixture<ArtifactListTabComponent>;
|
||||
const mockScanner = {
|
||||
name: 'Trivy',
|
||||
vendor: 'vm',
|
||||
version: 'v1.2',
|
||||
};
|
||||
const mockActivatedRoute = {
|
||||
snapshot: {
|
||||
params: {
|
||||
|
@ -274,6 +280,9 @@ describe('ArtifactListTabComponent', () => {
|
|||
hasScanImagePermission(): boolean {
|
||||
return true;
|
||||
},
|
||||
getProjectScanner(): Scanner {
|
||||
return mockScanner;
|
||||
},
|
||||
init() {},
|
||||
};
|
||||
beforeEach(async () => {
|
||||
|
@ -384,7 +393,7 @@ describe('ArtifactListTabComponent', () => {
|
|||
fixture.nativeElement.querySelector('#generate-sbom-btn');
|
||||
fixture.detectChanges();
|
||||
await fixture.whenStable();
|
||||
expect(generatedButton.disabled).toBeTruthy();
|
||||
expect(generatedButton.disabled).toBeFalsy();
|
||||
});
|
||||
it('Stop SBOM button should be disabled', async () => {
|
||||
await fixture.whenStable();
|
||||
|
|
|
@ -84,6 +84,7 @@ import { Accessory } from 'ng-swagger-gen/models/accessory';
|
|||
import { Tag } from '../../../../../../../../../ng-swagger-gen/models/tag';
|
||||
import { CopyArtifactComponent } from './copy-artifact/copy-artifact.component';
|
||||
import { CopyDigestComponent } from './copy-digest/copy-digest.component';
|
||||
import { Scanner } from '../../../../../../left-side-nav/interrogation-services/scanner/scanner';
|
||||
|
||||
export const AVAILABLE_TIME = '0001-01-01T00:00:00.000Z';
|
||||
|
||||
|
@ -160,6 +161,10 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
|
|||
get generateSbomBtnState(): ClrLoadingState {
|
||||
return this.artifactListPageService.getSbomBtnState();
|
||||
}
|
||||
get projectScanner(): Scanner {
|
||||
return this.artifactListPageService.getProjectScanner();
|
||||
}
|
||||
|
||||
onSendingScanCommand: boolean;
|
||||
onSendingStopScanCommand: boolean = false;
|
||||
onStopScanArtifactsLength: number = 0;
|
||||
|
@ -269,6 +274,9 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
|
|||
}
|
||||
);
|
||||
}
|
||||
if (this.projectId) {
|
||||
this.artifactListPageService.init(this.projectId);
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
|
@ -987,11 +995,6 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
|
|||
this.scanFinished(artifact);
|
||||
}
|
||||
|
||||
// when finished, remove it from selectedRow
|
||||
sbomFinished(artifact: Artifact) {
|
||||
this.scanFinished(artifact);
|
||||
}
|
||||
|
||||
getIconsFromBackEnd() {
|
||||
if (this.artifactList && this.artifactList.length) {
|
||||
this.artifactService.getIconsFromBackEnd(this.artifactList);
|
||||
|
|
|
@ -20,23 +20,18 @@ describe('ResultSbomComponent (inline template)', () => {
|
|||
};
|
||||
const mockedSbomDigest =
|
||||
'sha256:052240e8190b7057439d2bee1dffb9b37c8800e5c1af349f667635ae1debf8f3';
|
||||
const mockScanner = {
|
||||
name: 'Trivy',
|
||||
vendor: 'vm',
|
||||
version: 'v1.2',
|
||||
};
|
||||
const mockedSbomOverview = {
|
||||
report_id: '12345',
|
||||
scan_status: 'Error',
|
||||
scanner: {
|
||||
name: 'Trivy',
|
||||
vendor: 'vm',
|
||||
version: 'v1.2',
|
||||
},
|
||||
};
|
||||
const mockedCloneSbomOverview = {
|
||||
report_id: '12346',
|
||||
scan_status: 'Pending',
|
||||
scanner: {
|
||||
name: 'Trivy',
|
||||
vendor: 'vm',
|
||||
version: 'v1.2',
|
||||
},
|
||||
};
|
||||
const FakedScanService = {
|
||||
scanArtifact: () => of({}),
|
||||
|
@ -119,6 +114,7 @@ describe('ResultSbomComponent (inline template)', () => {
|
|||
fixture = TestBed.createComponent(ResultSbomComponent);
|
||||
component = fixture.componentInstance;
|
||||
component.repoName = 'mockRepo';
|
||||
component.inputScanner = mockScanner;
|
||||
component.artifactDigest = mockedSbomDigest;
|
||||
component.sbomDigest = mockedSbomDigest;
|
||||
component.sbomOverview = mockData;
|
||||
|
@ -179,9 +175,11 @@ describe('ResultSbomComponent (inline template)', () => {
|
|||
});
|
||||
it('Test ResultSbomComponent getScanner', () => {
|
||||
fixture.detectChanges();
|
||||
component.inputScanner = undefined;
|
||||
expect(component.getScanner()).toBeUndefined();
|
||||
component.inputScanner = mockScanner;
|
||||
component.sbomOverview = mockedSbomOverview;
|
||||
expect(component.getScanner()).toBe(mockedSbomOverview.scanner);
|
||||
expect(component.getScanner()).toBe(mockScanner);
|
||||
component.projectName = 'test';
|
||||
component.repoName = 'ui';
|
||||
component.artifactDigest = 'dg';
|
||||
|
@ -238,7 +236,9 @@ describe('ResultSbomComponent (inline template)', () => {
|
|||
fixture.detectChanges();
|
||||
fixture.whenStable().then(() => {
|
||||
fixture.detectChanges();
|
||||
expect(component.stateCheckTimer).toBeUndefined();
|
||||
expect(component.sbomOverview.scan_status).toBe(
|
||||
SBOM_SCAN_STATUS.SUCCESS
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -8,7 +8,6 @@ import {
|
|||
} from '@angular/core';
|
||||
import { Subscription, timer } from 'rxjs';
|
||||
import { finalize } from 'rxjs/operators';
|
||||
import { ScannerVo } from '../../../../../shared/services';
|
||||
import { ErrorHandler } from '../../../../../shared/units/error-handler';
|
||||
import {
|
||||
clone,
|
||||
|
@ -27,6 +26,7 @@ import { ScanService } from '../../../../../../../ng-swagger-gen/services/scan.s
|
|||
import { ScanType } from 'ng-swagger-gen/models';
|
||||
import { ScanTypes } from '../../../../../shared/entities/shared.const';
|
||||
import { SBOMOverview } from './sbom-overview';
|
||||
import { Scanner } from '../../../../left-side-nav/interrogation-services/scanner/scanner';
|
||||
const STATE_CHECK_INTERVAL: number = 3000; // 3s
|
||||
const RETRY_TIMES: number = 3;
|
||||
|
||||
|
@ -36,7 +36,7 @@ const RETRY_TIMES: number = 3;
|
|||
styleUrls: ['./scanning.scss'],
|
||||
})
|
||||
export class ResultSbomComponent implements OnInit, OnDestroy {
|
||||
@Input() inputScanner: ScannerVo;
|
||||
@Input() inputScanner: Scanner;
|
||||
@Input() repoName: string = '';
|
||||
@Input() projectName: string = '';
|
||||
@Input() projectId: string = '';
|
||||
|
@ -271,10 +271,7 @@ export class ResultSbomComponent implements OnInit, OnDestroy {
|
|||
}/scan/${this.sbomOverview.report_id}/log`;
|
||||
}
|
||||
|
||||
getScanner(): ScannerVo {
|
||||
if (this.sbomOverview && this.sbomOverview.scanner) {
|
||||
return this.sbomOverview.scanner;
|
||||
}
|
||||
getScanner(): Scanner {
|
||||
return this.inputScanner;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { Component, Input } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { ScannerVo, SbomSummary } from '../../../../../../shared/services';
|
||||
import { SbomSummary } from '../../../../../../shared/services';
|
||||
import { SBOM_SCAN_STATUS } from '../../../../../../shared/units/utils';
|
||||
import {
|
||||
UN_LOGGED_PARAM,
|
||||
|
@ -9,6 +9,7 @@ import {
|
|||
} from '../../../../../../account/sign-in/sign-in.service';
|
||||
import { HAS_STYLE_MODE, StyleMode } from '../../../../../../services/theme';
|
||||
import { ScanTypes } from '../../../../../../shared/entities/shared.const';
|
||||
import { Scanner } from '../../../../../left-side-nav/interrogation-services/scanner/scanner';
|
||||
|
||||
const MIN = 60;
|
||||
const MIN_STR = 'min ';
|
||||
|
@ -21,7 +22,7 @@ const SUCCESS_PCT: number = 100;
|
|||
styleUrls: ['./sbom-tip-histogram.component.scss'],
|
||||
})
|
||||
export class SbomTipHistogramComponent {
|
||||
@Input() scanner: ScannerVo;
|
||||
@Input() scanner: Scanner;
|
||||
@Input() sbomSummary: SbomSummary = {
|
||||
scan_status: SBOM_SCAN_STATUS.NOT_GENERATED_SBOM,
|
||||
};
|
||||
|
|
|
@ -256,8 +256,8 @@ describe('ResultBarChartComponent (inline template)', () => {
|
|||
});
|
||||
it('Test ResultBarChartComponent getSummary', () => {
|
||||
fixture.detectChanges();
|
||||
// component.summary.scan_status = VULNERABILITY_SCAN_STATUS.SUCCESS;
|
||||
component.getSummary();
|
||||
component.summary.scan_status = VULNERABILITY_SCAN_STATUS.SUCCESS;
|
||||
fixture.detectChanges();
|
||||
fixture.whenStable().then(() => {
|
||||
fixture.detectChanges();
|
||||
|
|
|
@ -127,6 +127,23 @@ ClarityIcons.add({
|
|||
21.18,0,0,0,4,21.42,21,21,0,0,0,7.71,33.58a1,1,0,0,0,.81.42h19a1,1,0,0,0,
|
||||
.81-.42A21,21,0,0,0,32,21.42,21.18,21.18,0,0,0,29.1,10.49Z"/>
|
||||
<rect class="cls-1" width="36" height="36"/></g></svg>`,
|
||||
sbom: `
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<!-- Generator: imaengine 6.0 -->
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0,0,512,512" style="enable-background:new 0 0 512 512;" version="1.1">
|
||||
<defs/>
|
||||
<g id="layer0">
|
||||
<g transform="matrix(1 0 0 1 0 0)">
|
||||
<path d="M341.333,213.333L362.666,213.333L362.666,117.333C362.619,116.239 362.399,115.159 362.015,114.133C361.93,113.866 361.951,113.557 361.844,113.29C361.285,111.937 360.454,110.713 359.401,109.695L252.885,3.136C250.88,1.135 248.166,0.0079999 245.333,0L10.667,0C4.776,0 0,4.776 0,10.667L0,458.667C0,464.558 4.776,469.334 10.667,469.334L224,469.334L224,448L21.333,448L21.333,21.333L234.666,21.333L234.666,117.333C234.666,123.224 239.442,128 245.333,128L341.333,128L341.333,213.333L341.333,213.333ZM256,106.667L256,36.427L326.219,106.667L256,106.667L256,106.667Z" fill="#175975"/>
|
||||
<path d="M501.333,341.333L480,341.333L480,330.666C479.988,289.429 446.55,256.009 405.312,256.02C402.195,256.021 399.081,256.217 395.989,256.607C358.752,261.151 330.666,294.047 330.666,333.119L330.666,341.332L309.333,341.332C303.442,341.332 298.666,346.108 298.666,351.999L298.666,501.332C298.666,507.223 303.442,511.999 309.333,511.999L501.333,511.999C507.224,511.999 512,507.223 512,501.332L512,352C512,346.109 507.224,341.333 501.333,341.333L501.333,341.333ZM352,333.131C352,304.822 372.021,281.035 398.571,277.792C427.788,274.057 454.502,294.715 458.237,323.932C458.523,326.165 458.666,328.415 458.667,330.666L458.667,341.333L352,341.333L352,333.131L352,333.131ZM490.667,490.667L320,490.667L320,362.667L490.667,362.667L490.667,490.667L490.667,490.667Z" fill="#175975"/>
|
||||
<path d="M394.667,423.797L394.667,458.666C394.667,464.557 399.443,469.333 405.334,469.333C411.225,469.333 416,464.558 416,458.667L416,423.563C426.103,417.57 429.435,404.522 423.443,394.419C419.605,387.948 412.633,383.986 405.11,384C393.369,383.979 383.834,393.479 383.813,405.22C383.798,412.922 387.951,420.028 394.667,423.797L394.667,423.797Z" fill="#175975"/>
|
||||
</g>
|
||||
<text font-size="100" font-family="'MesloLGLDZForPowerline-Bold'" fill="#175975" transform="matrix(1.24404 0 0 1.04972 34.5897 178.002)">
|
||||
<tspan x="0" y="112" textLength="240.82">
|
||||
<![CDATA[SBOM]]></tspan>
|
||||
</text>
|
||||
</g>
|
||||
</svg>`,
|
||||
});
|
||||
|
||||
@NgModule({
|
||||
|
|
|
@ -804,6 +804,7 @@
|
|||
"FILTER_BY_LABEL": "Images nach Label filtern",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "Artefakte nach Label filtern",
|
||||
"ADD_LABELS": "Label hinzufügen",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "Kopieren",
|
||||
"ACTION": "AKTION",
|
||||
"DEPLOY": "Bereitstellen",
|
||||
|
@ -1057,7 +1058,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
@ -1107,7 +1108,7 @@
|
|||
"PLACEHOLDER": "Filter Schwachstellen",
|
||||
"PACKAGE": "Paket",
|
||||
"PACKAGES": "Pakete",
|
||||
"SCAN_NOW": "Scan",
|
||||
"SCAN_NOW": "Scan vulnerability",
|
||||
"SCAN_BY": "SCAN DURCH {{scanner}}",
|
||||
"REPORTED_BY": "GEMELDET VON {{scanner}}",
|
||||
"NO_SCANNER": "KEIN SCANNER",
|
||||
|
|
|
@ -805,6 +805,7 @@
|
|||
"FILTER_BY_LABEL": "Filter images by label",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "Filter actifact by label",
|
||||
"ADD_LABELS": "Add Labels",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "Copy",
|
||||
"ACTION": "ACTION",
|
||||
"DEPLOY": "DEPLOY",
|
||||
|
@ -1058,7 +1059,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM ",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
@ -1108,7 +1109,7 @@
|
|||
"PLACEHOLDER": "Filter Vulnerabilities",
|
||||
"PACKAGE": "package",
|
||||
"PACKAGES": "packages",
|
||||
"SCAN_NOW": "Scan",
|
||||
"SCAN_NOW": "Scan vulnerability ",
|
||||
"SCAN_BY": "SCAN BY {{scanner}}",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"NO_SCANNER": "NO SCANNER",
|
||||
|
|
|
@ -805,6 +805,7 @@
|
|||
"FILTER_BY_LABEL": "Filter images by label",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "Filter actifact by label",
|
||||
"ADD_LABELS": "Add Labels",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "Copy",
|
||||
"ACTION": "ACTION",
|
||||
"DEPLOY": "DEPLOY",
|
||||
|
@ -1056,7 +1057,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
@ -1106,7 +1107,7 @@
|
|||
"PLACEHOLDER": "Filter Vulnerabilities",
|
||||
"PACKAGE": "package",
|
||||
"PACKAGES": "packages",
|
||||
"SCAN_NOW": "Scan",
|
||||
"SCAN_NOW": "Scan vulnerability",
|
||||
"SCAN_BY": "SCAN BY {{scanner}}",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"NO_SCANNER": "NO SCANNER",
|
||||
|
|
|
@ -804,6 +804,7 @@
|
|||
"FILTER_BY_LABEL": "Filtrer les images par label",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "Filtrer les artefact par label",
|
||||
"ADD_LABELS": "Ajouter des labels",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "Copier",
|
||||
"ACTION": "Action",
|
||||
"DEPLOY": "Déployer",
|
||||
|
@ -1056,7 +1057,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
@ -1106,12 +1107,12 @@
|
|||
"PLACEHOLDER": "Filtrer les vulnérabilités",
|
||||
"PACKAGE": "paquet",
|
||||
"PACKAGES": "paquets",
|
||||
"SCAN_NOW": "Analyser",
|
||||
"SCAN_NOW": "Scan vulnerability",
|
||||
"SCAN_BY": "Scan par {{scanner}}",
|
||||
"REPORTED_BY": "Rapporté par {{scanner}}",
|
||||
"NO_SCANNER": "Aucun scanneur",
|
||||
"TRIGGER_STOP_SUCCESS": "Déclenchement avec succès de l'arrêt d'analyse",
|
||||
"STOP_NOW": "Arrêter l'analyse"
|
||||
"STOP_NOW": "Stop Scan"
|
||||
},
|
||||
"PUSH_IMAGE": {
|
||||
"TITLE": "Commande de push",
|
||||
|
|
|
@ -802,6 +802,7 @@
|
|||
"FILTER_BY_LABEL": "라벨별로 이미지 필터",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "라벨별로 아티팩트 필터",
|
||||
"ADD_LABELS": "라벨 추가",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "복사",
|
||||
"ACTION": "동작",
|
||||
"DEPLOY": "배포",
|
||||
|
@ -1055,7 +1056,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
@ -1105,12 +1106,12 @@
|
|||
"PLACEHOLDER": "취약점 필터",
|
||||
"PACKAGE": "패키지",
|
||||
"PACKAGES": "패키지들",
|
||||
"SCAN_NOW": "스캔",
|
||||
"SCAN_NOW": "Scan vulnerability",
|
||||
"SCAN_BY": "{{scanner}로 스캔",
|
||||
"REPORTED_BY": "{{scanner}}로 보고 됨",
|
||||
"NO_SCANNER": "스캐너 없음",
|
||||
"TRIGGER_STOP_SUCCESS": "트리거 중지 스캔이 성공적으로 수행되었습니다",
|
||||
"STOP_NOW": "스캔 중지"
|
||||
"STOP_NOW": "Stop Scan"
|
||||
},
|
||||
"PUSH_IMAGE": {
|
||||
"TITLE": "푸시 명령어",
|
||||
|
|
|
@ -803,6 +803,7 @@
|
|||
"FILTER_BY_LABEL": "Filtrar imagens por marcadores",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "Filtrar por marcador",
|
||||
"ADD_LABELS": "Adicionar Marcadores",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "Copiar",
|
||||
"ACTION": "AÇÃO",
|
||||
"DEPLOY": "IMPLANTAR",
|
||||
|
@ -1054,7 +1055,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
@ -1104,12 +1105,12 @@
|
|||
"PLACEHOLDER": "Filtrar",
|
||||
"PACKAGE": "pacote",
|
||||
"PACKAGES": "pacotes",
|
||||
"SCAN_NOW": "Examinar",
|
||||
"SCAN_NOW": "Scan vulnerability",
|
||||
"SCAN_BY": "EXAMINAR COM {{scanner}}",
|
||||
"REPORTED_BY": "Encontrado com {{scanner}}",
|
||||
"NO_SCANNER": "NENHUM",
|
||||
"TRIGGER_STOP_SUCCESS": "Exame foi interrompido",
|
||||
"STOP_NOW": "Interromper"
|
||||
"STOP_NOW": "Stop Scan"
|
||||
},
|
||||
"PUSH_IMAGE": {
|
||||
"TITLE": "Comando Push",
|
||||
|
|
|
@ -804,6 +804,7 @@
|
|||
"FILTER_BY_LABEL": "İmajları etikete göre filtrele",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "Filter actifact by label",
|
||||
"ADD_LABELS": "Etiketler Ekle",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "Copy",
|
||||
"ACTION": "AKSİYON",
|
||||
"DEPLOY": "YÜKLE",
|
||||
|
@ -1057,7 +1058,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
@ -1107,7 +1108,7 @@
|
|||
"PLACEHOLDER": "Güvenlik Açıklarını Filtrele",
|
||||
"PACKAGE": "paket",
|
||||
"PACKAGES": "paketler",
|
||||
"SCAN_NOW": "Tara",
|
||||
"SCAN_NOW": "Scan vulnerability",
|
||||
"SCAN_BY": "SCAN BY {{scanner}}",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"NO_SCANNER": "NO SCANNER",
|
||||
|
|
|
@ -801,6 +801,7 @@
|
|||
"LABELS": "标签",
|
||||
"ADD_LABEL_TO_IMAGE": "添加标签到此镜像",
|
||||
"ADD_LABELS": "添加标签",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "拷贝",
|
||||
"FILTER_BY_LABEL": "过滤标签",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "通过标签过滤Artifact",
|
||||
|
@ -1055,7 +1056,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
@ -1105,7 +1106,7 @@
|
|||
"PLACEHOLDER": "过滤漏洞",
|
||||
"PACKAGE": "组件",
|
||||
"PACKAGES": "组件",
|
||||
"SCAN_NOW": "扫描",
|
||||
"SCAN_NOW": "Scan vulnerability",
|
||||
"SCAN_BY": "使用 {{scanner}} 进行扫描",
|
||||
"REPORTED_BY": "结果由 {{scanner}} 提供",
|
||||
"NO_SCANNER": "无扫描器",
|
||||
|
|
|
@ -801,6 +801,7 @@
|
|||
"LABELS": "標籤",
|
||||
"ADD_LABEL_TO_IMAGE": "新增標籤到此映像檔",
|
||||
"ADD_LABELS": "新增標籤",
|
||||
"STOP": "Stop",
|
||||
"RETAG": "複製",
|
||||
"FILTER_BY_LABEL": "篩選標籤",
|
||||
"FILTER_ARTIFACT_BY_LABEL": "透過標籤篩選 Artifact",
|
||||
|
@ -1054,7 +1055,7 @@
|
|||
"NO_SBOM": "No SBOM",
|
||||
"PACKAGES": "SBOM",
|
||||
"REPORTED_BY": "Reported by {{scanner}}",
|
||||
"GENERATE": "Create SBOM",
|
||||
"GENERATE": "Generate SBOM",
|
||||
"DOWNLOAD": "Download SBOM",
|
||||
"Details": "SBOM details",
|
||||
"STOP": "Stop SBOM",
|
||||
|
|
Loading…
Reference in New Issue