Refactor imperative code to be more reactive

This commit is contained in:
Roy Clarkson
2020-05-13 13:04:07 -04:00
committed by Roy Clarkson
parent 6077c4e82d
commit 2f2e183aca
5 changed files with 39 additions and 64 deletions

View File

@@ -78,10 +78,10 @@ public class AppDeploymentCreateServiceInstanceWorkflow
private Flux<String> createBackingServices(CreateServiceInstanceRequest request) {
return getBackingServicesForService(request.getServiceDefinition(), request.getPlan())
.flatMap(backingServices ->
targetService.addToBackingServices(backingServices,
getTargetForService(request.getServiceDefinition(), request.getPlan()),
.flatMap(backingServices -> getTargetForService(request.getServiceDefinition(), request.getPlan())
.flatMap(targetSpec -> targetService.addToBackingServices(backingServices, targetSpec,
request.getServiceInstanceId()))
.defaultIfEmpty(backingServices))
.flatMap(backingServices ->
servicesParametersTransformationService.transformParameters(backingServices,
request.getParameters()))
@@ -97,10 +97,10 @@ public class AppDeploymentCreateServiceInstanceWorkflow
private Flux<String> deployBackingApplications(CreateServiceInstanceRequest request) {
return getBackingApplicationsForService(request.getServiceDefinition(), request.getPlan())
.flatMap(backingApps ->
targetService.addToBackingApplications(backingApps,
getTargetForService(request.getServiceDefinition(),
request.getPlan()), request.getServiceInstanceId()))
.flatMap(backingApps -> getTargetForService(request.getServiceDefinition(), request.getPlan())
.flatMap(targetSpec -> targetService.addToBackingApplications(backingApps, targetSpec,
request.getServiceInstanceId()))
.defaultIfEmpty(backingApps))
.flatMap(backingApps ->
appsParametersTransformationService.transformParameters(backingApps,
request.getParameters()))

View File

@@ -89,9 +89,10 @@ public class AppDeploymentDeleteServiceInstanceWorkflow
private Flux<List<BackingService>> collectConfiguredBackingServices(DeleteServiceInstanceRequest request) {
return getBackingServicesForService(request.getServiceDefinition(), request.getPlan())
.flatMapMany(backingServices -> targetService.addToBackingServices(backingServices,
getTargetForService(request.getServiceDefinition(), request.getPlan()),
request.getServiceInstanceId()));
.flatMapMany(backingServices -> getTargetForService(request.getServiceDefinition(), request.getPlan())
.flatMap(targetSpec -> targetService.addToBackingServices(backingServices, targetSpec,
request.getServiceInstanceId()))
.defaultIfEmpty(backingServices));
}
private Flux<List<BackingService>> collectBoundBackingServices(DeleteServiceInstanceRequest request) {
@@ -109,10 +110,10 @@ public class AppDeploymentDeleteServiceInstanceWorkflow
.flatMap(backingApps ->
credentialProviderService.deleteCredentials(backingApps,
request.getServiceInstanceId()))
.flatMap(backingApps ->
targetService.addToBackingApplications(backingApps,
getTargetForService(request.getServiceDefinition(), request.getPlan()),
.flatMap(backingApps -> getTargetForService(request.getServiceDefinition(), request.getPlan())
.flatMap(targetSpec -> targetService.addToBackingApplications(backingApps, targetSpec,
request.getServiceInstanceId()))
.defaultIfEmpty(backingApps))
.flatMapMany(deploymentService::undeploy)
.doOnRequest(l -> log.debug("Undeploying backing applications for {}/{}",
request.getServiceDefinition().getName(), request.getPlan().getName()))

View File

@@ -18,6 +18,7 @@ package org.springframework.cloud.appbroker.workflow.instance;
import java.util.List;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.cloud.appbroker.deployer.BackingApplication;
@@ -29,7 +30,6 @@ import org.springframework.cloud.appbroker.deployer.BrokeredServices;
import org.springframework.cloud.appbroker.deployer.TargetSpec;
import org.springframework.cloud.servicebroker.model.catalog.Plan;
import org.springframework.cloud.servicebroker.model.catalog.ServiceDefinition;
import org.springframework.util.CollectionUtils;
public class AppDeploymentInstanceWorkflow {
@@ -50,57 +50,33 @@ public class AppDeploymentInstanceWorkflow {
);
}
protected TargetSpec getTargetForService(ServiceDefinition serviceDefinition, Plan plan) {
BrokeredService brokeredService = findBrokeredService(serviceDefinition, plan);
return brokeredService == null ? null : brokeredService.getTarget();
protected Mono<TargetSpec> getTargetForService(ServiceDefinition serviceDefinition, Plan plan) {
return findBrokeredService(serviceDefinition, plan)
.flatMap(brokeredService -> Mono.justOrEmpty(brokeredService.getTarget()));
}
protected Mono<List<BackingApplication>> getBackingApplicationsForService(ServiceDefinition serviceDefinition,
Plan plan) {
return Mono.defer(() ->
Mono.justOrEmpty(findBackingApplications(serviceDefinition, plan)));
return findBrokeredService(serviceDefinition, plan)
.flatMap(brokeredService -> Mono.justOrEmpty(brokeredService.getApps()))
.map(backingApplications -> BackingApplications.builder()
.backingApplications(backingApplications)
.build());
}
protected Mono<List<BackingService>> getBackingServicesForService(ServiceDefinition serviceDefinition, Plan plan) {
return Mono.defer(() ->
Mono.justOrEmpty(findBackingServices(serviceDefinition, plan)));
return findBrokeredService(serviceDefinition, plan)
.flatMap(brokeredService -> Mono.justOrEmpty(brokeredService.getServices()))
.map(backingServices -> BackingServices.builder()
.backingServices(backingServices)
.build());
}
private BackingApplications findBackingApplications(ServiceDefinition serviceDefinition,
Plan plan) {
BrokeredService brokeredService = findBrokeredService(serviceDefinition, plan);
BackingApplications backingApplications = null;
if (brokeredService != null) {
backingApplications = BackingApplications.builder()
.backingApplications(brokeredService.getApps())
.build();
}
return backingApplications;
}
private BackingServices findBackingServices(ServiceDefinition serviceDefinition,
Plan plan) {
BrokeredService brokeredService = findBrokeredService(serviceDefinition, plan);
BackingServices backingServices = null;
if (brokeredService != null && !CollectionUtils.isEmpty(brokeredService.getServices())) {
backingServices = BackingServices.builder()
.backingServices(brokeredService.getServices())
.build();
}
return backingServices;
}
private BrokeredService findBrokeredService(ServiceDefinition serviceDefinition,
Plan plan) {
String serviceName = serviceDefinition.getName();
String planName = plan.getName();
return brokeredServices.stream()
.filter(brokeredService ->
brokeredService.getServiceName().equals(serviceName)
&& brokeredService.getPlanName().equals(planName))
.findFirst()
.orElse(null);
private Mono<BrokeredService> findBrokeredService(ServiceDefinition serviceDefinition, Plan plan) {
return Flux.fromIterable(brokeredServices)
.filter(brokeredService -> brokeredService.getServiceName().equals(serviceDefinition.getName())
&& brokeredService.getPlanName().equals(plan.getName()))
.singleOrEmpty();
}
}

View File

@@ -87,10 +87,10 @@ public class AppDeploymentUpdateServiceInstanceWorkflow extends AppDeploymentIns
private Flux<String> updateBackingServices(UpdateServiceInstanceRequest request) {
return getBackingServicesForService(request.getServiceDefinition(), request.getPlan())
.flatMap(backingServices ->
targetService.addToBackingServices(backingServices,
getTargetForService(request.getServiceDefinition(), request.getPlan()),
.flatMap(backingServices -> getTargetForService(request.getServiceDefinition(), request.getPlan())
.flatMap(targetSpec -> targetService.addToBackingServices(backingServices, targetSpec,
request.getServiceInstanceId()))
.defaultIfEmpty(backingServices))
.flatMap(backingServices ->
servicesParametersTransformationService.transformParameters(backingServices,
request.getParameters()))
@@ -163,10 +163,10 @@ public class AppDeploymentUpdateServiceInstanceWorkflow extends AppDeploymentIns
private Flux<String> updateBackingApplications(UpdateServiceInstanceRequest request) {
return getBackingApplicationsForService(request.getServiceDefinition(), request.getPlan())
.flatMap(backingApps ->
targetService.addToBackingApplications(backingApps,
getTargetForService(request.getServiceDefinition(), request.getPlan()),
.flatMap(backingApps -> getTargetForService(request.getServiceDefinition(), request.getPlan())
.flatMap(targetSpec -> targetService.addToBackingApplications(backingApps, targetSpec,
request.getServiceInstanceId()))
.defaultIfEmpty(backingApps))
.flatMap(backingApps ->
appsParametersTransformationService.transformParameters(backingApps, request.getParameters()))
.flatMapMany(backingApps -> deploymentService.update(backingApps, request.getServiceInstanceId()))

View File

@@ -234,8 +234,6 @@ class AppDeploymentDeleteServiceInstanceWorkflowTest {
// no backing apps
given(this.backingAppManagementService.getDeployedBackingApplications(eq(request.getServiceInstanceId())))
.willReturn(Mono.empty());
given(this.credentialProviderService.deleteCredentials(any(), eq(request.getServiceInstanceId())))
.willReturn(Mono.empty());
given(this.backingServicesProvisionService.deleteServiceInstance(argThat(backingServices -> {
boolean nameMatch = "my-service-instance".equals(backingServices.get(0).getServiceInstanceName());