Deploy all the backing apps of a given service to a single space

Connected to #133
This commit is contained in:
Alberto Rios
2018-11-06 12:31:37 +01:00
committed by Scott Frederick
parent 64f1072a4b
commit 0f703d2ec6
14 changed files with 61 additions and 50 deletions

View File

@@ -36,10 +36,9 @@ class CreateInstanceWithTargetAcceptanceTest extends CloudFoundryAcceptanceTest
"spring.cloud.appbroker.services[0].plan-name=standard",
"spring.cloud.appbroker.services[0].apps[0].name=" + BROKER_SAMPLE_APP_CREATE_WITH_TARGET,
"spring.cloud.appbroker.services[0].apps[0].path=classpath:demo.jar",
"spring.cloud.appbroker.services[0].apps[0].target.name=SpacePerServiceInstance",
"spring.cloud.appbroker.services[0].apps[1].name=" + BROKER_SAMPLE_APP_CREATE_WITH_TARGET_OTHER,
"spring.cloud.appbroker.services[0].apps[1].path=classpath:demo.jar",
"spring.cloud.appbroker.services[0].apps[1].target.name=SpacePerServiceInstance"
"spring.cloud.appbroker.services[0].target.name=SpacePerServiceInstance"
})
void shouldCreateMultipleAppsInSpace() {
// when a service instance is created with targets

View File

@@ -39,8 +39,8 @@ class UpdateInstanceWithTargetAcceptanceTest extends CloudFoundryAcceptanceTest
"spring.cloud.appbroker.services[0].plan-name=standard",
"spring.cloud.appbroker.services[0].apps[0].name=" + BROKER_SAMPLE_APP_CREATE_WITH_TARGET,
"spring.cloud.appbroker.services[0].apps[0].path=classpath:demo.jar",
"spring.cloud.appbroker.services[0].apps[0].target.name=SpacePerServiceInstance",
"spring.cloud.appbroker.services[0].apps[0].environment.parameter1=config1"
"spring.cloud.appbroker.services[0].apps[0].environment.parameter1=config1",
"spring.cloud.appbroker.services[0].target.name=SpacePerServiceInstance"
})
void shouldCreateAppInTargetWhenAddingNewProperties() {
// when a service instance is created

View File

@@ -34,7 +34,6 @@ public class BackingApplication {
private List<ServicesSpec> services;
private List<ParametersTransformerSpec> parametersTransformers;
private List<CredentialProviderSpec> credentialProviders;
private TargetSpec target;
public BackingApplication(BackingApplication backingApplicationToCopy) {
this.name = backingApplicationToCopy.name;
@@ -54,7 +53,6 @@ public class BackingApplication {
this.credentialProviders = backingApplicationToCopy.credentialProviders == null
? new ArrayList<>()
: new ArrayList<>(backingApplicationToCopy.credentialProviders);
this.target = backingApplicationToCopy.target;
}
private BackingApplication() {
@@ -65,8 +63,7 @@ public class BackingApplication {
Map<String, String> environment,
List<ServicesSpec> services,
List<ParametersTransformerSpec> parametersTransformers,
List<CredentialProviderSpec> credentialProviders,
TargetSpec target) {
List<CredentialProviderSpec> credentialProviders) {
this.name = name;
this.path = path;
this.properties = properties;
@@ -74,7 +71,6 @@ public class BackingApplication {
this.services = services;
this.parametersTransformers = parametersTransformers;
this.credentialProviders = credentialProviders;
this.target = target;
}
public String getName() {
@@ -140,15 +136,6 @@ public class BackingApplication {
public void setCredentialProviders(List<CredentialProviderSpec> credentialProviders) {
this.credentialProviders = credentialProviders;
}
public TargetSpec getTarget() {
return target;
}
public void setTarget(TargetSpec target) {
this.target = target;
}
public static BackingApplicationBuilder builder() {
return new BackingApplicationBuilder();
}
@@ -168,14 +155,13 @@ public class BackingApplication {
Objects.equals(environment, that.environment) &&
Objects.equals(services, that.services) &&
Objects.equals(parametersTransformers, that.parametersTransformers) &&
Objects.equals(credentialProviders, that.credentialProviders) &&
Objects.equals(target, that.target);
Objects.equals(credentialProviders, that.credentialProviders);
}
@Override
public final int hashCode() {
return Objects.hash(name, path, properties, environment, services,
parametersTransformers, credentialProviders, target);
parametersTransformers, credentialProviders);
}
@Override
@@ -188,7 +174,6 @@ public class BackingApplication {
", services=" + services +
", parametersTransformers=" + parametersTransformers +
", credentialProviders=" + credentialProviders +
", target=" + target +
'}';
}
@@ -212,7 +197,6 @@ public class BackingApplication {
private final List<ServicesSpec> services = new ArrayList<>();
private final List<ParametersTransformerSpec> parameterTransformers = new ArrayList<>();
private final List<CredentialProviderSpec> credentialProviders = new ArrayList<>();
private TargetSpec target;
BackingApplicationBuilder() {
}
@@ -262,14 +246,9 @@ public class BackingApplication {
return this;
}
public BackingApplicationBuilder target(TargetSpec targetSpec) {
this.target = targetSpec;
return this;
}
public BackingApplication build() {
return new BackingApplication(name, path, properties, environment, services,
parameterTransformers, credentialProviders, target);
parameterTransformers, credentialProviders);
}
}
}

View File

@@ -24,15 +24,17 @@ public class BrokeredService {
private String planName;
private BackingApplications apps;
private BackingServices services;
private TargetSpec target;
private BrokeredService() {
}
BrokeredService(String serviceName, String planName, BackingApplications apps, BackingServices services) {
BrokeredService(String serviceName, String planName, BackingApplications apps, BackingServices services, TargetSpec target) {
this.serviceName = serviceName;
this.planName = planName;
this.apps = apps;
this.services = services;
this.target = target;
}
public String getServiceName() {
@@ -67,6 +69,14 @@ public class BrokeredService {
this.services = services;
}
public TargetSpec getTarget() {
return target;
}
public void setTarget(TargetSpec target) {
this.target = target;
}
public static BrokeredServiceBuilder builder() {
return new BrokeredServiceBuilder();
}
@@ -83,12 +93,13 @@ public class BrokeredService {
return Objects.equals(serviceName, that.serviceName) &&
Objects.equals(planName, that.planName) &&
Objects.equals(apps, that.apps) &&
Objects.equals(services, that.services);
Objects.equals(services, that.services) &&
Objects.equals(target, that.target);
}
@Override
public final int hashCode() {
return Objects.hash(serviceName, planName, apps, services);
return Objects.hash(serviceName, planName, apps, services, target);
}
@Override
@@ -98,6 +109,7 @@ public class BrokeredService {
", planName='" + planName + '\'' +
", apps=" + apps +
", services=" + services +
", target=" + target +
'}';
}
@@ -107,6 +119,7 @@ public class BrokeredService {
private String planId;
private BackingApplications backingApplications;
private BackingServices backingServices;
private TargetSpec target;
public BrokeredServiceBuilder serviceName(String id) {
this.id = id;
@@ -128,8 +141,13 @@ public class BrokeredService {
return this;
}
public BrokeredServiceBuilder target(TargetSpec target) {
this.target = target;
return this;
}
public BrokeredService build() {
return new BrokeredService(id, planId, backingApplications, backingServices);
return new BrokeredService(id, planId, backingApplications, backingServices, target);
}
}
}

View File

@@ -35,11 +35,11 @@ public class TargetService {
}
public Mono<List<BackingApplication>> add(List<BackingApplication> backingApplications,
TargetSpec targetSpec,
String serviceInstanceId) {
return Flux.fromIterable(backingApplications)
.flatMap(backingApplication -> {
TargetSpec targetSpec = backingApplication.getTarget();
if (targetSpec != null) {
Target target = locator.getByName(targetSpec.getName(), Collections.emptyMap());
return target.apply(backingApplication, serviceInstanceId);

View File

@@ -66,7 +66,7 @@ public class AppDeploymentCreateServiceInstanceWorkflow
.flatMapMany(backingServicesProvisionService::createServiceInstance)
.thenMany(
getBackingApplicationsForService(request.getServiceDefinition(), request.getPlanId())
.flatMap(backingApps -> targetService.add(backingApps, request.getServiceInstanceId()))
.flatMap(backingApps -> targetService.add(backingApps, getTargetForService(request.getServiceDefinition(), request.getPlanId()) , request.getServiceInstanceId()))
.flatMap(backingApps -> parametersTransformationService.transformParameters(backingApps, request.getParameters()))
.flatMap(backingApplications -> credentialProviderService.addCredentials(backingApplications, request.getServiceInstanceId()))
.flatMapMany(deploymentService::deploy)

View File

@@ -63,7 +63,7 @@ public class AppDeploymentDeleteServiceInstanceWorkflow
.thenMany(
getBackingApplicationsForService(request.getServiceDefinition(), request.getPlanId())
.flatMap(backingApplications -> credentialProviderService.deleteCredentials(backingApplications, request.getServiceInstanceId()))
.flatMap(backingApps -> targetService.add(backingApps, request.getServiceInstanceId()))
.flatMap(backingApps -> targetService.add(backingApps, getTargetForService(request.getServiceDefinition(), request.getPlanId()), request.getServiceInstanceId()))
.flatMapMany(deploymentService::undeploy)
.doOnRequest(l -> log.info("Undeploying applications {}", brokeredServices))
.doOnEach(s -> log.info("Finished undeploying {}", s))

View File

@@ -26,6 +26,7 @@ import org.springframework.cloud.appbroker.deployer.BackingService;
import org.springframework.cloud.appbroker.deployer.BackingServices;
import org.springframework.cloud.appbroker.deployer.BrokeredService;
import org.springframework.cloud.appbroker.deployer.BrokeredServices;
import org.springframework.cloud.appbroker.deployer.TargetSpec;
import org.springframework.cloud.servicebroker.model.catalog.ServiceDefinition;
class AppDeploymentInstanceWorkflow {
@@ -42,6 +43,11 @@ class AppDeploymentInstanceWorkflow {
.defaultIfEmpty(false);
}
TargetSpec getTargetForService(ServiceDefinition serviceDefinition, String planId) {
BrokeredService brokeredService = findBrokeredService(serviceDefinition, planId);
return brokeredService == null ? null : brokeredService.getTarget();
}
Mono<List<BackingApplication>> getBackingApplicationsForService(ServiceDefinition serviceDefinition, String planId) {
return Mono.defer(() ->
Mono.justOrEmpty(findBackingApplications(serviceDefinition, planId)));

View File

@@ -53,7 +53,7 @@ public class AppDeploymentUpdateServiceInstanceWorkflow
public Flux<Void> update(UpdateServiceInstanceRequest request) {
return getBackingApplicationsForService(request.getServiceDefinition(), request.getPlanId())
.flatMap(backingApps -> targetService.add(backingApps, request.getServiceInstanceId()))
.flatMap(backingApps -> targetService.add(backingApps, getTargetForService(request.getServiceDefinition(), request.getPlanId()), request.getServiceInstanceId()))
.flatMap(backingApps ->
parametersTransformationService.transformParameters(backingApps, request.getParameters()))
.flatMapMany(deploymentService::deploy)

View File

@@ -40,11 +40,11 @@ class TargetServiceTest {
@Test
void shouldAddProperties() {
// given an app with a target
TargetSpec spacePerServiceInstanceFactory = TargetSpec.builder().name("SpacePerServiceInstance").build();
BackingApplication backingApplication = BackingApplication.builder().name("app-name").target(spacePerServiceInstanceFactory).build();
TargetSpec targetSpec = TargetSpec.builder().name("SpacePerServiceInstance").build();
BackingApplication backingApplication = BackingApplication.builder().name("app-name").build();
//when add gets called
List<BackingApplication> updatedBackingApplications = targetService.add(singletonList(backingApplication), "service-id").block();
List<BackingApplication> updatedBackingApplications = targetService.add(singletonList(backingApplication), targetSpec, "service-id").block();
//then a host and space are added
BackingApplication updatedBackingApplication = updatedBackingApplications.get(0);
@@ -55,12 +55,12 @@ class TargetServiceTest {
@Test
void shouldAddPropertiesToAllBackingApps() {
// given an app with a target
TargetSpec spacePerServiceInstanceFactory = TargetSpec.builder().name("SpacePerServiceInstance").build();
BackingApplication backingApplication1 = BackingApplication.builder().name("app-name1").target(spacePerServiceInstanceFactory).build();
BackingApplication backingApplication2 = BackingApplication.builder().name("app-name2").target(spacePerServiceInstanceFactory).build();
TargetSpec targetSpec = TargetSpec.builder().name("SpacePerServiceInstance").build();
BackingApplication backingApplication1 = BackingApplication.builder().name("app-name1").build();
BackingApplication backingApplication2 = BackingApplication.builder().name("app-name2").build();
//when add gets called
List<BackingApplication> updatedBackingApplications = targetService.add(Lists.list(backingApplication1, backingApplication2), "service-id").block();
List<BackingApplication> updatedBackingApplications = targetService.add(Lists.list(backingApplication1, backingApplication2), targetSpec, "service-id").block();
//then a host and space are added
BackingApplication updatedBackingApplication1 = updatedBackingApplications.get(0);

View File

@@ -36,6 +36,7 @@ import org.springframework.cloud.appbroker.deployer.BackingServices;
import org.springframework.cloud.appbroker.deployer.BackingServicesProvisionService;
import org.springframework.cloud.appbroker.deployer.BrokeredService;
import org.springframework.cloud.appbroker.deployer.BrokeredServices;
import org.springframework.cloud.appbroker.deployer.TargetSpec;
import org.springframework.cloud.appbroker.extensions.credentials.CredentialProviderService;
import org.springframework.cloud.appbroker.extensions.parameters.ParametersTransformationService;
import org.springframework.cloud.appbroker.extensions.targets.TargetService;
@@ -70,6 +71,7 @@ class AppDeploymentCreateServiceInstanceWorkflowTest {
private BackingApplications backingApps;
private BackingServices backingServices;
private TargetSpec targetSpec;
private CreateServiceInstanceWorkflow createServiceInstanceWorkflow;
@@ -107,6 +109,7 @@ class AppDeploymentCreateServiceInstanceWorkflowTest {
.planName("plan1")
.apps(backingApps)
.services(backingServices)
.target(targetSpec)
.build())
.build();
@@ -170,7 +173,7 @@ class AppDeploymentCreateServiceInstanceWorkflowTest {
.verifyComplete();
final String expectedServiceId = "service-instance-id";
verify(targetService).add(backingApps, expectedServiceId);
verify(targetService).add(backingApps, targetSpec, expectedServiceId);
verifyNoMoreInteractionsWithServices();
}
@@ -193,7 +196,7 @@ class AppDeploymentCreateServiceInstanceWorkflowTest {
.willReturn(Mono.just(backingApps));
given(this.credentialProviderService.addCredentials(eq(backingApps), eq(request.getServiceInstanceId())))
.willReturn(Mono.just(backingApps));
given(this.targetService.add(eq(backingApps), eq(request.getServiceInstanceId())))
given(this.targetService.add(eq(backingApps), eq(targetSpec), eq(request.getServiceInstanceId())))
.willReturn(Mono.just(backingApps));
given(this.backingServicesProvisionService.createServiceInstance(eq(backingServices)))
.willReturn(Flux.just("my-service-instance"));

View File

@@ -33,6 +33,7 @@ import org.springframework.cloud.appbroker.deployer.BackingServices;
import org.springframework.cloud.appbroker.deployer.BackingServicesProvisionService;
import org.springframework.cloud.appbroker.deployer.BrokeredService;
import org.springframework.cloud.appbroker.deployer.BrokeredServices;
import org.springframework.cloud.appbroker.deployer.TargetSpec;
import org.springframework.cloud.appbroker.extensions.credentials.CredentialProviderService;
import org.springframework.cloud.appbroker.extensions.targets.TargetService;
import org.springframework.cloud.appbroker.service.DeleteServiceInstanceWorkflow;
@@ -61,6 +62,7 @@ class AppDeploymentDeleteServiceInstanceWorkflowTest {
private BackingApplications backingApps;
private BackingServices backingServices;
private TargetSpec targetSpec;
private DeleteServiceInstanceWorkflow deleteServiceInstanceWorkflow;
@@ -98,6 +100,7 @@ class AppDeploymentDeleteServiceInstanceWorkflowTest {
.planName("plan1")
.apps(backingApps)
.services(backingServices)
.target(targetSpec)
.build())
.build();
@@ -118,7 +121,7 @@ class AppDeploymentDeleteServiceInstanceWorkflowTest {
.willReturn(Flux.just("undeployed1", "undeployed2"));
given(this.credentialProviderService.deleteCredentials(eq(backingApps), eq(request.getServiceInstanceId())))
.willReturn(Mono.just(backingApps));
given(this.targetService.add(eq(backingApps), eq("service-instance-id")))
given(this.targetService.add(eq(backingApps), eq(targetSpec), eq("service-instance-id")))
.willReturn(Mono.just(backingApps));
given(this.backingServicesProvisionService.deleteServiceInstance(eq(backingServices)))
.willReturn(Flux.just("my-service-instance"));

View File

@@ -33,6 +33,7 @@ import org.springframework.cloud.appbroker.deployer.BackingApplication;
import org.springframework.cloud.appbroker.deployer.BackingApplications;
import org.springframework.cloud.appbroker.deployer.BrokeredService;
import org.springframework.cloud.appbroker.deployer.BrokeredServices;
import org.springframework.cloud.appbroker.deployer.TargetSpec;
import org.springframework.cloud.appbroker.extensions.parameters.ParametersTransformationService;
import org.springframework.cloud.appbroker.extensions.targets.TargetService;
import org.springframework.cloud.servicebroker.model.catalog.Plan;
@@ -57,6 +58,7 @@ class AppDeploymentUpdateServiceInstanceWorkflowTest {
private TargetService targetService;
private BackingApplications backingApps;
private TargetSpec targetSpec;
private AppDeploymentUpdateServiceInstanceWorkflow updateServiceInstanceWorkflow;
@BeforeEach
@@ -79,6 +81,7 @@ class AppDeploymentUpdateServiceInstanceWorkflowTest {
.serviceName("service1")
.planName("plan1")
.apps(backingApps)
.target(targetSpec)
.build())
.build();
@@ -96,7 +99,7 @@ class AppDeploymentUpdateServiceInstanceWorkflowTest {
given(this.backingAppDeploymentService.deploy(eq(backingApps)))
.willReturn(Flux.just("app1", "app2"));
given(this.targetService.add(eq(backingApps), eq("service-instance-id")))
given(this.targetService.add(eq(backingApps), eq(targetSpec), eq("service-instance-id")))
.willReturn(Mono.just(backingApps));
given(this.parametersTransformationService.transformParameters(eq(backingApps), eq(request.getParameters())))
.willReturn(Mono.just(backingApps));
@@ -121,7 +124,7 @@ class AppDeploymentUpdateServiceInstanceWorkflowTest {
.willReturn(Flux.just("app1", "app2"));
given(this.parametersTransformationService.transformParameters(eq(backingApps), eq(request.getParameters())))
.willReturn(Mono.just(backingApps));
given(this.targetService.add(eq(backingApps), eq("service-instance-id")))
given(this.targetService.add(eq(backingApps), eq(targetSpec), eq("service-instance-id")))
.willReturn(Mono.just(backingApps));
StepVerifier

View File

@@ -36,7 +36,7 @@ import static org.springframework.cloud.appbroker.sample.CreateInstanceWithTarge
"spring.cloud.appbroker.services[0].plan-name=standard",
"spring.cloud.appbroker.services[0].apps[0].path=classpath:demo.jar",
"spring.cloud.appbroker.services[0].apps[0].name=" + APP_NAME,
"spring.cloud.appbroker.services[0].apps[0].target.name=SpacePerServiceInstance"
"spring.cloud.appbroker.services[0].target.name=SpacePerServiceInstance"
})
class CreateInstanceWithTargetComponentTest extends WiremockComponentTest {