@Test public void requestWithDefaultsIsBuilt() { CreateServiceInstanceBindingRequest request = CreateServiceInstanceBindingRequest.builder().build(); assertThat(request.getServiceDefinitionId()).isNull(); assertThat(request.getServiceDefinition()).isNull(); assertThat(request.getPlanId()).isNull(); assertThat(request.getServiceInstanceId()).isNull(); assertThat(request.getBindResource()).isNull(); assertThat(request.getContext()).isNull(); assertThat(request.getBindingId()).isNull(); assertThat(request.getParameters()).hasSize(0); assertThat(request.isAsyncAccepted()).isEqualTo(false); assertThat(request.getApiInfoLocation()).isNull(); assertThat(request.getPlatformInstanceId()).isNull(); assertThat(request.getOriginatingIdentity()).isNull(); }
/** * Construct a {@link CreateServiceInstanceBindingRequest} from the provided values. * * @return the newly constructed {@literal CreateServiceInstanceBindingRequest} */ public CreateServiceInstanceBindingRequest build() { return new CreateServiceInstanceBindingRequest(serviceInstanceId, serviceDefinitionId, planId, bindingId, serviceDefinition, plan, asyncAccepted, bindResource, parameters, context, platformInstanceId, apiInfoLocation, originatingIdentity); } }
@Override public final boolean equals(Object o) { if (this == o) return true; if (!(o instanceof CreateServiceInstanceBindingRequest)) return false; if (!super.equals(o)) return false; CreateServiceInstanceBindingRequest that = (CreateServiceInstanceBindingRequest) o; return that.canEqual(this) && Objects.equals(serviceDefinitionId, that.serviceDefinitionId) && Objects.equals(planId, that.planId) && Objects.equals(serviceInstanceId, that.serviceInstanceId) && Objects.equals(bindingId, that.bindingId) && Objects.equals(appGuid, that.appGuid) && Objects.equals(bindResource, that.bindResource) && Objects.equals(parameters, that.parameters) && Objects.equals(context, that.context) && Objects.equals(serviceDefinition, that.serviceDefinition) && Objects.equals(plan, that.plan); }
@PutMapping(value = { "/{platformInstanceId}/v2/service_instances/{instanceId}/service_bindings/{bindingId}", "/v2/service_instances/{instanceId}/service_bindings/{bindingId}" }) public ResponseEntity<CreateServiceInstanceBindingResponse> createServiceInstanceBinding( @PathVariable Map<String, String> pathVariables, @PathVariable(ServiceBrokerRequest.INSTANCE_ID_PATH_VARIABLE) String serviceInstanceId, @PathVariable(ServiceBrokerRequest.BINDING_ID_PATH_VARIABLE) String bindingId, @RequestParam(value = AsyncServiceBrokerRequest.ASYNC_REQUEST_PARAMETER, required = false) boolean acceptsIncomplete, @RequestHeader(value = ServiceBrokerRequest.API_INFO_LOCATION_HEADER, required = false) String apiInfoLocation, @RequestHeader(value = ServiceBrokerRequest.ORIGINATING_IDENTITY_HEADER, required = false) String originatingIdentityString, @Valid @RequestBody CreateServiceInstanceBindingRequest request) { ServiceDefinition serviceDefinition = getRequiredServiceDefinition(request.getServiceDefinitionId()); Plan plan = getServiceDefinitionPlan(serviceDefinition, request.getPlanId()); request.setServiceInstanceId(serviceInstanceId); request.setBindingId(bindingId); request.setServiceDefinition(serviceDefinition); request.setPlan(plan); setCommonRequestFields(request, pathVariables.get(ServiceBrokerRequest.PLATFORM_INSTANCE_ID_VARIABLE), apiInfoLocation, originatingIdentityString, acceptsIncomplete); logger.debug("Creating a service instance binding: request={}", request); CreateServiceInstanceBindingResponse response = service.createServiceInstanceBinding(request); logger.debug("Creating a service instance binding succeeded: serviceInstanceId={}, bindingId={}, response={}", serviceInstanceId, bindingId, response); return new ResponseEntity<>(response, getCreateResponseCode(response)); }
@Test public void requestIsDeserializedFromJson() { CreateServiceInstanceBindingRequest request = JsonUtils.readTestDataFile("bindRequest.json", CreateServiceInstanceBindingRequest.class); assertThat(request.getServiceDefinitionId()).isEqualTo("test-service-id"); assertThat(request.getPlanId()).isEqualTo("test-plan-id"); assertThat(request.getAppGuid()).isEqualTo("test-app-guid"); Context context = request.getContext(); assertThat(context.getPlatform()).isEqualTo("sample-platform"); assertThat(context).isInstanceOf(Context.class); assertThat(context.getProperty("field1")).isEqualTo("data"); assertThat(context.getProperty("field2")).isEqualTo(2); assertThat(request.getBindResource().getProperty("field1")).isEqualTo("data"); assertThat(request.getBindResource().getProperty("field2")).isEqualTo(2); assertThat(request.getParameters().get("parameter1")).isEqualTo(1); assertThat(request.getParameters().get("parameter2")).isEqualTo("foo"); assertThat(request.getParameters().get("parameter3")).isEqualTo(true); }
@Test public void createBindingToRouteFiltersPlansSucceeds() throws Exception { setupCatalogService(); setupServiceInstanceBindingService(CreateServiceInstanceRouteBindingResponse .builder() .bindingExisted(false) .build()); client.put().uri(buildCreateUrl()) .contentType(MediaType.APPLICATION_JSON) .syncBody(createRequestBody) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isCreated(); CreateServiceInstanceBindingRequest actualRequest = verifyCreateBinding(); assertThat(actualRequest.isAsyncAccepted()).isEqualTo(false); assertThat(actualRequest.getPlan().getId()).isEqualTo(actualRequest.getPlanId()); assertHeaderValuesNotSet(actualRequest); }
@Test public void createBindingToAppFiltersPlansSucceeds() throws Exception { setupCatalogService(); setupServiceInstanceBindingService(CreateServiceInstanceAppBindingResponse .builder() .bindingExisted(false) .build()); client.put().uri(buildCreateUrl(PLATFORM_INSTANCE_ID, false)) .contentType(MediaType.APPLICATION_JSON) .syncBody(createRequestBody) .header(API_INFO_LOCATION_HEADER, API_INFO_LOCATION) .header(ORIGINATING_IDENTITY_HEADER, buildOriginatingIdentityHeader()) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isCreated(); CreateServiceInstanceBindingRequest actualRequest = verifyCreateBinding(); assertThat(actualRequest.getPlan().getId()).isEqualTo(actualRequest.getPlanId()); assertHeaderValuesSet(actualRequest); }
@Theory public void createServiceBindingWithResponseGivesExpectedStatus(CreateResponseAndExpectedStatus data) { Mono<CreateServiceInstanceBindingResponse> responseMono; if (data.response == null) { responseMono = Mono.empty(); } else { responseMono = Mono.just(data.response); } when(bindingService.createServiceInstanceBinding(any(CreateServiceInstanceBindingRequest.class))) .thenReturn(responseMono); CreateServiceInstanceBindingRequest createRequest = CreateServiceInstanceBindingRequest.builder() .serviceDefinitionId("service-definition-id") .build(); ResponseEntity<CreateServiceInstanceBindingResponse> responseEntity = controller .createServiceInstanceBinding(pathVariables, null, null, false, null, null, createRequest) .block(); assertThat(responseEntity).isNotNull(); assertThat(responseEntity.getStatusCode()).isEqualTo(data.expectedStatus); assertThat(responseEntity.getBody()).isEqualTo(data.response); }
@Test public void createBindingToRouteWithoutAsyncAndHeadersSucceeds() throws Exception { setupCatalogService(); setupServiceInstanceBindingService(CreateServiceInstanceRouteBindingResponse.builder() .bindingExisted(false) .build()); client.put().uri(buildCreateUrl()) .contentType(MediaType.APPLICATION_JSON) .syncBody(createRequestBody) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isCreated(); CreateServiceInstanceBindingRequest actualRequest = verifyCreateBinding(); assertThat(actualRequest.isAsyncAccepted()).isEqualTo(false); assertHeaderValuesNotSet(actualRequest); }
@Override public Mono<CreateServiceInstanceBindingResponse> createServiceInstanceBinding(CreateServiceInstanceBindingRequest request) { String serviceInstanceId = request.getServiceInstanceId(); String bindingId = request.getBindingId(); // // create credentials and store for later retrieval // String url = new String(/* build a URL to access the service instance */); String bindingUsername = new String(/* create a user */); String bindingPassword = new String(/* create a password */); CreateServiceInstanceBindingResponse response = CreateServiceInstanceAppBindingResponse.builder() .credentials("url", url) .credentials("username", bindingUsername) .credentials("password", bindingPassword) .bindingExisted(false) .async(true) .build(); return Mono.just(response); }
@Override public Mono<CreateServiceInstanceBindingResponse> createServiceInstanceBinding(CreateServiceInstanceBindingRequest request) { if (request.getServiceDefinitionId() == null) { return Mono.error(new ServiceInstanceBindingExistsException("foo", "arrrr")); } return Mono.just(CreateServiceInstanceAppBindingResponse.builder().build()); }
@Override public Mono<Void> error(DeleteServiceInstanceBindingRequest request, Throwable t) { return results.setErrorDelete("error delete " + request.getServiceInstanceId()); } }))
@RequestHeader(value = ServiceBrokerRequest.ORIGINATING_IDENTITY_HEADER, required = false) String originatingIdentityString, @Valid @RequestBody CreateServiceInstanceBindingRequest request) { return getRequiredServiceDefinition(request.getServiceDefinitionId()) .flatMap(serviceDefinition -> getServiceDefinitionPlan(serviceDefinition, request.getPlanId()) .map(plan -> { request.setPlan(plan); return request; }) .switchIfEmpty(Mono.just(request)) .map(req -> { request.setServiceInstanceId(serviceInstanceId); request.setBindingId(bindingId); request.setServiceDefinition(serviceDefinition); return request; }))
@Test public void createBindingToAppFiltersPlansSucceeds() throws Exception { setupCatalogService(); setupServiceInstanceBindingService(CreateServiceInstanceAppBindingResponse .builder() .bindingExisted(false) .build()); MvcResult mvcResult = mockMvc .perform(put(buildCreateUrl(PLATFORM_INSTANCE_ID, false)) .content(createRequestBody) .header(API_INFO_LOCATION_HEADER, API_INFO_LOCATION) .header(ORIGINATING_IDENTITY_HEADER, buildOriginatingIdentityHeader()) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON)) .andExpect(request().asyncStarted()) .andReturn(); mockMvc.perform(asyncDispatch(mvcResult)) .andExpect(status().isCreated()); CreateServiceInstanceBindingRequest actualRequest = verifyCreateBinding(); assertThat(actualRequest.isAsyncAccepted()).isEqualTo(false); assertThat(actualRequest.getPlan().getId()).isEqualTo(actualRequest.getPlanId()); assertHeaderValuesSet(actualRequest); }
@Test(expected = UnsupportedOperationException.class) public void createServiceInstanceBinding() { service.createServiceInstanceBinding(CreateServiceInstanceBindingRequest.builder().build()) .block(); }
@Test public void createBindingToRouteWithAsyncAndHeadersSucceeds() throws Exception { setupCatalogService(); setupServiceInstanceBindingService(CreateServiceInstanceRouteBindingResponse.builder() .async(true) .operation("working") .bindingExisted(false) .build()); client.put().uri(buildCreateUrl(null, true)) .contentType(MediaType.APPLICATION_JSON) .syncBody(createRequestBody) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isAccepted() .expectBody() .jsonPath("$.operation").isEqualTo("working"); CreateServiceInstanceBindingRequest actualRequest = verifyCreateBinding(); assertThat(actualRequest.isAsyncAccepted()).isEqualTo(true); assertHeaderValuesNotSet(actualRequest); }
@Override public Mono<Void> initialize(DeleteServiceInstanceBindingRequest request) { return results.setBeforeDelete("before delete " + request.getServiceInstanceId()); @Override public Mono<Void> complete(DeleteServiceInstanceBindingRequest request, DeleteServiceInstanceBindingResponse response) { return results.setAfterDelete("after delete " + request.getServiceInstanceId());
CreateServiceInstanceBindingRequest request = CreateServiceInstanceBindingRequest.builder() .serviceDefinitionId("service-definition-id") .planId("plan-id") assertThat(request.getServiceDefinitionId()).isEqualTo("service-definition-id"); assertThat(request.getServiceDefinition()).isNull(); assertThat(request.getPlanId()).isEqualTo("plan-id"); assertThat(request.getParameters()).hasSize(5); assertThat(request.getParameters().get("field1")).isEqualTo("value1"); assertThat(request.getParameters().get("field2")).isEqualTo(2); assertThat(request.getParameters().get("field3")).isEqualTo(true); assertThat(request.getParameters().get("field4")).isEqualTo("value4"); assertThat(request.getParameters().get("field5")).isEqualTo("value5"); Parameters boundParameters = request.getParameters(Parameters.class); assertThat(boundParameters.getField1()).isEqualTo("value1"); assertThat(boundParameters.getField2()).isEqualTo(2); assertThat(boundParameters.getField3()).isEqualTo(true); assertThat(request.getBindResource()).isEqualTo(bindResource); assertThat(request.getContext()).isEqualTo(context); assertThat(request.isAsyncAccepted()).isEqualTo(true); assertThat(request.getPlatformInstanceId()).isEqualTo("platform-instance-id"); assertThat(request.getApiInfoLocation()).isEqualTo("https://api.example.com"); assertThat(request.getOriginatingIdentity()).isEqualTo(originatingIdentity);
@Test public void createServiceInstanceBindingFails() { prepareBindingFlows(); StepVerifier .create(serviceInstanceBindingEventService.createServiceInstanceBinding( CreateServiceInstanceBindingRequest.builder() .serviceInstanceId("foo") .build())) .expectError() .verify(); assertThat(this.results.getBeforeCreate()).isEqualTo("before create foo"); assertThat(this.results.getAfterCreate()).isNullOrEmpty(); assertThat(this.results.getErrorCreate()).isEqualTo("error create foo"); assertThat(this.results.getBeforeDelete()).isNullOrEmpty(); assertThat(this.results.getAfterDelete()).isNullOrEmpty(); assertThat(this.results.getErrorDelete()).isNullOrEmpty(); }
@Test public void createBindingToRouteWithAsyncHeadersSucceeds() throws Exception { setupCatalogService(); setupServiceInstanceBindingService(CreateServiceInstanceRouteBindingResponse.builder() .async(true) .operation("working") .bindingExisted(false) .build()); MvcResult mvcResult = mockMvc.perform(put(buildCreateUrl(null, true)) .content(createRequestBody) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON)) .andExpect(request().asyncStarted()) .andExpect(status().isOk()) .andReturn(); mockMvc.perform(asyncDispatch(mvcResult)) .andExpect(status().isAccepted()) .andExpect(jsonPath("$.operation", equalTo("working"))); CreateServiceInstanceBindingRequest actualRequest = verifyCreateBinding(); assertThat(actualRequest.isAsyncAccepted()).isEqualTo(true); assertHeaderValuesNotSet(actualRequest); }