Skip to content

Commit e88d839

Browse files
committed
Filter Plan objects provided in Request objects
Resolves #141
1 parent 6b2ede4 commit e88d839

17 files changed

+394
-39
lines changed

spring-cloud-open-service-broker-autoconfigure/src/test/java/org/springframework/cloud/servicebroker/autoconfigure/web/AbstractServiceInstanceControllerIntegrationTest.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,25 @@ public abstract class AbstractServiceInstanceControllerIntegrationTest extends C
5757

5858
protected String updateRequestBody;
5959

60+
protected String updateRequestBodyWithPlan;
61+
6062
@Before
6163
public void setUpCommonFixtures() {
62-
this.createRequestBody = JsonUtils.toJson(CreateServiceInstanceRequest.builder()
64+
this.createRequestBody = JsonUtils.toJson(CreateServiceInstanceRequest
65+
.builder()
66+
.serviceDefinitionId(serviceDefinition.getId())
67+
.planId("plan-one-id")
68+
.build());
69+
70+
this.updateRequestBody = JsonUtils.toJson(UpdateServiceInstanceRequest
71+
.builder()
6372
.serviceDefinitionId(serviceDefinition.getId())
64-
.planId("standard")
6573
.build());
6674

67-
this.updateRequestBody = JsonUtils.toJson(UpdateServiceInstanceRequest.builder()
75+
this.updateRequestBodyWithPlan = JsonUtils.toJson(UpdateServiceInstanceRequest
76+
.builder()
6877
.serviceDefinitionId(serviceDefinition.getId())
78+
.planId("plan-three-id")
6979
.build());
7080
}
7181

@@ -132,7 +142,7 @@ protected String buildDeleteUrl(String platformInstanceId, boolean asyncAccepted
132142
return buildBaseUrl(platformInstanceId)
133143
.path(SERVICE_INSTANCE_ID)
134144
.queryParam("service_id", serviceDefinition.getId())
135-
.queryParam("plan_id", "standard")
145+
.queryParam("plan_id", "plan-three-id")
136146
.queryParam("accepts_incomplete", asyncAccepted)
137147
.toUriString();
138148
}

spring-cloud-open-service-broker-autoconfigure/src/test/java/org/springframework/cloud/servicebroker/autoconfigure/web/CatalogControllerIntegrationTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,14 @@ private void assertResult(ResultActions result) throws Exception {
116116
SERVICE_REQUIRES_SYSLOG_DRAIN.toString(),
117117
SERVICE_REQUIRES_ROUTE_FORWARDING.toString())
118118
))
119-
.andExpect(jsonPath("$.services[*].plans[*]", hasSize(2)))
120-
.andExpect(jsonPath("$.services[*].plans[*].id", containsInAnyOrder(plans.get(0).getId(), plans.get(1).getId())))
121-
.andExpect(jsonPath("$.services[*].plans[*].name", containsInAnyOrder(plans.get(0).getName(), plans.get(1).getName())))
122-
.andExpect(jsonPath("$.services[*].plans[*].description", containsInAnyOrder(plans.get(0).getDescription(), plans.get(1).getDescription())))
119+
.andExpect(jsonPath("$.services[*].plans[*]", hasSize(3)))
120+
.andExpect(jsonPath("$.services[*].plans[*].id", containsInAnyOrder(plans.get(0).getId(), plans.get(1).getId(), plans.get(2).getId())))
121+
.andExpect(jsonPath("$.services[*].plans[*].name", containsInAnyOrder(plans.get(0).getName(), plans.get(1).getName(), plans.get(2).getName())))
122+
.andExpect(jsonPath("$.services[*].plans[*].description", containsInAnyOrder(plans.get(0).getDescription(), plans.get(1).getDescription(), plans.get(2).getDescription())))
123123
.andExpect(jsonPath("$.services[*].plans[*].metadata", contains(plans.get(1).getMetadata())))
124124
.andExpect(jsonPath("$.services[*].plans[*].bindable", hasSize(1)))
125125
.andExpect(jsonPath("$.services[*].plans[*].bindable", contains(plans.get(1).isBindable())))
126-
.andExpect(jsonPath("$.services[*].plans[*].free", containsInAnyOrder(plans.get(0).isFree(), plans.get(1).isFree())))
126+
.andExpect(jsonPath("$.services[*].plans[*].free", containsInAnyOrder(plans.get(0).isFree(), plans.get(1).isFree(), plans.get(2).isFree())))
127127
.andExpect(jsonPath("$.services[*].plans[*].schemas.service_instance.create.parameters", contains(createServiceInstanceSchema)))
128128
.andExpect(jsonPath("$.services[*].plans[*].schemas.service_instance.update.parameters", contains(updateServiceInstanceSchema)))
129129
.andExpect(jsonPath("$.services[*].plans[*].schemas.service_binding.create.parameters", contains(createServiceBindingSchema)));

spring-cloud-open-service-broker-autoconfigure/src/test/java/org/springframework/cloud/servicebroker/autoconfigure/web/ServiceInstanceBindingControllerIntegrationTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,29 @@ public void createBindingToAppWithoutAsyncAndHeadersSucceeds() throws Exception
9292
assertHeaderValuesSet(actualRequest);
9393
}
9494

95+
@Test
96+
public void createBindingToAppFiltersPlansSucceeds() throws Exception {
97+
setupCatalogService();
98+
99+
setupServiceInstanceBindingService(CreateServiceInstanceAppBindingResponse
100+
.builder()
101+
.bindingExisted(false)
102+
.build());
103+
104+
mockMvc.perform(put(buildCreateUrl(PLATFORM_INSTANCE_ID, false))
105+
.content(createRequestBody)
106+
.header(API_INFO_LOCATION_HEADER, API_INFO_LOCATION)
107+
.header(ORIGINATING_IDENTITY_HEADER, buildOriginatingIdentityHeader())
108+
.accept(MediaType.APPLICATION_JSON)
109+
.contentType(MediaType.APPLICATION_JSON))
110+
.andExpect(status().isCreated());
111+
112+
CreateServiceInstanceBindingRequest actualRequest = verifyCreateBinding();
113+
assertThat(actualRequest.isAsyncAccepted()).isEqualTo(false);
114+
assertThat(actualRequest.getPlan().getId()).isEqualTo(actualRequest.getPlanId());
115+
assertHeaderValuesSet(actualRequest);
116+
}
117+
95118
@Test
96119
public void createBindingToAppWithAsyncAndHeadersSucceeds() throws Exception {
97120
setupCatalogService();
@@ -344,6 +367,29 @@ public void deleteBindingWithoutAsyncAndHeadersSucceeds() throws Exception {
344367
assertHeaderValuesSet(actualRequest);
345368
}
346369

370+
@Test
371+
public void deleteBindingFiltersPlansSucceeds() throws Exception {
372+
setupCatalogService();
373+
374+
setupServiceInstanceBindingService(DeleteServiceInstanceBindingResponse
375+
.builder()
376+
.build());
377+
378+
mockMvc.perform(delete(buildDeleteUrl(PLATFORM_INSTANCE_ID, false))
379+
.header(API_INFO_LOCATION_HEADER, API_INFO_LOCATION)
380+
.header(ORIGINATING_IDENTITY_HEADER, buildOriginatingIdentityHeader())
381+
.contentType(MediaType.APPLICATION_JSON))
382+
.andExpect(status().isOk())
383+
.andExpect(content().string("{}"));
384+
385+
verify(serviceInstanceBindingService).deleteServiceInstanceBinding(any(DeleteServiceInstanceBindingRequest.class));
386+
387+
DeleteServiceInstanceBindingRequest actualRequest = verifyDeleteBinding();
388+
assertThat(actualRequest.isAsyncAccepted()).isEqualTo(false);
389+
assertThat(actualRequest.getPlan().getId()).isEqualTo(actualRequest.getPlanId());
390+
assertHeaderValuesSet(actualRequest);
391+
}
392+
347393
@Test
348394
public void deleteBindingWithUnknownInstanceIdFails() throws Exception {
349395
setupCatalogService();

spring-cloud-open-service-broker-autoconfigure/src/test/java/org/springframework/cloud/servicebroker/autoconfigure/web/ServiceInstanceBindingIntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public abstract class ServiceInstanceBindingIntegrationTest extends ControllerIn
3333
public void setupBase() {
3434
CreateServiceInstanceBindingRequest request = CreateServiceInstanceBindingRequest.builder()
3535
.serviceDefinitionId(serviceDefinition.getId())
36-
.planId("standard")
36+
.planId("plan-one-id")
3737
.build();
3838

3939
createRequestBody = JsonUtils.toJson(request);

spring-cloud-open-service-broker-autoconfigure/src/test/java/org/springframework/cloud/servicebroker/autoconfigure/web/ServiceInstanceControllerIntegrationTest.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,29 @@ public void createServiceInstanceWithExistingInstanceSucceeds() throws Exception
185185
.andExpect(status().isOk());
186186
}
187187

188+
@Test
189+
public void createServiceInstanceFiltersPlansSucceeds() throws Exception {
190+
setupCatalogService();
191+
192+
setupServiceInstanceService(CreateServiceInstanceResponse
193+
.builder()
194+
.async(true)
195+
.build());
196+
197+
mockMvc.perform(put(buildCreateUpdateUrl(PLATFORM_INSTANCE_ID, true))
198+
.content(createRequestBody)
199+
.header(API_INFO_LOCATION_HEADER, API_INFO_LOCATION)
200+
.header(ORIGINATING_IDENTITY_HEADER, buildOriginatingIdentityHeader())
201+
.contentType(MediaType.APPLICATION_JSON)
202+
.accept(MediaType.APPLICATION_JSON))
203+
.andExpect(status().isAccepted());
204+
205+
CreateServiceInstanceRequest actualRequest = verifyCreateServiceInstance();
206+
assertThat(actualRequest.isAsyncAccepted()).isEqualTo(true);
207+
assertThat(actualRequest.getPlan().getId()).isEqualTo(actualRequest.getPlanId());
208+
assertHeaderValuesSet(actualRequest);
209+
}
210+
188211
@Test
189212
public void createServiceInstanceWithUnknownServiceDefinitionIdFails() throws Exception {
190213
setupCatalogService(null);
@@ -350,6 +373,25 @@ public void deleteServiceInstanceWithoutAsyncAndHeadersSucceeds() throws Excepti
350373
assertHeaderValuesNotSet(actualRequest);
351374
}
352375

376+
@Test
377+
public void deleteServiceInstanceFiltersPlansSucceeds() throws Exception {
378+
setupCatalogService();
379+
380+
setupServiceInstanceService(DeleteServiceInstanceResponse
381+
.builder()
382+
.build());
383+
384+
mockMvc.perform(delete(buildDeleteUrl())
385+
.accept(MediaType.APPLICATION_JSON))
386+
.andExpect(status().isOk())
387+
.andExpect(content().string("{}"));
388+
389+
DeleteServiceInstanceRequest actualRequest = verifyDeleteServiceInstance();
390+
assertThat(actualRequest.isAsyncAccepted()).isEqualTo(false);
391+
assertThat(actualRequest.getPlan().getId()).isEqualTo(actualRequest.getPlanId());
392+
assertHeaderValuesNotSet(actualRequest);
393+
}
394+
353395
@Test
354396
public void deleteServiceInstanceWithUnknownIdFails() throws Exception {
355397
setupCatalogService();
@@ -413,6 +455,28 @@ public void updateServiceInstanceWithoutSyncAndHeadersSucceeds() throws Exceptio
413455

414456
UpdateServiceInstanceRequest actualRequest = verifyUpdateServiceInstance();
415457
assertThat(actualRequest.isAsyncAccepted()).isEqualTo(false);
458+
assertThat(actualRequest.getServiceDefinition().getPlans().size()).isEqualTo(3);
459+
assertHeaderValuesNotSet(actualRequest);
460+
}
461+
462+
@Test
463+
public void updateServiceInstanceFiltersPlansSucceeds() throws Exception {
464+
setupCatalogService();
465+
466+
setupServiceInstanceService(UpdateServiceInstanceResponse
467+
.builder()
468+
.build());
469+
470+
mockMvc.perform(patch(buildCreateUpdateUrl())
471+
.content(updateRequestBodyWithPlan)
472+
.contentType(MediaType.APPLICATION_JSON)
473+
.accept(MediaType.APPLICATION_JSON))
474+
.andExpect(status().isOk())
475+
.andExpect(content().string("{}"));
476+
477+
UpdateServiceInstanceRequest actualRequest = verifyUpdateServiceInstance();
478+
assertThat(actualRequest.isAsyncAccepted()).isEqualTo(false);
479+
assertThat(actualRequest.getPlan().getId()).isEqualTo(actualRequest.getPlanId());
416480
assertHeaderValuesNotSet(actualRequest);
417481
}
418482

spring-cloud-open-service-broker-autoconfigure/src/test/java/org/springframework/cloud/servicebroker/autoconfigure/web/fixture/ServiceFixture.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static ServiceDefinition getSimpleService() {
3535
.name("Service One")
3636
.description("Description for Service One")
3737
.bindable(true)
38-
.plans(getPlanOne(), getPlanTwo())
38+
.plans(getPlanOne(), getPlanTwo(), getPlanThree())
3939
.requires(ServiceDefinitionRequires.SERVICE_REQUIRES_SYSLOG_DRAIN.toString(),
4040
ServiceDefinitionRequires.SERVICE_REQUIRES_ROUTE_FORWARDING.toString())
4141
.build();
@@ -80,4 +80,12 @@ private static Plan getPlanTwo() {
8080
.schemas(schemas)
8181
.build();
8282
}
83+
84+
private static Plan getPlanThree() {
85+
return Plan.builder()
86+
.id("plan-three-id")
87+
.name("Plan Three")
88+
.description("Description for Plan Three")
89+
.build();
90+
}
8391
}

spring-cloud-open-service-broker-core/src/main/java/org/springframework/cloud/servicebroker/controller/BaseController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.IOException;
2020
import java.util.Map;
21+
import java.util.Optional;
2122

2223
import com.fasterxml.jackson.core.type.TypeReference;
2324
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -31,11 +32,13 @@
3132
import org.springframework.cloud.servicebroker.model.KubernetesContext;
3233
import org.springframework.cloud.servicebroker.model.PlatformContext;
3334
import org.springframework.cloud.servicebroker.model.ServiceBrokerRequest;
35+
import org.springframework.cloud.servicebroker.model.catalog.Plan;
3436
import org.springframework.cloud.servicebroker.model.catalog.ServiceDefinition;
3537
import org.springframework.cloud.servicebroker.service.CatalogService;
3638
import org.springframework.http.HttpStatus;
3739
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
3840
import org.springframework.util.Base64Utils;
41+
import org.springframework.util.StringUtils;
3942

4043
/**
4144
* Base functionality shared by controllers.
@@ -77,6 +80,15 @@ protected ServiceDefinition getServiceDefinition(String serviceDefinitionId) {
7780
return catalogService.getServiceDefinition(serviceDefinitionId);
7881
}
7982

83+
protected Plan getServiceDefinitionPlan(ServiceDefinition serviceDefinition, String planId) {
84+
Optional<Plan> optionalPlan = Optional.empty();
85+
if (serviceDefinition != null) {
86+
optionalPlan = serviceDefinition.getPlans().stream().filter(plan ->
87+
plan.getId().equals(planId)).findFirst();
88+
}
89+
return optionalPlan.orElse(null);
90+
}
91+
8092
protected Context parseOriginatingIdentity(String originatingIdentityString) {
8193
if (originatingIdentityString == null) {
8294
return null;

spring-cloud-open-service-broker-core/src/main/java/org/springframework/cloud/servicebroker/controller/ServiceInstanceBindingController.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import org.springframework.cloud.servicebroker.model.binding.GetLastServiceBindingOperationResponse;
3636
import org.springframework.cloud.servicebroker.model.binding.GetServiceInstanceBindingRequest;
3737
import org.springframework.cloud.servicebroker.model.binding.GetServiceInstanceBindingResponse;
38+
import org.springframework.cloud.servicebroker.model.catalog.Plan;
39+
import org.springframework.cloud.servicebroker.model.catalog.ServiceDefinition;
3840
import org.springframework.cloud.servicebroker.model.instance.OperationState;
3941
import org.springframework.cloud.servicebroker.service.CatalogService;
4042
import org.springframework.cloud.servicebroker.service.ServiceInstanceBindingService;
@@ -55,6 +57,7 @@
5557
*
5658
5759
* @author Scott Frederick
60+
* @author Roy Clarkson
5861
*/
5962
@ServiceBrokerRestController
6063
public class ServiceInstanceBindingController extends BaseController {
@@ -82,9 +85,12 @@ public ResponseEntity<CreateServiceInstanceBindingResponse> createServiceInstanc
8285
@RequestHeader(value = ServiceBrokerRequest.API_INFO_LOCATION_HEADER, required = false) String apiInfoLocation,
8386
@RequestHeader(value = ServiceBrokerRequest.ORIGINATING_IDENTITY_HEADER, required = false) String originatingIdentityString,
8487
@Valid @RequestBody CreateServiceInstanceBindingRequest request) {
88+
ServiceDefinition serviceDefinition = getRequiredServiceDefinition(request.getServiceDefinitionId());
89+
Plan plan = getServiceDefinitionPlan(serviceDefinition, request.getPlanId());
8590
request.setServiceInstanceId(serviceInstanceId);
8691
request.setBindingId(bindingId);
87-
request.setServiceDefinition(getRequiredServiceDefinition(request.getServiceDefinitionId()));
92+
request.setServiceDefinition(serviceDefinition);
93+
request.setPlan(plan);
8894
setCommonRequestFields(request, pathVariables.get(ServiceBrokerRequest.PLATFORM_INSTANCE_ID_VARIABLE), apiInfoLocation,
8995
originatingIdentityString, acceptsIncomplete);
9096

@@ -185,12 +191,16 @@ public ResponseEntity<DeleteServiceInstanceBindingResponse> deleteServiceInstanc
185191
@RequestParam(value = AsyncServiceBrokerRequest.ASYNC_REQUEST_PARAMETER, required = false) boolean acceptsIncomplete,
186192
@RequestHeader(value = ServiceBrokerRequest.API_INFO_LOCATION_HEADER, required = false) String apiInfoLocation,
187193
@RequestHeader(value = ServiceBrokerRequest.ORIGINATING_IDENTITY_HEADER, required = false) String originatingIdentityString) {
188-
DeleteServiceInstanceBindingRequest request = DeleteServiceInstanceBindingRequest.builder()
194+
ServiceDefinition serviceDefinition = getServiceDefinition(serviceDefinitionId);
195+
Plan plan = getServiceDefinitionPlan(serviceDefinition, planId);
196+
DeleteServiceInstanceBindingRequest request = DeleteServiceInstanceBindingRequest
197+
.builder()
189198
.serviceInstanceId(serviceInstanceId)
190199
.bindingId(bindingId)
191200
.serviceDefinitionId(serviceDefinitionId)
192201
.planId(planId)
193-
.serviceDefinition(getServiceDefinition(serviceDefinitionId))
202+
.serviceDefinition(serviceDefinition)
203+
.plan(plan)
194204
.asyncAccepted(acceptsIncomplete)
195205
.platformInstanceId(pathVariables.get(ServiceBrokerRequest.PLATFORM_INSTANCE_ID_VARIABLE))
196206
.apiInfoLocation(apiInfoLocation)

spring-cloud-open-service-broker-core/src/main/java/org/springframework/cloud/servicebroker/controller/ServiceInstanceController.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.cloud.servicebroker.exception.ServiceInstanceDoesNotExistException;
2828
import org.springframework.cloud.servicebroker.model.AsyncServiceBrokerRequest;
2929
import org.springframework.cloud.servicebroker.model.ServiceBrokerRequest;
30+
import org.springframework.cloud.servicebroker.model.catalog.Plan;
3031
import org.springframework.cloud.servicebroker.model.catalog.ServiceDefinition;
3132
import org.springframework.cloud.servicebroker.model.instance.CreateServiceInstanceRequest;
3233
import org.springframework.cloud.servicebroker.model.instance.CreateServiceInstanceResponse;
@@ -86,9 +87,11 @@ public ResponseEntity<CreateServiceInstanceResponse> createServiceInstance(
8687
@RequestHeader(value = ServiceBrokerRequest.ORIGINATING_IDENTITY_HEADER, required = false) String originatingIdentityString,
8788
@Valid @RequestBody CreateServiceInstanceRequest request) {
8889
ServiceDefinition serviceDefinition = getRequiredServiceDefinition(request.getServiceDefinitionId());
90+
Plan plan = getServiceDefinitionPlan(serviceDefinition, request.getPlanId());
8991

9092
request.setServiceInstanceId(serviceInstanceId);
9193
request.setServiceDefinition(serviceDefinition);
94+
request.setPlan(plan);
9295
setCommonRequestFields(request, pathVariables.get(ServiceBrokerRequest.PLATFORM_INSTANCE_ID_VARIABLE), apiInfoLocation,
9396
originatingIdentityString, acceptsIncomplete);
9497

@@ -186,12 +189,15 @@ public ResponseEntity<DeleteServiceInstanceResponse> deleteServiceInstance(
186189
@RequestHeader(value = ServiceBrokerRequest.API_INFO_LOCATION_HEADER, required = false) String apiInfoLocation,
187190
@RequestHeader(value = ServiceBrokerRequest.ORIGINATING_IDENTITY_HEADER, required = false) String originatingIdentityString) {
188191
ServiceDefinition serviceDefinition = getRequiredServiceDefinition(serviceDefinitionId);
192+
Plan plan = getServiceDefinitionPlan(serviceDefinition, planId);
189193

190-
DeleteServiceInstanceRequest request = DeleteServiceInstanceRequest.builder()
194+
DeleteServiceInstanceRequest request = DeleteServiceInstanceRequest
195+
.builder()
191196
.serviceInstanceId(serviceInstanceId)
192197
.serviceDefinitionId(serviceDefinitionId)
193198
.planId(planId)
194199
.serviceDefinition(serviceDefinition)
200+
.plan(plan)
195201
.asyncAccepted(acceptsIncomplete)
196202
.platformInstanceId(pathVariables.get(ServiceBrokerRequest.PLATFORM_INSTANCE_ID_VARIABLE))
197203
.apiInfoLocation(apiInfoLocation)
@@ -225,9 +231,11 @@ public ResponseEntity<UpdateServiceInstanceResponse> updateServiceInstance(
225231
@RequestHeader(value = ServiceBrokerRequest.ORIGINATING_IDENTITY_HEADER, required = false) String originatingIdentityString,
226232
@Valid @RequestBody UpdateServiceInstanceRequest request) {
227233
ServiceDefinition serviceDefinition = getRequiredServiceDefinition(request.getServiceDefinitionId());
234+
Plan plan = getServiceDefinitionPlan(serviceDefinition, request.getPlanId());
228235

229236
request.setServiceInstanceId(serviceInstanceId);
230237
request.setServiceDefinition(serviceDefinition);
238+
request.setPlan(plan);
231239
setCommonRequestFields(request, pathVariables.get(ServiceBrokerRequest.PLATFORM_INSTANCE_ID_VARIABLE), apiInfoLocation,
232240
originatingIdentityString, acceptsIncomplete);
233241

0 commit comments

Comments
 (0)