From 523b5a4a020df742816b263fc00d865a398c7154 Mon Sep 17 00:00:00 2001 From: Stefan Yonkov <156345010+s-yonkov-yonkov@users.noreply.github.com> Date: Thu, 8 May 2025 11:47:48 +0300 Subject: [PATCH 1/4] Add support for cnb (#369) * Introduce new LifecycleType - CNB --- .../facade/adapters/RawCloudApplication.java | 35 ++++++++++++++---- .../client/facade/domain/LifecycleType.java | 2 +- .../client/facade/domain/Staging.java | 3 ++ .../rest/CloudControllerRestClientImpl.java | 31 ++++++++++++---- ...sCloudControllerClientIntegrationTest.java | 30 ++++++++++++--- .../CloudControllerClientIntegrationTest.java | 11 ++++-- .../adapters/RawCloudApplicationTest.java | 37 +++++++++++++++---- 7 files changed, 117 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java b/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java index f71b365b8..62f96a532 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java @@ -1,6 +1,11 @@ package com.sap.cloudfoundry.client.facade.adapters; +import java.util.HashMap; +import java.util.Map; + import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.CnbData; +import org.cloudfoundry.client.v3.LifecycleData; import org.cloudfoundry.client.v3.applications.Application; import org.cloudfoundry.client.v3.applications.ApplicationState; import org.immutables.value.Value; @@ -13,12 +18,12 @@ import com.sap.cloudfoundry.client.facade.domain.Lifecycle; import com.sap.cloudfoundry.client.facade.domain.LifecycleType; -import java.util.HashMap; -import java.util.Map; - @Value.Immutable public abstract class RawCloudApplication extends RawCloudEntity { + public static final String BUILDPACKS = "buildpacks"; + public static final String STACK = "stack"; + public abstract Application getApplication(); public abstract Derivable getSpace(); @@ -42,11 +47,12 @@ private static CloudApplication.State parseState(ApplicationState state) { private static Lifecycle parseLifecycle(org.cloudfoundry.client.v3.Lifecycle lifecycle) { Map data = new HashMap<>(); - if (lifecycle.getType() == org.cloudfoundry.client.v3.LifecycleType.BUILDPACK) { - var buildpackData = (BuildpackData) lifecycle.getData(); - data.put("buildpacks", buildpackData.getBuildpacks()); - data.put("stack", buildpackData.getStack()); + org.cloudfoundry.client.v3.LifecycleType lifecycleType = lifecycle.getType(); + + if (isBuildpackOrCnb(lifecycleType)) { + addLifecycleData(data, lifecycle.getData()); } + return ImmutableLifecycle.builder() .type(LifecycleType.valueOf(lifecycle.getType() .toString() @@ -55,4 +61,19 @@ private static Lifecycle parseLifecycle(org.cloudfoundry.client.v3.Lifecycle lif .build(); } + private static boolean isBuildpackOrCnb(org.cloudfoundry.client.v3.LifecycleType lifecycleType) { + return lifecycleType == org.cloudfoundry.client.v3.LifecycleType.BUILDPACK + || lifecycleType == org.cloudfoundry.client.v3.LifecycleType.CNB; + } + + private static void addLifecycleData(Map data, LifecycleData lifecycleData) { + if (lifecycleData instanceof BuildpackData buildpackData) { + data.put(BUILDPACKS, buildpackData.getBuildpacks()); + data.put(STACK, buildpackData.getStack()); + } else if (lifecycleData instanceof CnbData cnbData) { + data.put(BUILDPACKS, cnbData.getBuildpacks()); + data.put(STACK, cnbData.getStack()); + } + } + } diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/domain/LifecycleType.java b/src/main/java/com/sap/cloudfoundry/client/facade/domain/LifecycleType.java index fc8f56c23..6106d5e7c 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/domain/LifecycleType.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/domain/LifecycleType.java @@ -2,7 +2,7 @@ public enum LifecycleType { - BUILDPACK, DOCKER, KPACK; + BUILDPACK, DOCKER, KPACK, CNB; public String toString() { return this.name().toLowerCase(); diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/domain/Staging.java b/src/main/java/com/sap/cloudfoundry/client/facade/domain/Staging.java index b3f5a8012..8c81f0bbc 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/domain/Staging.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/domain/Staging.java @@ -67,6 +67,9 @@ public interface Staging { @Nullable Integer getInvocationTimeout(); + @Nullable + LifecycleType getLifecycleType(); + default String getBuildpack() { return getBuildpacks().isEmpty() ? null : getBuildpacks().get(0); } diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java b/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java index 704bca941..e9581e182 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java @@ -312,7 +312,26 @@ public void createApplication(ApplicationToCreateDto applicationToCreateDto) { } private Lifecycle buildApplicationLifecycle(Staging staging) { - return staging.getDockerInfo() != null ? createDockerLifecycle() : createBuildpackLifecycle(staging); + // Prioritize Docker lifecycle if DockerInfo is provided + if (staging.getDockerInfo() != null) { + return createDockerLifecycle(); + } + + // Determine lifecycle type, defaulting to BUILDPACK if lifecycleType is null + LifecycleType lifecycleType = staging.getLifecycleType() != null ? LifecycleType.valueOf(staging.getLifecycleType() + .name()) + : LifecycleType.BUILDPACK; + + return createLifecycleByType(staging, lifecycleType); + } + + private Lifecycle createLifecycleByType(Staging staging, LifecycleType lifecycleType) { + validateLifecycleConfiguration(staging, lifecycleType); + BuildpackData buildpackData = createBuildpackData(staging); + return Lifecycle.builder() + .type(lifecycleType) + .data(buildpackData) + .build(); } private Lifecycle createDockerLifecycle() { @@ -323,12 +342,10 @@ private Lifecycle createDockerLifecycle() { .build(); } - private Lifecycle createBuildpackLifecycle(Staging staging) { - BuildpackData buildpackData = createBuildpackData(staging); - return Lifecycle.builder() - .type(LifecycleType.BUILDPACK) - .data(buildpackData) - .build(); + private void validateLifecycleConfiguration(Staging staging, LifecycleType lifecycleType) { + if (lifecycleType == LifecycleType.CNB && staging.getBuildpacks() == null) { + throw new IllegalArgumentException("Buildpacks are required for CNB lifecycle type."); + } } private BuildpackData createBuildpackData(Staging staging) { diff --git a/src/test/java/com/sap/cloudfoundry/client/facade/ApplicationsCloudControllerClientIntegrationTest.java b/src/test/java/com/sap/cloudfoundry/client/facade/ApplicationsCloudControllerClientIntegrationTest.java index 3b70cf48e..4cc219d51 100644 --- a/src/test/java/com/sap/cloudfoundry/client/facade/ApplicationsCloudControllerClientIntegrationTest.java +++ b/src/test/java/com/sap/cloudfoundry/client/facade/ApplicationsCloudControllerClientIntegrationTest.java @@ -37,6 +37,7 @@ import com.sap.cloudfoundry.client.facade.domain.CloudBuild; import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; import com.sap.cloudfoundry.client.facade.domain.CloudPackage; +import com.sap.cloudfoundry.client.facade.domain.CloudProcess; import com.sap.cloudfoundry.client.facade.domain.CloudRoute; import com.sap.cloudfoundry.client.facade.domain.DockerInfo; import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; @@ -45,10 +46,10 @@ import com.sap.cloudfoundry.client.facade.domain.ImmutableDockerInfo; import com.sap.cloudfoundry.client.facade.domain.ImmutableStaging; import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; +import com.sap.cloudfoundry.client.facade.domain.LifecycleType; import com.sap.cloudfoundry.client.facade.domain.Staging; import com.sap.cloudfoundry.client.facade.domain.Status; import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto; -import com.sap.cloudfoundry.client.facade.domain.CloudProcess; import com.sap.cloudfoundry.client.facade.dto.ImmutableApplicationToCreateDto; class ApplicationsCloudControllerClientIntegrationTest extends CloudControllerClientIntegrationTest { @@ -157,11 +158,10 @@ void updateApplicationHealthcheckType() { createAndVerifyDefaultApplication(applicationName); UUID applicationGuid = client.getApplicationGuid(applicationName); delegate.applicationsV2() - .update(org.cloudfoundry.client.v2.applications.UpdateApplicationRequest - .builder() - .applicationId(applicationGuid.toString()) - .healthCheckType(HealthCheckType.NONE.getValue()) - .build()) + .update(org.cloudfoundry.client.v2.applications.UpdateApplicationRequest.builder() + .applicationId(applicationGuid.toString()) + .healthCheckType(HealthCheckType.NONE.getValue()) + .build()) .block(); CloudProcess cloudProcess = client.getApplicationProcess(applicationGuid); assertEquals(com.sap.cloudfoundry.client.facade.domain.HealthCheckType.NONE, cloudProcess.getHealthCheckType()); @@ -422,6 +422,24 @@ void createApplicationWithBuildpacks() { } } + @Test + @DisplayName("Create application with CNB lifecycle and verify attributes") + void createCnbApplication() { + String applicationName = "test-app-17"; + Staging staging = ImmutableStaging.builder() + .lifecycleType(LifecycleType.CNB) + .addBuildpacks(JAVA_BUILDPACK, STATICFILE_BUILDPACK) + .build(); + CloudRoute route = getImmutableCloudRoute(); + try { + verifyApplicationWillBeCreated(applicationName, staging, Set.of(route)); + } catch (Exception e) { + fail(e); + } finally { + client.deleteApplication(applicationName); + } + } + private void verifyApplicationWillBeCreated(String applicationName, Staging staging, Set routes) { ApplicationToCreateDto applicationToCreateDto = ImmutableApplicationToCreateDto.builder() .name(applicationName) diff --git a/src/test/java/com/sap/cloudfoundry/client/facade/CloudControllerClientIntegrationTest.java b/src/test/java/com/sap/cloudfoundry/client/facade/CloudControllerClientIntegrationTest.java index f98dc8c01..c90dc77c8 100644 --- a/src/test/java/com/sap/cloudfoundry/client/facade/CloudControllerClientIntegrationTest.java +++ b/src/test/java/com/sap/cloudfoundry/client/facade/CloudControllerClientIntegrationTest.java @@ -9,8 +9,6 @@ import java.util.HashMap; import java.util.Map; -import com.sap.cloudfoundry.client.facade.rest.CloudControllerRestClient; -import com.sap.cloudfoundry.client.facade.rest.CloudControllerRestClientFactory; import org.cloudfoundry.client.CloudFoundryClient; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -70,11 +68,18 @@ protected Lifecycle createLifecycle(Staging staging) { .data(Map.of()) .build(); } + var data = new HashMap(); data.put("buildpacks", staging.getBuildpacks()); data.put("stack", DEFAULT_STACK); + + // Default to BUILDPACK if lifecycleType is null + LifecycleType lifecycleType = staging.getLifecycleType() != null + ? staging.getLifecycleType() + : LifecycleType.BUILDPACK; + return ImmutableLifecycle.builder() - .type(LifecycleType.BUILDPACK) + .type(lifecycleType) .data(data) .build(); } diff --git a/src/test/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplicationTest.java b/src/test/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplicationTest.java index 7261c138a..bb1fd8950 100644 --- a/src/test/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplicationTest.java +++ b/src/test/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplicationTest.java @@ -27,19 +27,24 @@ class RawCloudApplicationTest { .name(SPACE_NAME) .build(); private static final String EXPECTED_BUILDPACK = "ruby_buildpack"; + private static final String BUILDPACK_URL = "custom-buildpack-url"; + private static final String EXPECTED_STACK = "cflinuxfs3"; private static final CloudApplication.State EXPECTED_STATE = CloudApplication.State.STARTED; @Test void testDeriveForBuildpackApp() { - RawCloudEntityTest.testDerive(buildApplication(buildBuildpackLifecycle()), - buildRawApplication(buildBuildpackLifecycleResource())); + RawCloudEntityTest.testDerive(buildApplication(buildBuildpackLifecycle()), buildRawApplication(buildBuildpackLifecycleResource())); } @Test void testDeriveForDockerApp() { - RawCloudEntityTest.testDerive(buildApplication(buildDockerLifecycle()), - buildRawApplication(buildDockerLifecycleResource())); + RawCloudEntityTest.testDerive(buildApplication(buildDockerLifecycle()), buildRawApplication(buildDockerLifecycleResource())); + } + + @Test + void testDeriveForCnbApp() { + RawCloudEntityTest.testDerive(buildApplication(buildCnbLifecycle()), buildRawApplication(buildCnbLifecycleResource())); } private static CloudApplication buildApplication(com.sap.cloudfoundry.client.facade.domain.Lifecycle lifecycle) { @@ -56,13 +61,15 @@ private static CloudApplication buildApplication(com.sap.cloudfoundry.client.fac private static com.sap.cloudfoundry.client.facade.domain.Lifecycle buildBuildpackLifecycle() { return ImmutableLifecycle.builder() .type(com.sap.cloudfoundry.client.facade.domain.LifecycleType.BUILDPACK) - .data(buildBuildpackLifecycleData()) + .data(buildLifecycleData(EXPECTED_BUILDPACK)) .build(); } - private static Map buildBuildpackLifecycleData() { - return Map.of("buildpacks", List.of(EXPECTED_BUILDPACK), - "stack", EXPECTED_STACK); + private com.sap.cloudfoundry.client.facade.domain.Lifecycle buildCnbLifecycle() { + return ImmutableLifecycle.builder() + .type(com.sap.cloudfoundry.client.facade.domain.LifecycleType.CNB) + .data(buildLifecycleData(BUILDPACK_URL)) + .build(); } private static com.sap.cloudfoundry.client.facade.domain.Lifecycle buildDockerLifecycle() { @@ -72,6 +79,10 @@ private static com.sap.cloudfoundry.client.facade.domain.Lifecycle buildDockerLi .build(); } + private static Map buildLifecycleData(String buildpack) { + return Map.of("buildpacks", List.of(buildpack), "stack", EXPECTED_STACK); + } + private static RawCloudApplication buildRawApplication(Lifecycle lifecycle) { return ImmutableRawCloudApplication.builder() .application(buildApplicationResource(lifecycle)) @@ -101,6 +112,16 @@ private static Lifecycle buildBuildpackLifecycleResource() { .build(); } + private Lifecycle buildCnbLifecycleResource() { + return Lifecycle.builder() + .type(LifecycleType.CNB) + .data(BuildpackData.builder() + .buildpack(BUILDPACK_URL) + .stack(STACK_NAME) + .build()) + .build(); + } + private static Lifecycle buildDockerLifecycleResource() { return Lifecycle.builder() .type(LifecycleType.DOCKER) From fe24cb40d0826430b3509b2b57de182626ed5ece Mon Sep 17 00:00:00 2001 From: Stefan Yonkov Date: Fri, 9 May 2025 12:36:30 +0300 Subject: [PATCH 2/4] Apply formatting --- .../facade/adapters/RawCloudApplication.java | 13 +- .../client/facade/domain/LifecycleType.java | 3 +- .../client/facade/domain/Staging.java | 6 +- .../rest/CloudControllerRestClientImpl.java | 281 ++++++++++-------- ...sCloudControllerClientIntegrationTest.java | 50 ++-- .../CloudControllerClientIntegrationTest.java | 19 +- .../adapters/RawCloudApplicationTest.java | 11 +- 7 files changed, 213 insertions(+), 170 deletions(-) diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java b/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java index 62f96a532..ec71ce29b 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java @@ -3,13 +3,6 @@ import java.util.HashMap; import java.util.Map; -import org.cloudfoundry.client.v3.BuildpackData; -import org.cloudfoundry.client.v3.CnbData; -import org.cloudfoundry.client.v3.LifecycleData; -import org.cloudfoundry.client.v3.applications.Application; -import org.cloudfoundry.client.v3.applications.ApplicationState; -import org.immutables.value.Value; - import com.sap.cloudfoundry.client.facade.domain.CloudApplication; import com.sap.cloudfoundry.client.facade.domain.CloudSpace; import com.sap.cloudfoundry.client.facade.domain.Derivable; @@ -17,6 +10,12 @@ import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; import com.sap.cloudfoundry.client.facade.domain.Lifecycle; import com.sap.cloudfoundry.client.facade.domain.LifecycleType; +import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.CnbData; +import org.cloudfoundry.client.v3.LifecycleData; +import org.cloudfoundry.client.v3.applications.Application; +import org.cloudfoundry.client.v3.applications.ApplicationState; +import org.immutables.value.Value; @Value.Immutable public abstract class RawCloudApplication extends RawCloudEntity { diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/domain/LifecycleType.java b/src/main/java/com/sap/cloudfoundry/client/facade/domain/LifecycleType.java index 6106d5e7c..3c157afe8 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/domain/LifecycleType.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/domain/LifecycleType.java @@ -5,7 +5,8 @@ public enum LifecycleType { BUILDPACK, DOCKER, KPACK, CNB; public String toString() { - return this.name().toLowerCase(); + return this.name() + .toLowerCase(); } } diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/domain/Staging.java b/src/main/java/com/sap/cloudfoundry/client/facade/domain/Staging.java index 8c81f0bbc..d9d763523 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/domain/Staging.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/domain/Staging.java @@ -1,13 +1,13 @@ package com.sap.cloudfoundry.client.facade.domain; +import java.util.List; + import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.sap.cloudfoundry.client.facade.Nullable; import com.sap.cloudfoundry.client.facade.SkipNulls; import org.immutables.value.Value; -import java.util.List; - @Value.Immutable @JsonSerialize(as = ImmutableStaging.class) @JsonDeserialize(as = ImmutableStaging.class) @@ -26,7 +26,7 @@ public interface Staging { /** * @return Raw, free-form information regarding a detected buildpack, or null if no detected buildpack was resolved. For example, if the - * application is stopped, the detected buildpack may be null. + * application is stopped, the detected buildpack may be null. */ @Nullable String getDetectedBuildpack(); diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java b/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java index e9581e182..36d09e17f 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java @@ -19,6 +19,67 @@ import java.util.function.Supplier; import java.util.stream.Collectors; +import com.sap.cloudfoundry.client.facade.CloudOperationException; +import com.sap.cloudfoundry.client.facade.Constants; +import com.sap.cloudfoundry.client.facade.Messages; +import com.sap.cloudfoundry.client.facade.UploadStatusCallback; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudApplication; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudAsyncJob; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudBuild; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudDomain; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudEvent; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudPackage; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudProcess; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudRoute; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceBinding; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceBroker; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceInstance; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceKey; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceOffering; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServicePlan; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudStack; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudTask; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawInstancesInfo; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawUserRole; +import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawV3CloudServiceInstance; +import com.sap.cloudfoundry.client.facade.domain.BitsData; +import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; +import com.sap.cloudfoundry.client.facade.domain.CloudBuild; +import com.sap.cloudfoundry.client.facade.domain.CloudDomain; +import com.sap.cloudfoundry.client.facade.domain.CloudEntity; +import com.sap.cloudfoundry.client.facade.domain.CloudEvent; +import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; +import com.sap.cloudfoundry.client.facade.domain.CloudPackage; +import com.sap.cloudfoundry.client.facade.domain.CloudProcess; +import com.sap.cloudfoundry.client.facade.domain.CloudRoute; +import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; +import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; +import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; +import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; +import com.sap.cloudfoundry.client.facade.domain.CloudServiceOffering; +import com.sap.cloudfoundry.client.facade.domain.CloudServicePlan; +import com.sap.cloudfoundry.client.facade.domain.CloudSpace; +import com.sap.cloudfoundry.client.facade.domain.CloudStack; +import com.sap.cloudfoundry.client.facade.domain.CloudTask; +import com.sap.cloudfoundry.client.facade.domain.Derivable; +import com.sap.cloudfoundry.client.facade.domain.DockerCredentials; +import com.sap.cloudfoundry.client.facade.domain.DockerInfo; +import com.sap.cloudfoundry.client.facade.domain.DropletInfo; +import com.sap.cloudfoundry.client.facade.domain.ErrorDetails; +import com.sap.cloudfoundry.client.facade.domain.ImmutableDropletInfo; +import com.sap.cloudfoundry.client.facade.domain.ImmutableErrorDetails; +import com.sap.cloudfoundry.client.facade.domain.ImmutableInstancesInfo; +import com.sap.cloudfoundry.client.facade.domain.ImmutableUpload; +import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; +import com.sap.cloudfoundry.client.facade.domain.RouteDestination; +import com.sap.cloudfoundry.client.facade.domain.ServicePlanVisibility; +import com.sap.cloudfoundry.client.facade.domain.Staging; +import com.sap.cloudfoundry.client.facade.domain.Status; +import com.sap.cloudfoundry.client.facade.domain.Upload; +import com.sap.cloudfoundry.client.facade.domain.UserRole; +import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto; +import com.sap.cloudfoundry.client.facade.util.JobV3Util; import org.cloudfoundry.AbstractCloudFoundryException; import org.cloudfoundry.client.CloudFoundryClient; import org.cloudfoundry.client.v3.BuildpackData; @@ -152,69 +213,6 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; - -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.Constants; -import com.sap.cloudfoundry.client.facade.Messages; -import com.sap.cloudfoundry.client.facade.UploadStatusCallback; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudApplication; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudAsyncJob; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudBuild; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudDomain; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudEvent; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudPackage; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudProcess; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudRoute; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceBinding; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceBroker; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceInstance; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceKey; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceOffering; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServicePlan; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudStack; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudTask; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawInstancesInfo; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawUserRole; -import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawV3CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.BitsData; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob; -import com.sap.cloudfoundry.client.facade.domain.CloudBuild; -import com.sap.cloudfoundry.client.facade.domain.CloudDomain; -import com.sap.cloudfoundry.client.facade.domain.CloudEntity; -import com.sap.cloudfoundry.client.facade.domain.CloudEvent; -import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; -import com.sap.cloudfoundry.client.facade.domain.CloudPackage; -import com.sap.cloudfoundry.client.facade.domain.CloudProcess; -import com.sap.cloudfoundry.client.facade.domain.CloudRoute; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey; -import com.sap.cloudfoundry.client.facade.domain.CloudServiceOffering; -import com.sap.cloudfoundry.client.facade.domain.CloudServicePlan; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.domain.CloudStack; -import com.sap.cloudfoundry.client.facade.domain.CloudTask; -import com.sap.cloudfoundry.client.facade.domain.Derivable; -import com.sap.cloudfoundry.client.facade.domain.DockerCredentials; -import com.sap.cloudfoundry.client.facade.domain.DockerInfo; -import com.sap.cloudfoundry.client.facade.domain.DropletInfo; -import com.sap.cloudfoundry.client.facade.domain.ErrorDetails; -import com.sap.cloudfoundry.client.facade.domain.ImmutableDropletInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableErrorDetails; -import com.sap.cloudfoundry.client.facade.domain.ImmutableInstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.ImmutableUpload; -import com.sap.cloudfoundry.client.facade.domain.InstancesInfo; -import com.sap.cloudfoundry.client.facade.domain.RouteDestination; -import com.sap.cloudfoundry.client.facade.domain.ServicePlanVisibility; -import com.sap.cloudfoundry.client.facade.domain.Staging; -import com.sap.cloudfoundry.client.facade.domain.Status; -import com.sap.cloudfoundry.client.facade.domain.Upload; -import com.sap.cloudfoundry.client.facade.domain.UserRole; -import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto; -import com.sap.cloudfoundry.client.facade.util.JobV3Util; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -283,8 +281,11 @@ public Optional bindServiceInstance(String bindingName, String applicati .name(bindingName) .type(ServiceBindingType.APPLICATION) .relationships(ServiceBindingRelationships.builder() - .application(buildToOneRelationship(applicationGuid)) - .serviceInstance(buildToOneRelationship(serviceInstanceGuid)) + .application(buildToOneRelationship( + applicationGuid)) + .serviceInstance( + buildToOneRelationship( + serviceInstanceGuid)) .build()); if (!CollectionUtils.isEmpty(parameters)) { createBindingRequest.parameters(parameters); @@ -301,7 +302,8 @@ public void createApplication(ApplicationToCreateDto applicationToCreateDto) { CreateApplicationRequest createApplicationRequest = CreateApplicationRequest.builder() .name(applicationToCreateDto.getName()) .metadata(applicationToCreateDto.getMetadata()) - .lifecycle(buildApplicationLifecycle(applicationToCreateDto.getStaging())) + .lifecycle(buildApplicationLifecycle( + applicationToCreateDto.getStaging())) .relationships(buildApplicationRelationships()) .environmentVariables(applicationToCreateDto.getEnv()) .build(); @@ -450,8 +452,10 @@ public void createServiceInstance(CloudServiceInstance serviceInstance) { .name(serviceInstance.getName()) .metadata(serviceInstance.getV3Metadata()) .relationships(ServiceInstanceRelationships.builder() - .servicePlan(buildToOneRelationship(servicePlanGuid.toString())) - .space(buildToOneRelationship(getTargetSpaceGuid().toString())) + .servicePlan(buildToOneRelationship( + servicePlanGuid.toString())) + .space(buildToOneRelationship( + getTargetSpaceGuid().toString())) .build()) .tags(serviceInstance.getTags()) .parameters(serviceInstance.getCredentials()) @@ -467,7 +471,8 @@ public String createServiceBroker(CloudServiceBroker serviceBroker) { .map(UUID::fromString) .map(this::buildToOneRelationship) .map(spaceRelationship -> ServiceBrokerRelationships.builder() - .space(spaceRelationship) + .space( + spaceRelationship) .build()) .orElse(null); @@ -541,7 +546,9 @@ private CreateServiceBindingRequest buildServiceCredentialBindingRequest(String .name(name) .metadata(metadata) .relationships(ServiceBindingRelationships.builder() - .serviceInstance(buildToOneRelationship(serviceInstanceGuid)) + .serviceInstance( + buildToOneRelationship( + serviceInstanceGuid)) .build()); if (!CollectionUtils.isEmpty(parameters)) { createBindingRequest.parameters(parameters); @@ -563,7 +570,8 @@ public void createUserProvidedServiceInstance(CloudServiceInstance serviceInstan .syslogDrainUrl(syslogDrainUrl) .tags(serviceInstance.getTags()) .relationships(ServiceInstanceRelationships.builder() - .space(buildToOneRelationship(getTargetSpaceGuid().toString())) + .space(buildToOneRelationship( + getTargetSpaceGuid().toString())) .build()) .build()) .block(); @@ -726,7 +734,8 @@ public CloudProcess getApplicationProcess(UUID applicationGuid) { public List getApplicationRoutes(UUID applicationGuid) { return fetchList(() -> getRouteResourcesByAppGuid(applicationGuid), routeResource -> ImmutableRawCloudRoute.builder() .route(routeResource) - .applicationGuid(applicationGuid) + .applicationGuid( + applicationGuid) .build()); } @@ -753,7 +762,8 @@ public List getApplications() { public List getApplicationsByMetadataLabelSelector(String labelSelector) { assertSpaceProvided("get applications"); return fetchList(() -> getApplicationsByLabelSelector(labelSelector), application -> ImmutableRawCloudApplication.builder() - .application(application) + .application( + application) .space(target) .build()); } @@ -915,8 +925,10 @@ public List getServiceKeysWithCredentials(String serviceInstanc @Override public List getServiceKeys(CloudServiceInstance serviceInstance) { return fetchList(() -> getServiceKeyResource(serviceInstance), serviceKey -> ImmutableRawCloudServiceKey.builder() - .serviceInstance(serviceInstance) - .serviceBindingResource(serviceKey) + .serviceInstance( + serviceInstance) + .serviceBindingResource( + serviceKey) .build()); } @@ -996,7 +1008,8 @@ public void updateServicePlan(String serviceName, String planName) { .serviceInstanceId(service.getGuid() .toString()) .relationships(ServiceInstanceRelationships.builder() - .servicePlan(buildToOneRelationship(plan.getGuid())) + .servicePlan( + buildToOneRelationship(plan.getGuid())) .build()) .build()) .block(); @@ -1091,7 +1104,8 @@ private Flux getServiceInstancesByNames(List se String spaceGuid = getTargetSpaceGuid().toString(); IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() .spaceId(spaceGuid) - .addAllServiceInstanceNames(serviceInstanceNames) + .addAllServiceInstanceNames( + serviceInstanceNames) .page(page) .build(); return PaginationUtils.requestClientV3Resources(page -> delegate.serviceInstancesV3() @@ -1113,7 +1127,8 @@ public List getServiceInstancesWithoutAuxiliaryContentByNa public List getServiceInstancesByMetadataLabelSelector(String labelSelector) { IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() .labelSelector(labelSelector) - .spaceId(getTargetSpaceGuid().toString()) + .spaceId( + getTargetSpaceGuid().toString()) .page(page) .build(); @@ -1125,7 +1140,8 @@ public List getServiceInstancesByMetadataLabelSelector(Str public List getServiceInstancesWithoutAuxiliaryContentByMetadataLabelSelector(String labelSelector) { IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() .labelSelector(labelSelector) - .spaceId(getTargetSpaceGuid().toString()) + .spaceId( + getTargetSpaceGuid().toString()) .page(page) .build(); @@ -1480,7 +1496,8 @@ public void bindDropletToApp(UUID dropletGuid, UUID applicationGuid) { public DropletInfo getCurrentDropletForApplication(UUID applicationGuid) { GetApplicationCurrentDropletResponse dropletResponse = delegate.applicationsV3() .getCurrentDroplet(GetApplicationCurrentDropletRequest.builder() - .applicationId(applicationGuid.toString()) + .applicationId( + applicationGuid.toString()) .build()) .block(); if (dropletResponse == null) { @@ -1513,7 +1530,8 @@ public List getPackagesForApplication(UUID applicationGuid) { private Flux getPackages(String applicationGuid) { IntFunction pageRequestSupplier = page -> ListApplicationPackagesRequest.builder() .page(page) - .applicationId(applicationGuid) + .applicationId( + applicationGuid) .build(); return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() .listPackages(pageRequestSupplier.apply(page))); @@ -1528,7 +1546,8 @@ public Set getUserRolesBySpaceAndUser(UUID spaceGuid, UUID userGuid) { public CloudPackage createDockerPackage(UUID applicationGuid, DockerInfo dockerInfo) { org.cloudfoundry.client.v3.packages.DockerData.Builder dockerDataBuilder = org.cloudfoundry.client.v3.packages.DockerData.builder() - .image(dockerInfo.getImage()); + .image( + dockerInfo.getImage()); if (dockerInfo.getCredentials() != null) { addNonNullDockerCredentials(dockerInfo.getCredentials(), dockerDataBuilder); } @@ -1632,7 +1651,8 @@ private Mono getServiceInstanceByGuid(UUID serviceIns private Mono getServiceInstanceResourceByName(String name) { IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() - .spaceId(getTargetSpaceGuid().toString()) + .spaceId( + getTargetSpaceGuid().toString()) .serviceInstanceName(name) .page(page) .build(); @@ -1654,14 +1674,18 @@ private Mono> zipWithAuxiliaryServiceInstanceCon .getId(); return getServicePlanResource(servicePlanGuid, - serviceInstanceResource.getName()).zipWhen(servicePlan -> getServiceOffering(servicePlan.getRelationships() - .getServiceOffering() - .getData() - .getId())) + serviceInstanceResource.getName()).zipWhen( + servicePlan -> getServiceOffering(servicePlan.getRelationships() + .getServiceOffering() + .getData() + .getId())) .map(tuple -> ImmutableRawCloudServiceInstance.builder() - .resource(serviceInstanceResource) - .servicePlan(tuple.getT1()) - .serviceOffering(tuple.getT2()) + .resource( + serviceInstanceResource) + .servicePlan( + tuple.getT1()) + .serviceOffering( + tuple.getT2()) .build()); } @@ -1671,8 +1695,10 @@ private boolean isUserProvided(ServiceInstanceResource serviceInstanceResource) private Flux getServiceBindingResourcesByServiceInstanceGuid(UUID serviceInstanceGuid) { IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() - .serviceInstanceId(serviceInstanceGuid.toString()) - .type(ServiceBindingType.APPLICATION) + .serviceInstanceId( + serviceInstanceGuid.toString()) + .type( + ServiceBindingType.APPLICATION) .page(page) .build(); return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBindingsV3() @@ -1680,10 +1706,12 @@ private Flux getServiceBindingResourcesByServi } private Mono - getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(UUID applicationGuid, UUID serviceInstanceGuid) { + getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(UUID applicationGuid, UUID serviceInstanceGuid) { IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() - .applicationId(applicationGuid.toString()) - .serviceInstanceId(serviceInstanceGuid.toString()) + .applicationId( + applicationGuid.toString()) + .serviceInstanceId( + serviceInstanceGuid.toString()) .page(page) .build(); return getApplicationServiceBindingResources(pageRequestSupplier).singleOrEmpty(); @@ -1691,14 +1719,15 @@ private Flux getServiceBindingResourcesByServi private Flux getServiceBindingResourcesByApplicationGuid(UUID applicationGuid) { IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() - .applicationId(applicationGuid.toString()) + .applicationId( + applicationGuid.toString()) .page(page) .build(); return getApplicationServiceBindingResources(pageRequestSupplier); } private Flux - getApplicationServiceBindingResources(IntFunction pageRequestSupplier) { + getApplicationServiceBindingResources(IntFunction pageRequestSupplier) { return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBindingsV3() .list(pageRequestSupplier.apply(page))); } @@ -1844,7 +1873,8 @@ private Mono getBuildResource(UUID buildGuid) { private Flux getBuildResourcesByApplicationGuid(UUID applicationGuid) { IntFunction pageRequestSupplier = page -> ListApplicationBuildsRequest.builder() - .applicationId(applicationGuid.toString()) + .applicationId( + applicationGuid.toString()) .page(page) .build(); return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() @@ -1927,8 +1957,10 @@ private UUID doAddRoute(UUID domainGuid, String host, String path) { .host(host) .path(path) .relationships(RouteRelationships.builder() - .domain(buildToOneRelationship(domainGuid)) - .space(buildToOneRelationship(getTargetSpaceGuid())) + .domain(buildToOneRelationship( + domainGuid)) + .space(buildToOneRelationship( + getTargetSpaceGuid())) .build()) .build()) .block(); @@ -1940,7 +1972,8 @@ private void doCreateDomain(String name) { .create(CreateDomainRequest.builder() .name(name) .relationships(DomainRelationships.builder() - .organization(buildToOneRelationship(getTargetOrganizationGuid())) + .organization( + buildToOneRelationship(getTargetOrganizationGuid())) .build()) .build()) .block(); @@ -2040,7 +2073,8 @@ private Flux getPrivateDomainResources() { private Flux getDomainResourcesByOrganizationGuid(UUID organizationGuid) { IntFunction pageRequestSupplier = page -> ListOrganizationDomainsRequest.builder() - .organizationId(organizationGuid.toString()) + .organizationId( + organizationGuid.toString()) .page(page) .build(); return PaginationUtils.requestClientV3Resources(page -> delegate.organizationsV3() @@ -2097,7 +2131,8 @@ private Flux getRouteResourcesByDomainGuidHostAndPath(UUID domain private Flux getRouteResourcesByAppGuid(UUID applicationGuid) { IntFunction pageSupplier = page -> ListApplicationRoutesRequest.builder() - .applicationId(applicationGuid.toString()) + .applicationId( + applicationGuid.toString()) .page(page) .build(); return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3() @@ -2123,7 +2158,8 @@ private List findServiceOfferingsByLabelAndBrokerName(Stri private Flux getServiceResources() { IntFunction pageRequestSupplier = page -> ListServiceOfferingsRequest.builder() - .spaceId(getTargetSpaceGuid().toString()) + .spaceId( + getTargetSpaceGuid().toString()) .page(page) .build(); return getServiceResources(pageRequestSupplier); @@ -2138,8 +2174,9 @@ protected Mono getServiceOffering(String offeringId) .onErrorMap(t -> doesErrorMatchStatusCode(t, HttpStatus.FORBIDDEN), t -> new CloudOperationException(HttpStatus.FORBIDDEN, HttpStatus.FORBIDDEN.getReasonPhrase(), - MessageFormat.format(Messages.SERVICE_OFFERING_WITH_GUID_0_IS_NOT_AVAILABLE, - offeringId), + MessageFormat.format( + Messages.SERVICE_OFFERING_WITH_GUID_0_IS_NOT_AVAILABLE, + offeringId), t)) .onErrorMap(t -> doesErrorMatchStatusCode(t, HttpStatus.NOT_FOUND), t -> new CloudOperationException(HttpStatus.NOT_FOUND, @@ -2151,8 +2188,10 @@ protected Mono getServiceOffering(String offeringId) private Flux getServiceResourcesByBrokerGuid(UUID brokerGuid) { IntFunction pageRequestSupplier = page -> ListServiceOfferingsRequest.builder() - .serviceBrokerId(brokerGuid.toString()) - .spaceId(getTargetSpaceGuid().toString()) + .serviceBrokerId( + brokerGuid.toString()) + .spaceId( + getTargetSpaceGuid().toString()) .page(page) .build(); return getServiceResources(pageRequestSupplier); @@ -2161,7 +2200,8 @@ private Flux getServiceResourcesByBrokerGuid( private Flux getServiceResourcesByLabel(String label) { IntFunction pageRequestSupplier = page -> ListServiceOfferingsRequest.builder() .name(label) - .spaceId(getTargetSpaceGuid().toString()) + .spaceId( + getTargetSpaceGuid().toString()) .page(page) .build(); return getServiceResources(pageRequestSupplier); @@ -2171,7 +2211,8 @@ private Flux getServiceResourcesByLabelAndBro IntFunction pageRequestSupplier = page -> ListServiceOfferingsRequest.builder() .name(label) .serviceBrokerName(brokerName) - .spaceId(getTargetSpaceGuid().toString()) + .spaceId( + getTargetSpaceGuid().toString()) .page(page) .build(); return getServiceResources(pageRequestSupplier); @@ -2186,7 +2227,8 @@ private Mono> zipWithAuxiliaryServiceOfferingCon UUID serviceOfferingGuid = getGuid(serviceOffering); return getServicePlansFlux(serviceOfferingGuid).collectList() .map(servicePlans -> ImmutableRawCloudServiceOffering.builder() - .serviceOffering(serviceOffering) + .serviceOffering( + serviceOffering) .servicePlans(servicePlans) .build()); } @@ -2205,8 +2247,9 @@ protected Mono getServicePlanResource(String servicePlanG .onErrorMap(t -> doesErrorMatchStatusCode(t, HttpStatus.FORBIDDEN), t -> new CloudOperationException(HttpStatus.FORBIDDEN, HttpStatus.FORBIDDEN.getReasonPhrase(), - MessageFormat.format(Messages.SERVICE_PLAN_WITH_GUID_0_NOT_AVAILABLE_FOR_SERVICE_INSTANCE_1, - servicePlanGuid, serviceInstanceName), + MessageFormat.format( + Messages.SERVICE_PLAN_WITH_GUID_0_NOT_AVAILABLE_FOR_SERVICE_INSTANCE_1, + servicePlanGuid, serviceInstanceName), t)) .onErrorMap(t -> doesErrorMatchStatusCode(t, HttpStatus.NOT_FOUND), t -> new CloudOperationException(HttpStatus.NOT_FOUND, @@ -2218,7 +2261,8 @@ protected Mono getServicePlanResource(String servicePlanG private Flux getServicePlanResourcesByServiceOfferingGuid(UUID serviceOfferingGuid) { IntFunction pageRequestSupplier = page -> ListServicePlansRequest.builder() - .serviceOfferingId(serviceOfferingGuid.toString()) + .serviceOfferingId( + serviceOfferingGuid.toString()) .page(page) .build(); return PaginationUtils.requestClientV3Resources(page -> delegate.servicePlansV3() @@ -2232,7 +2276,8 @@ private Flux getServiceKeyResource(CloudServic private Flux getServiceKeyResourcesByServiceInstanceGuid(UUID serviceInstanceGuid) { IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder() - .serviceInstanceId(serviceInstanceGuid.toString()) + .serviceInstanceId( + serviceInstanceGuid.toString()) .type(ServiceBindingType.KEY) .page(page) .build(); @@ -2362,7 +2407,8 @@ private UUID getRequiredApplicationGuid(String name) { private Mono getServiceInstanceByName(String name) { IntFunction pageRequestSupplier = page -> ListServiceInstancesRequest.builder() - .spaceId(getTargetSpaceGuid().toString()) + .spaceId( + getTargetSpaceGuid().toString()) .serviceInstanceName(name) .page(page) .build(); @@ -2471,8 +2517,7 @@ private UUID getGuid(Resource resource) { } private boolean doesErrorMatchStatusCode(Throwable t, HttpStatus status) { - if (t instanceof AbstractCloudFoundryException) { - AbstractCloudFoundryException e = (AbstractCloudFoundryException) t; + if (t instanceof AbstractCloudFoundryException e) { return e.getStatusCode() == status.value(); } return false; diff --git a/src/test/java/com/sap/cloudfoundry/client/facade/ApplicationsCloudControllerClientIntegrationTest.java b/src/test/java/com/sap/cloudfoundry/client/facade/ApplicationsCloudControllerClientIntegrationTest.java index 4cc219d51..3f77206d0 100644 --- a/src/test/java/com/sap/cloudfoundry/client/facade/ApplicationsCloudControllerClientIntegrationTest.java +++ b/src/test/java/com/sap/cloudfoundry/client/facade/ApplicationsCloudControllerClientIntegrationTest.java @@ -1,21 +1,5 @@ package com.sap.cloudfoundry.client.facade; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.APPLICATION_HOST; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.DEFAULT_DOMAIN; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.DISK_IN_MB; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.HEALTH_CHECK_ENDPOINT; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.HEALTH_CHECK_TIMEMOUT; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.JAVA_BUILDPACK; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.MEMORY_IN_MB; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.NODEJS_BUILDPACK; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.STATICFILE_APPLICATION_CONTENT; -import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.STATICFILE_BUILDPACK; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Path; @@ -25,14 +9,6 @@ import java.util.Set; import java.util.UUID; -import org.cloudfoundry.client.v3.Metadata; -import org.cloudfoundry.client.v3.processes.HealthCheckType; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.http.HttpStatus; - import com.sap.cloudfoundry.client.facade.domain.CloudApplication; import com.sap.cloudfoundry.client.facade.domain.CloudBuild; import com.sap.cloudfoundry.client.facade.domain.CloudMetadata; @@ -51,6 +27,29 @@ import com.sap.cloudfoundry.client.facade.domain.Status; import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto; import com.sap.cloudfoundry.client.facade.dto.ImmutableApplicationToCreateDto; +import org.cloudfoundry.client.v3.Metadata; +import org.cloudfoundry.client.v3.processes.HealthCheckType; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; + +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.APPLICATION_HOST; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.DEFAULT_DOMAIN; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.DISK_IN_MB; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.HEALTH_CHECK_ENDPOINT; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.HEALTH_CHECK_TIMEMOUT; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.JAVA_BUILDPACK; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.MEMORY_IN_MB; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.NODEJS_BUILDPACK; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.STATICFILE_APPLICATION_CONTENT; +import static com.sap.cloudfoundry.client.facade.IntegrationTestConstants.STATICFILE_BUILDPACK; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; class ApplicationsCloudControllerClientIntegrationTest extends CloudControllerClientIntegrationTest { @@ -160,7 +159,8 @@ void updateApplicationHealthcheckType() { delegate.applicationsV2() .update(org.cloudfoundry.client.v2.applications.UpdateApplicationRequest.builder() .applicationId(applicationGuid.toString()) - .healthCheckType(HealthCheckType.NONE.getValue()) + .healthCheckType( + HealthCheckType.NONE.getValue()) .build()) .block(); CloudProcess cloudProcess = client.getApplicationProcess(applicationGuid); diff --git a/src/test/java/com/sap/cloudfoundry/client/facade/CloudControllerClientIntegrationTest.java b/src/test/java/com/sap/cloudfoundry/client/facade/CloudControllerClientIntegrationTest.java index c90dc77c8..20bf66456 100644 --- a/src/test/java/com/sap/cloudfoundry/client/facade/CloudControllerClientIntegrationTest.java +++ b/src/test/java/com/sap/cloudfoundry/client/facade/CloudControllerClientIntegrationTest.java @@ -1,7 +1,5 @@ package com.sap.cloudfoundry.client.facade; -import static org.junit.jupiter.api.Assertions.assertNotNull; - import java.net.MalformedURLException; import java.net.URI; import java.net.URL; @@ -9,12 +7,6 @@ import java.util.HashMap; import java.util.Map; -import org.cloudfoundry.client.CloudFoundryClient; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.TestInfo; - import com.sap.cloudfoundry.client.facade.adapters.ImmutableCloudFoundryClientFactory; import com.sap.cloudfoundry.client.facade.domain.CloudSpace; import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; @@ -23,6 +15,13 @@ import com.sap.cloudfoundry.client.facade.domain.Staging; import com.sap.cloudfoundry.client.facade.rest.CloudSpaceClient; import com.sap.cloudfoundry.client.facade.util.RestUtil; +import org.cloudfoundry.client.CloudFoundryClient; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInfo; + +import static org.junit.jupiter.api.Assertions.assertNotNull; abstract class CloudControllerClientIntegrationTest { @@ -75,8 +74,8 @@ protected Lifecycle createLifecycle(Staging staging) { // Default to BUILDPACK if lifecycleType is null LifecycleType lifecycleType = staging.getLifecycleType() != null - ? staging.getLifecycleType() - : LifecycleType.BUILDPACK; + ? staging.getLifecycleType() + : LifecycleType.BUILDPACK; return ImmutableLifecycle.builder() .type(lifecycleType) diff --git a/src/test/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplicationTest.java b/src/test/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplicationTest.java index bb1fd8950..8ec2510ce 100644 --- a/src/test/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplicationTest.java +++ b/src/test/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplicationTest.java @@ -3,6 +3,11 @@ import java.util.List; import java.util.Map; +import com.sap.cloudfoundry.client.facade.domain.CloudApplication; +import com.sap.cloudfoundry.client.facade.domain.CloudSpace; +import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; +import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudSpace; +import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; import org.cloudfoundry.client.v3.BuildpackData; import org.cloudfoundry.client.v3.DockerData; import org.cloudfoundry.client.v3.Lifecycle; @@ -11,12 +16,6 @@ import org.cloudfoundry.client.v3.applications.ApplicationState; import org.junit.jupiter.api.Test; -import com.sap.cloudfoundry.client.facade.domain.CloudApplication; -import com.sap.cloudfoundry.client.facade.domain.CloudSpace; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudApplication; -import com.sap.cloudfoundry.client.facade.domain.ImmutableCloudSpace; -import com.sap.cloudfoundry.client.facade.domain.ImmutableLifecycle; - class RawCloudApplicationTest { private static final String STATE = "STARTED"; From f02b5e157302125be148f71014d783d5a624af04 Mon Sep 17 00:00:00 2001 From: Stefan Yonkov Date: Fri, 6 Jun 2025 11:57:03 +0300 Subject: [PATCH 3/4] Changes on comments --- .../java/com/sap/cloudfoundry/client/facade/Messages.java | 2 ++ .../client/facade/rest/CloudControllerRestClientImpl.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/Messages.java b/src/main/java/com/sap/cloudfoundry/client/facade/Messages.java index 6841acc09..288c4429f 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/Messages.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/Messages.java @@ -25,4 +25,6 @@ private Messages() { public static final String SERVICE_OFFERING_WITH_GUID_0_NOT_FOUND = "Service offering with guid \"{0}\" not found."; public static final String FAILED_TO_FETCH_APP_LOGS_FOR_APP = "Failed to fetch app logs for app: %s"; + public static final String BUILDPACKS_ARE_REQUIRED_FOR_CNB_LIFECYCLE_TYPE = "Buildpacks are required for CNB lifecycle type."; + } diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java b/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java index 36d09e17f..384f02899 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/rest/CloudControllerRestClientImpl.java @@ -345,8 +345,8 @@ private Lifecycle createDockerLifecycle() { } private void validateLifecycleConfiguration(Staging staging, LifecycleType lifecycleType) { - if (lifecycleType == LifecycleType.CNB && staging.getBuildpacks() == null) { - throw new IllegalArgumentException("Buildpacks are required for CNB lifecycle type."); + if (lifecycleType == LifecycleType.CNB && CollectionUtils.isEmpty(staging.getBuildpacks())) { + throw new IllegalArgumentException(Messages.BUILDPACKS_ARE_REQUIRED_FOR_CNB_LIFECYCLE_TYPE); } } From 7fe62ade8614d043f8267be56a35e3c73cc1b6a0 Mon Sep 17 00:00:00 2001 From: Stefan Yonkov Date: Mon, 9 Jun 2025 10:28:26 +0300 Subject: [PATCH 4/4] Changes on comments --- .../facade/adapters/RawCloudApplication.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java b/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java index ec71ce29b..a1d31af2d 100644 --- a/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java +++ b/src/main/java/com/sap/cloudfoundry/client/facade/adapters/RawCloudApplication.java @@ -1,6 +1,6 @@ package com.sap.cloudfoundry.client.facade.adapters; -import java.util.HashMap; +import java.util.Collections; import java.util.Map; import com.sap.cloudfoundry.client.facade.domain.CloudApplication; @@ -45,12 +45,7 @@ private static CloudApplication.State parseState(ApplicationState state) { } private static Lifecycle parseLifecycle(org.cloudfoundry.client.v3.Lifecycle lifecycle) { - Map data = new HashMap<>(); - org.cloudfoundry.client.v3.LifecycleType lifecycleType = lifecycle.getType(); - - if (isBuildpackOrCnb(lifecycleType)) { - addLifecycleData(data, lifecycle.getData()); - } + Map data = extractLifecycleData(lifecycle.getData()); return ImmutableLifecycle.builder() .type(LifecycleType.valueOf(lifecycle.getType() @@ -60,18 +55,17 @@ private static Lifecycle parseLifecycle(org.cloudfoundry.client.v3.Lifecycle lif .build(); } - private static boolean isBuildpackOrCnb(org.cloudfoundry.client.v3.LifecycleType lifecycleType) { - return lifecycleType == org.cloudfoundry.client.v3.LifecycleType.BUILDPACK - || lifecycleType == org.cloudfoundry.client.v3.LifecycleType.CNB; - } - - private static void addLifecycleData(Map data, LifecycleData lifecycleData) { + private static Map extractLifecycleData(LifecycleData lifecycleData) { if (lifecycleData instanceof BuildpackData buildpackData) { - data.put(BUILDPACKS, buildpackData.getBuildpacks()); - data.put(STACK, buildpackData.getStack()); + return Map.of( + BUILDPACKS, buildpackData.getBuildpacks(), + STACK, buildpackData.getStack()); } else if (lifecycleData instanceof CnbData cnbData) { - data.put(BUILDPACKS, cnbData.getBuildpacks()); - data.put(STACK, cnbData.getStack()); + return Map.of( + BUILDPACKS, cnbData.getBuildpacks(), + STACK, cnbData.getStack()); + } else { + return Collections.emptyMap(); } }