diff --git a/spring-cloud-app-broker-deployer-cloudfoundry/src/main/java/org/springframework/cloud/appbroker/deployer/cloudfoundry/CloudFoundryAppDeployer.java b/spring-cloud-app-broker-deployer-cloudfoundry/src/main/java/org/springframework/cloud/appbroker/deployer/cloudfoundry/CloudFoundryAppDeployer.java index 323f54e..87419a5 100644 --- a/spring-cloud-app-broker-deployer-cloudfoundry/src/main/java/org/springframework/cloud/appbroker/deployer/cloudfoundry/CloudFoundryAppDeployer.java +++ b/spring-cloud-app-broker-deployer-cloudfoundry/src/main/java/org/springframework/cloud/appbroker/deployer/cloudfoundry/CloudFoundryAppDeployer.java @@ -35,6 +35,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.cloudfoundry.AbstractCloudFoundryException; import org.cloudfoundry.UnknownCloudFoundryException; import org.cloudfoundry.client.CloudFoundryClient; +import org.cloudfoundry.client.v2.organizations.ListOrganizationSpacesRequest; import org.cloudfoundry.client.v2.spaces.CreateSpaceRequest; import org.cloudfoundry.client.v2.spaces.DeleteSpaceRequest; import org.cloudfoundry.client.v3.Relationship; @@ -76,9 +77,8 @@ import org.cloudfoundry.operations.services.BindServiceInstanceRequest; import org.cloudfoundry.operations.services.GetServiceInstanceRequest; import org.cloudfoundry.operations.services.ServiceInstance; import org.cloudfoundry.operations.services.UnbindServiceInstanceRequest; -import org.cloudfoundry.operations.spaces.GetSpaceRequest; -import org.cloudfoundry.operations.spaces.SpaceDetail; import org.cloudfoundry.util.DelayUtils; +import org.cloudfoundry.util.PaginationUtils; import org.reactivestreams.Publisher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -513,12 +513,16 @@ public class CloudFoundryAppDeployer implements AppDeployer, ResourceLoaderAware } private Mono getSpaceIdFromName(String spaceName) { - return this.operations.spaces() - .get(GetSpaceRequest.builder() - .name(spaceName) - .build()) - .map(SpaceDetail::getId) - .onErrorResume(e -> Mono.empty()); + return getDefaultOrganizationId() + .flatMap(orgId -> PaginationUtils.requestClientV2Resources(page -> client.organizations() + .listSpaces(ListOrganizationSpacesRequest.builder() + .name(spaceName) + .organizationId(orgId) + .page(page) + .build())) + .filter(resource -> resource.getEntity().getName().equals(spaceName)) + .map(resource -> resource.getMetadata().getId()) + .next()); } private CloudFoundryOperations createCloudFoundryOperationsForSpace(String space) { diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceComponentTest.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceComponentTest.java index da91b7d..8b39dbb 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceComponentTest.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceComponentTest.java @@ -75,30 +75,4 @@ class CreateInstanceComponentTest extends WiremockComponentTest { String state = brokerFixture.waitForAsyncOperationComplete("instance-id"); assertThat(state).isEqualTo(OperationState.SUCCEEDED.toString()); } - - @Test - void updateAppsWhenTheyExist() { - cloudControllerFixture.stubAppExists(APP_NAME_1); - cloudControllerFixture.stubUpdateApp(APP_NAME_1); - cloudControllerFixture.stubAppExists(APP_NAME_2); - cloudControllerFixture.stubUpdateApp(APP_NAME_2); - - // when a service instance is created - given(brokerFixture.serviceInstanceRequest()) - .when() - .put(brokerFixture.createServiceInstanceUrl(), "instance-id") - .then() - .statusCode(HttpStatus.ACCEPTED.value()); - - // when the "last_operation" API is polled - given(brokerFixture.serviceInstanceRequest()) - .when() - .get(brokerFixture.getLastInstanceOperationUrl(), "instance-id") - .then() - .statusCode(HttpStatus.OK.value()) - .body("state", is(equalTo(OperationState.IN_PROGRESS.toString()))); - - String state = brokerFixture.waitForAsyncOperationComplete("instance-id"); - assertThat(state).isEqualTo(OperationState.SUCCEEDED.toString()); - } } \ No newline at end of file diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesAndTargetComponentTest.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesAndTargetComponentTest.java index 86a7add..1b4d68d 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesAndTargetComponentTest.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesAndTargetComponentTest.java @@ -60,14 +60,12 @@ class CreateInstanceWithServicesAndTargetComponentTest extends WiremockComponent @Test void pushAppWithServicesInSpace() { String serviceInstanceId = "instance-id"; - cloudControllerFixture.stubAppDoesNotExistInSpace(APP_NAME, serviceInstanceId); - final String host = APP_NAME + "-" + serviceInstanceId; - cloudControllerFixture.stubPushAppWithHost(APP_NAME, host); - // given that service instances does not exist - cloudControllerFixture.stubServiceInstanceDoesNotExists(BACKING_SI_NAME); + cloudControllerFixture.stubSpaceDoesNotExist(serviceInstanceId); + cloudControllerFixture.stubCreateSpace(serviceInstanceId); + cloudControllerFixture.stubPushAppWithHost(APP_NAME, APP_NAME + "-" + serviceInstanceId); - // and the services are available in the marketplace + // given services are available in the marketplace cloudControllerFixture.stubServiceExists(BACKING_SERVICE_NAME); // will create and bind the service instance @@ -78,19 +76,19 @@ class CreateInstanceWithServicesAndTargetComponentTest extends WiremockComponent // when a service instance is created given(brokerFixture.serviceInstanceRequest()) .when() - .put(brokerFixture.createServiceInstanceUrl(), "instance-id") + .put(brokerFixture.createServiceInstanceUrl(), serviceInstanceId) .then() .statusCode(HttpStatus.ACCEPTED.value()); // when the "last_operation" API is polled given(brokerFixture.serviceInstanceRequest()) .when() - .get(brokerFixture.getLastInstanceOperationUrl(), "instance-id") + .get(brokerFixture.getLastInstanceOperationUrl(), serviceInstanceId) .then() .statusCode(HttpStatus.OK.value()) .body("state", is(equalTo(OperationState.IN_PROGRESS.toString()))); - String state = brokerFixture.waitForAsyncOperationComplete("instance-id"); + String state = brokerFixture.waitForAsyncOperationComplete(serviceInstanceId); assertThat(state).isEqualTo(OperationState.SUCCEEDED.toString()); } } \ No newline at end of file diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesComponentTest.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesComponentTest.java index 2be5d71..1c68f1c 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesComponentTest.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesComponentTest.java @@ -61,10 +61,7 @@ class CreateInstanceWithServicesComponentTest extends WiremockComponentTest { cloudControllerFixture.stubAppDoesNotExist(APP_NAME); cloudControllerFixture.stubPushApp(APP_NAME); - // given that service instances does not exist - cloudControllerFixture.stubServiceInstanceDoesNotExists(BACKING_SI_NAME); - - // and the services are available in the marketplace + // given services are available in the marketplace cloudControllerFixture.stubServiceExists(BACKING_SERVICE_NAME); // will create and bind the service instance diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesParametersComponentTest.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesParametersComponentTest.java index 6e3f761..c86f72d 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesParametersComponentTest.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithServicesParametersComponentTest.java @@ -66,10 +66,7 @@ class CreateInstanceWithServicesParametersComponentTest extends WiremockComponen cloudControllerFixture.stubAppDoesNotExist(APP_NAME); cloudControllerFixture.stubPushApp(APP_NAME); - // given that service instances does not exist - cloudControllerFixture.stubServiceInstanceDoesNotExists(BACKING_SI_NAME); - - // and the services are available in the marketplace + // given services are available in the marketplace cloudControllerFixture.stubServiceExists(BACKING_SERVICE_NAME); // will create with filtered parameters and bind the service instance diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithTargetComponentTest.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithTargetComponentTest.java index 7c264f9..dc0df72 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithTargetComponentTest.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/CreateInstanceWithTargetComponentTest.java @@ -51,26 +51,28 @@ class CreateInstanceWithTargetComponentTest extends WiremockComponentTest { @Test void shouldPushAppWithTargetWhenCreateServiceCalled() { String serviceInstanceId = "instance-id"; - cloudControllerFixture.stubAppDoesNotExistInSpace(APP_NAME, serviceInstanceId); - final String host = APP_NAME + "-" + serviceInstanceId; - cloudControllerFixture.stubPushAppWithHost(APP_NAME, host); + + cloudControllerFixture.stubSpaceDoesNotExist(serviceInstanceId); + cloudControllerFixture.stubCreateSpace(serviceInstanceId); + + cloudControllerFixture.stubPushAppWithHost(APP_NAME, APP_NAME + "-" + serviceInstanceId); // when a service instance is created given(brokerFixture.serviceInstanceRequest()) .when() - .put(brokerFixture.createServiceInstanceUrl(), "instance-id") + .put(brokerFixture.createServiceInstanceUrl(), serviceInstanceId) .then() .statusCode(HttpStatus.ACCEPTED.value()); // when the "last_operation" API is polled given(brokerFixture.serviceInstanceRequest()) .when() - .get(brokerFixture.getLastInstanceOperationUrl(), "instance-id") + .get(brokerFixture.getLastInstanceOperationUrl(), serviceInstanceId) .then() .statusCode(HttpStatus.OK.value()) .body("state", is(equalTo(OperationState.IN_PROGRESS.toString()))); - String state = brokerFixture.waitForAsyncOperationComplete("instance-id"); + String state = brokerFixture.waitForAsyncOperationComplete(serviceInstanceId); assertThat(state).isEqualTo(OperationState.SUCCEEDED.toString()); } diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/UpdateInstanceWithServicesComponentTest.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/UpdateInstanceWithServicesComponentTest.java index 6061445..122d01d 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/UpdateInstanceWithServicesComponentTest.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/UpdateInstanceWithServicesComponentTest.java @@ -60,9 +60,6 @@ class UpdateInstanceWithServicesComponentTest extends WiremockComponentTest { cloudControllerFixture.stubAppExists(APP_NAME); cloudControllerFixture.stubUpdateApp(APP_NAME); - cloudControllerFixture.stubServiceInstanceExists(SERVICE_INSTANCE_NAME); - cloudControllerFixture.stubCreateServiceBinding(APP_NAME, SERVICE_INSTANCE_NAME); - // when a service instance is updated given(brokerFixture.serviceInstanceRequest()) .when() diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/UpdateInstanceWithServicesParametersComponentTest.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/UpdateInstanceWithServicesParametersComponentTest.java index 572c937..d5a2c28 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/UpdateInstanceWithServicesParametersComponentTest.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/UpdateInstanceWithServicesParametersComponentTest.java @@ -66,8 +66,6 @@ class UpdateInstanceWithServicesParametersComponentTest extends WiremockComponen cloudControllerFixture.stubUpdateApp(APP_NAME); cloudControllerFixture.stubServiceInstanceExists(BACKING_SI_NAME); - cloudControllerFixture.stubListServiceBindings(APP_NAME, BACKING_SI_NAME); - cloudControllerFixture.stubServiceBindingExists(APP_NAME, BACKING_SI_NAME); // will update with filtered parameters and bind the service instance HashMap expectedCreationParameters = new HashMap<>(); @@ -75,7 +73,6 @@ class UpdateInstanceWithServicesParametersComponentTest extends WiremockComponen expectedCreationParameters.put("paramC", Collections.singletonMap("paramC1", "valueC1")); cloudControllerFixture.stubUpdateServiceInstanceWithParameters(BACKING_SI_NAME, expectedCreationParameters); - cloudControllerFixture.stubCreateServiceBinding(APP_NAME, BACKING_SI_NAME); // when a service instance is created with parameters HashMap creationParameters = new HashMap<>(); diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/CloudControllerStubFixture.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/CloudControllerStubFixture.java index 0834498..3ff26a9 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/CloudControllerStubFixture.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/CloudControllerStubFixture.java @@ -72,6 +72,12 @@ public class CloudControllerStubFixture extends WiremockStubFixture { .willReturn(ok() .withBody(cc("list-organizations", replace("@org-guid", TEST_ORG_GUID))))); + + stubFor(get(urlPathEqualTo("/v2/organizations/" + TEST_ORG_GUID)) + .withMetadata(optionalStubMapping()) + .willReturn(ok() + .withBody(cc("get-organization", + replace("@org-guid", TEST_ORG_GUID))))); } private void stubFindTestSpace() { @@ -82,12 +88,24 @@ public class CloudControllerStubFixture extends WiremockStubFixture { replace("@org-guid", TEST_ORG_GUID), replace("@space-guid", TEST_SPACE_GUID))))); - stubFor(get(urlEqualTo("/v2/spaces/" + TEST_SPACE_GUID)) + stubFor(get(urlPathEqualTo("/v2/spaces/" + TEST_SPACE_GUID)) .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("get-space", + replace("@name", "test"), replace("@org-guid", TEST_ORG_GUID), replace("@space-guid", TEST_SPACE_GUID))))); + + stubFor(get(urlPathEqualTo("/v2/spaces/" + TEST_SPACE_GUID + "/apps")) + .withQueryParam("page", equalTo("1")) + .withMetadata(optionalStubMapping()) + .willReturn(ok() + .withBody(cc("empty-query-results")))); + + stubFor(get(urlPathEqualTo("/v2/spaces/" + TEST_SPACE_GUID + "/security_groups")) + .withMetadata(optionalStubMapping()) + .willReturn(ok() + .withBody(cc("get-space-security_groups")))); } private void stubFindDomains() { @@ -102,37 +120,47 @@ public class CloudControllerStubFixture extends WiremockStubFixture { .willReturn(ok() .withBody(cc("empty-query-results")))); - stubFor(get(urlEqualTo("/v2/organizations/" + TEST_ORG_GUID + "/spaces?page=1")) + stubFor(get(urlPathEqualTo("/v2/organizations/" + TEST_ORG_GUID + "/spaces")) + .withQueryParam("page", equalTo("1")) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("list-spaces", replace("@org-guid", TEST_ORG_GUID), replace("@space-guid", TEST_SPACE_GUID))))); - stubFor(get(urlEqualTo("/v2/organizations/" + TEST_ORG_GUID + "/space_quota_definitions?page=1")) + stubFor(get(urlPathEqualTo("/v2/organizations/" + TEST_ORG_GUID + "/space_quota_definitions")) + .withQueryParam("page", equalTo("1")) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("list-organizations-quota", replace("@org-guid", TEST_ORG_GUID))))); - stubFor(get(urlEqualTo("/v2/quota_definitions/" + TEST_QUOTA_DEFINITION_GUID)) + stubFor(get(urlPathEqualTo("/v2/quota_definitions/" + TEST_QUOTA_DEFINITION_GUID)) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("get-organizations-quota", replace("@org-guid", TEST_ORG_GUID))))); } - public void stubAppDoesNotExist(final String appName) { - stubAppDoesNotExistInSpace(appName, TEST_SPACE_GUID); - } - - public void stubAppDoesNotExistInSpace(final String appName, final String space) { - stubFor(get(urlPathEqualTo("/v2/spaces/" + space + "/apps")) - .withQueryParam("q", equalTo("name:" + appName)) - .withQueryParam("page", equalTo("1")) + public void stubSpaceDoesNotExist(final String spaceName) { + stubFor(get(urlPathEqualTo("/v2/organizations/" + TEST_ORG_GUID + "/spaces")) + .withQueryParam("q", equalTo("name:" + spaceName)) .willReturn(ok() .withBody(cc("empty-query-results")))); + } + public void stubCreateSpace(final String spaceName) { stubFor(post(urlPathEqualTo("/v2/spaces")) - .willReturn(ok())); + .withRequestBody(matchingJsonPath("$.[?(@.name == '" + spaceName + "')]")) + .withRequestBody(matchingJsonPath("$.[?(@.organization_guid == '" + TEST_ORG_GUID + "')]")) + .willReturn(ok() + .withBody(cc("get-space", + replace("@name", spaceName), + replace("@space-guid", "CREATED-SPACE-GUID"), + replace("@org-guid", TEST_ORG_GUID))))); + } + public void stubAppDoesNotExist(final String appName) { stubFor(get(urlPathEqualTo("/v2/spaces/" + TEST_SPACE_GUID + "/apps")) .withQueryParam("q", equalTo("name:" + appName)) .withQueryParam("page", equalTo("1")) @@ -142,6 +170,7 @@ public class CloudControllerStubFixture extends WiremockStubFixture { public void stubAppExists(final String appName) { stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName))) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("get-app-STAGED", replace("@name", appName))))); @@ -149,6 +178,7 @@ public class CloudControllerStubFixture extends WiremockStubFixture { stubFor(get(urlPathEqualTo("/v2/spaces/" + TEST_SPACE_GUID + "/apps")) .withQueryParam("q", equalTo("name:" + appName)) .withQueryParam("page", equalTo("1")) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("list-space-apps", replace("@name", appName), @@ -157,10 +187,12 @@ public class CloudControllerStubFixture extends WiremockStubFixture { replace("@stack-guid", stackGuid(appName)))))); stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName) + "/instances")) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("get-app-instances")))); stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName) + "/summary")) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("get-app-summary", replace("@name", appName), @@ -169,11 +201,13 @@ public class CloudControllerStubFixture extends WiremockStubFixture { replace("@route-guid", routeGuid(appName)))))); stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName) + "/stats")) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("get-app-stats", replace("@name", appName))))); stubFor(get(urlPathEqualTo("/v2/stacks/" + stackGuid(appName))) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(cc("get-stack", replace("@guid", stackGuid(appName)))))); @@ -190,12 +224,10 @@ public class CloudControllerStubFixture extends WiremockStubFixture { } public void stubUpdateApp(final String appName) { - stubGetApp(appName); stubUpdateEnvironment(appName); stubCreatePackage(appName); stubCreateBuild(appName); stubCreateDeployment(appName); - stubAppAfterCreation(appName, appName); } private void stubAppAfterCreation(String appName, String host) { @@ -205,19 +237,6 @@ public class CloudControllerStubFixture extends WiremockStubFixture { stubCheckAppState(appName); } - private void stubGetApp(String appName) { - stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName))) - .willReturn(ok() - .withBody(cc("get-app-STARTED", - replace("@name", appName), - replace("@guid", appGuid(appName)))))); - stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName) + "/routes?page=1")) - .willReturn(ok() - .withBody(cc("list-routes", - replace("@name", appName), - replace("@guid", appGuid(appName)))))); - } - private void stubUpdateEnvironment(String appName) { stubFor(put(urlPathEqualTo("/v2/apps/" + appGuid(appName))) .withRequestBody(matchingJsonPath("$.[?(@.environment_json)]")) @@ -233,41 +252,54 @@ public class CloudControllerStubFixture extends WiremockStubFixture { matchingJsonPath("$.[?(@.relationships.app.data.guid == '" + appGuid(appName) + "')]")) .willReturn(ok() .withBody(cc("get-package-READY", - replace("@guid", appGuid(appName)))))); - stubFor(post(urlPathEqualTo("/v3/packages/" + appGuid(appName) + "/upload")) + replace("@guid", packageGuid(appName)), + replace("@app-guid", appGuid(appName)))))); + + stubFor(post(urlPathEqualTo("/v3/packages/" + packageGuid(appName) + "/upload")) .willReturn(ok() .withBody(cc("get-package-READY", - replace("@guid", appGuid(appName)))))); - stubFor(get(urlPathEqualTo("/v3/packages/" + appGuid(appName))) + replace("@guid", packageGuid(appName)), + replace("@app-guid", appGuid(appName)))))); + + stubFor(get(urlPathEqualTo("/v3/packages/" + packageGuid(appName))) .willReturn(ok() .withBody(cc("get-package-READY", - replace("@guid", appGuid(appName)))))); + replace("@guid", packageGuid(appName)), + replace("@app-guid", appGuid(appName)))))); } private void stubCreateBuild(String appName) { - stubFor(get(urlPathEqualTo("/v3/builds")) - .willReturn(ok() - .withBody(cc("get-build-STAGED", - replace("@guid", appGuid(appName)))))); stubFor(post(urlPathEqualTo("/v3/builds")) + .withRequestBody( + matchingJsonPath("$.[?(@.package.guid == '" + packageGuid(appName) + "')]")) .willReturn(ok() .withBody(cc("get-build-STAGED", - replace("@guid", appGuid(appName)))))); - stubFor(get(urlPathEqualTo("/v3/builds/" + appGuid(appName))) + replace("@guid", buildGuid(appName)), + replace("@package-guid", packageGuid(appName)), + replace("@app-guid", appGuid(appName)))))); + + stubFor(get(urlPathEqualTo("/v3/builds/" + buildGuid(appName))) .willReturn(ok() .withBody(cc("get-build-STAGED", - replace("@guid", appGuid(appName)))))); + replace("@guid", buildGuid(appName)), + replace("@package-guid", packageGuid(appName)), + replace("@app-guid", appGuid(appName)))))); } private void stubCreateDeployment(String appName) { stubFor(post(urlPathEqualTo("/v3/deployments")) + .withRequestBody( + matchingJsonPath("$.[?(@.relationships.app.data.guid == '" + appGuid(appName) + "')]")) .willReturn(ok() .withBody(cc("get-deployment-DEPLOYED", - replace("@guid", appGuid(appName)))))); - stubFor(get(urlPathEqualTo("/v3/deployments/" + appGuid(appName))) + replace("@guid", deploymentGuid(appName)), + replace("@app-guid", appGuid(appName)))))); + + stubFor(get(urlPathEqualTo("/v3/deployments/" + deploymentGuid(appName))) .willReturn(ok() .withBody(cc("get-deployment-DEPLOYED", - replace("@guid", appGuid(appName)))))); + replace("@guid", deploymentGuid(appName)), + replace("@app-guid", appGuid(appName)))))); } private void stubCreateAppMetadata(String appName, ContentPattern... appMetadataPatterns) { @@ -285,6 +317,7 @@ public class CloudControllerStubFixture extends WiremockStubFixture { private void stubMapRouteToApp(String appName, String host) { stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName) + "/routes")) + .withQueryParam("page", equalTo("1")) .willReturn(ok() .withBody(cc("empty-query-results")))); @@ -369,16 +402,9 @@ public class CloudControllerStubFixture extends WiremockStubFixture { replace("@space-guid", TEST_SPACE_GUID), replace("@name", serviceInstanceName), replace("@guid", serviceInstanceName + "-GUID"))))); - - stubFor(get(urlPathEqualTo("/v2/service_instances/" + serviceInstanceGuid(serviceInstanceName))) - .willReturn(ok() - .withBody(cc("get-service_instances", - replace("@space-guid", TEST_SPACE_GUID), - replace("@name", serviceInstanceName), - replace("@guid", serviceInstanceName + "-GUID"))))); } - public void stubServiceInstanceDoesNotExists(String serviceInstanceName) { + public void stubServiceInstanceDoesNotExist(String serviceInstanceName) { stubFor(get(urlPathEqualTo("/v2/spaces/" + TEST_SPACE_GUID + "/service_instances")) .withQueryParam("q", equalTo("name:" + serviceInstanceName)) .withQueryParam("page", equalTo("1")) @@ -445,15 +471,11 @@ public class CloudControllerStubFixture extends WiremockStubFixture { } public void stubDeleteServiceBinding(String appName, String serviceInstanceName) { - String appGuid = appGuid(appName); String serviceBindingGuid = serviceBindingGuid(appName, serviceInstanceName); stubFor(delete(urlPathEqualTo("/v2/service_bindings/" + serviceBindingGuid)) .withQueryParam("async", equalTo("true")) .willReturn(noContent())); - - stubFor(delete(urlPathEqualTo("/v2/apps/" + appGuid + "/service_bindings/" + serviceBindingGuid)) - .willReturn(noContent())); } public void stubListServiceBindings(String appName, String serviceInstanceName) { @@ -474,13 +496,6 @@ public class CloudControllerStubFixture extends WiremockStubFixture { String serviceInstanceGuid = serviceInstanceGuid(serviceInstanceName); String serviceBindingGuid = serviceBindingGuid(appName, serviceInstanceName); - stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName) + "/service_bindings")) - .willReturn(ok() - .withBody(cc("get-service_bindings", - replace("@service-binding-guid", serviceBindingGuid), - replace("@app-guid", appGuid(appName)), - replace("@service-instance-guid", serviceInstanceGuid))))); - stubFor(get(urlPathEqualTo("/v2/apps/" + appGuid(appName) + "/service_bindings")) .withQueryParam("q", equalTo("service_instance_guid:" + serviceInstanceGuid)) .withQueryParam("page", equalTo("1")) @@ -524,4 +539,16 @@ public class CloudControllerStubFixture extends WiremockStubFixture { private String serviceBindingGuid(String appName, String serviceInstanceName) { return appGuid(appName) + "-" + serviceInstanceGuid(serviceInstanceName); } + + private String packageGuid(String appName) { + return appName + "-PACKAGE-GUID"; + } + + private String buildGuid(String appName) { + return appName + "-BUILD-GUID"; + } + + private String deploymentGuid(String appname) { + return appname + "-DEPLOYMENT-GUID"; + } } diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/UaaStubFixture.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/UaaStubFixture.java index 39212c2..06afe71 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/UaaStubFixture.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/UaaStubFixture.java @@ -82,12 +82,14 @@ public class UaaStubFixture extends WiremockStubFixture { */ private void stubRetrieveAccessToken() { stubFor(post(urlPathEqualTo("/oauth/token")) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(uaa("put-oauth-token")))); } private void stubRetrieveTokenKeys() { stubFor(get(urlPathEqualTo("/token_keys")) + .withMetadata(optionalStubMapping()) .willReturn(ok() .withBody(uaa("get-token-keys")))); } diff --git a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/WiremockServerFixture.java b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/WiremockServerFixture.java index 89eac54..2d987ae 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/WiremockServerFixture.java +++ b/spring-cloud-app-broker-integration-tests/src/test/java/org.springframework.cloud.appbroker/integration/fixtures/WiremockServerFixture.java @@ -60,8 +60,7 @@ public class WiremockServerFixture { } public void verifyAllRequiredStubsUsed() { - // todo: cleanup CC and UAA stubbing so used/unused can be verified - // verifyStubs(ccUaaWiremockServer); + verifyStubs(ccUaaWiremockServer); verifyStubs(credHubWiremockServer); } diff --git a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-build-STAGED.json b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-build-STAGED.json index d08a09f..ca5d765 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-build-STAGED.json +++ b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-build-STAGED.json @@ -19,17 +19,17 @@ } }, "package": { - "guid": "8e4da443-f255-499c-8b47-b3729b5b7432" + "guid": "@package-guid" }, "droplet": { "guid": "1e1186e7-d803-4c46-b9d6-5c81e50fe55a" }, "links": { "self": { - "href": "https://api.example.org/v3/builds/585bc3c1-3743-497d-88b0-403ad6b56d16" + "href": "https://api.example.org/v3/builds/@guid" }, "app": { - "href": "https://api.example.org/v3/apps/7b34f1cf-7e73-428a-bb5a-8a17a8058396" + "href": "https://api.example.org/v3/apps/@app-guid" } } } diff --git a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-deployment-DEPLOYED.json b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-deployment-DEPLOYED.json index 93f53d9..2ed551a 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-deployment-DEPLOYED.json +++ b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-deployment-DEPLOYED.json @@ -22,16 +22,16 @@ "relationships": { "app": { "data": { - "guid": "305cea31-5a44-45ca-b51b-e89c7a8ef8b2" + "guid": "@app-guid" } } }, "links": { "self": { - "href": "https://api.example.org/v3/deployments/59c3d133-2b83-46f3-960e-7765a129aea4" + "href": "https://api.example.org/v3/deployments/@guid" }, "app": { - "href": "https://api.example.org/v3/apps/305cea31-5a44-45ca-b51b-e89c7a8ef8b2" + "href": "https://api.example.org/v3/apps/@app-guid" } } } \ No newline at end of file diff --git a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-organization.json b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-organization.json new file mode 100644 index 0000000..77d8277 --- /dev/null +++ b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-organization.json @@ -0,0 +1,25 @@ +{ + "metadata": { + "guid": "@org-guid", + "url": "/v2/organizations/@org-guid", + "created_at": "2018-07-19T20:33:45Z", + "updated_at": "2018-07-19T20:33:45Z" + }, + "entity": { + "name": "test", + "billing_enabled": false, + "quota_definition_guid": "TEST-QUOTA-DEFINITION-GUID", + "status": "active", + "default_isolation_segment_guid": null, + "quota_definition_url": "/v2/quota_definitions/TEST-QUOTA-DEFINITION-GUID", + "spaces_url": "/v2/organizations/@org-guid/spaces", + "domains_url": "/v2/organizations/@org-guid/domains", + "private_domains_url": "/v2/organizations/@org-guid/private_domains", + "users_url": "/v2/organizations/@org-guid/users", + "managers_url": "/v2/organizations/@org-guid/managers", + "billing_managers_url": "/v2/organizations/@org-guid/billing_managers", + "auditors_url": "/v2/organizations/@org-guid/auditors", + "app_events_url": "/v2/organizations/@org-guid/app_events", + "space_quota_definitions_url": "/v2/organizations/@org-guid/space_quota_definitions" + } +} \ No newline at end of file diff --git a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-package-READY.json b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-package-READY.json index 3ede15d..5112d66 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-package-READY.json +++ b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-package-READY.json @@ -13,7 +13,7 @@ "updated_at": "2016-06-08T16:41:26Z", "links": { "self": { - "href": "https://api.example.org/v3/packages/44f7c078-0934-470f-9883-4fcddc5b8f13" + "href": "https://api.example.org/v3/packages/@guid" }, "upload": { "href": "https://api.example.org/v3/packages/44f7c078-0934-470f-9883-4fcddc5b8f13/upload", @@ -24,7 +24,7 @@ "method": "GET" }, "app": { - "href": "https://api.example.org/v3/apps/1d3bf0ec-5806-43c4-b64e-8364dba1086a" + "href": "https://api.example.org/v3/apps/@app-guid" } } } diff --git a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-space-security_groups.json b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-space-security_groups.json new file mode 100644 index 0000000..2b255bd --- /dev/null +++ b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-space-security_groups.json @@ -0,0 +1,30 @@ +{ + "total_results": 1, + "total_pages": 1, + "prev_url": null, + "next_url": null, + "resources": [ + { + "metadata": { + "guid": "3da034d1-f0e3-4bfe-8d42-0bf2822fe8cc", + "url": "/v2/security_groups/3da034d1-f0e3-4bfe-8d42-0bf2822fe8cc", + "created_at": "2016-06-08T16:41:40Z", + "updated_at": "2016-06-08T16:41:26Z" + }, + "entity": { + "name": "name-2073", + "rules": [ + { + "protocol": "udp", + "ports": "8080", + "destination": "198.41.191.47/1" + } + ], + "running_default": false, + "staging_default": false, + "spaces_url": "/v2/security_groups/3da034d1-f0e3-4bfe-8d42-0bf2822fe8cc/spaces", + "staging_spaces_url": "/v2/security_groups/3da034d1-f0e3-4bfe-8d42-0bf2822fe8cc/staging_spaces" + } + } + ] +} \ No newline at end of file diff --git a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-space.json b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-space.json index d60bf98..e129cde 100644 --- a/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-space.json +++ b/spring-cloud-app-broker-integration-tests/src/test/resources/responses/cloudcontroller/get-space.json @@ -6,7 +6,7 @@ "updated_at": "2018-07-19T20:34:16Z" }, "entity": { - "name": "development", + "name": "@name", "organization_guid": "@org-guid", "space_quota_definition_guid": null, "isolation_segment_guid": null,