Skip to content

Commit 36e43a3

Browse files
richard-coxnwmac
authored andcommitted
When no space quota has been assigned fall back on more realistive quota (#3541)
* When no space quota has been assigned fall back on more realistive quota - before, if no space quota was found, a rough match for the default quota was used - this missed the `paid service plan` property - now, before falling back on the 'infinite' quota, try to use the more realistive org quota * Fix unit test
1 parent 0dc5583 commit 36e43a3

File tree

8 files changed

+44
-39
lines changed

8 files changed

+44
-39
lines changed

src/frontend/packages/core/src/features/cloud-foundry/edit-space/edit-space.component.spec.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
generateTestCfEndpointServiceProvider,
77
} from '../../../../test-framework/cloud-foundry-endpoint-service.helper';
88
import { ActiveRouteCfOrgSpace } from '../cf-page.types';
9+
import { CloudFoundryOrganizationService } from '../services/cloud-foundry-organization.service';
910
import { EditSpaceStepComponent } from './edit-space-step/edit-space-step.component';
1011
import { EditSpaceComponent } from './edit-space.component';
1112

@@ -17,7 +18,7 @@ describe('EditSpaceComponent', () => {
1718
TestBed.configureTestingModule({
1819
declarations: [EditSpaceComponent, EditSpaceStepComponent],
1920
imports: [...BaseTestModules],
20-
providers: [ActiveRouteCfOrgSpace, generateTestCfEndpointServiceProvider(), TabNavService]
21+
providers: [ActiveRouteCfOrgSpace, generateTestCfEndpointServiceProvider(), TabNavService, CloudFoundryOrganizationService]
2122
})
2223
.compileComponents();
2324
}));

src/frontend/packages/core/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts

+8-11
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,14 @@ import { ActiveRouteCfOrgSpace } from '../cf-page.types';
3232
import { getOrgRolesString } from '../cf.helpers';
3333
import { CloudFoundryEndpointService } from './cloud-foundry-endpoint.service';
3434

35-
export const createQuotaDefinition = (orgGuid: string): APIResource<IQuotaDefinition> => ({
36-
entity: {
37-
memory_limit: -1,
38-
app_instance_limit: -1,
39-
instance_memory_limit: -1,
40-
name: 'None assigned',
41-
organization_guid: orgGuid,
42-
total_services: -1,
43-
total_routes: -1
44-
},
45-
metadata: null
35+
export const createQuotaDefinition = (orgGuid: string): IQuotaDefinition => ({
36+
memory_limit: -1,
37+
app_instance_limit: -1,
38+
instance_memory_limit: -1,
39+
name: 'None assigned',
40+
organization_guid: orgGuid,
41+
total_services: -1,
42+
total_routes: -1
4643
});
4744

4845
@Injectable()

src/frontend/packages/core/src/features/cloud-foundry/services/cloud-foundry-space.service.ts

+16-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Injectable } from '@angular/core';
22
import { Store } from '@ngrx/store';
3-
import { Observable } from 'rxjs';
3+
import { Observable, of } from 'rxjs';
44
import { filter, map, publishReplay, refCount, switchMap } from 'rxjs/operators';
55

66
import { GetSpace } from '../../../../../store/src/actions/space.actions';
@@ -30,7 +30,7 @@ import { fetchServiceInstancesCount } from '../../service-catalog/services-helpe
3030
import { ActiveRouteCfOrgSpace } from '../cf-page.types';
3131
import { getSpaceRolesString } from '../cf.helpers';
3232
import { CloudFoundryEndpointService } from './cloud-foundry-endpoint.service';
33-
import { createQuotaDefinition } from './cloud-foundry-organization.service';
33+
import { CloudFoundryOrganizationService, createQuotaDefinition } from './cloud-foundry-organization.service';
3434

3535
@Injectable()
3636
export class CloudFoundrySpaceService {
@@ -39,7 +39,7 @@ export class CloudFoundrySpaceService {
3939
orgGuid: string;
4040
spaceGuid: string;
4141
userRole$: Observable<string>;
42-
quotaDefinition$: Observable<APIResource<IQuotaDefinition>>;
42+
quotaDefinition$: Observable<IQuotaDefinition>;
4343
allowSsh$: Observable<string>;
4444
totalMem$: Observable<number>;
4545
routes$: Observable<APIResource<IRoute>[]>;
@@ -59,7 +59,8 @@ export class CloudFoundrySpaceService {
5959
private cfUserService: CfUserService,
6060
private paginationMonitorFactory: PaginationMonitorFactory,
6161
private cfEndpointService: CloudFoundryEndpointService,
62-
private cfUserProvidedServicesService: CloudFoundryUserProvidedServicesService
62+
private cfUserProvidedServicesService: CloudFoundryUserProvidedServicesService,
63+
private cfOrgService: CloudFoundryOrganizationService
6364
) {
6465

6566
this.spaceGuid = activeRouteCfOrgSpace.spaceGuid;
@@ -133,13 +134,17 @@ export class CloudFoundrySpaceService {
133134
this.cfUserProvidedServicesService.fetchUserProvidedServiceInstancesCount(this.cfGuid, this.orgGuid, this.spaceGuid);
134135
this.routes$ = this.space$.pipe(map(o => o.entity.entity.routes));
135136
this.allowSsh$ = this.space$.pipe(map(o => o.entity.entity.allow_ssh ? 'true' : 'false'));
136-
this.quotaDefinition$ = this.space$.pipe(map(q => {
137-
if (q.entity.entity.space_quota_definition) {
138-
return q.entity.entity.space_quota_definition;
139-
} else {
140-
return createQuotaDefinition(this.orgGuid);
141-
}
142-
}));
137+
this.quotaDefinition$ = this.space$.pipe(
138+
map(q => q.entity.entity.space_quota_definition),
139+
switchMap(def => def ? of(def.entity) : this.cfOrgService.quotaDefinition$),
140+
map(def => def ?
141+
{
142+
...def,
143+
organization_guid: this.orgGuid
144+
} :
145+
createQuotaDefinition(this.orgGuid)
146+
)
147+
);
143148
}
144149

145150
private initialiseAppObservables() {

src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@
3636
<app-tile *ngIf="cfEndpointService.appsPagObs.hasEntities$ | async">
3737
<app-card-number-metric icon="content_copy" label="App Instances"
3838
value="{{ (cfSpaceService.appInstances$ | async) }}"
39-
limit="{{ (cfSpaceService.quotaDefinition$ | async)?.entity.app_instance_limit}}"></app-card-number-metric>
39+
limit="{{ (cfSpaceService.quotaDefinition$ | async)?.app_instance_limit}}"></app-card-number-metric>
4040
</app-tile>
4141
<app-tile>
4242
<app-card-number-metric
4343
link="/cloud-foundry/{{cfSpaceService.cfGuid}}/organizations/{{cfSpaceService.orgGuid}}/spaces/{{cfSpaceService.spaceGuid}}/routes"
4444
iconFont="stratos-icons" icon="network_route" label="Routes"
4545
value="{{ (cfSpaceService.routes$ | async)?.length }}"
46-
limit="{{ (cfSpaceService.quotaDefinition$ | async)?.entity.total_routes}}"></app-card-number-metric>
46+
limit="{{ (cfSpaceService.quotaDefinition$ | async)?.total_routes}}"></app-card-number-metric>
4747
</app-tile>
4848
</app-tile-group>
4949

@@ -59,7 +59,7 @@
5959
link="/cloud-foundry/{{cfSpaceService.cfGuid}}/organizations/{{cfSpaceService.orgGuid}}/spaces/{{cfSpaceService.spaceGuid}}/service-instances"
6060
iconFont="stratos-icons" icon="service" label="Service Instances"
6161
value="{{ (cfSpaceService.serviceInstancesCount$ | async)}}"
62-
limit="{{ (cfSpaceService.quotaDefinition$ | async)?.entity.total_services }}"></app-card-number-metric>
62+
limit="{{ (cfSpaceService.quotaDefinition$ | async)?.total_services }}"></app-card-number-metric>
6363
</app-tile>
6464
<app-tile *ngIf="(cfSpaceService.userProvidedServiceInstancesCount$ | async) > 0">
6565
<app-card-number-metric iconFont="stratos-icons" icon="service" label="User Service Instances"
@@ -68,7 +68,7 @@
6868
<app-tile *ngIf="cfEndpointService.appsPagObs.hasEntities$ | async">
6969
<app-card-number-metric icon="memory" label="Memory Usage" units="mb"
7070
value="{{ (cfSpaceService.totalMem$ | async) }}"
71-
limit="{{ (cfSpaceService.quotaDefinition$ | async)?.entity.memory_limit }}"></app-card-number-metric>
71+
limit="{{ (cfSpaceService.quotaDefinition$ | async)?.memory_limit }}"></app-card-number-metric>
7272
</app-tile>
7373
</app-tile-group>
7474

src/frontend/packages/core/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.html

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
{{ (cfSpaceService.userRole$ | async) }}
1111
</app-metadata-item>
1212
<app-metadata-item label="Quota Definition Name">
13-
{{ (cfSpaceService.quotaDefinition$ | async)?.entity.name }}
13+
{{ (cfSpaceService.quotaDefinition$ | async)?.name }}
1414
</app-metadata-item>
1515
<app-metadata-item label="Provision Paid Services">
16-
<app-boolean-indicator [isTrue]="(cfSpaceService.quotaDefinition$ | async)?.non_basic_services_allowed" type="yes-no">
16+
<app-boolean-indicator [isTrue]="(cfSpaceService.quotaDefinition$ | async)?.non_basic_services_allowed"
17+
type="yes-no">
1718
</app-boolean-indicator>
1819
</app-metadata-item>
1920
</div>

src/frontend/packages/core/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { Component, OnInit } from '@angular/core';
2-
3-
import { CloudFoundrySpaceService } from '../../../../features/cloud-foundry/services/cloud-foundry-space.service';
1+
import { Component } from '@angular/core';
42
import { Observable } from 'rxjs';
53
import { map } from 'rxjs/operators';
64

5+
import { CloudFoundrySpaceService } from '../../../../features/cloud-foundry/services/cloud-foundry-space.service';
6+
77
@Component({
88
selector: 'app-card-cf-space-details',
99
templateUrl: './card-cf-space-details.component.html',

src/frontend/packages/core/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { createQuotaDefinition } from '../../../../../../features/cloud-foundry/
2525
import { CfUserService } from '../../../../../data-services/cf-user.service';
2626
import { EntityMonitorFactory } from '../../../../../monitors/entity-monitor.factory.service';
2727
import { PaginationMonitorFactory } from '../../../../../monitors/pagination-monitor.factory';
28-
import { StratosStatus, ComponentEntityMonitorConfig } from '../../../../../shared.types';
28+
import { ComponentEntityMonitorConfig, StratosStatus } from '../../../../../shared.types';
2929
import { ConfirmationDialogConfig } from '../../../../confirmation-dialog.config';
3030
import { ConfirmationDialogService } from '../../../../confirmation-dialog.service';
3131
import { MetaCardMenuItem } from '../../../list-cards/meta-card/meta-card-base/meta-card.component';
@@ -128,7 +128,7 @@ export class CfOrgCardComponent extends CardCell<APIResource<IOrganization>> imp
128128

129129
setValues = (role: string, apps: APIResource<IApp>[]) => {
130130
this.userRolesInOrg = role;
131-
const quotaDefinition = this.row.entity.quota_definition || createQuotaDefinition(this.orgGuid);
131+
const quotaDefinition = this.row.entity.quota_definition || { entity: createQuotaDefinition(this.orgGuid), metadata: null };
132132

133133
if (apps) {
134134
this.setAppsDependentCounts(apps);

src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { SpaceQuotaHelper } from '../../../../../../features/cloud-foundry/servi
2828
import { CfUserService } from '../../../../../data-services/cf-user.service';
2929
import { EntityMonitorFactory } from '../../../../../monitors/entity-monitor.factory.service';
3030
import { PaginationMonitorFactory } from '../../../../../monitors/pagination-monitor.factory';
31-
import { StratosStatus, ComponentEntityMonitorConfig } from '../../../../../shared.types';
31+
import { ComponentEntityMonitorConfig, StratosStatus } from '../../../../../shared.types';
3232
import { ConfirmationDialogConfig } from '../../../../confirmation-dialog.config';
3333
import { ConfirmationDialogService } from '../../../../confirmation-dialog.service';
3434
import { MetaCardMenuItem } from '../../../list-cards/meta-card/meta-card-base/meta-card.component';
@@ -140,14 +140,15 @@ export class CfSpaceCardComponent extends CardCell<APIResource<ISpace>> implemen
140140

141141
setValues = (roles: string, apps: APIResource<IApp>[]) => {
142142
this.userRolesInSpace = roles;
143-
const quotaDefinition = this.row.entity.space_quota_definition || createQuotaDefinition(this.orgGuid);
143+
const quotaDefinition = this.row.entity.space_quota_definition ?
144+
this.row.entity.space_quota_definition.entity : createQuotaDefinition(this.orgGuid);
144145
if (apps) {
145146
this.setAppsDependentCounts(apps);
146147
this.memoryTotal = this.cfEndpointService.getMetricFromApps(apps, 'memory');
147-
this.normalisedMemoryUsage = this.memoryTotal / quotaDefinition.entity.memory_limit * 100;
148+
this.normalisedMemoryUsage = this.memoryTotal / quotaDefinition.memory_limit * 100;
148149
}
149-
this.appInstancesLimit = truthyIncludingZeroString(quotaDefinition.entity.app_instance_limit);
150-
this.memoryLimit = truthyIncludingZeroString(quotaDefinition.entity.memory_limit);
150+
this.appInstancesLimit = truthyIncludingZeroString(quotaDefinition.app_instance_limit);
151+
this.memoryLimit = truthyIncludingZeroString(quotaDefinition.memory_limit);
151152
}
152153

153154
ngOnDestroy = () => this.subscriptions.forEach(p => p.unsubscribe());

0 commit comments

Comments
 (0)