From f8ba9ed9be4d0a1e9961732a0961a11a8dc3c644 Mon Sep 17 00:00:00 2001 From: IvanBorislavovDimitrov Date: Thu, 23 Jun 2022 18:07:16 +0300 Subject: [PATCH] Implement service instances and plans creation and update --- .../client/v3/AbstractClientV3Operations.java | 20 + .../ReactorServiceInstancesV3.java | 51 +- .../serviceplans/ReactorServicePlansV3.java | 7 + .../ReactorServiceInstancesV3Test.java | 567 +++++++++++++++--- .../serviceplans/ReactorServicePlansTest.java | 36 ++ .../POST_{id}_request_update_plan.json | 8 + .../POST_{id}_response_update_plan.json | 9 + .../serviceinstances/GET_{id}_response.json | 55 ++ .../v3/serviceinstances/PATCH_request.json | 10 - ...quest_update_managed_service_instance.json | 26 + ...update_user_provided_service_instance.json | 18 + .../v3/serviceinstances/PATCH_response.json | 26 - ...ponse_update_managed_service_instance.json | 59 ++ ...update_user_provided_service_instance.json | 45 ++ ...quest_create_managed_service_instance.json | 33 + ...create_user_provided_service_instance.json | 26 + ...create_user_provided_service_instance.json | 45 ++ .../serviceinstances/ServiceInstancesV3.java | 32 +- .../_CreateServiceInstanceRequest.java | 96 +++ .../_CreateServiceInstanceResponse.java | 34 ++ .../_DeleteServiceInstanceRequest.java | 34 ++ .../_GetServiceInstanceRequest.java | 31 + .../_GetServiceInstanceResponse.java | 10 + .../_ServiceInstanceRelationships.java | 1 + .../_UpdateServiceInstanceRequest.java | 70 ++- .../_UpdateServiceInstanceResponse.java | 10 +- .../v3/serviceplans/ServicePlansV3.java | 16 +- .../client/v3/serviceplans/_Organization.java | 45 ++ .../_UpdateServicePlanVisibilityRequest.java | 53 ++ .../_UpdateServicePlanVisibilityResponse.java | 46 ++ .../CreateServiceInstanceRequestTest.java | 79 +++ ...etManagedServiceParametersRequestTest.java | 8 +- ...GetUserProvidedCredentialsRequestTest.java | 6 +- .../UpdateServiceInstanceRequestTest.java | 25 +- .../UpdateServicePlanVisibilityTest.java | 46 ++ .../org/cloudfoundry/util/OperationUtils.java | 1 - .../client/v3/ServiceInstancesTest.java | 234 +++++++- .../client/v3/ServicePlansTest.java | 22 +- 38 files changed, 1778 insertions(+), 162 deletions(-) create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/service_plans/POST_{id}_request_update_plan.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/service_plans/POST_{id}_response_update_plan.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/GET_{id}_response.json delete mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request_update_managed_service_instance.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request_update_user_provided_service_instance.json delete mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response_update_managed_service_instance.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response_update_user_provided_service_instance.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_request_create_managed_service_instance.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_request_create_user_provided_service_instance.json create mode 100644 cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_response_create_user_provided_service_instance.json create mode 100644 cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_CreateServiceInstanceRequest.java create mode 100644 cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_CreateServiceInstanceResponse.java create mode 100644 cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_DeleteServiceInstanceRequest.java create mode 100644 cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_GetServiceInstanceRequest.java create mode 100644 cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_GetServiceInstanceResponse.java create mode 100644 cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_Organization.java create mode 100644 cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_UpdateServicePlanVisibilityRequest.java create mode 100644 cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_UpdateServicePlanVisibilityResponse.java create mode 100644 cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/CreateServiceInstanceRequestTest.java create mode 100644 cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceplans/UpdateServicePlanVisibilityTest.java diff --git a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/AbstractClientV3Operations.java b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/AbstractClientV3Operations.java index 27ce97ac504..25bc8d35cdc 100644 --- a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/AbstractClientV3Operations.java +++ b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/AbstractClientV3Operations.java @@ -65,6 +65,16 @@ protected final Mono delete(Object requestPayload, Function Mono> deleteWithResponse(Object requestPayload, Class responseType, + Function uriTransformer) { + return createOperator() + .flatMap(operator -> operator.delete() + .uri(queryTransformer(requestPayload).andThen(uriTransformer)) + .send(requestPayload) + .response() + .parseBodyWithResponse(responseType)); + } + protected final Mono delete(Object requestPayload, Class responseType, Function uriTransformer) { return createOperator() .flatMap(operator -> operator.delete() @@ -130,6 +140,16 @@ protected Mono post(Object requestPayload, Class responseType, Functio .parseBody(responseType)); } + protected final Mono> postWithResponse(Object requestPayload, Class responseType, + Function uriTransformer) { + return createOperator() + .flatMap(operator -> operator.post() + .uri(queryTransformer(requestPayload).andThen(uriTransformer)) + .send(requestPayload) + .response() + .parseBodyWithResponse(responseType)); + } + protected final Mono post(Object requestPayload, Function uriTransformer) { return createOperator() .flatMap(operator -> operator.post() diff --git a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/serviceinstances/ReactorServiceInstancesV3.java b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/serviceinstances/ReactorServiceInstancesV3.java index d49de1e46a6..2a03da3c06b 100644 --- a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/serviceinstances/ReactorServiceInstancesV3.java +++ b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/serviceinstances/ReactorServiceInstancesV3.java @@ -16,14 +16,21 @@ package org.cloudfoundry.reactor.client.v3.serviceinstances; + +import org.cloudfoundry.client.v3.serviceinstances.CreateServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.CreateServiceInstanceResponse; +import org.cloudfoundry.client.v3.serviceinstances.DeleteServiceInstanceRequest; import org.cloudfoundry.client.v3.serviceinstances.GetManagedServiceParametersRequest; import org.cloudfoundry.client.v3.serviceinstances.GetManagedServiceParametersResponse; +import org.cloudfoundry.client.v3.serviceinstances.GetServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.GetServiceInstanceResponse; import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsRequest; import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsResponse; import org.cloudfoundry.client.v3.serviceinstances.ListServiceInstancesRequest; import org.cloudfoundry.client.v3.serviceinstances.ListServiceInstancesResponse; import org.cloudfoundry.client.v3.serviceinstances.ListSharedSpacesRelationshipRequest; import org.cloudfoundry.client.v3.serviceinstances.ListSharedSpacesRelationshipResponse; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceResource; import org.cloudfoundry.client.v3.serviceinstances.ServiceInstancesV3; import org.cloudfoundry.client.v3.serviceinstances.ShareServiceInstanceRequest; import org.cloudfoundry.client.v3.serviceinstances.ShareServiceInstanceResponse; @@ -31,11 +38,13 @@ import org.cloudfoundry.client.v3.serviceinstances.UpdateServiceInstanceRequest; import org.cloudfoundry.client.v3.serviceinstances.UpdateServiceInstanceResponse; import org.cloudfoundry.reactor.ConnectionContext; +import org.cloudfoundry.reactor.HttpClientResponseWithParsedBody; import org.cloudfoundry.reactor.TokenProvider; import org.cloudfoundry.reactor.client.v3.AbstractClientV3Operations; import reactor.core.publisher.Mono; import java.util.Map; +import java.util.Optional; /** * The Reactor-based implementation of {@link ServiceInstancesV3} @@ -54,16 +63,43 @@ public ReactorServiceInstancesV3(ConnectionContext connectionContext, Mono create(CreateServiceInstanceRequest request) { + return postWithResponse(request, ServiceInstanceResource.class, builder -> builder.pathSegment("service_instances")) + .map(responseTuple -> CreateServiceInstanceResponse.builder() + .jobId(getJobId(responseTuple)) + .serviceInstance(responseTuple.getBody()) + .build()) + .checkpoint(); + } + + private Optional getJobId(HttpClientResponseWithParsedBody responseTuple) { + return Optional.ofNullable(extractJobId(responseTuple.getResponse())); + } + + @Override + public Mono get(GetServiceInstanceRequest request) { + return get(request, GetServiceInstanceResponse.class, builder -> builder.pathSegment("service_instances", request.getServiceInstanceId())) + .checkpoint(); + } + + @Override + public Mono> delete(DeleteServiceInstanceRequest request) { + return deleteWithResponse(request, String.class, builder -> builder.pathSegment("service_instances", request.getServiceInstanceId())) + .map(this::getJobId) + .checkpoint(); + } + @Override public Mono getManagedServiceParameters(GetManagedServiceParametersRequest request) { - return get(request, GetManagedServiceParametersResponse.class, builder -> builder.pathSegment("service_instances", request.getServiceInstanceId(), "parameters")) - .checkpoint(); + return get(request, GetManagedServiceParametersResponse.class, builder -> builder.pathSegment("service_instances", request.getServiceInstanceId(), "parameters")) + .checkpoint(); } @Override public Mono getUserProvidedCredentials(GetUserProvidedCredentialsRequest request) { - return get(request, GetUserProvidedCredentialsResponse.class, builder -> builder.pathSegment("service_instances", request.getServiceInstanceId(), "credentials")) - .checkpoint(); + return get(request, GetUserProvidedCredentialsResponse.class, builder -> builder.pathSegment("service_instances", request.getServiceInstanceId(), "credentials")) + .checkpoint(); } @Override @@ -92,6 +128,11 @@ public Mono unshare(UnshareServiceInstanceRequest request) { @Override public Mono update(UpdateServiceInstanceRequest request) { - return patch(request, UpdateServiceInstanceResponse.class, builder -> builder.pathSegment("service_instances", request.getServiceInstanceId())); + return patchWithResponse(request, ServiceInstanceResource.class, builder -> builder.pathSegment("service_instances", request.getServiceInstanceId())) + .map(responseTuple -> UpdateServiceInstanceResponse.builder() + .jobId(getJobId(responseTuple)) + .serviceInstance(responseTuple.getBody()) + .build()) + .checkpoint(); } } diff --git a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/serviceplans/ReactorServicePlansV3.java b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/serviceplans/ReactorServicePlansV3.java index 3f4b94f0733..b70dc7ae509 100644 --- a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/serviceplans/ReactorServicePlansV3.java +++ b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/serviceplans/ReactorServicePlansV3.java @@ -24,6 +24,8 @@ import org.cloudfoundry.client.v3.serviceplans.ServicePlansV3; import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanRequest; import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanResponse; +import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanVisibilityRequest; +import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanVisibilityResponse; import org.cloudfoundry.reactor.ConnectionContext; import org.cloudfoundry.reactor.TokenProvider; import org.cloudfoundry.reactor.client.v3.AbstractClientV3Operations; @@ -72,4 +74,9 @@ public Mono update(UpdateServicePlanRequest request) .checkpoint(); } + @Override + public Mono updateVisibility(UpdateServicePlanVisibilityRequest request) { + return post(request, UpdateServicePlanVisibilityResponse.class, builder -> builder.pathSegment("service_plans", request.getServicePlanId(), "visibility")) + .checkpoint(); + } } diff --git a/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/client/v3/serviceInstances/ReactorServiceInstancesV3Test.java b/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/client/v3/serviceInstances/ReactorServiceInstancesV3Test.java index e32388173b5..e075884c817 100644 --- a/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/client/v3/serviceInstances/ReactorServiceInstancesV3Test.java +++ b/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/client/v3/serviceInstances/ReactorServiceInstancesV3Test.java @@ -16,13 +16,20 @@ package org.cloudfoundry.reactor.client.v3.serviceinstances; +import org.cloudfoundry.client.v3.LastOperation; import org.cloudfoundry.client.v3.Link; +import org.cloudfoundry.client.v3.MaintenanceInfo; import org.cloudfoundry.client.v3.Metadata; import org.cloudfoundry.client.v3.Pagination; import org.cloudfoundry.client.v3.Relationship; import org.cloudfoundry.client.v3.ToOneRelationship; +import org.cloudfoundry.client.v3.serviceinstances.CreateServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.CreateServiceInstanceResponse; +import org.cloudfoundry.client.v3.serviceinstances.DeleteServiceInstanceRequest; import org.cloudfoundry.client.v3.serviceinstances.GetManagedServiceParametersRequest; import org.cloudfoundry.client.v3.serviceinstances.GetManagedServiceParametersResponse; +import org.cloudfoundry.client.v3.serviceinstances.GetServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.GetServiceInstanceResponse; import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsRequest; import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsResponse; import org.cloudfoundry.client.v3.serviceinstances.ListServiceInstancesRequest; @@ -31,6 +38,7 @@ import org.cloudfoundry.client.v3.serviceinstances.ListSharedSpacesRelationshipResponse; import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceRelationships; import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceResource; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; import org.cloudfoundry.client.v3.serviceinstances.ShareServiceInstanceRequest; import org.cloudfoundry.client.v3.serviceinstances.ShareServiceInstanceResponse; import org.cloudfoundry.client.v3.serviceinstances.UnshareServiceInstanceRequest; @@ -40,7 +48,6 @@ import org.cloudfoundry.reactor.TestRequest; import org.cloudfoundry.reactor.TestResponse; import org.cloudfoundry.reactor.client.AbstractClientApiTest; -import org.cloudfoundry.reactor.client.v3.serviceinstances.ReactorServiceInstancesV3; import org.junit.Test; import reactor.test.StepVerifier; @@ -48,11 +55,13 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import static io.netty.handler.codec.http.HttpMethod.DELETE; import static io.netty.handler.codec.http.HttpMethod.GET; import static io.netty.handler.codec.http.HttpMethod.PATCH; import static io.netty.handler.codec.http.HttpMethod.POST; +import static io.netty.handler.codec.http.HttpResponseStatus.ACCEPTED; import static io.netty.handler.codec.http.HttpResponseStatus.CREATED; import static io.netty.handler.codec.http.HttpResponseStatus.NO_CONTENT; import static io.netty.handler.codec.http.HttpResponseStatus.OK; @@ -63,61 +72,135 @@ public final class ReactorServiceInstancesV3Test extends AbstractClientApiTest { @Test public void getManagedServiceParameters() { - Map parameters = new HashMap<>(); - parameters.put("key_1", "value_1"); - parameters.put("key_2", "value_2"); - - mockRequest(InteractionContext.builder() - .request(TestRequest.builder() - .method(GET).path("/service_instances/test-service-instance-id/parameters") - .build()) - .response(TestResponse.builder() - .status(OK) - .payload("fixtures/client/v3/serviceinstances/GET_{id}_parameters.json") - .build()) - .build()); - - this.serviceInstances - .getManagedServiceParameters(GetManagedServiceParametersRequest.builder() - .serviceInstanceId("test-service-instance-id") - .build()) - .as(StepVerifier::create) - .expectNext(GetManagedServiceParametersResponse.builder() - .parameters(parameters) - .build()) - .expectComplete() - .verify(Duration.ofSeconds(5)); + Map parameters = new HashMap<>(); + parameters.put("key_1", "value_1"); + parameters.put("key_2", "value_2"); + + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(GET).path("/service_instances/test-service-instance-id/parameters") + .build()) + .response(TestResponse.builder() + .status(OK) + .payload("fixtures/client/v3/serviceinstances/GET_{id}_parameters.json") + .build()) + .build()); + + this.serviceInstances + .getManagedServiceParameters(GetManagedServiceParametersRequest.builder() + .serviceInstanceId("test-service-instance-id") + .build()) + .as(StepVerifier::create) + .expectNext(GetManagedServiceParametersResponse.builder() + .parameters(parameters) + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); } - + @Test public void getUserProvidedCredentials() { - Map credentials = new HashMap<>(); - credentials.put("username", "my-username"); - credentials.put("password", "super-secret"); - credentials.put("other", "credential"); - - mockRequest(InteractionContext.builder() - .request(TestRequest.builder() - .method(GET).path("/service_instances/test-service-instance-id/credentials") - .build()) - .response(TestResponse.builder() - .status(OK) - .payload("fixtures/client/v3/serviceinstances/GET_{id}_credentials.json") - .build()) - .build()); - - this.serviceInstances - .getUserProvidedCredentials(GetUserProvidedCredentialsRequest.builder() - .serviceInstanceId("test-service-instance-id") - .build()) - .as(StepVerifier::create) - .expectNext(GetUserProvidedCredentialsResponse.builder() - .credentials(credentials) - .build()) - .expectComplete() - .verify(Duration.ofSeconds(5)); + Map credentials = new HashMap<>(); + credentials.put("username", "my-username"); + credentials.put("password", "super-secret"); + credentials.put("other", "credential"); + + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(GET).path("/service_instances/test-service-instance-id/credentials") + .build()) + .response(TestResponse.builder() + .status(OK) + .payload("fixtures/client/v3/serviceinstances/GET_{id}_credentials.json") + .build()) + .build()); + + this.serviceInstances + .getUserProvidedCredentials(GetUserProvidedCredentialsRequest.builder() + .serviceInstanceId("test-service-instance-id") + .build()) + .as(StepVerifier::create) + .expectNext(GetUserProvidedCredentialsResponse.builder() + .credentials(credentials) + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); } - + + @Test + public void get() { + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(GET).path("/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .build()) + .response(TestResponse.builder() + .status(CREATED) + .payload("fixtures/client/v3/serviceinstances/GET_{id}_response.json") + .build()) + .build()); + + this.serviceInstances + .get(GetServiceInstanceRequest.builder() + .serviceInstanceId("c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .build()) + .as(StepVerifier::create) + .expectNext(GetServiceInstanceResponse.builder() + .id("c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .createdAt("2020-03-10T15:49:29Z") + .updatedAt("2020-03-10T15:49:29Z") + .name("my-managed-instance") + .tags("foo", "bar") + .type(ServiceInstanceType.MANAGED) + .maintenanceInfo(MaintenanceInfo.builder() + .version("1.0.0") + .build()) + .updateAvailable(false) + .dashboardUrl("https://service-broker.example.org/dashboard") + .lastOperation(LastOperation.builder() + .type("create") + .state("succeeded") + .description("Operation succeeded") + .updatedAt("2020-03-10T15:49:32Z") + .createdAt("2020-03-10T15:49:29Z") + .build()) + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id("5358d122-638e-11ea-afca-bf6e756684ac") + .build()) + .build()) + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("5a84d315-9513-4d74-95e5-f6a5501eeef7") + .build()) + .build()) + .build()) + .link("self", Link.builder() + .href("https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .build()) + .link("service_plan", Link.builder() + .href("https://api.example.org/v3/service_plans/5358d122-638e-11ea-afca-bf6e756684ac") + .build()) + .link("space", Link.builder() + .href("https://api.example.org/v3/spaces/5a84d315-9513-4d74-95e5-f6a5501eeef7") + .build()) + .link("parameters", Link.builder() + .href("https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c/parameters") + .build()) + .link("shared_spaces", Link.builder() + .href("https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c/relationships/shared_spaces") + .build()) + .link("service_credential_bindings", Link.builder() + .href("https://api.example.org/v3/service_credential_bindings?service_instance_guids=c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .build()) + .link("service_route_bindings", Link.builder() + .href("https://api.example.org/v3/service_route_bindings?service_instance_guids=c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .build()) + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); + } + @Test public void list() { mockRequest(InteractionContext.builder() @@ -293,47 +376,393 @@ public void unshare() { } @Test - public void update() { + public void createManagedServiceInstance() { mockRequest(InteractionContext.builder() .request(TestRequest.builder() - .method(PATCH).path("/service_instances/68d54d31-9b3a-463b-ba94-e8e4c32edbac") - .payload("fixtures/client/v3/serviceinstances/PATCH_request.json") + .method(POST).path("/service_instances") + .payload("fixtures/client/v3/serviceinstances/POST_request_create_managed_service_instance.json") .build()) .response(TestResponse.builder() - .status(OK) - .payload("fixtures/client/v3/serviceinstances/PATCH_response.json") + .status(ACCEPTED) + .header("Location", "e1e4417c-74ee-11ea-a604-48bf6bec2d79") .build()) .build()); this.serviceInstances - .update(UpdateServiceInstanceRequest.builder() - .serviceInstanceId("68d54d31-9b3a-463b-ba94-e8e4c32edbac") + .create(CreateServiceInstanceRequest.builder() + .type(ServiceInstanceType.MANAGED) + .name("my_service_instance") + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id("e0e4417c-74ee-11ea-a604-48bf6bec2d78") + .build()) + .build()) + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("7304bc3c-7010-11ea-8840-48bf6bec2d78") + .build()) + .build()) + .build()) .metadata(Metadata.builder() - .annotation("note", "detailed information") - .label("key", "value") + .annotation("foo", "bar") + .label("baz", "qux") .build()) + .tags("foo", "bar", "baz") + .parameter("foo", "bar") + .parameter("baz", "qux") .build()) .as(StepVerifier::create) - .expectNext(UpdateServiceInstanceResponse.builder() - .createdAt("2017-11-17T13:54:21Z") - .id("85ccdcad-d725-4109-bca4-fd6ba062b5c8") - .link("space", Link.builder() - .href("https://api.example.org/v3/spaces/ae0031f9-dd49-461c-a945-df40e77c39cb") + .expectNext(CreateServiceInstanceResponse.builder() + .jobId("e1e4417c-74ee-11ea-a604-48bf6bec2d79") + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); + } + + @Test + public void testCreateUserProvidedService() { + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(POST).path("/service_instances") + .payload("fixtures/client/v3/serviceinstances/POST_request_create_user_provided_service_instance.json") + .build()) + .response(TestResponse.builder() + .status(CREATED) + .payload("fixtures/client/v3/serviceinstances/POST_response_create_user_provided_service_instance.json") + .build()) + .build()); + + this.serviceInstances + .create(CreateServiceInstanceRequest.builder() + .type(ServiceInstanceType.USER_PROVIDED) + .name("my-user-provided-instance") + .relationships(ServiceInstanceRelationships.builder() + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("7304bc3c-7010-11ea-8840-48bf6bec2d78") + .build()) + .build()) + .build()) + .metadata(Metadata.builder() + .annotation("foo", "bar") + .label("baz", "qux") + .build()) + .tag("sql") + .credential("foo", "bar") + .credential("baz", "qux") + .syslogDrainUrl("https://syslog.com/drain") + .routeServiceUrl("https://route.com/service") + .build()) + .as(StepVerifier::create) + .expectNext(CreateServiceInstanceResponse.builder() + .serviceInstance(ServiceInstanceResource.builder() + .id("88ce23e5-27c3-4381-a2df-32a28ec43133") + .createdAt("2020-03-10T15:56:08Z") + .updatedAt("2020-03-10T15:56:08Z") + .lastOperation(LastOperation.builder() + .type("create") + .state("succeeded") + .description("Operation succeeded") + .updatedAt("2020-03-10T15:49:32Z") + .createdAt("2020-03-10T15:49:29Z") + .build()) + .name("my-user-provided-instance") + .tag("sql") + .type(ServiceInstanceType.USER_PROVIDED) + .syslogDrainUrl("https://syslog.com/drain") + .routeServiceUrl("https://route.com/service") + .relationships(ServiceInstanceRelationships.builder() + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("7304bc3c-7010-11ea-8840-48bf6bec2d78") + .build()) + .build()) + .build()) + .metadata(Metadata.builder() + .annotation("foo", "bar") + .label("baz", "qux") + .build()) + .link("self", Link.builder() + .href("https://api.example.org/v3/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .link("space", Link.builder() + .href("https://api.example.org/v3/spaces/5a84d315-9513-4d74-95e5-f6a5501eeef7") + .build()) + .link("credentials", Link.builder() + .href("https://api.example.org/v3/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133/credentials") + .build()) + .link("service_credential_bindings", Link.builder() + .href("https://api.example.org/v3/service_credential_bindings?service_instance_guids=88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .link("service_route_bindings", Link.builder() + .href("https://api.example.org/v3/service_route_bindings?service_instance_guids=88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .build()) + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); + } + + @Test + public void updateManagedServiceInstance() { + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(PATCH).path("/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .payload("fixtures/client/v3/serviceinstances/PATCH_request_update_managed_service_instance.json") + .build()) + .response(TestResponse.builder() + .status(ACCEPTED) + .payload("fixtures/client/v3/serviceinstances/PATCH_response_update_managed_service_instance.json") + .build()) + .build()); + + this.serviceInstances + .update(UpdateServiceInstanceRequest.builder() + .serviceInstanceId("c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .name("my_service_instance") + .parameter("foo", "bar") + .parameter("baz", "qux") + .maintenanceInfo(MaintenanceInfo.builder() + .version("1.0.0") + .build()) + .tags("foo", "bar", "baz") + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id("f2b6ba9c-a4d2-11ea-8ae6-48bf6bec2d78") + .build()) + .build()) .build()) .metadata(Metadata.builder() .annotation("note", "detailed information") .label("key", "value") .build()) + .build()) + .as(StepVerifier::create) + .expectNext(UpdateServiceInstanceResponse.builder() + .serviceInstance(ServiceInstanceResource.builder() + .id("c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .createdAt("2020-03-10T15:49:29Z") + .updatedAt("2020-03-10T15:49:29Z") + .name("my_service_instance") + .maintenanceInfo(MaintenanceInfo.builder() + .version("1.0.0") + .build()) + .updateAvailable(false) + .type(ServiceInstanceType.MANAGED) + .dashboardUrl("https://service-broker.example.org/dashboard") + .tags("foo", "bar", "baz") + .lastOperation(LastOperation.builder() + .type("update") + .description("Operation succeeded") + .state("succeeded") + .updatedAt("2020-03-10T15:49:32Z") + .createdAt("2020-03-10T15:49:29Z") + .build()) + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id("5358d122-638e-11ea-afca-bf6e756684ac") + .build()) + .build()) + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("5a84d315-9513-4d74-95e5-f6a5501eeef7") + .build()) + .build()) + .build()) + .metadata(Metadata.builder() + .label("key", "value") + .annotation("note", "detailed information") + .build()) + .link("self", Link.builder() + .href("https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .build()) + .link("service_plan", Link.builder() + .href("https://api.example.org/v3/service_plans/5358d122-638e-11ea-afca-bf6e756684ac") + .build()) + .link("space", Link.builder() + .href("https://api.example.org/v3/spaces/5a84d315-9513-4d74-95e5-f6a5501eeef7") + .build()) + .link("parameters", Link.builder() + .href("https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c/parameters") + .build()) + .link("shared_spaces", Link.builder() + .href("https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c/relationships/shared_spaces") + .build()) + .link("service_credential_bindings", Link.builder() + .href("https://api.example.org/v3/service_credential_bindings?service_instance_guids=c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .build()) + .link("service_route_bindings", Link.builder() + .href("https://api.example.org/v3/service_route_bindings?service_instance_guids=c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .build()) + .build()) + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); + } + + @Test + public void updateManagedServiceInstanceAsync() { + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(PATCH).path("/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c") + .payload("fixtures/client/v3/serviceinstances/PATCH_request_update_managed_service_instance.json") + .build()) + .response(TestResponse.builder() + .status(ACCEPTED) + .header("Location", "e1e4417c-74ee-11ea-a604-48bf6bec2d79") + .build()) + .build()); + + this.serviceInstances + .update(UpdateServiceInstanceRequest.builder() + .serviceInstanceId("c89b3280-fe8d-4aa0-a42e-44465bb1c61c") .name("my_service_instance") + .parameter("foo", "bar") + .parameter("baz", "qux") + .maintenanceInfo(MaintenanceInfo.builder() + .version("1.0.0") + .build()) + .tags("foo", "bar", "baz") .relationships(ServiceInstanceRelationships.builder() - .space(ToOneRelationship.builder() + .servicePlan(ToOneRelationship.builder() .data(Relationship.builder() - .id("ae0031f9-dd49-461c-a945-df40e77c39cb") + .id("f2b6ba9c-a4d2-11ea-8ae6-48bf6bec2d78") .build()) .build()) .build()) - .updatedAt("2017-11-17T13:54:21Z") + .metadata(Metadata.builder() + .annotation("note", "detailed information") + .label("key", "value") + .build()) .build()) + .as(StepVerifier::create) + .expectNext(UpdateServiceInstanceResponse.builder() + .jobId("e1e4417c-74ee-11ea-a604-48bf6bec2d79") + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); + } + + @Test + public void updateUserProvidedServiceInstance() { + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(PATCH).path("/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133") + .payload("fixtures/client/v3/serviceinstances/PATCH_request_update_user_provided_service_instance.json") + .build()) + .response(TestResponse.builder() + .status(OK) + .payload("fixtures/client/v3/serviceinstances/PATCH_response_update_user_provided_service_instance.json") + .build()) + .build()); + + this.serviceInstances + .update(UpdateServiceInstanceRequest.builder() + .serviceInstanceId("88ce23e5-27c3-4381-a2df-32a28ec43133") + .name("my-user-provided-instance") + .credential("foo", "bar") + .credential("baz", "qux") + .tags("foo", "bar", "baz") + .syslogDrainUrl("https://syslog.com/drain") + .routeServiceUrl("https://route.com/service") + .metadata(Metadata.builder() + .annotation("foo", "bar") + .label("baz", "qux") + .build()) + .build()) + .as(StepVerifier::create) + .expectNext(UpdateServiceInstanceResponse.builder() + .serviceInstance( + ServiceInstanceResource.builder() + .id("88ce23e5-27c3-4381-a2df-32a28ec43133") + .createdAt("2020-03-10T15:56:08Z") + .updatedAt("2020-03-10T15:56:08Z") + .lastOperation(LastOperation.builder() + .type("create") + .state("succeeded") + .description("Operation succeeded") + .updatedAt("2020-03-10T15:49:32Z") + .createdAt("2020-03-10T15:49:29Z") + .build()) + .name("my-user-provided-instance") + .tags("foo", "bar", "baz") + .type(ServiceInstanceType.USER_PROVIDED) + .syslogDrainUrl("https://syslog.com/drain") + .routeServiceUrl("https://route.com/service") + .relationships(ServiceInstanceRelationships.builder() + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("5a84d315-9513-4d74-95e5-f6a5501eeef7") + .build()) + .build()) + .build()) + .metadata(Metadata.builder() + .annotation("foo", "bar") + .label("baz", "qux") + .build()) + .link("self", Link.builder() + .href("https://api.example.org/v3/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .link("space", Link.builder() + .href("https://api.example.org/v3/spaces/5a84d315-9513-4d74-95e5-f6a5501eeef7") + .build()) + .link("credentials", Link.builder() + .href("https://api.example.org/v3/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133/credentials") + .build()) + .link("service_credential_bindings", Link.builder() + .href("https://api.example.org/v3/service_credential_bindings?service_instance_guids=88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .link("service_route_bindings", Link.builder() + .href("https://api.example.org/v3/service_route_bindings?service_instance_guids=88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .build()) + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); + } + + @Test + public void deleteManagedServiceInstance() { + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(DELETE).path("/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .response(TestResponse.builder() + .status(ACCEPTED) + .header("Location", "e1e4417c-74ee-11ea-a604-48bf6bec2d79") + .build()) + .build()); + + this.serviceInstances + .delete(DeleteServiceInstanceRequest.builder() + .serviceInstanceId("88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .as(StepVerifier::create) + .expectNext(Optional.of("e1e4417c-74ee-11ea-a604-48bf6bec2d79")) + .expectComplete() + .verify(Duration.ofSeconds(5)); + } + + @Test + public void deleteUserProvidedServiceInstance() { + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(DELETE).path("/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .response(TestResponse.builder() + .status(NO_CONTENT) + .build()) + .build()); + + this.serviceInstances + .delete(DeleteServiceInstanceRequest.builder() + .serviceInstanceId("88ce23e5-27c3-4381-a2df-32a28ec43133") + .build()) + .as(StepVerifier::create) + .expectNext(Optional.empty()) .expectComplete() .verify(Duration.ofSeconds(5)); } diff --git a/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/client/v3/serviceplans/ReactorServicePlansTest.java b/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/client/v3/serviceplans/ReactorServicePlansTest.java index 7f028177893..e6eb1912e82 100644 --- a/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/client/v3/serviceplans/ReactorServicePlansTest.java +++ b/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/client/v3/serviceplans/ReactorServicePlansTest.java @@ -30,6 +30,7 @@ import org.cloudfoundry.client.v3.serviceplans.ListServicePlansRequest; import org.cloudfoundry.client.v3.serviceplans.ListServicePlansResponse; import org.cloudfoundry.client.v3.serviceplans.MaintenanceInfo; +import org.cloudfoundry.client.v3.serviceplans.Organization; import org.cloudfoundry.client.v3.serviceplans.Parameters; import org.cloudfoundry.client.v3.serviceplans.Schema; import org.cloudfoundry.client.v3.serviceplans.Schemas; @@ -39,6 +40,8 @@ import org.cloudfoundry.client.v3.serviceplans.ServicePlanResource; import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanRequest; import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanResponse; +import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanVisibilityRequest; +import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanVisibilityResponse; import org.cloudfoundry.reactor.InteractionContext; import org.cloudfoundry.reactor.TestRequest; import org.cloudfoundry.reactor.TestResponse; @@ -54,6 +57,7 @@ import static io.netty.handler.codec.http.HttpMethod.DELETE; import static io.netty.handler.codec.http.HttpMethod.GET; import static io.netty.handler.codec.http.HttpMethod.PATCH; +import static io.netty.handler.codec.http.HttpMethod.POST; import static io.netty.handler.codec.http.HttpResponseStatus.CREATED; import static io.netty.handler.codec.http.HttpResponseStatus.NO_CONTENT; import static io.netty.handler.codec.http.HttpResponseStatus.OK; @@ -429,4 +433,36 @@ public void update() { .verify(Duration.ofSeconds(5)); } + @Test + public void updatePlanVisibility() { + mockRequest(InteractionContext.builder() + .request(TestRequest.builder() + .method(POST).path("/service_plans/bf7eb420-11e5-11ea-b7db-4b5d5e7976a9/visibility") + .payload("fixtures/client/v3/service_plans/POST_{id}_request_update_plan.json") + .build()) + .response(TestResponse.builder() + .status(OK) + .payload("fixtures/client/v3/service_plans/POST_{id}_response_update_plan.json") + .build()) + .build()); + + this.servicePlans + .updateVisibility(UpdateServicePlanVisibilityRequest.builder() + .servicePlanId("bf7eb420-11e5-11ea-b7db-4b5d5e7976a9") + .type(ORGANIZATION) + .organization(Organization.builder() + .guid("0fc1ad4f-e1d7-4436-8e23-6b20f03c6482") + .build()) + .build()) + .as(StepVerifier::create) + .expectNext(UpdateServicePlanVisibilityResponse.builder() + .type(ORGANIZATION) + .organization(Organization.builder() + .guid("0fc1ad4f-e1d7-4436-8e23-6b20f03c6482") + .name("other_org") + .build()) + .build()) + .expectComplete() + .verify(Duration.ofSeconds(5)); + } } diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/service_plans/POST_{id}_request_update_plan.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/service_plans/POST_{id}_request_update_plan.json new file mode 100644 index 00000000000..ff0f20ffb22 --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/service_plans/POST_{id}_request_update_plan.json @@ -0,0 +1,8 @@ +{ + "type": "organization", + "organizations": [ + { + "guid": "0fc1ad4f-e1d7-4436-8e23-6b20f03c6482" + } + ] +} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/service_plans/POST_{id}_response_update_plan.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/service_plans/POST_{id}_response_update_plan.json new file mode 100644 index 00000000000..75268df51df --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/service_plans/POST_{id}_response_update_plan.json @@ -0,0 +1,9 @@ +{ + "type": "organization", + "organizations": [ + { + "guid": "0fc1ad4f-e1d7-4436-8e23-6b20f03c6482", + "name": "other_org" + } + ] +} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/GET_{id}_response.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/GET_{id}_response.json new file mode 100644 index 00000000000..ee1df48b448 --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/GET_{id}_response.json @@ -0,0 +1,55 @@ +{ + "guid": "c89b3280-fe8d-4aa0-a42e-44465bb1c61c", + "created_at": "2020-03-10T15:49:29Z", + "updated_at": "2020-03-10T15:49:29Z", + "name": "my-managed-instance", + "tags": ["foo", "bar"], + "type": "managed", + "maintenance_info": { + "version": "1.0.0" + }, + "upgrade_available": false, + "dashboard_url": "https://service-broker.example.org/dashboard", + "last_operation": { + "type": "create", + "state": "succeeded", + "description": "Operation succeeded", + "updated_at": "2020-03-10T15:49:32Z", + "created_at": "2020-03-10T15:49:29Z" + }, + "relationships": { + "service_plan": { + "data": { + "guid": "5358d122-638e-11ea-afca-bf6e756684ac" + } + }, + "space": { + "data": { + "guid": "5a84d315-9513-4d74-95e5-f6a5501eeef7" + } + } + }, + "links": { + "self": { + "href": "https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c" + }, + "service_plan": { + "href": "https://api.example.org/v3/service_plans/5358d122-638e-11ea-afca-bf6e756684ac" + }, + "space": { + "href": "https://api.example.org/v3/spaces/5a84d315-9513-4d74-95e5-f6a5501eeef7" + }, + "parameters": { + "href": "https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c/parameters" + }, + "shared_spaces": { + "href": "https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c/relationships/shared_spaces" + }, + "service_credential_bindings": { + "href": "https://api.example.org/v3/service_credential_bindings?service_instance_guids=c89b3280-fe8d-4aa0-a42e-44465bb1c61c" + }, + "service_route_bindings": { + "href": "https://api.example.org/v3/service_route_bindings?service_instance_guids=c89b3280-fe8d-4aa0-a42e-44465bb1c61c" + } + } +} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request.json deleted file mode 100644 index d2d6d044047..00000000000 --- a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "metadata": { - "labels": { - "key": "value" - }, - "annotations": { - "note": "detailed information" - } - } -} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request_update_managed_service_instance.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request_update_managed_service_instance.json new file mode 100644 index 00000000000..72d958985f9 --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request_update_managed_service_instance.json @@ -0,0 +1,26 @@ +{ + "name": "my_service_instance", + "parameters": { + "foo": "bar", + "baz": "qux" + }, + "tags": ["foo", "bar", "baz"], + "relationships": { + "service_plan": { + "data": { + "guid": "f2b6ba9c-a4d2-11ea-8ae6-48bf6bec2d78" + } + } + }, + "maintenance_info": { + "version": "1.0.0" + }, + "metadata": { + "annotations": { + "note": "detailed information" + }, + "labels": { + "key": "value" + } + } +} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request_update_user_provided_service_instance.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request_update_user_provided_service_instance.json new file mode 100644 index 00000000000..e0db3ef9ee5 --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_request_update_user_provided_service_instance.json @@ -0,0 +1,18 @@ +{ + "name": "my-user-provided-instance", + "credentials": { + "foo": "bar", + "baz": "qux" + }, + "tags": ["foo", "bar", "baz"], + "syslog_drain_url": "https://syslog.com/drain", + "route_service_url": "https://route.com/service", + "metadata": { + "annotations": { + "foo": "bar" + }, + "labels": { + "baz": "qux" + } + } +} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response.json deleted file mode 100644 index 6419cd284e6..00000000000 --- a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "guid": "85ccdcad-d725-4109-bca4-fd6ba062b5c8", - "created_at": "2017-11-17T13:54:21Z", - "updated_at": "2017-11-17T13:54:21Z", - "name": "my_service_instance", - "relationships": { - "space": { - "data": { - "guid": "ae0031f9-dd49-461c-a945-df40e77c39cb" - } - } - }, - "metadata": { - "labels": { - "key": "value" - }, - "annotations": { - "note": "detailed information" - } - }, - "links": { - "space": { - "href": "https://api.example.org/v3/spaces/ae0031f9-dd49-461c-a945-df40e77c39cb" - } - } -} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response_update_managed_service_instance.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response_update_managed_service_instance.json new file mode 100644 index 00000000000..509f05864dd --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response_update_managed_service_instance.json @@ -0,0 +1,59 @@ +{ + "guid": "c89b3280-fe8d-4aa0-a42e-44465bb1c61c", + "created_at": "2020-03-10T15:49:29Z", + "updated_at": "2020-03-10T15:49:29Z", + "name": "my_service_instance", + "tags": ["foo", "bar", "baz"], + "type": "managed", + "maintenance_info": { + "version": "1.0.0" + }, + "upgrade_available": false, + "dashboard_url": "https://service-broker.example.org/dashboard", + "last_operation": { + "type": "update", + "state": "succeeded", + "description": "Operation succeeded", + "updated_at": "2020-03-10T15:49:32Z", + "created_at": "2020-03-10T15:49:29Z" + }, + "relationships": { + "service_plan": { + "data": { + "guid": "5358d122-638e-11ea-afca-bf6e756684ac" + } + }, + "space": { + "data": { + "guid": "5a84d315-9513-4d74-95e5-f6a5501eeef7" + } + } + }, + "metadata": { + "labels": {"key": "value"}, + "annotations": {"note": "detailed information"} + }, + "links": { + "self": { + "href": "https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c" + }, + "service_plan": { + "href": "https://api.example.org/v3/service_plans/5358d122-638e-11ea-afca-bf6e756684ac" + }, + "space": { + "href": "https://api.example.org/v3/spaces/5a84d315-9513-4d74-95e5-f6a5501eeef7" + }, + "parameters": { + "href": "https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c/parameters" + }, + "shared_spaces": { + "href": "https://api.example.org/v3/service_instances/c89b3280-fe8d-4aa0-a42e-44465bb1c61c/relationships/shared_spaces" + }, + "service_credential_bindings": { + "href": "https://api.example.org/v3/service_credential_bindings?service_instance_guids=c89b3280-fe8d-4aa0-a42e-44465bb1c61c" + }, + "service_route_bindings": { + "href": "https://api.example.org/v3/service_route_bindings?service_instance_guids=c89b3280-fe8d-4aa0-a42e-44465bb1c61c" + } + } +} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response_update_user_provided_service_instance.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response_update_user_provided_service_instance.json new file mode 100644 index 00000000000..470ef303c41 --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/PATCH_response_update_user_provided_service_instance.json @@ -0,0 +1,45 @@ +{ + "guid": "88ce23e5-27c3-4381-a2df-32a28ec43133", + "created_at": "2020-03-10T15:56:08Z", + "updated_at": "2020-03-10T15:56:08Z", + "last_operation": { + "type": "create", + "state": "succeeded", + "description": "Operation succeeded", + "updated_at": "2020-03-10T15:49:32Z", + "created_at": "2020-03-10T15:49:29Z" + }, + "name": "my-user-provided-instance", + "tags": ["foo", "bar", "baz"], + "type": "user-provided", + "syslog_drain_url": "https://syslog.com/drain", + "route_service_url": "https://route.com/service", + "relationships": { + "space": { + "data": { + "guid": "5a84d315-9513-4d74-95e5-f6a5501eeef7" + } + } + }, + "metadata": { + "labels": {"baz": "qux"}, + "annotations": {"foo": "bar"} + }, + "links": { + "self": { + "href": "https://api.example.org/v3/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133" + }, + "space": { + "href": "https://api.example.org/v3/spaces/5a84d315-9513-4d74-95e5-f6a5501eeef7" + }, + "credentials": { + "href": "https://api.example.org/v3/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133/credentials" + }, + "service_credential_bindings": { + "href": "https://api.example.org/v3/service_credential_bindings?service_instance_guids=88ce23e5-27c3-4381-a2df-32a28ec43133" + }, + "service_route_bindings": { + "href": "https://api.example.org/v3/service_route_bindings?service_instance_guids=88ce23e5-27c3-4381-a2df-32a28ec43133" + } + } +} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_request_create_managed_service_instance.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_request_create_managed_service_instance.json new file mode 100644 index 00000000000..4c5b632e6bc --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_request_create_managed_service_instance.json @@ -0,0 +1,33 @@ +{ + "type": "managed", + "name": "my_service_instance", + "parameters": { + "foo": "bar", + "baz": "qux" + }, + "tags": [ + "foo", + "bar", + "baz" + ], + "metadata": { + "annotations": { + "foo": "bar" + }, + "labels": { + "baz": "qux" + } + }, + "relationships": { + "space": { + "data": { + "guid": "7304bc3c-7010-11ea-8840-48bf6bec2d78" + } + }, + "service_plan": { + "data": { + "guid": "e0e4417c-74ee-11ea-a604-48bf6bec2d78" + } + } + } +} diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_request_create_user_provided_service_instance.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_request_create_user_provided_service_instance.json new file mode 100644 index 00000000000..292d40ea3d2 --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_request_create_user_provided_service_instance.json @@ -0,0 +1,26 @@ +{ + "type": "user-provided", + "name": "my-user-provided-instance", + "credentials": { + "foo": "bar", + "baz": "qux" + }, + "tags": ["sql"], + "syslog_drain_url": "https://syslog.com/drain", + "route_service_url": "https://route.com/service", + "metadata": { + "annotations": { + "foo": "bar" + }, + "labels": { + "baz": "qux" + } + }, + "relationships": { + "space": { + "data": { + "guid": "7304bc3c-7010-11ea-8840-48bf6bec2d78" + } + } + } +} \ No newline at end of file diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_response_create_user_provided_service_instance.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_response_create_user_provided_service_instance.json new file mode 100644 index 00000000000..b35107b1b7e --- /dev/null +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/client/v3/serviceinstances/POST_response_create_user_provided_service_instance.json @@ -0,0 +1,45 @@ +{ + "guid": "88ce23e5-27c3-4381-a2df-32a28ec43133", + "created_at": "2020-03-10T15:56:08Z", + "updated_at": "2020-03-10T15:56:08Z", + "last_operation": { + "type": "create", + "state": "succeeded", + "description": "Operation succeeded", + "updated_at": "2020-03-10T15:49:32Z", + "created_at": "2020-03-10T15:49:29Z" + }, + "name": "my-user-provided-instance", + "tags": ["sql"], + "type": "user-provided", + "syslog_drain_url": "https://syslog.com/drain", + "route_service_url": "https://route.com/service", + "relationships": { + "space": { + "data": { + "guid": "7304bc3c-7010-11ea-8840-48bf6bec2d78" + } + } + }, + "metadata": { + "labels": {"baz": "qux"}, + "annotations": {"foo": "bar"} + }, + "links": { + "self": { + "href": "https://api.example.org/v3/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133" + }, + "space": { + "href": "https://api.example.org/v3/spaces/5a84d315-9513-4d74-95e5-f6a5501eeef7" + }, + "credentials": { + "href": "https://api.example.org/v3/service_instances/88ce23e5-27c3-4381-a2df-32a28ec43133/credentials" + }, + "service_credential_bindings": { + "href": "https://api.example.org/v3/service_credential_bindings?service_instance_guids=88ce23e5-27c3-4381-a2df-32a28ec43133" + }, + "service_route_bindings": { + "href": "https://api.example.org/v3/service_route_bindings?service_instance_guids=88ce23e5-27c3-4381-a2df-32a28ec43133" + } + } +} diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/ServiceInstancesV3.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/ServiceInstancesV3.java index cc57a90c7b7..971b69f9813 100644 --- a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/ServiceInstancesV3.java +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/ServiceInstancesV3.java @@ -18,11 +18,41 @@ import reactor.core.publisher.Mono; +import java.util.Optional; + /** * Main entry point to the Cloud Foundry Service Instances V3 Client API */ public interface ServiceInstancesV3 { - + + /** + * Makes the + * Create A Service Instance request + * + * @param request the Create Service Instance request + * @return the response from Create Service Instance request + */ + Mono create(CreateServiceInstanceRequest request); + + /** + * Makes the + * Get A Service Instance request + * + * @param request the Get Service Instance request + * @return the response from Get Service Instance request + */ + Mono get(GetServiceInstanceRequest request); + + + /** + * Makes the + * Delete A Service Instance request + * + * @param request the Delete Service Instance request + * @return the response from Delete Service Instance request + */ + Mono> delete(DeleteServiceInstanceRequest request); + /** * Makes the * Get parameters for a managed service instance request diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_CreateServiceInstanceRequest.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_CreateServiceInstanceRequest.java new file mode 100644 index 00000000000..ab22c64d7fe --- /dev/null +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_CreateServiceInstanceRequest.java @@ -0,0 +1,96 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceinstances; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.Nullable; +import org.cloudfoundry.client.v3.Metadata; +import org.immutables.value.Value; + +import java.util.List; +import java.util.Map; + +/** + * The request payload for the Create Service operation + */ +@JsonSerialize +@Value.Immutable +abstract class _CreateServiceInstanceRequest { + + /** + * The type of the service instance + */ + @JsonProperty("type") + abstract ServiceInstanceType getType(); + + /** + * The name + */ + @JsonProperty("name") + abstract String getName(); + + /** + * The relationships + */ + @JsonProperty("relationships") + @Nullable + abstract ServiceInstanceRelationships getRelationships(); + + /** + * A list of tags for the service instance + */ + @JsonProperty("tags") + @Nullable + abstract List getTags(); + + /** + * The service creation parameters + */ + @JsonProperty("parameters") + @Nullable + abstract Map getParameters(); + + /** + * The metadata + */ + @JsonProperty("metadata") + @Nullable + abstract Metadata getMetadata(); + + /** + * The user provided service credentials + */ + @JsonProperty("credentials") + @Nullable + abstract Map getCredentials(); + + /** + * The syslog drain url + */ + @JsonProperty("syslog_drain_url") + @Nullable + abstract String getSyslogDrainUrl(); + + /** + * The route service url + */ + @JsonProperty("route_service_url") + @Nullable + abstract String getRouteServiceUrl(); + +} diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_CreateServiceInstanceResponse.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_CreateServiceInstanceResponse.java new file mode 100644 index 00000000000..ebc8a2498be --- /dev/null +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_CreateServiceInstanceResponse.java @@ -0,0 +1,34 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceinstances; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.immutables.value.Value; + +import java.util.Optional; + +/** + * The response payload for the Update Service operation + */ +@JsonDeserialize +@Value.Immutable +abstract class _CreateServiceInstanceResponse { + + abstract Optional getJobId(); + + abstract Optional getServiceInstance(); +} diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_DeleteServiceInstanceRequest.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_DeleteServiceInstanceRequest.java new file mode 100644 index 00000000000..b9f166568ab --- /dev/null +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_DeleteServiceInstanceRequest.java @@ -0,0 +1,34 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceinstances; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.immutables.value.Value; + +/** + * The request payload for the Create Service operation + */ +@Value.Immutable +abstract class _DeleteServiceInstanceRequest { + + /** + * The service instance id + */ + @JsonIgnore + abstract String getServiceInstanceId(); + +} diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_GetServiceInstanceRequest.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_GetServiceInstanceRequest.java new file mode 100644 index 00000000000..9c15df2ad78 --- /dev/null +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_GetServiceInstanceRequest.java @@ -0,0 +1,31 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceinstances; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.immutables.value.Value; + +/** + * The request payload for the Create Service operation + */ +@Value.Immutable +abstract class _GetServiceInstanceRequest { + + @JsonIgnore + abstract String getServiceInstanceId(); + +} diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_GetServiceInstanceResponse.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_GetServiceInstanceResponse.java new file mode 100644 index 00000000000..a615d2a6f60 --- /dev/null +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_GetServiceInstanceResponse.java @@ -0,0 +1,10 @@ +package org.cloudfoundry.client.v3.serviceinstances; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.immutables.value.Value; + +@Value.Immutable +@JsonDeserialize +abstract class _GetServiceInstanceResponse extends ServiceInstance { + +} diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_ServiceInstanceRelationships.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_ServiceInstanceRelationships.java index ec84f305109..ab91b3dca8e 100644 --- a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_ServiceInstanceRelationships.java +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_ServiceInstanceRelationships.java @@ -40,5 +40,6 @@ abstract class _ServiceInstanceRelationships { * The space relationship */ @JsonProperty("space") + @Nullable abstract ToOneRelationship getSpace(); } diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_UpdateServiceInstanceRequest.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_UpdateServiceInstanceRequest.java index 478207cc690..88936d03174 100644 --- a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_UpdateServiceInstanceRequest.java +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_UpdateServiceInstanceRequest.java @@ -19,26 +19,88 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.Nullable; +import org.cloudfoundry.client.v3.MaintenanceInfo; import org.cloudfoundry.client.v3.Metadata; import org.immutables.value.Value; +import java.util.List; +import java.util.Map; + /** - * The request payload for the Update Application operation + * The request payload for the Update Service operation */ @JsonSerialize @Value.Immutable abstract class _UpdateServiceInstanceRequest { + /** + * The service instance id + */ + @JsonIgnore + abstract String getServiceInstanceId(); + /** * The metadata */ @JsonProperty("metadata") + @Nullable abstract Metadata getMetadata(); /** - * The service instance id + * The name */ - @JsonIgnore - abstract String getServiceInstanceId(); + @JsonProperty("name") + @Nullable + abstract String getName(); + + /** + * The relationships + */ + @JsonProperty("relationships") + @Nullable + abstract ServiceInstanceRelationships getRelationships(); + + /** + * A list of tags for the service instance + */ + @JsonProperty("tags") + @Nullable + abstract List getTags(); + + /** + * The service creation parameters + */ + @JsonProperty("parameters") + @Nullable + abstract Map getParameters(); + + /** + * The user provided service credentials + */ + @JsonProperty("credentials") + @Nullable + abstract Map getCredentials(); + + /** + * The syslog drain url + */ + @JsonProperty("syslog_drain_url") + @Nullable + abstract String getSyslogDrainUrl(); + + /** + * The route service url + */ + @JsonProperty("route_service_url") + @Nullable + abstract String getRouteServiceUrl(); + + /** + * The maintenance info object + */ + @JsonProperty("maintenance_info") + @Nullable + abstract MaintenanceInfo maintenanceInfo(); } diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_UpdateServiceInstanceResponse.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_UpdateServiceInstanceResponse.java index 35fab438624..79d0f15058f 100644 --- a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_UpdateServiceInstanceResponse.java +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceinstances/_UpdateServiceInstanceResponse.java @@ -19,11 +19,17 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.immutables.value.Value; +import java.util.Optional; + /** - * The response payload for the Update Application operation + * The response payload for the Update Service operation */ @JsonDeserialize @Value.Immutable -abstract class _UpdateServiceInstanceResponse extends ServiceInstance { +abstract class _UpdateServiceInstanceResponse { + + abstract Optional getJobId(); + + abstract Optional getServiceInstance(); } diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/ServicePlansV3.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/ServicePlansV3.java index fc1a22750fd..1402abdde90 100644 --- a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/ServicePlansV3.java +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/ServicePlansV3.java @@ -24,7 +24,7 @@ public interface ServicePlansV3 { /** - * Makes the Delete Service Plan request + * Makes the Delete Service Plan request * * @param request the Delete Service Plan request * @return the response from the Delete Service Plan request @@ -32,7 +32,7 @@ public interface ServicePlansV3 { Mono delete(DeleteServicePlanRequest request); /** - * Makes the Get Service Plan request + * Makes the Get Service Plan request * * @param request the Get Service Plan request * @return the response from the Get Service Plan request @@ -40,7 +40,7 @@ public interface ServicePlansV3 { Mono get(GetServicePlanRequest request); /** - * Makes the List Service Plan request + * Makes the List Service Plan request * * @param request the List Service Plans request * @return the response from the List Service Plans request @@ -48,11 +48,19 @@ public interface ServicePlansV3 { Mono list(ListServicePlansRequest request); /** - * Makes the Upload Service Plan request + * Makes the Upload Service Plan request * * @param request the Update Service Plan request * @return the response from the Update Service Plan request */ Mono update(UpdateServicePlanRequest request); + /** + * Makes the Upload Service Plan request + * + * @param request the Update Service Plan Visibility request + * @return the response from the Update Service Plan Visibility request + */ + Mono updateVisibility(UpdateServicePlanVisibilityRequest request); + } diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_Organization.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_Organization.java new file mode 100644 index 00000000000..5e6da84ee5e --- /dev/null +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_Organization.java @@ -0,0 +1,45 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceplans; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.Nullable; +import org.immutables.value.Value; + +/** + * Organization for a Service Plan Visibility + */ +@JsonSerialize +@Value.Immutable +abstract class _Organization { + + /** + * The GUID of the organization + */ + @JsonProperty("guid") + abstract String getGuid(); + + /** + * The name of the organization + */ + @JsonProperty("name") + @Nullable + abstract String getName(); + + +} diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_UpdateServicePlanVisibilityRequest.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_UpdateServicePlanVisibilityRequest.java new file mode 100644 index 00000000000..dbb59a73526 --- /dev/null +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_UpdateServicePlanVisibilityRequest.java @@ -0,0 +1,53 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceplans; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.Nullable; +import org.immutables.value.Value; + +import java.util.List; + +/** + * The request payload for the Update Service Plan Visibility operation + */ +@JsonSerialize +@Value.Immutable +abstract class _UpdateServicePlanVisibilityRequest { + + /** + * The service plan id + */ + @JsonIgnore + abstract String getServicePlanId(); + + /** + * Denotes the visibility of the plan + */ + @JsonProperty("type") + abstract Visibility getType(); + + /** + * The organizations where the service plan is visible + */ + @JsonProperty("organizations") + @Nullable + abstract List getOrganizations(); + +} diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_UpdateServicePlanVisibilityResponse.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_UpdateServicePlanVisibilityResponse.java new file mode 100644 index 00000000000..5c58e6650d4 --- /dev/null +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/serviceplans/_UpdateServicePlanVisibilityResponse.java @@ -0,0 +1,46 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceplans; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.cloudfoundry.Nullable; +import org.immutables.value.Value; + +import java.util.List; + +/** + * The response payload for the Update Service Plan operation + */ +@JsonDeserialize +@Value.Immutable +abstract class _UpdateServicePlanVisibilityResponse { + + /** + * Denotes the visibility of the plan + */ + @JsonProperty("type") + abstract Visibility getType(); + + /** + * The organizations where the service plan is visible + */ + @JsonProperty("organizations") + @Nullable + abstract List getOrganizations(); + +} diff --git a/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/CreateServiceInstanceRequestTest.java b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/CreateServiceInstanceRequestTest.java new file mode 100644 index 00000000000..2a05a9d52a8 --- /dev/null +++ b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/CreateServiceInstanceRequestTest.java @@ -0,0 +1,79 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceinstances; + +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; +import org.junit.Test; + +public class CreateServiceInstanceRequestTest { + + @Test + public void validManagedServiceInstance() { + CreateServiceInstanceRequest.builder() + .type(ServiceInstanceType.MANAGED) + .name("test-service-instance-name") + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id("test-service-plan-id") + .build()) + .build()) + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("test-space-id") + .build()) + .build()) + .build()) + .tags("foo", "bar") + .parameter("key", "value") + .build(); + } + + @Test + public void validUserProvidedServiceInstance() { + CreateServiceInstanceRequest.builder() + .type(ServiceInstanceType.USER_PROVIDED) + .syslogDrainUrl("https://syslog.com") + .routeServiceUrl("https://route.com") + .credential("key", "value") + .name("test-user-provided-name") + .build(); + } + + @Test(expected = IllegalStateException.class) + public void testWithMissingName() { + CreateServiceInstanceRequest.builder() + .type(ServiceInstanceType.MANAGED) + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id("test-service-plan-id") + .build()) + .build()) + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("test-space-id") + .build()) + .build()) + .build()) + .tags("foo", "bar") + .parameter("key", "value") + .build(); + } + +} diff --git a/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/GetManagedServiceParametersRequestTest.java b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/GetManagedServiceParametersRequestTest.java index a77c62160d0..f6737303b3f 100644 --- a/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/GetManagedServiceParametersRequestTest.java +++ b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/GetManagedServiceParametersRequestTest.java @@ -6,9 +6,9 @@ public class GetManagedServiceParametersRequestTest { @Test public void valid() { - GetManagedServiceParametersRequest.builder() - .serviceInstanceId("test-service-instance-id") - .build(); + GetManagedServiceParametersRequest.builder() + .serviceInstanceId("test-service-instance-id") + .build(); } - + } diff --git a/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/GetUserProvidedCredentialsRequestTest.java b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/GetUserProvidedCredentialsRequestTest.java index e147dd1a57d..f64f01de599 100644 --- a/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/GetUserProvidedCredentialsRequestTest.java +++ b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/GetUserProvidedCredentialsRequestTest.java @@ -6,8 +6,8 @@ public class GetUserProvidedCredentialsRequestTest { @Test public void valid() { - GetUserProvidedCredentialsRequest.builder() - .serviceInstanceId("test-service-instance-id") - .build(); + GetUserProvidedCredentialsRequest.builder() + .serviceInstanceId("test-service-instance-id") + .build(); } } diff --git a/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/UpdateServiceInstanceRequestTest.java b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/UpdateServiceInstanceRequestTest.java index e626df4ecc6..4671277da3c 100644 --- a/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/UpdateServiceInstanceRequestTest.java +++ b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceinstances/UpdateServiceInstanceRequestTest.java @@ -17,12 +17,14 @@ package org.cloudfoundry.client.v3.serviceinstances; import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.client.v3.Relationship; +import org.cloudfoundry.client.v3.ToOneRelationship; import org.junit.Test; public class UpdateServiceInstanceRequestTest { - @Test(expected = IllegalStateException.class) - public void noMetadata() { + @Test + public void testServiceInstanceIdOnly() { UpdateServiceInstanceRequest.builder() .serviceInstanceId("test-service-instance-id") .build(); @@ -36,10 +38,27 @@ public void noServiceInstanceId() { } @Test - public void valid() { + public void validManagedServiceInstance() { UpdateServiceInstanceRequest.builder() .metadata(Metadata.builder().build()) .serviceInstanceId("test-service-instance-id") + .name("test-service-instance-name") + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id("test-service-plan-id") + .build()) + .build()) + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id("test-space-id") + .build()) + .build()) + .build()) + .tags("foo", "bar") + .parameter("key", "value") .build(); } + + } diff --git a/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceplans/UpdateServicePlanVisibilityTest.java b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceplans/UpdateServicePlanVisibilityTest.java new file mode 100644 index 00000000000..600f08b79b6 --- /dev/null +++ b/cloudfoundry-client/src/test/java/org/cloudfoundry/client/v3/serviceplans/UpdateServicePlanVisibilityTest.java @@ -0,0 +1,46 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cloudfoundry.client.v3.serviceplans; + +import org.junit.Test; + +public class UpdateServicePlanVisibilityTest { + + @Test + public void valid() { + UpdateServicePlanVisibilityRequest.builder() + .servicePlanId("test-service-plan-id") + .type(Visibility.ORGANIZATION) + .organization(Organization.builder() + .name("test-organization") + .guid("test-organization-id") + .build()) + .build(); + } + + @Test(expected = IllegalStateException.class) + public void invalid() { + UpdateServicePlanVisibilityRequest.builder() + .servicePlanId("test-service-plan-id") + .organization(Organization.builder() + .name("test-organization") + .guid("test-organization-id") + .build()) + .build(); + } + +} diff --git a/cloudfoundry-util/src/main/java/org/cloudfoundry/util/OperationUtils.java b/cloudfoundry-util/src/main/java/org/cloudfoundry/util/OperationUtils.java index 8c2ccec67b1..841ec33a577 100644 --- a/cloudfoundry-util/src/main/java/org/cloudfoundry/util/OperationUtils.java +++ b/cloudfoundry-util/src/main/java/org/cloudfoundry/util/OperationUtils.java @@ -22,7 +22,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.function.Function; /** * Utilities with operations that do not (yet) exist diff --git a/integration-test/src/test/java/org/cloudfoundry/client/v3/ServiceInstancesTest.java b/integration-test/src/test/java/org/cloudfoundry/client/v3/ServiceInstancesTest.java index 8d82ca7e3a6..38508a4cb41 100644 --- a/integration-test/src/test/java/org/cloudfoundry/client/v3/ServiceInstancesTest.java +++ b/integration-test/src/test/java/org/cloudfoundry/client/v3/ServiceInstancesTest.java @@ -20,23 +20,30 @@ import org.cloudfoundry.CloudFoundryVersion; import org.cloudfoundry.IfCloudFoundryVersion; import org.cloudfoundry.client.CloudFoundryClient; -import org.cloudfoundry.client.v2.serviceinstances.CreateServiceInstanceRequest; -import org.cloudfoundry.client.v2.serviceinstances.CreateServiceInstanceResponse; -import org.cloudfoundry.client.v2.serviceplans.ListServicePlansRequest; -import org.cloudfoundry.client.v2.serviceplans.ServicePlanResource; -import org.cloudfoundry.client.v2.services.ListServicesRequest; -import org.cloudfoundry.client.v2.services.ServiceResource; +import org.cloudfoundry.client.v3.serviceinstances.CreateServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.CreateServiceInstanceResponse; +import org.cloudfoundry.client.v3.serviceinstances.DeleteServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.GetServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsRequest; import org.cloudfoundry.client.v3.serviceinstances.ListServiceInstancesRequest; import org.cloudfoundry.client.v3.serviceinstances.ListSharedSpacesRelationshipRequest; import org.cloudfoundry.client.v3.serviceinstances.ListSharedSpacesRelationshipResponse; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceRelationships; +import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; import org.cloudfoundry.client.v3.serviceinstances.ShareServiceInstanceRequest; import org.cloudfoundry.client.v3.serviceinstances.ShareServiceInstanceResponse; import org.cloudfoundry.client.v3.serviceinstances.UnshareServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.UpdateServiceInstanceRequest; +import org.cloudfoundry.client.v3.serviceinstances.UpdateServiceInstanceResponse; +import org.cloudfoundry.client.v3.serviceofferings.ListServiceOfferingsRequest; +import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingResource; +import org.cloudfoundry.client.v3.serviceplans.ListServicePlansRequest; +import org.cloudfoundry.client.v3.serviceplans.ServicePlanResource; import org.cloudfoundry.client.v3.spaces.CreateSpaceRequest; import org.cloudfoundry.client.v3.spaces.CreateSpaceResponse; import org.cloudfoundry.client.v3.spaces.SpaceRelationships; +import org.cloudfoundry.util.JobUtils; import org.cloudfoundry.util.PaginationUtils; -import org.cloudfoundry.util.ResourceUtils; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import reactor.core.publisher.Flux; @@ -44,6 +51,9 @@ import reactor.test.StepVerifier; import java.time.Duration; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import static org.cloudfoundry.util.tuple.TupleUtils.function; @@ -66,11 +76,91 @@ public final class ServiceInstancesTest extends AbstractIntegrationTest { private Mono spaceId; @Test - public void list() { + public void createManagedServiceInstance() { + String serviceInstanceName = this.nameFactory.getServiceInstanceName(); + this.spaceId + .flatMap(spaceId -> createManagedServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName, spaceId)) + .flatMap(serviceInstanceId -> this.cloudFoundryClient.serviceInstancesV3() + .get(GetServiceInstanceRequest.builder() + .serviceInstanceId(serviceInstanceId) + .build())) + .filter(resource -> serviceInstanceName.equals(resource.getName())) + .as(StepVerifier::create) + .expectNextCount(1) + .expectComplete() + .verify(Duration.ofMinutes(5)); + } + + @Test + public void getUserProvidedServiceCredentials() { + String serviceInstanceName = this.nameFactory.getServiceInstanceName(); + Map credentials = new HashMap<>(); + credentials.put("foo", "bar"); + this.spaceId + .flatMap(spaceId -> createUserProvidedServiceInstance(this.cloudFoundryClient, serviceInstanceName, credentials, spaceId)) + .map(getServiceInstanceResponse -> getServiceInstanceResponse.getServiceInstance().get().getId()) + .flatMap(serviceInstanceId -> this.cloudFoundryClient.serviceInstancesV3() + .getUserProvidedCredentials(GetUserProvidedCredentialsRequest.builder() + .serviceInstanceId(serviceInstanceId) + .build())) + .filter(resource -> credentials.equals(resource.getCredentials())) + .as(StepVerifier::create) + .expectNextCount(1) + .expectComplete() + .verify(Duration.ofMinutes(5)); + } + + @Test + public void delete() { + String serviceInstanceName = this.nameFactory.getServiceInstanceName(); + this.spaceId + .flatMap(spaceId -> createManagedServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName, spaceId)) + .flatMap(serviceInstanceId -> this.cloudFoundryClient.serviceInstancesV3() + .get(GetServiceInstanceRequest.builder() + .serviceInstanceId(serviceInstanceId) + .build())) + .filter(resource -> serviceInstanceName.equals(resource.getName())) + .as(StepVerifier::create) + .expectNextCount(1) + .expectComplete() + .verify(Duration.ofMinutes(5)); + + this.spaceId + .flatMap(spaceId -> deleteServiceInstanceByName(this.cloudFoundryClient, serviceInstanceName, spaceId)) + .as(StepVerifier::create) + .expectNextCount(1) + .expectComplete() + .verify(Duration.ofMinutes(5)); + } + + @Test + public void update() { String serviceInstanceName = this.nameFactory.getServiceInstanceName(); + this.spaceId + .flatMap(spaceId -> createManagedServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName, spaceId)) + .flatMap(serviceInstanceId -> this.cloudFoundryClient.serviceInstancesV3() + .get(GetServiceInstanceRequest.builder() + .serviceInstanceId(serviceInstanceId) + .build())) + .filter(resource -> serviceInstanceName.equals(resource.getName())) + .as(StepVerifier::create) + .expectNextCount(1) + .expectComplete() + .verify(Duration.ofMinutes(5)); this.spaceId - .flatMap(spaceId -> createServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName, spaceId)) + .flatMap(spaceId -> updateServiceInstanceByName(this.cloudFoundryClient, serviceInstanceName, spaceId)) + .as(StepVerifier::create) + .expectNextCount(1) + .expectComplete() + .verify(Duration.ofMinutes(5)); + } + + @Test + public void list() { + String serviceInstanceName = this.nameFactory.getServiceInstanceName(); + this.spaceId + .flatMap(spaceId -> createManagedServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName, spaceId)) .thenMany(PaginationUtils .requestClientV3Resources(page -> this.cloudFoundryClient.serviceInstancesV3() .list(ListServiceInstancesRequest.builder() @@ -90,7 +180,7 @@ public void listSharedSpaces() { Mono.zip(this.organizationId, this.spaceId) .flatMap(function((organizationId, spaceId) -> Mono.zip( - createServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName + "-shareable", spaceId), + createManagedServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName + "-shareable", spaceId), createSpaceId(this.cloudFoundryClient, organizationId, spaceName)) )) .flatMap(function((serviceInstanceId, newSpaceId) -> requestShareServiceInstance(this.cloudFoundryClient, newSpaceId, serviceInstanceId) @@ -113,7 +203,7 @@ public void share() { Mono.zip(this.organizationId, this.spaceId) .flatMap(function((organizationId, spaceId) -> Mono.zip( - createServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName + "-shareable", spaceId), + createManagedServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName + "-shareable", spaceId), createSpaceId(this.cloudFoundryClient, organizationId, spaceName)) )) .flatMapMany(function((serviceInstanceId, newSpaceId) -> Mono.zip( @@ -141,7 +231,7 @@ public void unshare() { Mono.zip(this.organizationId, this.spaceId) .flatMap(function((organizationId, spaceId) -> Mono.zip( - createServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName + "-shareable", spaceId), + createManagedServiceInstanceId(this.cloudFoundryClient, this.serviceBrokerId, serviceInstanceName, this.serviceName + "-shareable", spaceId), createSpaceId(this.cloudFoundryClient, organizationId, spaceName)) )) .delayUntil(function((serviceInstanceId, newSpaceId) -> requestShareServiceInstance(this.cloudFoundryClient, newSpaceId, serviceInstanceId))) @@ -159,11 +249,91 @@ public void unshare() { .verify(Duration.ofMinutes(5)); } - private static Mono createServiceInstanceId(CloudFoundryClient cloudFoundryClient, Mono serviceBrokerId, String serviceInstanceName, String serviceName, String spaceId) { + private static Mono deleteServiceInstanceByName(CloudFoundryClient cloudFoundryClient, String serviceInstanceName, String spaceId) { + return cloudFoundryClient.serviceInstancesV3() + .list(ListServiceInstancesRequest.builder() + .spaceId(spaceId) + .serviceInstanceName(serviceInstanceName) + .build()) + .map(serviceInstances -> serviceInstances.getResources().get(0)) + .flatMap(serviceInstance -> deleteServiceInstanceById(cloudFoundryClient, serviceInstance.getId())); + } + + private static Mono deleteServiceInstanceById(CloudFoundryClient cloudFoundryClient, String serviceInstanceId) { + return cloudFoundryClient.serviceInstancesV3() + .delete(DeleteServiceInstanceRequest.builder() + .serviceInstanceId(serviceInstanceId) + .build()) + .map(Optional::get); + } + + private static Mono updateServiceInstanceByName(CloudFoundryClient cloudFoundryClient, String serviceInstanceName, String spaceId) { + return cloudFoundryClient.serviceInstancesV3() + .list(ListServiceInstancesRequest.builder() + .spaceId(spaceId) + .serviceInstanceName(serviceInstanceName) + .build()) + .map(serviceInstances -> serviceInstances.getResources().get(0)) + .flatMap(serviceInstance -> updateServiceInstanceById(cloudFoundryClient, serviceInstance.getId())) + .flatMap(serviceInstance -> waitForCompletionOnUpdate(cloudFoundryClient, serviceInstance, serviceInstanceName)); + } + + private static Mono updateServiceInstanceById(CloudFoundryClient cloudFoundryClient, String serviceInstanceId) { + return cloudFoundryClient.serviceInstancesV3() + .update(UpdateServiceInstanceRequest.builder() + .serviceInstanceId(serviceInstanceId) + .parameter("foo", "bar") + .tag("baz") + .build()); + } + + + private static Mono waitForCompletionOnUpdate(CloudFoundryClient cloudFoundryClient, UpdateServiceInstanceResponse updateServiceInstanceResponse, String serviceInstanceName) { + if (updateServiceInstanceResponse.getJobId().isPresent()) { + JobUtils.waitForCompletion(cloudFoundryClient, Duration.ofMinutes(1), updateServiceInstanceResponse.getJobId().get()); + } + return getServiceInstanceIdByName(cloudFoundryClient, serviceInstanceName); + } + + private static Mono createManagedServiceInstanceId(CloudFoundryClient cloudFoundryClient, Mono serviceBrokerId, String serviceInstanceName, String serviceName, String spaceId) { return serviceBrokerId - .flatMap(s -> getPlanId(cloudFoundryClient, s, serviceName)) + .flatMap(brokerId -> getPlanId(cloudFoundryClient, brokerId, serviceName)) .flatMap(planId -> requestCreateServiceInstance(cloudFoundryClient, planId, serviceInstanceName, spaceId)) - .map(ResourceUtils::getId); + .flatMap(serviceInstance -> waitForCompletionOnCreate(cloudFoundryClient, serviceInstance, serviceInstanceName)); + } + + private static Mono waitForCompletionOnCreate(CloudFoundryClient cloudFoundryClient, CreateServiceInstanceResponse createServiceInstanceResponse, String serviceInstanceName) { + if (createServiceInstanceResponse.getJobId().isPresent()) { + JobUtils.waitForCompletion(cloudFoundryClient, Duration.ofMinutes(1), createServiceInstanceResponse.getJobId().get()); + } + return getServiceInstanceIdByName(cloudFoundryClient, serviceInstanceName); + } + + private static Mono getServiceInstanceIdByName(CloudFoundryClient cloudFoundryClient, String serviceInstanceName) { + return cloudFoundryClient.serviceInstancesV3() + .list(ListServiceInstancesRequest.builder() + .serviceInstanceName(serviceInstanceName) + .build()) + .map(serviceInstances -> serviceInstances.getResources() + .get(0) + .getId()); + } + + private static Mono createUserProvidedServiceInstance(CloudFoundryClient cloudFoundryClient, String serviceInstanceName, Map credentials, + String spaceId) { + return cloudFoundryClient.serviceInstancesV3() + .create(CreateServiceInstanceRequest.builder() + .name(serviceInstanceName) + .type(ServiceInstanceType.USER_PROVIDED) + .relationships(ServiceInstanceRelationships.builder() + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id(spaceId) + .build()) + .build()) + .build()) + .credentials(credentials) + .build()); } private static Mono createSpaceId(CloudFoundryClient cloudFoundryClient, String organizationId, String spaceName) { @@ -172,21 +342,31 @@ private static Mono createSpaceId(CloudFoundryClient cloudFoundryClient, } private static Mono getPlanId(CloudFoundryClient cloudFoundryClient, String serviceBrokerId, String serviceName) { - return requestListServices(cloudFoundryClient, serviceBrokerId) - .filter(resource -> serviceName.equals(resource.getEntity().getLabel())) + return requestListServiceOfferings(cloudFoundryClient, serviceBrokerId) + .filter(serviceOfferingResource -> serviceName.equals(serviceOfferingResource.getName())) .single() - .map(ResourceUtils::getId) + .map(ServiceOfferingResource::getId) .flatMapMany(serviceId -> requestListServicePlans(cloudFoundryClient, serviceId)) .single() - .map(ResourceUtils::getId); + .map(ServicePlanResource::getId); } private static Mono requestCreateServiceInstance(CloudFoundryClient cloudFoundryClient, String planId, String serviceInstanceName, String spaceId) { - return cloudFoundryClient.serviceInstances() + return cloudFoundryClient.serviceInstancesV3() .create(CreateServiceInstanceRequest.builder() .name(serviceInstanceName) - .servicePlanId(planId) - .spaceId(spaceId) + .type(ServiceInstanceType.MANAGED) + .relationships(ServiceInstanceRelationships.builder() + .servicePlan(ToOneRelationship.builder() + .data(Relationship.builder() + .id(planId).build()) + .build()) + .space(ToOneRelationship.builder() + .data(Relationship.builder() + .id(spaceId) + .build()) + .build()) + .build()) .build()); } @@ -206,17 +386,17 @@ private static Mono requestCreateSpace(CloudFoundryClient c private static Flux requestListServicePlans(CloudFoundryClient cloudFoundryClient, String serviceId) { return PaginationUtils - .requestClientV2Resources(page -> cloudFoundryClient.servicePlans() + .requestClientV3Resources(page -> cloudFoundryClient.servicePlansV3() .list(ListServicePlansRequest.builder() .page(page) - .serviceId(serviceId) + .serviceOfferingId(serviceId) .build())); } - private static Flux requestListServices(CloudFoundryClient cloudFoundryClient, String serviceBrokerId) { + private static Flux requestListServiceOfferings(CloudFoundryClient cloudFoundryClient, String serviceBrokerId) { return PaginationUtils - .requestClientV2Resources(page -> cloudFoundryClient.services() - .list(ListServicesRequest.builder() + .requestClientV3Resources(page -> cloudFoundryClient.serviceOfferingsV3() + .list(ListServiceOfferingsRequest.builder() .page(page) .serviceBrokerId(serviceBrokerId) .build())); diff --git a/integration-test/src/test/java/org/cloudfoundry/client/v3/ServicePlansTest.java b/integration-test/src/test/java/org/cloudfoundry/client/v3/ServicePlansTest.java index 0585be86072..def69abfdbb 100644 --- a/integration-test/src/test/java/org/cloudfoundry/client/v3/ServicePlansTest.java +++ b/integration-test/src/test/java/org/cloudfoundry/client/v3/ServicePlansTest.java @@ -27,6 +27,8 @@ import org.cloudfoundry.client.v3.serviceplans.ListServicePlansRequest; import org.cloudfoundry.client.v3.serviceplans.ServicePlanResource; import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanRequest; +import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanVisibilityRequest; +import org.cloudfoundry.client.v3.serviceplans.Visibility; import org.cloudfoundry.client.v3.spaces.CreateSpaceRequest; import org.cloudfoundry.client.v3.spaces.CreateSpaceResponse; import org.cloudfoundry.client.v3.spaces.SpaceRelationships; @@ -103,9 +105,9 @@ public void get() { @Test public void list() { PaginationUtils.requestClientV3Resources(page -> this.cloudFoundryClient.servicePlansV3() - .list(ListServicePlansRequest.builder() - .page(page) - .build())) + .list(ListServicePlansRequest.builder() + .page(page) + .build())) .filter(response -> this.planName.equals(response.getName())) .map(ServicePlanResource::getDescription) .as(StepVerifier::create) @@ -131,6 +133,20 @@ public void listFilterByServiceBrokerId() { .verify(Duration.ofMinutes(5)); } + @Test + public void updateServicePlanVisibilityWithSame() { + this.serviceBrokerId + .flatMap(serviceBrokerId -> getServicePlanId(this.cloudFoundryClient, serviceBrokerId)) + .flatMap(servicePlanId -> this.cloudFoundryClient + .servicePlansV3().updateVisibility(UpdateServicePlanVisibilityRequest.builder() + .servicePlanId(servicePlanId) + .type(Visibility.SPACE) + .build())) + .as(StepVerifier::create) + .expectError() + .verify(Duration.ofMinutes(5)); + } + @Test public void listUsingLabelSelector() { String planName = this.nameFactory.getPlanName();