diff --git a/src/portal/lib/src/project-policy-config/project-policy-config.component.html b/src/portal/lib/src/project-policy-config/project-policy-config.component.html
index cc1b424b5..0519f95d6 100644
--- a/src/portal/lib/src/project-policy-config/project-policy-config.component.html
+++ b/src/portal/lib/src/project-policy-config/project-policy-config.component.html
@@ -20,8 +20,8 @@
{{ 'PROJECT_CONFIG.CONTENT_TRUST_POLCIY' | translate }}
-
-
+
+
diff --git a/src/portal/lib/src/project-policy-config/project-policy-config.component.ts b/src/portal/lib/src/project-policy-config/project-policy-config.component.ts
index 1e6aa270c..2d4f26fe3 100644
--- a/src/portal/lib/src/project-policy-config/project-policy-config.component.ts
+++ b/src/portal/lib/src/project-policy-config/project-policy-config.component.ts
@@ -70,6 +70,7 @@ export class ProjectPolicyConfigComponent implements OnInit {
projectPolicy = new ProjectPolicy();
hasChangeConfigRole: boolean;
severityOptions = [
+ {severity: 'critical', severityLevel: 'VULNERABILITY.SEVERITY.CRITICAL'},
{severity: 'high', severityLevel: 'VULNERABILITY.SEVERITY.HIGH'},
{severity: 'medium', severityLevel: 'VULNERABILITY.SEVERITY.MEDIUM'},
{severity: 'low', severityLevel: 'VULNERABILITY.SEVERITY.LOW'},
diff --git a/src/portal/lib/src/vulnerability-scanning/result-grid.component.html b/src/portal/lib/src/vulnerability-scanning/result-grid.component.html
index 4ebb30c87..89f1f427b 100644
--- a/src/portal/lib/src/vulnerability-scanning/result-grid.component.html
+++ b/src/portal/lib/src/vulnerability-scanning/result-grid.component.html
@@ -35,12 +35,12 @@
- {{severityText(res.severity) | translate}}
- {{severityText(res.severity) | translate}}
- {{severityText(res.severity) | translate}}
- {{severityText(res.severity) | translate}}
- {{severityText(res.severity) | translate}}
- {{severityText(res.severity) | translate}}
+ {{severityText(res.severity) | translate}}
+ {{severityText(res.severity) | translate}}
+ {{severityText(res.severity) | translate}}
+ {{severityText(res.severity) | translate}}
+ {{severityText(res.severity) | translate}}
+ {{severityText(res.severity) | translate}}
{{severityText(res.severity) | translate}}
{{res.package}}
diff --git a/src/portal/lib/src/vulnerability-scanning/scanning.scss b/src/portal/lib/src/vulnerability-scanning/scanning.scss
index c462c9637..a68e05a93 100644
--- a/src/portal/lib/src/vulnerability-scanning/scanning.scss
+++ b/src/portal/lib/src/vulnerability-scanning/scanning.scss
@@ -164,3 +164,6 @@ hr{
.margin-top-m15{
margin-top: -15px;
}
+.no-border {
+ border: none;
+}
diff --git a/src/portal/src/app/app.module.ts b/src/portal/src/app/app.module.ts
index 7363ef3b1..c4709a6b1 100644
--- a/src/portal/src/app/app.module.ts
+++ b/src/portal/src/app/app.module.ts
@@ -39,6 +39,10 @@ import { VulnerabilityPageComponent } from './vulnerability-page/vulnerability-p
import { GcPageComponent } from './gc-page/gc-page.component';
import { OidcOnboardModule } from './oidc-onboard/oidc-onboard.module';
import { LicenseModule } from './license/license.module';
+import { InterrogationServicesComponent } from "./interrogation-services/interrogation-services.component";
+import { LabelsComponent } from './labels/labels.component';
+import { ProjectQuotasComponent } from './project-quotas/project-quotas.component';
+
registerLocaleData(zh, 'zh-cn');
registerLocaleData(es, 'es-es');
registerLocaleData(localeFr, 'fr-fr');
@@ -61,7 +65,10 @@ export function getCurrentLanguage(translateService: TranslateService) {
AppComponent,
ProjectConfigComponent,
VulnerabilityPageComponent,
- GcPageComponent
+ GcPageComponent,
+ InterrogationServicesComponent,
+ LabelsComponent,
+ ProjectQuotasComponent
],
imports: [
BrowserModule,
diff --git a/src/portal/src/app/base/harbor-shell/harbor-shell.component.html b/src/portal/src/app/base/harbor-shell/harbor-shell.component.html
index f15c1e941..7ba9ecbf2 100644
--- a/src/portal/src/app/base/harbor-shell/harbor-shell.component.html
+++ b/src/portal/src/app/base/harbor-shell/harbor-shell.component.html
@@ -41,26 +41,28 @@
{{'SIDE_NAV.SYSTEM_MGMT.REPLICATION' | translate}}
-
-
-
-
- {{'SIDE_NAV.TASKS' | translate}}
-
-
-
- {{'SIDE_NAV.SYSTEM_MGMT.VULNERABILITY' | translate}}
+
+
+ {{'CONFIG.LABEL' | translate }}
+
+
+
+ {{'CONFIG.PROJECT_QUOTAS' | translate }}
+
+
+
+ {{'SIDE_NAV.SYSTEM_MGMT.INTERROGATION_SERVICES' | translate}}
+
{{'SIDE_NAV.SYSTEM_MGMT.GARBAGE_COLLECTION' | translate}}
+
+
+ {{'SIDE_NAV.SYSTEM_MGMT.CONFIG' | translate}}
+
-
-
- {{'SIDE_NAV.SYSTEM_MGMT.CONFIG' | translate}}
-
diff --git a/src/portal/src/app/gc-page/gc-page.component.scss b/src/portal/src/app/gc-page/gc-page.component.scss
index 638f7dcb7..dfd969db2 100644
--- a/src/portal/src/app/gc-page/gc-page.component.scss
+++ b/src/portal/src/app/gc-page/gc-page.component.scss
@@ -1,3 +1,6 @@
.gc-title {
display: inline-block;
-}
\ No newline at end of file
+}
+.v-mid {
+ vertical-align: middle;
+}
diff --git a/src/portal/src/app/harbor-routing.module.ts b/src/portal/src/app/harbor-routing.module.ts
index eb50796e7..476bbe777 100644
--- a/src/portal/src/app/harbor-routing.module.ts
+++ b/src/portal/src/app/harbor-routing.module.ts
@@ -62,8 +62,13 @@ import { LicenseComponent } from './license/license.component';
import { SummaryComponent } from './project/summary/summary.component';
import { TagRetentionComponent } from './project/tag-retention/tag-retention.component';
import { ImmutableTagComponent } from './project/immutable-tag/immutable-tag.component';
-import { USERSTATICPERMISSION } from '@harbor/ui';
+import { USERSTATICPERMISSION, VulnerabilityConfigComponent } from '@harbor/ui';
import { ScannerComponent } from "./project/scanner/scanner.component";
+import { InterrogationServicesComponent } from "./interrogation-services/interrogation-services.component";
+import { ConfigurationScannerComponent } from "./config/scanner/config-scanner.component";
+import { LabelsComponent } from "./labels/labels.component";
+import { ProjectQuotasComponent } from "./project-quotas/project-quotas.component";
+
const harborRoutes: Routes = [
{ path: '', redirectTo: 'harbor', pathMatch: 'full' },
@@ -122,6 +127,37 @@ const harborRoutes: Routes = [
canActivate: [SystemAdminGuard],
canActivateChild: [SystemAdminGuard]
},
+ {
+ path: 'interrogation-services',
+ component: InterrogationServicesComponent,
+ canActivate: [SystemAdminGuard],
+ canActivateChild: [SystemAdminGuard],
+ children: [
+ {
+ path: 'scanners',
+ component: ConfigurationScannerComponent
+ },
+ {
+ path: 'vulnerability',
+ component: VulnerabilityConfigComponent
+ },
+ {
+ path: '',
+ redirectTo: 'scanners',
+ pathMatch: 'full'
+ },
+ ]
+ },
+ {
+ path: 'labels',
+ component: LabelsComponent,
+ canActivate: [SystemAdminGuard],
+ },
+ {
+ path: 'project-quotas',
+ component: ProjectQuotasComponent,
+ canActivate: [SystemAdminGuard],
+ },
{
path: 'replications/:id/:tasks',
component: ReplicationTasksPageComponent,
diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.html b/src/portal/src/app/interrogation-services/interrogation-services.component.html
new file mode 100644
index 000000000..c674f81da
--- /dev/null
+++ b/src/portal/src/app/interrogation-services/interrogation-services.component.html
@@ -0,0 +1,14 @@
+{{'SIDE_NAV.SYSTEM_MGMT.INTERROGATION_SERVICES' | translate}}
+
+
+
+
diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.scss b/src/portal/src/app/interrogation-services/interrogation-services.component.scss
new file mode 100644
index 000000000..3d5e2656f
--- /dev/null
+++ b/src/portal/src/app/interrogation-services/interrogation-services.component.scss
@@ -0,0 +1,26 @@
+.sub-header-title {
+ margin-top: 12px;
+ margin-bottom: 12px;
+}
+
+.sub-nav-bg-color {
+ background-color: #fafafa;
+}
+
+.subnav {
+ .nav {
+ padding-left: 0;
+ }
+}
+
+.role-label {
+ color: #CCCCCC;
+ font-size: 14px;
+ font-style: italic;
+ letter-spacing: 0.01em;
+}
+.backStyle{
+ color: #007cbb;
+ font-size: 12px;
+ cursor: pointer;
+}
diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts b/src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts
new file mode 100644
index 000000000..5a437cdd2
--- /dev/null
+++ b/src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts
@@ -0,0 +1,37 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { InterrogationServicesComponent } from './interrogation-services.component';
+import { SharedModule } from "../shared/shared.module";
+import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
+import { ClarityModule } from "@clr/angular";
+import { TranslateService } from "@ngx-translate/core";
+import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
+
+describe('InterrogationServicesComponent', () => {
+ let component: InterrogationServicesComponent;
+ let fixture: ComponentFixture;
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ SharedModule,
+ BrowserAnimationsModule,
+ ClarityModule,
+ ],
+ declarations: [ InterrogationServicesComponent ],
+ providers: [TranslateService],
+ schemas: [
+ CUSTOM_ELEMENTS_SCHEMA
+ ],
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(InterrogationServicesComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.ts b/src/portal/src/app/interrogation-services/interrogation-services.component.ts
new file mode 100644
index 000000000..8c2280c75
--- /dev/null
+++ b/src/portal/src/app/interrogation-services/interrogation-services.component.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-interrogation-services',
+ templateUrl: './interrogation-services.component.html',
+ styleUrls: ['./interrogation-services.component.scss']
+})
+export class InterrogationServicesComponent implements OnInit {
+
+ constructor(
+ ) {}
+
+ ngOnInit() {
+ }
+}
diff --git a/src/portal/src/app/labels/labels.component.html b/src/portal/src/app/labels/labels.component.html
new file mode 100644
index 000000000..a1ec87d01
--- /dev/null
+++ b/src/portal/src/app/labels/labels.component.html
@@ -0,0 +1,5 @@
+{{'CONFIG.LABEL' | translate }}
+
diff --git a/src/portal/src/app/labels/labels.component.spec.ts b/src/portal/src/app/labels/labels.component.spec.ts
new file mode 100644
index 000000000..91fe512e5
--- /dev/null
+++ b/src/portal/src/app/labels/labels.component.spec.ts
@@ -0,0 +1,39 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LabelsComponent } from './labels.component';
+import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
+import { TranslateService } from "@ngx-translate/core";
+import { ClarityModule } from "@clr/angular";
+import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
+import { SharedModule } from "../shared/shared.module";
+
+describe('LabelsComponent', () => {
+ let component: LabelsComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ SharedModule,
+ BrowserAnimationsModule,
+ ClarityModule,
+ ],
+ declarations: [ LabelsComponent ],
+ providers: [TranslateService],
+ schemas: [
+ CUSTOM_ELEMENTS_SCHEMA
+ ],
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(LabelsComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/portal/src/app/labels/labels.component.ts b/src/portal/src/app/labels/labels.component.ts
new file mode 100644
index 000000000..67d557192
--- /dev/null
+++ b/src/portal/src/app/labels/labels.component.ts
@@ -0,0 +1,14 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-labels',
+ templateUrl: './labels.component.html',
+})
+export class LabelsComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/src/portal/src/app/project-quotas/project-quotas.component.html b/src/portal/src/app/project-quotas/project-quotas.component.html
new file mode 100644
index 000000000..48bce381f
--- /dev/null
+++ b/src/portal/src/app/project-quotas/project-quotas.component.html
@@ -0,0 +1,2 @@
+{{'CONFIG.PROJECT_QUOTAS' | translate }}
+
diff --git a/src/portal/src/app/project-quotas/project-quotas.component.scss b/src/portal/src/app/project-quotas/project-quotas.component.scss
new file mode 100644
index 000000000..e8c5586b8
--- /dev/null
+++ b/src/portal/src/app/project-quotas/project-quotas.component.scss
@@ -0,0 +1,3 @@
+.v-mid {
+ vertical-align: middle;
+}
diff --git a/src/portal/src/app/project-quotas/project-quotas.component.spec.ts b/src/portal/src/app/project-quotas/project-quotas.component.spec.ts
new file mode 100644
index 000000000..fcaa9c559
--- /dev/null
+++ b/src/portal/src/app/project-quotas/project-quotas.component.spec.ts
@@ -0,0 +1,73 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { ProjectQuotasComponent } from './project-quotas.component';
+import { TranslateModule } from "@ngx-translate/core";
+import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
+import { MessageHandlerService } from "../shared/message-handler/message-handler.service";
+import { SessionService } from "../shared/session.service";
+import { SessionUser } from "../shared/session-user";
+import { ConfigurationService } from "../config/config.service";
+import { Configuration } from "@harbor/ui";
+import { of } from "rxjs";
+
+describe('ProjectQuotasComponent', () => {
+ let component: ProjectQuotasComponent;
+ let fixture: ComponentFixture;
+ const mockedUser: SessionUser = {
+ user_id: 1,
+ username: 'admin',
+ email: 'harbor@vmware.com',
+ realname: 'admin',
+ has_admin_role: true,
+ comment: 'no comment'
+ };
+ let mockedConfig: Configuration = new Configuration();
+ mockedConfig.count_per_project.value = 10;
+ const fakedSessionService = {
+ getCurrentUser() {
+ return mockedUser;
+ }
+ };
+ const fakedConfigurationService = {
+ getConfiguration() {
+ return of(mockedConfig);
+ }
+ };
+ const fakedMessageHandlerService = {
+ handleError() {
+ return;
+ }
+ };
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ TranslateModule.forRoot()
+ ],
+ declarations: [ ProjectQuotasComponent ],
+ providers: [
+ MessageHandlerService,
+ {provide: MessageHandlerService, useValue: fakedMessageHandlerService},
+ {provide: SessionService, useValue: fakedSessionService},
+ {provide: ConfigurationService, useValue: fakedConfigurationService}
+ ],
+ schemas: [
+ CUSTOM_ELEMENTS_SCHEMA
+ ],
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ProjectQuotasComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+
+ it('should get config', () => {
+ expect(component.allConfig.count_per_project.value).toEqual(10);
+ });
+});
diff --git a/src/portal/src/app/project-quotas/project-quotas.component.ts b/src/portal/src/app/project-quotas/project-quotas.component.ts
new file mode 100644
index 000000000..6b3e04c91
--- /dev/null
+++ b/src/portal/src/app/project-quotas/project-quotas.component.ts
@@ -0,0 +1,40 @@
+import { Component, OnInit } from '@angular/core';
+import { Configuration } from "@harbor/ui";
+import { SessionService } from "../shared/session.service";
+import { ConfigurationService } from "../config/config.service";
+import { MessageHandlerService } from "../shared/message-handler/message-handler.service";
+import { finalize } from "rxjs/operators";
+
+@Component({
+ selector: 'app-project-quotas',
+ templateUrl: './project-quotas.component.html',
+ styleUrls: ['./project-quotas.component.scss']
+})
+export class ProjectQuotasComponent implements OnInit {
+ allConfig: Configuration = new Configuration();
+ loading: boolean = false;
+ constructor(private session: SessionService,
+ private configService: ConfigurationService,
+ private msgHandler: MessageHandlerService) { }
+
+ ngOnInit() {
+ let currentUser = this.session.getCurrentUser();
+ if (currentUser && currentUser.has_admin_role) {
+ this.retrieveConfig();
+ }
+ }
+
+ refreshAllconfig() {
+ this.retrieveConfig();
+ }
+ retrieveConfig(): void {
+ this.loading = true;
+ this.configService.getConfiguration()
+ .pipe(finalize(() => this.loading = false))
+ .subscribe((configurations: Configuration) => {
+ this.allConfig = configurations;
+ }, error => {
+ this.msgHandler.handleError(error);
+ });
+ }
+}
diff --git a/src/portal/src/app/project/scanner/scanner.component.html b/src/portal/src/app/project/scanner/scanner.component.html
index 0e0dfd59f..fb919eb26 100644
--- a/src/portal/src/app/project/scanner/scanner.component.html
+++ b/src/portal/src/app/project/scanner/scanner.component.html
@@ -74,7 +74,7 @@
{{scanner.name}}
{{scanner.url}}
-
+
{{scanner.is_default}}
{{scanner.is_default}}
diff --git a/src/portal/src/global.scss b/src/portal/src/global.scss
index c268a4c18..d925c59e0 100644
--- a/src/portal/src/global.scss
+++ b/src/portal/src/global.scss
@@ -288,3 +288,7 @@
.float-lg-right {
float: right;
}
+
+.position-relative {
+ position: relative;
+}
diff --git a/src/portal/src/i18n/lang/en-us-lang.json b/src/portal/src/i18n/lang/en-us-lang.json
index 73e18a4e5..7b71d1c9e 100644
--- a/src/portal/src/i18n/lang/en-us-lang.json
+++ b/src/portal/src/i18n/lang/en-us-lang.json
@@ -166,7 +166,8 @@
"REPLICATION": "Replications",
"CONFIG": "Configuration",
"VULNERABILITY": "Vulnerability",
- "GARBAGE_COLLECTION": "Garbage Collection"
+ "GARBAGE_COLLECTION": "Garbage Collection",
+ "INTERROGATION_SERVICES": "Interrogation Services"
},
"LOGS": "Logs",
"TASKS": "Tasks",
diff --git a/src/portal/src/i18n/lang/es-es-lang.json b/src/portal/src/i18n/lang/es-es-lang.json
index 7f79e3881..f5ed5e138 100644
--- a/src/portal/src/i18n/lang/es-es-lang.json
+++ b/src/portal/src/i18n/lang/es-es-lang.json
@@ -166,7 +166,8 @@
"REPLICATION": "Replicacións",
"CONFIG": "Configuración",
"VULNERABILITY": "Vulnerability",
- "GARBAGE_COLLECTION": "Garbage Collection"
+ "GARBAGE_COLLECTION": "Garbage Collection",
+ "INTERROGATION_SERVICES": "Interrogation Services"
},
"LOGS": "Logs",
"TASKS": "Tasks",
diff --git a/src/portal/src/i18n/lang/fr-fr-lang.json b/src/portal/src/i18n/lang/fr-fr-lang.json
index 7132718a8..e134761a0 100644
--- a/src/portal/src/i18n/lang/fr-fr-lang.json
+++ b/src/portal/src/i18n/lang/fr-fr-lang.json
@@ -160,7 +160,8 @@
"REPLICATION": "Réplication",
"CONFIG": "Configuration",
"VULNERABILITY": "Vulnerability",
- "GARBAGE_COLLECTION": "Garbage Collection"
+ "GARBAGE_COLLECTION": "Garbage Collection",
+ "INTERROGATION_SERVICES": "Interrogation Services"
},
"LOGS": "Logs",
"TASKS": "Tasks",
diff --git a/src/portal/src/i18n/lang/pt-br-lang.json b/src/portal/src/i18n/lang/pt-br-lang.json
index 208ebb847..6d2b9640e 100644
--- a/src/portal/src/i18n/lang/pt-br-lang.json
+++ b/src/portal/src/i18n/lang/pt-br-lang.json
@@ -164,7 +164,8 @@
"REPLICATION": "Replicações",
"CONFIG": "Configuração",
"VULNERABILITY": "Vulnerability",
- "GARBAGE_COLLECTION": "Garbage Collection"
+ "GARBAGE_COLLECTION": "Garbage Collection",
+ "INTERROGATION_SERVICES": "Interrogation Services"
},
"LOGS": "Logs",
"TASKS": "Tasks",
diff --git a/src/portal/src/i18n/lang/tr-tr-lang.json b/src/portal/src/i18n/lang/tr-tr-lang.json
index 453123d77..cfbe4cdc8 100644
--- a/src/portal/src/i18n/lang/tr-tr-lang.json
+++ b/src/portal/src/i18n/lang/tr-tr-lang.json
@@ -166,7 +166,8 @@
"REPLICATION": "Kopyalama",
"CONFIG": "Yapılandırma",
"VULNERABILITY": "Güvenlik Açığı",
- "GARBAGE_COLLECTION": "Çöp toplama"
+ "GARBAGE_COLLECTION": "Çöp toplama",
+ "INTERROGATION_SERVICES": "Interrogation Services"
},
"LOGS": "Kayıtlar",
"TASKS": "Görevler",
diff --git a/src/portal/src/i18n/lang/zh-cn-lang.json b/src/portal/src/i18n/lang/zh-cn-lang.json
index 1ff46102f..7850ed10f 100644
--- a/src/portal/src/i18n/lang/zh-cn-lang.json
+++ b/src/portal/src/i18n/lang/zh-cn-lang.json
@@ -165,7 +165,8 @@
"REPLICATION": "同步管理",
"CONFIG": "配置管理",
"VULNERABILITY": "漏洞",
- "GARBAGE_COLLECTION": "垃圾清理"
+ "GARBAGE_COLLECTION": "垃圾清理",
+ "INTERROGATION_SERVICES": "审查服务"
},
"LOGS": "日志",
"TASKS": "任务",
diff --git a/tests/resources/Harbor-Pages/Configuration.robot b/tests/resources/Harbor-Pages/Configuration.robot
index e2e04a21d..d619698a1 100644
--- a/tests/resources/Harbor-Pages/Configuration.robot
+++ b/tests/resources/Harbor-Pages/Configuration.robot
@@ -154,9 +154,7 @@ Switch To System Settings
Switch To Project Quotas
Sleep 1
- Retry Element Click xpath=${configuration_xpath}
- Retry Element Click xpath=${configuration_system_tabsheet_id}
- Retry Element Click xpath=${configuration_project_quotas_tabsheet_id}
+ Retry Element Click xpath=//clr-main-container//clr-vertical-nav//a[contains(.,'Project Quotas')]
Sleep 1
Modify Token Expiration
@@ -243,8 +241,7 @@ Disable Read Only
## System labels
Switch To System Labels
Sleep 1
- Retry Element Click xpath=${configuration_xpath}
- Retry Element Click xpath=//*[@id='config-label']
+ Retry Element Click xpath=//clr-main-container//clr-vertical-nav//a[contains(.,'Labels')]
## System labels
Switch To Configuration System Setting
@@ -254,8 +251,7 @@ Switch To Configuration System Setting
Switch To Configuration Project Quotas
Sleep 1
- Retry Element Click xpath=${configuration_xpath}
- Retry Element Click xpath=${configuration_project_quotas}
+ Retry Element Click xpath=//clr-main-container//clr-vertical-nav//a[contains(.,'Project Quotas')]
Create New Labels
[Arguments] ${labelname}
@@ -337,4 +333,4 @@ Get Project Storage Quota Text From Project Quotas List
[Arguments] ${project_name}
Switch To Project Quotas
${storage_quota}= Get Text xpath=//project-quotas//clr-datagrid//clr-dg-row[contains(.,'${project_name}')]//clr-dg-cell[4]//label
- [Return] ${storage_quota}
\ No newline at end of file
+ [Return] ${storage_quota}
diff --git a/tests/resources/Harbor-Pages/Vulnerability.robot b/tests/resources/Harbor-Pages/Vulnerability.robot
index 687b4e7aa..854b82c01 100644
--- a/tests/resources/Harbor-Pages/Vulnerability.robot
+++ b/tests/resources/Harbor-Pages/Vulnerability.robot
@@ -18,7 +18,8 @@ Trigger Scan Now
Sleep 10
Switch To Vulnerability Page
- Retry Element Click xpath=${vulnerability_page}
+ Retry Element Click xpath=//clr-main-container//clr-vertical-nav//a[contains(.,'Interrogation')]
+ Retry Element Click xpath=//app-interrogation-services//a[contains(.,'Vulnerability')]
Retry Wait Element ${scan_now_button}