From 3af3d39261a439f9ce4661c505bb73a468d0fdfd Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 9 Jun 2020 15:38:44 +0100 Subject: [PATCH 1/8] Hide deployment info card if not space developer - fixes #4322 --- .../tabs/build-tab/build-tab.component.html | 7 ++--- .../tabs/build-tab/build-tab.component.ts | 27 +++++++++++++++---- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.html index a1ceaa6f53..de18350435 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.html @@ -149,12 +149,12 @@ - + Deployment Info - +
- - None - diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts index 57c88faeb4..6c07dbb615 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts @@ -1,12 +1,15 @@ import { Component, Inject, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Store } from '@ngrx/store'; -import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; -import { combineLatest, delay, distinct, filter, first, map, mergeMap, startWith, tap } from 'rxjs/operators'; +import { combineLatest as observableCombineLatest, Observable, of as observableOf, of } from 'rxjs'; +import { combineLatest, delay, distinct, filter, first, map, mergeMap, startWith, switchMap, tap } from 'rxjs/operators'; import { AppMetadataTypes } from '../../../../../../../../cloud-foundry/src/actions/app-metadata.actions'; import { UpdateExistingApplication } from '../../../../../../../../cloud-foundry/src/actions/application.actions'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; +import { + CurrentUserPermissionsService, +} from '../../../../../../../../core/src/core/permissions/current-user-permissions.service'; import { getFullEndpointApiUrl } from '../../../../../../../../core/src/features/endpoints/endpoint-helpers'; import { ConfirmationDialogConfig } from '../../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; @@ -58,6 +61,7 @@ const appRestageConfirmation = new ConfirmationDialogConfig( export class BuildTabComponent implements OnInit { public isBusyUpdating$: Observable<{ updating: boolean }>; public manageAppPermission = CfCurrentUserPermissions.APPLICATION_MANAGE; + constructor( public applicationService: ApplicationService, private scmService: GitSCMService, @@ -66,7 +70,7 @@ export class BuildTabComponent implements OnInit { private route: ActivatedRoute, private router: Router, private confirmDialog: ConfirmationDialogService, - + private cups: CurrentUserPermissionsService ) { } cardTwoFetching$: Observable; @@ -108,8 +112,17 @@ export class BuildTabComponent implements OnInit { }) ); - this.deploySource$ = this.applicationService.applicationStratProject$.pipe( - combineLatest(this.applicationService.application$) + const canSeeEnvVars$ = this.applicationService.appSpace$.pipe( + switchMap(space => this.cups.can( + CfCurrentUserPermissions.APPLICATION_VIEW_ENV_VARS, + this.applicationService.cfGuid, + space.metadata.guid) + ) + ) + + const deploySource$ = observableCombineLatest( + this.applicationService.applicationStratProject$, + this.applicationService.application$ ).pipe( map(([project, app]) => { if (!!project) { @@ -149,6 +162,10 @@ export class BuildTabComponent implements OnInit { } }), startWith({ type: 'loading' }) + ) + + this.deploySource$ = canSeeEnvVars$.pipe( + switchMap(canSeeEnvVars => canSeeEnvVars ? deploySource$ : of(null)), ); } From c190ec2d5f31e8c2d5b27af31f1ced6367b74f89 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 9 Jun 2020 16:17:48 +0100 Subject: [PATCH 2/8] Only space developers can create/unmap/delete routes in app routes table - fixes #4324 --- .../cf-app-routes-list-config.service.ts | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config.service.ts index a631fac6ae..b69eb4ab15 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config.service.ts @@ -1,7 +1,8 @@ import { DatePipe } from '@angular/common'; import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; -import { take } from 'rxjs/operators'; +import { combineLatest } from 'rxjs'; +import { switchMap, take } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { @@ -12,6 +13,7 @@ import { IGlobalListAction, IListConfig } from '../../../../../../../core/src/sh import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { ApplicationService } from '../../../../../features/applications/application.service'; +import { CfCurrentUserPermissions } from '../../../../../user-permissions/cf-user-permissions-checkers'; import { CfAppRoutesListConfigServiceBase } from './cf-app-routes-list-config-base'; @@ -23,11 +25,12 @@ export class CfAppRoutesListConfigService extends CfAppRoutesListConfigServiceBa appService: ApplicationService, confirmDialog: ConfirmationDialogService, datePipe: DatePipe, - currentUserPermissionsService: CurrentUserPermissionsService, + private currentUserPermissionsService: CurrentUserPermissionsService, ) { super(store, appService, confirmDialog, datePipe, currentUserPermissionsService, null, true); this.setupList(store, appService); + this.allowSelection = false; // Allow the multi action visibility to determine this } private setupList(store: Store, appService: ApplicationService) { @@ -51,7 +54,18 @@ export class CfAppRoutesListConfigService extends CfAppRoutesListConfigServiceBa }, icon: 'add', label: 'Add', - description: 'Add new route' + description: 'Add new route', + visible$: combineLatest( + appService.appOrg$, + appService.appSpace$ + ).pipe( + switchMap(([org, space]) => this.currentUserPermissionsService.can( + CfCurrentUserPermissions.ROUTE_CREATE, + appService.cfGuid, + org.metadata.guid, + space.metadata.guid + )) + ) }; this.getGlobalActions = () => [listActionAddRoute]; } From d4bb0e9ae4e69942d0a897ebafe9fd17c821235d Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 9 Jun 2020 16:38:20 +0100 Subject: [PATCH 3/8] Only Space Developers should be able to change count, terminate or ssh to instances - fixes #4330 --- .../card-app-instances.component.html | 39 +++++++++++-------- .../card-app-instances.component.ts | 21 ++++++++-- .../cf-app-instances-config.service.ts | 23 +++++++++-- 3 files changed, 58 insertions(+), 25 deletions(-) diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.html index bf67158f11..d2c25acd15 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.html +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.html @@ -5,7 +5,8 @@
- +
@@ -14,23 +15,27 @@
- - - - - - - - - - + + + + + \ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.ts index c3524019b6..548b3d0cca 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.ts @@ -1,13 +1,15 @@ -import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild, Renderer2 } from '@angular/core'; +import { Component, ElementRef, Input, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core'; import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/snack-bar'; -import { Observable, Subscription } from 'rxjs'; -import { first, map } from 'rxjs/operators'; +import { combineLatest, Observable, Subscription } from 'rxjs'; +import { first, map, switchMap } from 'rxjs/operators'; import { AppMetadataTypes } from '../../../../../../cloud-foundry/src/actions/app-metadata.actions'; import { ApplicationService } from '../../../../../../cloud-foundry/src/features/applications/application.service'; +import { CurrentUserPermissionsService } from '../../../../../../core/src/core/permissions/current-user-permissions.service'; import { ConfirmationDialogConfig } from '../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../core/src/shared/components/confirmation-dialog.service'; import { StratosStatus } from '../../../../../../core/src/shared/shared.types'; +import { CfCurrentUserPermissions } from '../../../../user-permissions/cf-user-permissions-checkers'; const appInstanceScaleToZeroConfirmation = new ConfirmationDialogConfig('Set Instance count to 0', 'Are you sure you want to set the instance count to 0?', 'Confirm', true); @@ -28,14 +30,25 @@ export class CardAppInstancesComponent implements OnInit, OnDestroy { status$: Observable; + public canEditSpace$: Observable; + constructor( public appService: ApplicationService, private renderer: Renderer2, private confirmDialog: ConfirmationDialogService, - private snackBar: MatSnackBar) { + private snackBar: MatSnackBar, + cups: CurrentUserPermissionsService + ) { this.status$ = this.appService.applicationState$.pipe( map(state => state.indicator) ); + this.canEditSpace$ = combineLatest( + appService.appOrg$, + appService.appSpace$ + ).pipe( + switchMap(([org, space]) => cups.can(CfCurrentUserPermissions.SPACE_EDIT, appService.cfGuid, org.metadata.guid, space.metadata.guid)) + ) + } private currentCount = 0; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.ts index 1559dfec06..bd55fffa79 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.ts @@ -1,12 +1,15 @@ import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; +import { combineLatest as combineLatestObs, Observable } from 'rxjs'; import { combineLatest, map, switchMap } from 'rxjs/operators'; import { DeleteApplicationInstance } from '../../../../../../../cloud-foundry/src/actions/application.actions'; import { FetchApplicationMetricsAction } from '../../../../../../../cloud-foundry/src/actions/cf-metrics.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; +import { + CurrentUserPermissionsService, +} from '../../../../../../../core/src/core/permissions/current-user-permissions.service'; import { UtilsService } from '../../../../../../../core/src/core/utils.service'; import { ConfirmationDialogConfig } from '../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; @@ -27,6 +30,7 @@ import { IMetricMatrixResult, IMetrics } from '../../../../../../../store/src/ty import { IMetricApplication } from '../../../../../../../store/src/types/metric.types'; import { ApplicationService } from '../../../../../features/applications/application.service'; import { CfCellHelper } from '../../../../../features/cloud-foundry/cf-cell.helpers'; +import { CfCurrentUserPermissions } from '../../../../../user-permissions/cf-user-permissions-checkers'; import { ListAppInstance } from './app-instance-types'; import { CfAppInstancesDataSource } from './cf-app-instances-data-source'; import { TableCellCfCellComponent } from './table-cell-cf-cell/table-cell-cf-cell.component'; @@ -158,7 +162,7 @@ export class CfAppInstancesConfigService implements IListConfig }, label: 'Terminate', description: ``, // Description depends on console user permission - + createVisible: () => this.canEditSpace$ }; private listActionSsh: IListAction = { @@ -182,7 +186,8 @@ export class CfAppInstancesConfigService implements IListConfig space.entity.allow_ssh; }) ); - })) + })), + createVisible: () => this.canEditSpace$ }; private singleActions = [ @@ -190,6 +195,8 @@ export class CfAppInstancesConfigService implements IListConfig this.listActionSsh, ]; + private canEditSpace$: Observable; + constructor( private store: Store, private appService: ApplicationService, @@ -197,7 +204,8 @@ export class CfAppInstancesConfigService implements IListConfig private router: Router, private confirmDialog: ConfirmationDialogService, entityServiceFactory: EntityServiceFactory, - paginationMonitorFactory: PaginationMonitorFactory + paginationMonitorFactory: PaginationMonitorFactory, + cups: CurrentUserPermissionsService ) { const cellHelper = new CfCellHelper(store, paginationMonitorFactory); @@ -220,6 +228,13 @@ export class CfAppInstancesConfigService implements IListConfig this.appService.appGuid, this, ); + + this.canEditSpace$ = combineLatestObs( + appService.appOrg$, + appService.appSpace$ + ).pipe( + switchMap(([org, space]) => cups.can(CfCurrentUserPermissions.SPACE_EDIT, appService.cfGuid, org.metadata.guid, space.metadata.guid)) + ) } getGlobalActions = () => null; From 7565ee06408a611647ca5e3c3e1221932ba906b9 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 9 Jun 2020 16:53:24 +0100 Subject: [PATCH 4/8] Permissions: Only Space Developers should be able to create/edit/delete an Autoscaler policy - fixes #4323 --- .../autoscaler-tab-extension.component.html | 4 ++-- .../autoscaler-tab-extension.component.ts | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html index 2a20fe1798..c1d419a048 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html @@ -1,4 +1,4 @@ - +
\ No newline at end of file diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts index dfee79bace..1a7fad96d9 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts @@ -3,14 +3,16 @@ import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/s import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { combineLatest, Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, filter, first, map, pairwise, publishReplay, refCount } from 'rxjs/operators'; +import { distinctUntilChanged, filter, first, map, pairwise, publishReplay, refCount, switchMap } from 'rxjs/operators'; import { applicationEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey } from '../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { ApplicationMonitorService } from '../../../../cloud-foundry/src/features/applications/application-monitor.service'; import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; import { getGuids } from '../../../../cloud-foundry/src/features/applications/application/application-base.component'; +import { CfCurrentUserPermissions } from '../../../../cloud-foundry/src/user-permissions/cf-user-permissions-checkers'; import { StratosTab, StratosTabType } from '../../../../core/src/core/extension/extension-service'; +import { CurrentUserPermissionsService } from '../../../../core/src/core/permissions/current-user-permissions.service'; import { safeUnsubscribe } from '../../../../core/src/core/utils.service'; import { ConfirmationDialogConfig } from '../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../core/src/shared/components/confirmation-dialog.service'; @@ -113,6 +115,8 @@ export class AutoscalerTabExtensionComponent implements OnInit, OnDestroy { 'order-direction': 'desc' }; + public canEditSpace$: Observable; + ngOnDestroy(): void { if (this.appAutoscalerPolicySnackBarRef) { this.appAutoscalerPolicySnackBarRef.dismiss(); @@ -131,6 +135,7 @@ export class AutoscalerTabExtensionComponent implements OnInit, OnDestroy { private appAutoscalerPolicySnackBar: MatSnackBar, private appAutoscalerScalingHistorySnackBar: MatSnackBar, private confirmDialog: ConfirmationDialogService, + private cups: CurrentUserPermissionsService ) { } ngOnInit() { @@ -219,6 +224,18 @@ export class AutoscalerTabExtensionComponent implements OnInit, OnDestroy { publishReplay(1), refCount() ); + + this.canEditSpace$ = combineLatest( + this.applicationService.appOrg$, + this.applicationService.appSpace$ + ).pipe( + switchMap(([org, space]) => this.cups.can( + CfCurrentUserPermissions.SPACE_EDIT, + this.applicationService.cfGuid, + org.metadata.guid, + space.metadata.guid + )) + ) } getAppMetric(metricName: string, trigger: AppScalingTrigger, params: AutoscalerPaginationParams) { From a291040cd65168fffe04a28762bc60f31023d8e5 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 9 Jun 2020 17:53:26 +0100 Subject: [PATCH 5/8] Users with no developer roles could click on add app button - fixes #4361 --- .../src/user-permissions/cf-user-permissions-checkers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-permissions-checkers.ts b/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-permissions-checkers.ts index b38816caf9..5d4e9bc1be 100644 --- a/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-permissions-checkers.ts +++ b/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-permissions-checkers.ts @@ -396,7 +396,7 @@ export class CfUserPermissionsChecker extends BaseCurrentUserPermissionsChecker } private getAllEndpointGuids() { - return this.store.select(connectedEndpointsSelector).pipe( + return this.store.select(connectedEndpointsSelector()).pipe( map(endpoints => Object.values(endpoints).filter(e => e.cnsi_type === CF_ENDPOINT_TYPE).map(endpoint => endpoint.guid)) ); } From ab2dd37bd267a0ab5af59f992038ca576964d60a Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Thu, 11 Jun 2020 12:00:50 +0100 Subject: [PATCH 6/8] Fix tests --- .../autoscaler-tab-extension.component.spec.ts | 6 +++++- src/test-e2e/application/application-view-e2e.spec.ts | 3 +-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.spec.ts index eff100853b..b96d66bdb5 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.spec.ts @@ -15,6 +15,9 @@ import { import { RunningInstancesComponent, } from '../../../../cloud-foundry/src/shared/components/running-instances/running-instances.component'; +import { + cfCurrentUserPermissionsService, +} from '../../../../cloud-foundry/src/user-permissions/cf-user-permissions-checkers'; import { ApplicationServiceMock } from '../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../core/src/core/core.module'; import { SharedModule } from '../../../../core/src/shared/shared.module'; @@ -48,7 +51,8 @@ describe('AutoscalerTabExtensionComponent', () => { providers: [ DatePipe, { provide: ApplicationService, useClass: ApplicationServiceMock }, - TabNavService + TabNavService, + ...cfCurrentUserPermissionsService ] }) .compileComponents(); diff --git a/src/test-e2e/application/application-view-e2e.spec.ts b/src/test-e2e/application/application-view-e2e.spec.ts index c2d51b6b78..e7467a6341 100644 --- a/src/test-e2e/application/application-view-e2e.spec.ts +++ b/src/test-e2e/application/application-view-e2e.spec.ts @@ -135,8 +135,7 @@ describe('Application View -', () => { }); it('Deployment Info', () => { - appSummary.cardDeployInfo.waitForTitle('Deployment Info'); - expect(appSummary.cardDeployInfo.getContent()).toBe('None'); + expect(appSummary.cardDeployInfo.isPresent()).toBeFalsy(); }); }); From d19213c2f99e6985f02c559855376cceff7c8dab Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Tue, 16 Jun 2020 09:59:40 +0100 Subject: [PATCH 7/8] Fix autoscaler tab --- .../autoscaler-tab-extension.component.html | 4 +- .../autoscaler-tab-extension.component.ts | 55 ++++++++++++------- .../src/core/extension/extension-service.ts | 12 +++- .../page-side-nav/page-side-nav.component.ts | 15 +++-- 4 files changed, 57 insertions(+), 29 deletions(-) diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html index c1d419a048..2a20fe1798 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html @@ -1,4 +1,4 @@ - +