Skip to content
This repository has been archived by the owner on Jan 24, 2023. It is now read-only.

User Provided Service Instances #3415

Merged
merged 109 commits into from
Mar 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
4327c40
WIP
richard-cox Feb 15, 2019
f49f7c2
Tidy user service up actions
KlapTrap Feb 19, 2019
787901c
Add base step component route to service instance creation
KlapTrap Feb 20, 2019
818660c
Remove unused component
KlapTrap Feb 20, 2019
5a5c148
Ensure we have the correct cancel URL when editing a space service insta
KlapTrap Feb 20, 2019
32ef3a3
Remove console.log
KlapTrap Feb 20, 2019
367cc3b
Added tile selector
KlapTrap Feb 20, 2019
ea91982
Add help message and tidy up tile selector
KlapTrap Feb 20, 2019
522aa54
Allow a steppers step to hiden next button
KlapTrap Feb 21, 2019
b00cb25
Make app name unique directive generic
KlapTrap Feb 21, 2019
13b4a39
Fixed create user service
KlapTrap Feb 21, 2019
bcafc38
WIP Multi entity/action lists
KlapTrap Feb 21, 2019
5e498f1
Put service instance and user provided in same list
KlapTrap Feb 22, 2019
52c4c7b
Fix delete for multi action lists
KlapTrap Feb 22, 2019
91d72e1
Add updating for user provided services
KlapTrap Feb 22, 2019
8883d3c
Fix edit for local lists
KlapTrap Feb 25, 2019
3ff0b29
Added entity type select to multi action lists
KlapTrap Feb 27, 2019
b14759d
Fix provided service delete
KlapTrap Feb 27, 2019
71da3f1
Added default select text
KlapTrap Feb 28, 2019
d469b3e
Pass schema type into card component
KlapTrap Feb 28, 2019
80066ac
WIP Multiple careds per list
KlapTrap Mar 1, 2019
f5bd70d
Shwo more information on user provided service instance card
KlapTrap Mar 5, 2019
9375693
Fix update user provided action
KlapTrap Mar 5, 2019
34f272c
Relations fixes
richard-cox Mar 5, 2019
9a25288
Fix user service update
KlapTrap Mar 6, 2019
28ae3d6
Multi action can now render multiple cards
KlapTrap Mar 7, 2019
2cb9363
Fix none multi list local list
KlapTrap Mar 7, 2019
f04c2ff
Fix none multi component, multi action lists
KlapTrap Mar 7, 2019
b8d5850
Fix multi list tables
KlapTrap Mar 7, 2019
b8178c1
Fix paginator subscription leak
KlapTrap Mar 7, 2019
8b12b34
Remove the need for pageSubscription in list-data-source
KlapTrap Mar 7, 2019
473f904
Improve isPageReady logic
KlapTrap Mar 7, 2019
37d3009
Provide maxed entity per local page
KlapTrap Mar 7, 2019
d5012b6
Make maxList work with multi action lists
KlapTrap Mar 7, 2019
c7063fd
Revert app wall to single action list
KlapTrap Mar 8, 2019
462611d
Seperate service instance cards
KlapTrap Mar 8, 2019
0ad4736
CC fixes
KlapTrap Mar 8, 2019
8c8c11c
cc fixes
KlapTrap Mar 8, 2019
ed6b222
Revert app wall maxlist
KlapTrap Mar 8, 2019
96cc165
v2-master merge
richard-cox Mar 8, 2019
1d36229
Fix for older cf's with no tags
richard-cox Mar 8, 2019
f14346b
Missing file following merge
richard-cox Mar 8, 2019
e6c65d2
Merge remote-tracking branch 'origin/v2-master' into user-services
richard-cox Mar 8, 2019
ffd5214
Remove junk after merge
richard-cox Mar 8, 2019
2837fef
Fix new lint error
richard-cox Mar 11, 2019
59e0c14
Fix list view switching
KlapTrap Mar 11, 2019
20dc5d8
Pass entity key to the cell component
KlapTrap Mar 11, 2019
c1017ac
Fix table loading issue
KlapTrap Mar 11, 2019
dcfd91c
Fix linting
KlapTrap Mar 11, 2019
b07c07b
Update e2e tests wirth new create service instance flow.
KlapTrap Mar 11, 2019
c0bb399
Fix unit tests
KlapTrap Mar 12, 2019
50ee35b
Lint fix
KlapTrap Mar 12, 2019
8c0443f
More unit test fixes
KlapTrap Mar 12, 2019
014a5dc
Merge branch 'angular7' into user-services
richard-cox Mar 12, 2019
71b772b
Link fixes
richard-cox Mar 12, 2019
a380666
Merge branch 'user-services-temp' into user-services
richard-cox Mar 12, 2019
390178b
Temp remove [appApplicationNameUnique]="appNameChecking"
richard-cox Mar 12, 2019
3a7d36f
Remove depentent attribute
richard-cox Mar 12, 2019
03df97b
Fix cf-org-space selectors
KlapTrap Mar 12, 2019
c467d5c
fix pagination tests
KlapTrap Mar 12, 2019
f3127b6
Fix e2e tests
KlapTrap Mar 12, 2019
7e19158
Fixes for e2e tests
KlapTrap Mar 13, 2019
711d8b0
Merge branch 'v2-master' into user-services
KlapTrap Mar 13, 2019
be43a12
E2e fixes
KlapTrap Mar 13, 2019
adb83ca
e2e test fixes
KlapTrap Mar 13, 2019
39cd390
Fix marketplace test
KlapTrap Mar 13, 2019
cfba715
Fix more e2e tests
KlapTrap Mar 13, 2019
29c90f5
More e2e test fixes
KlapTrap Mar 13, 2019
ad05c0b
Another e2e fix
KlapTrap Mar 14, 2019
87a5b92
Add back in unique name check to user provided ser
KlapTrap Mar 14, 2019
cca53d5
Fix on enter stepper requirement
KlapTrap Mar 14, 2019
0543367
Fix user provided service instance delete
KlapTrap Mar 14, 2019
9e3ce07
Fix new service instance name chacking
KlapTrap Mar 14, 2019
7d235df
Unit test fix
KlapTrap Mar 14, 2019
69393e1
Fix populatePaginationFromParent
richard-cox Mar 14, 2019
0b54211
E2e fixes
KlapTrap Mar 14, 2019
56ac4f1
Merge branch 'v2-master' into user-services
KlapTrap Mar 15, 2019
6f74a24
Unit test fixes
KlapTrap Mar 15, 2019
504bfc3
Fix table cell updaing
KlapTrap Mar 18, 2019
9238e32
Fix linting
KlapTrap Mar 18, 2019
c95ade9
Fix craete service instance e2e tests
KlapTrap Mar 18, 2019
7b3c8ca
Add title to edit instance step.
KlapTrap Mar 18, 2019
4708511
Fix stepper with no onEnter
KlapTrap Mar 18, 2019
4cefbe3
Removing white space.
KlapTrap Mar 18, 2019
46ebfcc
Fix e2e test
KlapTrap Mar 18, 2019
228e8b0
Fix edit service instance test
KlapTrap Mar 18, 2019
ced80ef
Fix service wall e2e tests
KlapTrap Mar 18, 2019
77a721c
Fix menu for variable card
KlapTrap Mar 18, 2019
a0a2faf
Tweaks during review
richard-cox Mar 19, 2019
b7afb46
Fix switching entity types while not on the first page
KlapTrap Mar 20, 2019
321ca65
Fix unit test
richard-cox Mar 20, 2019
543669c
Fix flip flopping of list entities given out of sync pagination and e…
richard-cox Mar 20, 2019
12dc4bc
Fix application upbind
KlapTrap Mar 20, 2019
8b13021
Ensure we refetch applicating service bindings when service instance …
KlapTrap Mar 20, 2019
fabef5a
Tidy ups
richard-cox Mar 20, 2019
7346f3e
Fix app service binding list
richard-cox Mar 20, 2019
d9180e1
Fix issue with previous commit
richard-cox Mar 20, 2019
ec77704
Fix delete app
richard-cox Mar 20, 2019
2c0be97
Fix unit test
richard-cox Mar 20, 2019
12bdcbe
WIP User provided service binding
KlapTrap Mar 20, 2019
d6a79a1
Fix unit tests
richard-cox Mar 21, 2019
8f7ac89
More unit test fixes
richard-cox Mar 21, 2019
0c3364b
Merge branch 'user-provided-binding' into user-services
richard-cox Mar 21, 2019
68bfcb7
Complete create/bind user provided service on apps page
richard-cox Mar 21, 2019
a268a97
Fix prod
richard-cox Mar 21, 2019
80fabec
Another prod/e2e fix
richard-cox Mar 21, 2019
e184f3c
Fix unit test
richard-cox Mar 21, 2019
1fee213
Fix e2e tests
richard-cox Mar 21, 2019
012bd7c
Fix two issues
richard-cox Mar 21, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/frontend/packages/core/sass/_all-theme.scss
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
@import '../src/features/applications/application-wall/application-wall.component.theme';
@import '../src/features/services/services-wall/services-wall.component.theme';
@import '../src/features/service-catalog/service-catalog-page/service-catalog-page.component.theme';
@import '../src/shared/components/tile-selector/tile-selector.component.theme';
@import '../src/shared/components/multiline-title/multiline-title.component.theme';
@import './components/mat-tabs.theme';
@import './components/text-status.theme';
Expand Down Expand Up @@ -127,6 +128,7 @@ $side-nav-light-active: #484848;
@include metrics-chart-theme($theme, $app-theme);
@include metrics-range-selector-theme($theme, $app-theme);
@include app-multiline-title-theme($theme, $app-theme);
@include tile-selector-theme($theme, $app-theme);
}

@function app-generate-nav-theme($theme, $nav-theme: null) {
Expand Down
21 changes: 19 additions & 2 deletions src/frontend/packages/core/src/core/cf-api-svc.types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { APIResource } from '../../../store/src/types/api.types';
import { IApp, IOrganization, ISpace } from './cf-api.types';
import { IApp, IOrganization, IRoute, ISpace } from './cf-api.types';

export interface ILastOperation {
type: string;
Expand All @@ -21,7 +21,7 @@ export interface IServiceBinding {
app_url: string;
app?: APIResource<IApp>;
service_instance_url: string;
service_instance?: APIResource<IServiceInstance>;
service_instance?: APIResource<IServiceInstance> | APIResource<IUserProvidedServiceInstance>;
guid?: string;
cfGuid?: string;
}
Expand Down Expand Up @@ -147,3 +147,20 @@ export interface IServiceBroker {
guid?: string;
cfGuid?: string;
}

export interface IUserProvidedServiceInstance {
name: string;
credentials: { [name: string]: string };
space_guid: string;
space: APIResource<ISpace>;
space_url: string;
type: string;
syslog_drain_url: string;
tags: string[];
service_bindings: APIResource<IServiceBinding>[];
service_bindings_url: string;
routes: APIResource<IRoute>[];
routes_url: string;
route_service_url: string;
cfGuid?: string;
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,50 @@ <h1>Delete application</h1>
<app-step *ngIf="entities.routes && entities.routes.length" title="Routes">
<div class="app-delete__monitors">
<p>Please select any attached application routes you would like to delete.</p>
<app-delete-app-routes class="app-delete__step-table" (selected)="setSelectedRoutes($event)"></app-delete-app-routes>
<app-delete-app-routes class="app-delete__step-table" (selected)="setSelectedRoutes($event)">
</app-delete-app-routes>
</div>
</app-step>
<app-step title="Service Instances" *ngIf="entities.instances && entities.instances.length">
<div class="app-delete__monitors">
<p>Please select any attached application service instances you would like to delete.</p>
<app-delete-app-instances class="app-delete__step-table" (selected)="setSelectedServiceInstances($event)"></app-delete-app-instances>
<app-delete-app-instances class="app-delete__step-table" (selected)="setSelectedServiceInstances($event)">
</app-delete-app-instances>
</div>
</app-step>
<app-step title="Confirm" class="app-delete__monitors" [canClose]="!deleteStarted" [disablePrevious]="deleteStarted" [destructiveStep]="!deleteStarted" [onNext]="startDelete" [finishButtonText]="deleteStarted ? 'Close' : 'Delete'">
<app-step title="Confirm" class="app-delete__monitors" [canClose]="!deleteStarted"
[disablePrevious]="deleteStarted" [destructiveStep]="!deleteStarted" [onNext]="startDelete"
[finishButtonText]="deleteStarted ? 'Close' : 'Delete'">
<div class="app-delete__monitors">
<p>Please confirm that you would like to delete the following application<span *ngIf="(selectedRoutes && selectedRoutes.length) || (selectedServiceInstances && selectedServiceInstances.length) "> and related entities</span>:</p>
<p>Please confirm that you would like to delete the following application<span
*ngIf="(selectedRoutes && selectedRoutes.length) || (selectedServiceInstances && selectedServiceInstances.length) ">
and related entities</span>:</p>
<h3>Application</h3>
<app-action-monitor [columns]="appDeleteColumns" [data$]="selectedApplication$" [entityKey]="applicationSchemaKey" [monitorState]="deletingState" [getId]="getId">
<app-action-monitor [columns]="appDeleteColumns" [data$]="selectedApplication$"
[entityKey]="applicationSchemaKey" [monitorState]="deletingState" [getId]="getId">
</app-action-monitor>
<ng-container *ngIf="selectedRoutes && selectedRoutes.length">
<h3>Routes</h3>
<app-action-monitor [columns]="routeDeleteColumns" [data$]="selectedRoutes$" [entityKey]="routeSchemaKey" [monitorState]="deletingState" [getId]="getId">
<app-action-monitor [columns]="routeDeleteColumns" [data$]="selectedRoutes$" [entityKey]="routeSchemaKey"
[monitorState]="deletingState" [getId]="getId">
</app-action-monitor>
</ng-container>
<ng-container *ngIf="selectedServiceInstances && selectedServiceInstances.length">
<h3>Services</h3>
<app-action-monitor [columns]="instanceDeleteColumns" [data$]="selectedServiceInstances$" [entityKey]="serviceInstancesSchemaKey" [monitorState]="deletingState" [getId]="getInstanceId"></app-action-monitor>
<ng-container *ngIf="(selectedServiceInstances$ | async).length">
<h3>Services</h3>
<app-action-monitor [columns]="instanceDeleteColumns" [data$]="selectedServiceInstances$"
[entityKey]="serviceInstancesSchemaKey" [monitorState]="deletingState" [getId]="getInstanceId">
</app-action-monitor>
</ng-container>
<ng-container *ngIf="(selectedUserServiceInstances$ | async).length">
<h3>User Provided Services</h3>
<app-action-monitor [columns]="instanceDeleteColumns" [data$]="selectedUserServiceInstances$"
[entityKey]="userProvidedServiceInstanceSchemaKey" [monitorState]="deletingState"
[getId]="getInstanceId"></app-action-monitor>
</ng-container>
</ng-container>
</div>
</app-step>
</app-steppers>
</ng-container>
</app-loading-page>
</app-loading-page>
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@ import { Store } from '@ngrx/store';
import { combineLatest, Observable, ReplaySubject } from 'rxjs';
import { filter, first, map, pairwise, shareReplay, startWith, switchMap, tap } from 'rxjs/operators';

import { GetAppRoutes } from '../../../../../store/src/actions/application-service-routes.actions';
import { DeleteApplication, GetApplication } from '../../../../../store/src/actions/application.actions';
import { DeleteRoute } from '../../../../../store/src/actions/route.actions';
import { RouterNav } from '../../../../../store/src/actions/router.actions';
import { DeleteServiceInstance } from '../../../../../store/src/actions/service-instances.actions';
import { DeleteUserProvidedInstance } from '../../../../../store/src/actions/user-provided-service.actions';
import { AppState } from '../../../../../store/src/app-state';
import {
applicationSchemaKey,
entityFactory,
routeSchemaKey,
serviceInstancesSchemaKey,
userProvidedServiceInstanceSchemaKey,
} from '../../../../../store/src/helpers/entity-factory';
import { APIResource } from '../../../../../store/src/types/api.types';
import { IServiceBinding } from '../../../core/cf-api-svc.types';
import { IApp, IRoute } from '../../../core/cf-api.types';
import {
Expand All @@ -14,12 +29,6 @@ import { ITableColumn } from '../../../shared/components/list/list-table/table.t
import {
CfAppRoutesListConfigService,
} from '../../../shared/components/list/list-types/app-route/cf-app-routes-list-config.service';
import {
TableCellRouteComponent,
} from '../../../shared/components/list/list-types/cf-routes/table-cell-route/table-cell-route.component';
import {
TableCellTCPRouteComponent,
} from '../../../shared/components/list/list-types/cf-routes/table-cell-tcproute/table-cell-tcproute.component';
import {
AppServiceBindingDataSource,
} from '../../../shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source';
Expand All @@ -32,24 +41,18 @@ import {
import {
TableCellAppStatusComponent,
} from '../../../shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component';
import {
TableCellRouteComponent,
} from '../../../shared/components/list/list-types/cf-routes/table-cell-route/table-cell-route.component';
import {
TableCellTCPRouteComponent,
} from '../../../shared/components/list/list-types/cf-routes/table-cell-tcproute/table-cell-tcproute.component';
import { EntityMonitor } from '../../../shared/monitors/entity-monitor';
import { EntityMonitorFactory } from '../../../shared/monitors/entity-monitor.factory.service';
import { PaginationMonitor } from '../../../shared/monitors/pagination-monitor';
import { PaginationMonitorFactory } from '../../../shared/monitors/pagination-monitor.factory';
import { isServiceInstance, isUserProvidedServiceInstance } from '../../cloud-foundry/cf.helpers';
import { ApplicationService } from '../application.service';
import { GetApplication, DeleteApplication } from '../../../../../store/src/actions/application.actions';
import { AppState } from '../../../../../store/src/app-state';
import { RouterNav } from '../../../../../store/src/actions/router.actions';
import { GetAppRoutes } from '../../../../../store/src/actions/application-service-routes.actions';
import { DeleteRoute } from '../../../../../store/src/actions/route.actions';
import { DeleteServiceInstance } from '../../../../../store/src/actions/service-instances.actions';
import { APIResource } from '../../../../../store/src/types/api.types';
import {
applicationSchemaKey,
entityFactory,
routeSchemaKey,
serviceInstancesSchemaKey,
} from '../../../../../store/src/helpers/entity-factory';


@Component({
Expand Down Expand Up @@ -77,7 +80,10 @@ export class ApplicationDeleteComponent<T> {
columnId: 'service',
headerCell: () => 'Service',
cellDefinition: {
getValue: (row) => row.entity.service_instance.entity.service.entity.label
getValue: (row) => {
const si = isServiceInstance(row.entity.service_instance.entity);
return si ? si.service.entity.label : 'User Service';
}
},
cellFlex: '2'
},
Expand Down Expand Up @@ -148,9 +154,11 @@ export class ApplicationDeleteComponent<T> {
public selectedApplication$: Observable<APIResource<IApp>[]>;
public selectedRoutes$ = new ReplaySubject<APIResource<IRoute>[]>(1);
public selectedServiceInstances$ = new ReplaySubject<APIResource<IServiceBinding>[]>(1);
public selectedUserServiceInstances$ = new ReplaySubject<APIResource<IServiceBinding>[]>(1);
public fetchingApplicationData$: Observable<boolean>;

public serviceInstancesSchemaKey = serviceInstancesSchemaKey;
public userProvidedServiceInstanceSchemaKey = userProvidedServiceInstanceSchemaKey;
public routeSchemaKey = routeSchemaKey;
public applicationSchemaKey = applicationSchemaKey;
public deletingState = AppMonitorComponentTypes.DELETE;
Expand Down Expand Up @@ -262,12 +270,21 @@ export class ApplicationDeleteComponent<T> {
);
}

private setSelectedServiceInstances(selected: APIResource<IServiceBinding>[]) {
public setSelectedServiceInstances(selected: APIResource<IServiceBinding>[]) {
this.selectedServiceInstances = selected;
this.selectedServiceInstances$.next(selected);
const selectedServices = selected.reduce((res, binding) => {
if (isUserProvidedServiceInstance(binding.entity.service_instance.entity)) {
res.upsi.push(binding);
} else {
res.si.push(binding);
}
return res;
}, { si: [], upsi: [] });
this.selectedServiceInstances$.next(selectedServices.si);
this.selectedUserServiceInstances$.next(selectedServices.upsi);
}

private setSelectedRoutes(selected: APIResource<IRoute>[]) {
public setSelectedRoutes(selected: APIResource<IRoute>[]) {
this.selectedRoutes = selected;
this.selectedRoutes$.next(selected);
}
Expand Down Expand Up @@ -302,7 +319,11 @@ export class ApplicationDeleteComponent<T> {
}
if (this.selectedServiceInstances && this.selectedServiceInstances.length) {
this.selectedServiceInstances.forEach(instance => {
this.store.dispatch(new DeleteServiceInstance(this.applicationService.cfGuid, instance.entity.service_instance_guid));
if (isUserProvidedServiceInstance(instance.entity.service_instance.entity)) {
this.store.dispatch(new DeleteUserProvidedInstance(this.applicationService.cfGuid, instance.entity.service_instance_guid));
} else {
this.store.dispatch(new DeleteServiceInstance(this.applicationService.cfGuid, instance.entity.service_instance_guid));
}
});
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,12 @@ export class AppDeleteServiceInstancesListConfigService extends AppServiceBindin
return action;
}

constructor(store: Store<AppState>,
appService: ApplicationService,
datePipe: DatePipe,
currentUserPermissionService: CurrentUserPermissionsService,
private paginationMonitorFactory: PaginationMonitorFactory
constructor(
store: Store<AppState>,
appService: ApplicationService,
datePipe: DatePipe,
currentUserPermissionService: CurrentUserPermissionsService,
private paginationMonitorFactory: PaginationMonitorFactory
) {
super(store, appService, datePipe, currentUserPermissionService);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@ import { Store } from '@ngrx/store';
import { Observable, Subscription } from 'rxjs';
import { map } from 'rxjs/operators';

import { AppState } from '../../../../../store/src/app-state';
import { applicationSchemaKey } from '../../../../../store/src/helpers/entity-factory';
import { CurrentUserPermissions } from '../../../core/current-user-permissions.config';
import { CardAppComponent } from '../../../shared/components/list/list-types/app/card/card-app.component';
import { CfAppConfigService } from '../../../shared/components/list/list-types/app/cf-app-config.service';
import { CfAppsDataSource } from '../../../shared/components/list/list-types/app/cf-apps-data-source';
import { ListConfig } from '../../../shared/components/list/list.component.types';
import { CfOrgSpaceDataService, initCfOrgSpaceService } from '../../../shared/data-services/cf-org-space-service.service';
import { CloudFoundryService } from '../../../shared/data-services/cloud-foundry.service';
import { AppState } from '../../../../../store/src/app-state';
import { applicationSchemaKey } from '../../../../../store/src/helpers/entity-factory';

@Component({
selector: 'app-application-wall',
Expand Down Expand Up @@ -66,8 +65,6 @@ export class ApplicationWallComponent implements OnDestroy {
CfAppsDataSource.paginationKey).subscribe();
}

cardComponent = CardAppComponent;

ngOnDestroy(): void {
this.initCfOrgSpaceService.unsubscribe();
}
Expand Down
Loading