diff --git a/spring-cloud-open-service-broker-core/src/main/java/org/springframework/cloud/servicebroker/model/instance/GetServiceInstanceResponse.java b/spring-cloud-open-service-broker-core/src/main/java/org/springframework/cloud/servicebroker/model/instance/GetServiceInstanceResponse.java index cd4cc222..ca662c8e 100644 --- a/spring-cloud-open-service-broker-core/src/main/java/org/springframework/cloud/servicebroker/model/instance/GetServiceInstanceResponse.java +++ b/spring-cloud-open-service-broker-core/src/main/java/org/springframework/cloud/servicebroker/model/instance/GetServiceInstanceResponse.java @@ -50,11 +50,13 @@ public class GetServiceInstanceResponse { private final Map parameters; + private final ServiceInstanceMetadata metadata; + /** * Construct a new {@link GetServiceInstanceResponse} */ public GetServiceInstanceResponse() { - this(null, null, null, new Hashtable<>()); + this(null, null, null, new Hashtable<>(), null); } /** @@ -64,13 +66,15 @@ public GetServiceInstanceResponse() { * @param planId the plan ID * @param dashboardUrl the dashboard URL * @param parameters the parameters + * @param metadata containing metadata for the service instance */ public GetServiceInstanceResponse(String serviceDefinitionId, String planId, String dashboardUrl, - Map parameters) { + Map parameters, ServiceInstanceMetadata metadata) { this.serviceDefinitionId = serviceDefinitionId; this.planId = planId; this.dashboardUrl = dashboardUrl; this.parameters = parameters; + this.metadata = metadata; } /** @@ -110,6 +114,15 @@ public Map getParameters() { return parameters; } + /** + * Get object containing metadata for the service instance + * + * @return the service instance metadata + */ + public ServiceInstanceMetadata getMetadata() { + return this.metadata; + } + /** * Create a builder that provides a fluent API for constructing a {@literal GetServiceInstanceResponse}. * @@ -132,7 +145,8 @@ public final boolean equals(Object o) { Objects.equals(serviceDefinitionId, that.serviceDefinitionId) && Objects.equals(planId, that.planId) && Objects.equals(dashboardUrl, that.dashboardUrl) && - Objects.equals(parameters, that.parameters); + Objects.equals(parameters, that.parameters) && + Objects.equals(metadata, that.metadata); } /** @@ -147,7 +161,7 @@ public final boolean canEqual(Object other) { @Override public final int hashCode() { - return Objects.hash(serviceDefinitionId, planId, dashboardUrl, parameters); + return Objects.hash(serviceDefinitionId, planId, dashboardUrl, parameters, metadata); } @Override @@ -156,7 +170,8 @@ public String toString() { "serviceDefinitionId='" + serviceDefinitionId + '\'' + ", planId='" + planId + '\'' + ", dashboardUrl='" + dashboardUrl + '\'' + - ", parameters=" + parameters + + ", parameters=" + parameters + '\'' + + ", metadata=" + metadata + '}'; } @@ -173,6 +188,8 @@ public static final class GetServiceInstanceResponseBuilder { private final Map parameters = new HashMap<>(); + private ServiceInstanceMetadata metadata; + private GetServiceInstanceResponseBuilder() { } @@ -249,13 +266,28 @@ public GetServiceInstanceResponseBuilder parameters(String key, Object value) { return this; } + /** + * Object containing metadata for the service instance + * Can be {@literal null} to indicate that metadata was not provided for the service instance. + * + *

+ * This value will set the {@literal metadata} field in the body of the response to the platform. + * + * @param metadata the service instance metadata + * @return the builder + */ + public GetServiceInstanceResponseBuilder metadata(ServiceInstanceMetadata metadata) { + this.metadata = metadata; + return this; + } + /** * Construct a {@link GetServiceInstanceResponse} from the provided values. * * @return the newly constructed {@literal GetServiceInstanceResponse} */ public GetServiceInstanceResponse build() { - return new GetServiceInstanceResponse(serviceDefinitionId, planId, dashboardUrl, parameters); + return new GetServiceInstanceResponse(serviceDefinitionId, planId, dashboardUrl, parameters, metadata); } } diff --git a/spring-cloud-open-service-broker-core/src/test/java/org/springframework/cloud/servicebroker/model/instance/GetServiceInstanceResponseTest.java b/spring-cloud-open-service-broker-core/src/test/java/org/springframework/cloud/servicebroker/model/instance/GetServiceInstanceResponseTest.java index 15c36185..efbd3ebb 100755 --- a/spring-cloud-open-service-broker-core/src/test/java/org/springframework/cloud/servicebroker/model/instance/GetServiceInstanceResponseTest.java +++ b/spring-cloud-open-service-broker-core/src/test/java/org/springframework/cloud/servicebroker/model/instance/GetServiceInstanceResponseTest.java @@ -21,6 +21,7 @@ import com.jayway.jsonpath.DocumentContext; import nl.jqno.equalsverifier.EqualsVerifier; +import org.assertj.core.util.Maps; import org.junit.jupiter.api.Test; import org.springframework.cloud.servicebroker.JsonUtils; @@ -29,6 +30,8 @@ import static org.assertj.core.api.Assertions.entry; import static org.springframework.cloud.servicebroker.JsonPathAssert.assertThat; + + class GetServiceInstanceResponseTest { @Test @@ -40,6 +43,7 @@ void responseWithDefaultsIsBuilt() { assertThat(response.getPlanId()).isNull(); assertThat(response.getDashboardUrl()).isNull(); assertThat(response.getParameters()).hasSize(0); + assertThat(response.getMetadata()).isNull(); DocumentContext json = JsonUtils.toJsonPath(response); @@ -47,6 +51,7 @@ void responseWithDefaultsIsBuilt() { assertThat(json).hasNoPath("$.plan_id"); assertThat(json).hasNoPath("$.dashboard_url"); assertThat(json).hasMapAtPath("$.parameters").hasSize(0); + assertThat(json).hasNoPath("$.metadata"); } @Test @@ -63,6 +68,7 @@ void responseWithAllValuesIsBuilt() { .parameters("field2", 2) .parameters("field3", true) .parameters(parameters) + .metadata(ServiceInstanceMetadata.builder().label("key","value").build()) .build(); assertThat(response.getServiceDefinitionId()).isEqualTo("service-definition-id"); @@ -76,6 +82,9 @@ void responseWithAllValuesIsBuilt() { assertThat(response.getParameters().get("field4")).isEqualTo("value4"); assertThat(response.getParameters().get("field5")).isEqualTo("value5"); + assertThat(response.getMetadata()).isEqualTo( + ServiceInstanceMetadata.builder().label("key","value").build()); + DocumentContext json = JsonUtils.toJsonPath(response); assertThat(json).hasPath("$.service_id").isEqualTo("service-definition-id"); @@ -86,6 +95,8 @@ void responseWithAllValuesIsBuilt() { assertThat(json).hasPath("$.parameters.field3").isEqualTo(true); assertThat(json).hasPath("$.parameters.field4").isEqualTo("value4"); assertThat(json).hasPath("$.parameters.field5").isEqualTo("value5"); + assertThat(json).hasPath("$.metadata.labels").isEqualTo( + Maps.newHashMap("key", "value")); } @Test @@ -97,6 +108,13 @@ void responseWithAllValuesIsDeserialized() { assertThat(response.getPlanId()).isEqualTo("plan-id"); assertThat(response.getDashboardUrl()).isEqualTo("https://dashboard.local"); assertThat(response.getParameters()).containsOnly(entry("field1", "field-a"), entry("field2", "field-b")); + + Map labels = new HashMap<>(); + labels.put("key1","value1"); + labels.put("key2","value2"); + + assertThat(response.getMetadata()).isEqualTo(ServiceInstanceMetadata.builder().labels(labels).build()); + } @Test diff --git a/spring-cloud-open-service-broker-core/src/test/resources/getResponse.json b/spring-cloud-open-service-broker-core/src/test/resources/getResponse.json index 16d6bb7a..c4246e45 100644 --- a/spring-cloud-open-service-broker-core/src/test/resources/getResponse.json +++ b/spring-cloud-open-service-broker-core/src/test/resources/getResponse.json @@ -5,5 +5,11 @@ "parameters": { "field1": "field-a", "field2": "field-b" + }, + "metadata": { + "labels": { + "key1" : "value1", + "key2" : "value2" + } } } \ No newline at end of file