From 8aa5fef4adad0ec8fe3938a7fdfcb5df987093e8 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Tue, 16 Dec 2025 22:05:14 +0100 Subject: [PATCH 01/16] DefaultApplications: add constructor non-reactive params --- .../_DefaultCloudFoundryOperations.java | 16 +- .../applications/DefaultApplications.java | 762 ++++++------------ .../DefaultCloudFoundryOperationsTest.java | 45 +- .../applications/DefaultApplicationsTest.java | 5 +- .../IntegrationTestConfiguration.java | 1 + 5 files changed, 274 insertions(+), 555 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/_DefaultCloudFoundryOperations.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/_DefaultCloudFoundryOperations.java index 1d21f29b2b..2b0a9996c2 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/_DefaultCloudFoundryOperations.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/_DefaultCloudFoundryOperations.java @@ -79,7 +79,7 @@ public Advanced advanced() { @Override @Value.Derived public Applications applications() { - return new DefaultApplications(getCloudFoundryClientPublisher(), getDopplerClientPublisher(), getSpaceId()); + return new DefaultApplications(getCloudFoundryClient(), getDopplerClient(), getSpaceId().block()); } @Override @@ -318,12 +318,14 @@ private static boolean hasText(CharSequence str) { private static Flux requestOrganizations(Mono cloudFoundryClientPublisher, String organization) { return cloudFoundryClientPublisher - .flatMapMany(cloudFoundryClient -> PaginationUtils - .requestClientV3Resources(page -> cloudFoundryClient.organizationsV3() - .list(ListOrganizationsRequest.builder() - .name(organization) - .page(page) - .build()))); + .flatMapMany(cloudFoundryClient -> PaginationUtils + .requestClientV3Resources(page -> cloudFoundryClient.organizationsV3() + .list(ListOrganizationsRequest.builder() + .name(organization) + .page(page) + .build()) + ) + ); } private static Flux requestSpaces(Mono cloudFoundryClientPublisher, String organizationId, String space) { diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index e51ddbb472..b670f2c70b 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -19,7 +19,6 @@ import static org.cloudfoundry.client.v3.LifecycleType.BUILDPACK; import static org.cloudfoundry.util.DelayUtils.exponentialBackOff; import static org.cloudfoundry.util.tuple.TupleUtils.function; -import static org.cloudfoundry.util.tuple.TupleUtils.predicate; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -210,26 +209,35 @@ public final class DefaultApplications implements Applications { private static final String APP_FEATURE_SSH = "ssh"; - private final Mono cloudFoundryClient; + private final CloudFoundryClient cloudFoundryClient; - private final Mono dopplerClient; + private final DopplerClient dopplerClient; private final RandomWords randomWords; - private final Mono spaceId; + private final String spaceId; + public DefaultApplications( + CloudFoundryClient cloudFoundryClient, DopplerClient dopplerClient, String spaceId) { + this(cloudFoundryClient, dopplerClient, new WordListRandomWords(), spaceId); + } + + /** + * @deprecated Please use {@link DefaultApplications(CloudFoundryClient, DopplerClient, String)} instead. + */ + @Deprecated public DefaultApplications( Mono cloudFoundryClient, Mono dopplerClient, Mono spaceId) { - this(cloudFoundryClient, dopplerClient, new WordListRandomWords(), spaceId); + this(cloudFoundryClient.block(), dopplerClient.block(), spaceId.block()); } DefaultApplications( - Mono cloudFoundryClient, - Mono dopplerClient, + CloudFoundryClient cloudFoundryClient, + DopplerClient dopplerClient, RandomWords randomWords, - Mono spaceId) { + String spaceId) { this.cloudFoundryClient = cloudFoundryClient; this.dopplerClient = dopplerClient; this.randomWords = randomWords; @@ -238,74 +246,49 @@ public DefaultApplications( @Override public Mono copySource(CopySourceApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationId( - cloudFoundryClient, - request.getName(), - spaceId), - getApplicationIdFromOrgSpace( - cloudFoundryClient, - request.getTargetName(), - spaceId, - request.getTargetOrganization(), - request.getTargetSpace())))) + return Mono.zip( + getApplicationId(this.cloudFoundryClient, request.getName(), spaceId), + getApplicationIdFromOrgSpace( + cloudFoundryClient, + request.getTargetName(), + spaceId, + request.getTargetOrganization(), + request.getTargetSpace())) .flatMap( function( - (cloudFoundryClient, sourceApplicationId, targetApplicationId) -> + (sourceApplicationId, targetApplicationId) -> copyBits( cloudFoundryClient, request.getStagingTimeout(), sourceApplicationId, targetApplicationId) - .thenReturn( - Tuples.of( - cloudFoundryClient, - targetApplicationId)))) + .thenReturn(targetApplicationId))) .filter( - predicate( - (cloudFoundryClient, targetApplicationId) -> - Optional.ofNullable(request.getRestart()).orElse(false))) + targetApplicationId -> + Optional.ofNullable(request.getRestart()).orElse(false)) .flatMap( - function( - (cloudFoundryClient, targetApplicationId) -> - restartApplication( - cloudFoundryClient, - request.getTargetName(), - targetApplicationId, - request.getStagingTimeout(), - request.getStartupTimeout()))) + targetApplicationId -> + restartApplication( + cloudFoundryClient, + request.getTargetName(), + targetApplicationId, + request.getStagingTimeout(), + request.getStartupTimeout())) .transform(OperationsLogging.log("Copy Application Source")) .checkpoint(); } @Override public Mono delete(DeleteApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) + return getRoutesAndApplicationId( + cloudFoundryClient, + request, + spaceId, + Optional.ofNullable(request.getDeleteRoutes()).orElse(false)) + .map(function((routes, applicationId) -> Tuples.of(routes, applicationId))) .flatMap( function( - (cloudFoundryClient, spaceId) -> - getRoutesAndApplicationId( - cloudFoundryClient, - request, - spaceId, - Optional.ofNullable( - request.getDeleteRoutes()) - .orElse(false)) - .map( - function( - (routes, applicationId) -> - Tuples.of( - cloudFoundryClient, - routes, - applicationId))))) - .flatMap( - function( - (cloudFoundryClient, routes, applicationId) -> + (routes, applicationId) -> deleteRoutes( cloudFoundryClient, request.getCompletionTimeout(), @@ -322,32 +305,13 @@ public Mono delete(DeleteApplicationRequest request) { @Override public Mono disableSsh(DisableApplicationSshRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdV3( - cloudFoundryClient, - request.getName(), - spaceId)))) - .flatMap( - function( - (cloudFoundryClient, applicationId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - Mono.just(applicationId), - getSshEnabled(cloudFoundryClient, applicationId)))) - .filter( - predicate( - (cloudFoundryClient, applicationId, sshEnabled) -> - sshEnabled.equals(true))) + return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) + // TODO dgarnier: is this correct? + .filterWhen(applicationId -> getSshEnabled(cloudFoundryClient, applicationId)) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - requestUpdateApplicationSsh( - cloudFoundryClient, applicationId, false))) + applicationId -> + requestUpdateApplicationSsh( + cloudFoundryClient, applicationId, false)) .then() .transform(OperationsLogging.log("Disable Application SSH")) .checkpoint(); @@ -355,32 +319,15 @@ public Mono disableSsh(DisableApplicationSshRequest request) { @Override public Mono enableSsh(EnableApplicationSshRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdV3( - cloudFoundryClient, - request.getName(), - spaceId)))) - .flatMap( - function( - (cloudFoundryClient, applicationId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - Mono.just(applicationId), - getSshEnabled(cloudFoundryClient, applicationId)))) - .filter( - predicate( - (cloudFoundryClient, applicationId, sshEnabled) -> - sshEnabled.equals(false))) + return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) + .filterWhen( + applicationId -> + getSshEnabled(cloudFoundryClient, applicationId) + .map(enabled -> !enabled)) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - requestUpdateApplicationSsh( - cloudFoundryClient, applicationId, true))) + applicationId -> + requestUpdateApplicationSsh( + cloudFoundryClient, applicationId, true)) .then() .transform(OperationsLogging.log("Enable Application SSH")) .checkpoint(); @@ -388,52 +335,32 @@ public Mono enableSsh(EnableApplicationSshRequest request) { @Override public Mono get(GetApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplication( - cloudFoundryClient, - request.getName(), - spaceId)))) - .flatMap(function(DefaultApplications::getAuxiliaryContent)) + return getApplication(cloudFoundryClient, request.getName(), spaceId) + .flatMap(app -> getAuxiliaryContent(cloudFoundryClient, app)) .map(function(DefaultApplications::toApplicationDetail)) .transform(OperationsLogging.log("Get Application")) .checkpoint(); } + // TODO dgarnier: manifest v3? @Override public Mono getApplicationManifest(GetApplicationManifestRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationId( - cloudFoundryClient, - request.getName(), - spaceId)))) + return getApplicationId(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - Mono.just(applicationId), - requestApplicationSummary( - cloudFoundryClient, applicationId)))) + applicationId -> + Mono.zip( + Mono.just(applicationId), + requestApplicationSummary( + cloudFoundryClient, applicationId))) .flatMap( function( - (cloudFoundryClient, applicationId, response) -> + (applicationId, summary) -> Mono.zip( getApplicationBuildpacks( cloudFoundryClient, applicationId), - Mono.just(response), + Mono.just(summary), getStackName( - cloudFoundryClient, - response.getStackId())))) + cloudFoundryClient, summary.getStackId())))) .flatMap(function(DefaultApplications::toApplicationManifest)) .transform(OperationsLogging.log("Get Application Manifest")) .checkpoint(); @@ -442,17 +369,10 @@ public Mono getApplicationManifest(GetApplicationManifestRe @Override public Mono getEnvironments( GetApplicationEnvironmentsRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) + return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdV3( - cloudFoundryClient, - request.getName(), - spaceId)))) - .flatMap(function(DefaultApplications::requestApplicationEnvironment)) + applicationId -> + requestApplicationEnvironment(cloudFoundryClient, applicationId)) .map(DefaultApplications::toApplicationEnvironments) .transform(OperationsLogging.log("Get Application Environments")) .checkpoint(); @@ -460,26 +380,13 @@ public Mono getEnvironments( @Override public Flux getEvents(GetApplicationEventsRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationId( - cloudFoundryClient, - request.getName(), - spaceId)))) + return getApplicationId(cloudFoundryClient, request.getName(), spaceId) .flatMapMany( - function( - (cloudFoundryClient, applicationId) -> - requestEvents(applicationId, cloudFoundryClient) - .take( - Optional.ofNullable( - request - .getMaxNumberOfEvents()) - .orElse( - MAX_NUMBER_OF_RECENT_EVENTS)))) + applicationId -> + requestEvents(applicationId, cloudFoundryClient) + .take( + Optional.ofNullable(request.getMaxNumberOfEvents()) + .orElse(MAX_NUMBER_OF_RECENT_EVENTS))) .map(DefaultApplications::convertToApplicationEvent) .transform(OperationsLogging.log("Get Application Events")) .checkpoint(); @@ -487,12 +394,7 @@ public Flux getEvents(GetApplicationEventsRequest request) { @Override public Mono getHealthCheck(GetApplicationHealthCheckRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - getApplication( - cloudFoundryClient, request.getName(), spaceId))) + return getApplication(cloudFoundryClient, request.getName(), spaceId) .map(DefaultApplications::toHealthCheck) .transform(OperationsLogging.log("Get Application Health Check")) .checkpoint(); @@ -500,8 +402,7 @@ public Mono getHealthCheck(GetApplicationHealthCheckRequ @Override public Flux list() { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap(function(DefaultApplications::requestSpaceSummary)) + return requestSpaceSummary(cloudFoundryClient, spaceId) .flatMapMany(DefaultApplications::extractApplications) .map(DefaultApplications::toApplicationSummary) .transform(OperationsLogging.log("List Applications")) @@ -510,20 +411,8 @@ public Flux list() { @Override public Flux listTasks(ListApplicationTasksRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdV3( - cloudFoundryClient, - request.getName(), - spaceId)))) - .flatMapMany( - function( - (cloudFoundryClient, applicationId) -> - requestListTasks(cloudFoundryClient, applicationId))) + return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) + .flatMapMany(applicationId -> requestListTasks(cloudFoundryClient, applicationId)) .map(DefaultApplications::toTask) .transform(OperationsLogging.log("List Application Tasks")) .checkpoint(); @@ -531,12 +420,7 @@ public Flux listTasks(ListApplicationTasksRequest request) { @Override public Flux logs(LogsRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - getApplicationId( - cloudFoundryClient, request.getName(), spaceId))) + return getApplicationId(cloudFoundryClient, request.getName(), spaceId) .flatMapMany( applicationId -> getLogs(this.dopplerClient, applicationId, request.getRecent())) @@ -610,55 +494,41 @@ public Mono push(PushApplicationRequest request) { .checkpoint(); } + // TODO dgarnier: pass orgId to constructor? @Override public Mono pushManifest(PushApplicationManifestRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getSpaceOrganizationId(cloudFoundryClient, spaceId), - Mono.just(spaceId)))) - .flatMap( - function( - (cloudFoundryClient, organizationId, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - listAvailableDomains( - cloudFoundryClient, organizationId), - Mono.just(spaceId)))) + return getSpaceOrganizationId(cloudFoundryClient, spaceId) + .flatMap(organizationId -> listAvailableDomains(cloudFoundryClient, organizationId)) .flatMapMany( - function( - (cloudFoundryClient, availableDomains, spaceId) -> - Flux.fromIterable(request.getManifests()) - .flatMap( - manifest -> { - if (manifest.getPath() != null) { - return pushApplication( - cloudFoundryClient, - availableDomains, - manifest, - this.randomWords, - request, - spaceId); - } else if (!manifest.getDocker() - .getImage() - .isEmpty()) { - return pushDocker( - cloudFoundryClient, - availableDomains, - manifest, - this.randomWords, - request, - spaceId); - } else { - throw new IllegalStateException( - "One of application or" - + " dockerImage must be" - + " supplied"); - } - }))) + availableDomains -> + Flux.fromIterable(request.getManifests()) + .flatMap( + manifest -> { + if (manifest.getPath() != null) { + return pushApplication( + cloudFoundryClient, + availableDomains, + manifest, + this.randomWords, + request, + spaceId); + } else if (!manifest.getDocker() + .getImage() + .isEmpty()) { + return pushDocker( + cloudFoundryClient, + availableDomains, + manifest, + this.randomWords, + request, + spaceId); + } else { + throw new IllegalStateException( + "One of application or" + + " dockerImage must be" + + " supplied"); + } + })) .then() .transform(OperationsLogging.log("Push Manifest")) .checkpoint(); @@ -674,74 +544,38 @@ public Mono pushManifestV3(PushManifestV3Request request) { throw new RuntimeException("Could not serialize manifest", e); } - return Mono.zip(this.cloudFoundryClient, this.spaceId) + return applyManifestAndWaitForCompletion(cloudFoundryClient, spaceId, manifestSerialized) + .flatMapMany(ignored -> Flux.fromIterable(request.getManifest().getApplications())) .flatMap( - function( - (cloudFoundryClient, spaceId) -> - applyManifestAndWaitForCompletion( - cloudFoundryClient, - spaceId, - manifestSerialized) - .then( - Mono.just( - Tuples.of( + manifestApp -> + getApplicationIdV3( + cloudFoundryClient, manifestApp.getName(), spaceId) + .flatMap( + appId -> + Mono.zip( + Mono.just(appId), + createPackage( cloudFoundryClient, - spaceId))))) - .flatMapMany( - function( - (cloudFoundryClient, spaceId) -> - Flux.fromIterable(request.getManifest().getApplications()) - .map( - manifestApp -> - Tuples.of( + appId, + manifestApp))) + .flatMap( + function( + (appId, packageId) -> + buildAndStageAndWaitForRunning( cloudFoundryClient, - spaceId, - manifestApp)))) - .flatMap( - function( - (cloudFoundryClient, spaceId, manifestApp) -> - getApplicationIdV3( - cloudFoundryClient, - manifestApp.getName(), - spaceId) - .flatMap( - appId -> - Mono.zip( - Mono.just(appId), - createPackage( - cloudFoundryClient, - appId, - manifestApp))) - .flatMap( - function( - (appId, packageId) -> - buildAndStageAndWaitForRunning( - cloudFoundryClient, - manifestApp, - packageId, - appId))))) + manifestApp, + packageId, + appId)))) .then(); } @Override public Mono rename(RenameApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationId( - cloudFoundryClient, - request.getName(), - spaceId)))) + return getApplicationId(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - requestUpdateApplicationName( - cloudFoundryClient, - applicationId, - request.getNewName()))) + applicationId -> + requestUpdateApplicationName( + cloudFoundryClient, applicationId, request.getNewName())) .then() .transform(OperationsLogging.log("Rename Application")) .checkpoint(); @@ -749,101 +583,54 @@ public Mono rename(RenameApplicationRequest request) { @Override public Mono restage(RestageApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationId( - cloudFoundryClient, - request.getName(), - spaceId)))) + return getApplicationId(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - restageApplication( - cloudFoundryClient, - request.getName(), - applicationId, - request.getStagingTimeout(), - request.getStartupTimeout()))) + applicationId -> + restageApplication( + cloudFoundryClient, + request.getName(), + applicationId, + request.getStagingTimeout(), + request.getStartupTimeout())) .transform(OperationsLogging.log("Restage Application")) .checkpoint(); } @Override public Mono restart(RestartApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) + return getApplication(cloudFoundryClient, request.getName(), spaceId) + .flatMap(resource -> stopApplicationIfNotStopped(cloudFoundryClient, resource)) .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplication( - cloudFoundryClient, - request.getName(), - spaceId)))) - .flatMap( - function( - (cloudFoundryClient, resource) -> - Mono.zip( - Mono.just(cloudFoundryClient), - stopApplicationIfNotStopped( - cloudFoundryClient, resource)))) - .flatMap( - function( - (cloudFoundryClient, stoppedApplication) -> - startApplicationAndWait( - cloudFoundryClient, - request.getName(), - ResourceUtils.getId(stoppedApplication), - request.getStagingTimeout(), - request.getStartupTimeout()))) + stoppedApplication -> + startApplicationAndWait( + cloudFoundryClient, + request.getName(), + ResourceUtils.getId(stoppedApplication), + request.getStagingTimeout(), + request.getStartupTimeout())) .transform(OperationsLogging.log("Restart Application")) .checkpoint(); } @Override public Mono restartInstance(RestartApplicationInstanceRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationId( - cloudFoundryClient, - request.getName(), - spaceId)))) + return getApplicationId(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - requestTerminateApplicationInstance( - cloudFoundryClient, - applicationId, - String.valueOf(request.getInstanceIndex())))) + applicationId -> + requestTerminateApplicationInstance( + cloudFoundryClient, + applicationId, + String.valueOf(request.getInstanceIndex()))) .transform(OperationsLogging.log("Restart Application Instance")) .checkpoint(); } @Override public Mono runTask(RunApplicationTaskRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) + return getApplicationIdV3(cloudFoundryClient, request.getApplicationName(), spaceId) .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdV3( - cloudFoundryClient, - request.getApplicationName(), - spaceId)))) - .flatMap( - function( - (cloudFoundryClient, applicationId) -> - requestCreateTask( - cloudFoundryClient, applicationId, request))) + applicationId -> + requestCreateTask(cloudFoundryClient, applicationId, request)) .map(DefaultApplications::toTask) .transform(OperationsLogging.log("Run Application Task Instance")) .checkpoint(); @@ -851,67 +638,43 @@ public Mono runTask(RunApplicationTaskRequest request) { @Override public Mono scale(ScaleApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .filter(predicate((cloudFoundryClient, spaceId) -> areModifiersPresent(request))) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationId( - cloudFoundryClient, - request.getName(), - spaceId)))) + if (!areModifiersPresent(request)) { + return Mono.empty(); + } + return getApplicationId(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - requestUpdateApplicationScale( - cloudFoundryClient, - applicationId, - request.getDiskLimit(), - request.getInstances(), - request.getMemoryLimit())))) - .filter( - predicate( - (cloudFoundryClient, resource) -> - isRestartRequired(request, resource))) + applicationId -> + requestUpdateApplicationScale( + cloudFoundryClient, + applicationId, + request.getDiskLimit(), + request.getInstances(), + request.getMemoryLimit())) + .filter(resource -> isRestartRequired(request, resource)) .flatMap( - function( - (cloudFoundryClient, resource) -> - restartApplication( - cloudFoundryClient, - request.getName(), - ResourceUtils.getId(resource), - request.getStagingTimeout(), - request.getStartupTimeout()))) + resource -> + restartApplication( + cloudFoundryClient, + request.getName(), + ResourceUtils.getId(resource), + request.getStagingTimeout(), + request.getStartupTimeout())) .transform(OperationsLogging.log("Scale Application")) .checkpoint(); } @Override public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) + return getApplication(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplication( - cloudFoundryClient, - request.getName(), - spaceId)))) - .flatMap( - function( - (cloudFoundryClient, resource) -> - requestUpdateApplicationEnvironment( - cloudFoundryClient, - ResourceUtils.getId(resource), - addToEnvironment( - getEnvironment(resource), - request.getVariableName(), - request.getVariableValue())))) + resource -> + requestUpdateApplicationEnvironment( + cloudFoundryClient, + ResourceUtils.getId(resource), + addToEnvironment( + getEnvironment(resource), + request.getVariableName(), + request.getVariableValue()))) .then() .transform(OperationsLogging.log("Set Application Environment Variable")) .checkpoint(); @@ -919,23 +682,11 @@ public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationReques @Override public Mono setHealthCheck(SetApplicationHealthCheckRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationId( - cloudFoundryClient, - request.getName(), - spaceId)))) + return getApplicationId(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - requestUpdateApplicationHealthCheckType( - cloudFoundryClient, - applicationId, - request.getType()))) + applicationId -> + requestUpdateApplicationHealthCheckType( + cloudFoundryClient, applicationId, request.getType())) .then() .transform(OperationsLogging.log("Set Application Health Check")) .checkpoint(); @@ -943,17 +694,8 @@ public Mono setHealthCheck(SetApplicationHealthCheckRequest request) { @Override public Mono sshEnabled(ApplicationSshEnabledRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdV3( - cloudFoundryClient, - request.getName(), - spaceId)))) - .flatMap(function(DefaultApplications::getSshEnabled)) + return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) + .flatMap(applicationId -> getSshEnabled(cloudFoundryClient, applicationId)) .transform(OperationsLogging.log("Is Application SSH Enabled")) .checkpoint(); } @@ -971,44 +713,25 @@ private static Mono getSshEnabled( @Override public Mono start(StartApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdWhere( - cloudFoundryClient, - request.getName(), - spaceId, - isNotIn(STARTED_STATE))))) + return getApplicationIdWhere( + cloudFoundryClient, request.getName(), spaceId, isNotIn(STARTED_STATE)) .flatMap( - function( - (cloudFoundryClient, applicationId) -> - startApplicationAndWait( - cloudFoundryClient, - request.getName(), - applicationId, - request.getStagingTimeout(), - request.getStartupTimeout()))) + applicationId -> + startApplicationAndWait( + cloudFoundryClient, + request.getName(), + applicationId, + request.getStagingTimeout(), + request.getStartupTimeout())) .transform(OperationsLogging.log("Start Application")) .checkpoint(); } @Override public Mono stop(StopApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdWhere( - cloudFoundryClient, - request.getName(), - spaceId, - isNotIn(STOPPED_STATE))))) - .flatMap(function(DefaultApplications::stopApplication)) + return getApplicationIdWhere( + cloudFoundryClient, request.getName(), spaceId, isNotIn(STOPPED_STATE)) + .flatMap(applicationId -> stopApplication(cloudFoundryClient, applicationId)) .then() .transform(OperationsLogging.log("Stop Application")) .checkpoint(); @@ -1016,26 +739,12 @@ public Mono stop(StopApplicationRequest request) { @Override public Mono terminateTask(TerminateApplicationTaskRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) + return getApplicationIdV3(cloudFoundryClient, request.getApplicationName(), spaceId) .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplicationIdV3( - cloudFoundryClient, - request.getApplicationName(), - spaceId)))) - .flatMap( - function( - (cloudFoundryClient, applicationId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getTaskId( - cloudFoundryClient, - applicationId, - request.getSequenceId())))) - .flatMap(function(DefaultApplications::requestTerminateTask)) + applicationId -> + getTaskId( + cloudFoundryClient, applicationId, request.getSequenceId())) + .flatMap(taskId -> requestTerminateTask(cloudFoundryClient, taskId)) .then() .transform(OperationsLogging.log("Terminate Application Task Instance")) .checkpoint(); @@ -1043,25 +752,15 @@ public Mono terminateTask(TerminateApplicationTaskRequest request) { @Override public Mono unsetEnvironmentVariable(UnsetEnvironmentVariableApplicationRequest request) { - return Mono.zip(this.cloudFoundryClient, this.spaceId) - .flatMap( - function( - (cloudFoundryClient, spaceId) -> - Mono.zip( - Mono.just(cloudFoundryClient), - getApplication( - cloudFoundryClient, - request.getName(), - spaceId)))) + return getApplication(cloudFoundryClient, request.getName(), spaceId) .flatMap( - function( - (cloudFoundryClient, resource) -> - requestUpdateApplicationEnvironment( - cloudFoundryClient, - ResourceUtils.getId(resource), - removeFromEnvironment( - getEnvironment(resource), - request.getVariableName())))) + resource -> + requestUpdateApplicationEnvironment( + cloudFoundryClient, + ResourceUtils.getId(resource), + removeFromEnvironment( + getEnvironment(resource), + request.getVariableName()))) .then() .transform(OperationsLogging.log("Unset Application Environment Variable")) .checkpoint(); @@ -1601,7 +1300,7 @@ private static int getInstances(AbstractApplicationResource resource) { } private static Flux getLogs( - Mono dopplerClient, String applicationId, Boolean recent) { + DopplerClient dopplerClient, String applicationId, Boolean recent) { if (Optional.ofNullable(recent).orElse(false)) { return requestLogsRecent(dopplerClient, applicationId) .filter(e -> EventType.LOG_MESSAGE == e.getEventType()) @@ -2502,19 +2201,14 @@ private static Flux requestListTasks( } private static Flux requestLogsRecent( - Mono dopplerClient, String applicationId) { - return dopplerClient.flatMapMany( - client -> - client.recentLogs( - RecentLogsRequest.builder().applicationId(applicationId).build())); + DopplerClient dopplerClient, String applicationId) { + return dopplerClient.recentLogs( + RecentLogsRequest.builder().applicationId(applicationId).build()); } private static Flux requestLogsStream( - Mono dopplerClient, String applicationId) { - return dopplerClient.flatMapMany( - client -> - client.stream( - StreamRequest.builder().applicationId(applicationId).build())); + DopplerClient dopplerClient, String applicationId) { + return dopplerClient.stream(StreamRequest.builder().applicationId(applicationId).build()); } private static Flux requestOrganizationSpacesByName( diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/DefaultCloudFoundryOperationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/DefaultCloudFoundryOperationsTest.java index 02e671a3e6..2dfa183183 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/DefaultCloudFoundryOperationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/DefaultCloudFoundryOperationsTest.java @@ -17,20 +17,45 @@ package org.cloudfoundry.operations; import static org.assertj.core.api.Assertions.assertThat; - +import static org.cloudfoundry.operations.TestObjects.fill; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import org.cloudfoundry.client.v3.organizations.ListOrganizationsResponse; +import org.cloudfoundry.client.v3.organizations.OrganizationResource; +import org.cloudfoundry.client.v3.spaces.ListSpacesResponse; +import org.cloudfoundry.client.v3.spaces.SpaceResource; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import reactor.core.publisher.Mono; final class DefaultCloudFoundryOperationsTest extends AbstractOperationsTest { - private final DefaultCloudFoundryOperations operations = - DefaultCloudFoundryOperations.builder() - .cloudFoundryClient(this.cloudFoundryClient) - .dopplerClient(this.dopplerClient) - .routingClient(this.routingClient) - .organization(TEST_ORGANIZATION_NAME) - .space(TEST_SPACE_NAME) - .uaaClient(this.uaaClient) - .build(); + private DefaultCloudFoundryOperations operations; + + @BeforeEach + void setUp() { + ListOrganizationsResponse orgsResponse = + fill(ListOrganizationsResponse.builder()) + .resource(fill(OrganizationResource.builder()).build()) + .build(); + when(this.organizationsV3.list(any())).thenReturn(Mono.just(orgsResponse)); + ListSpacesResponse spacesResponse = + fill(ListSpacesResponse.builder()) + .resource(fill(SpaceResource.builder()).build()) + .build(); + when(this.spacesV3.list(any())).thenReturn(Mono.just(spacesResponse)); + + operations = + DefaultCloudFoundryOperations.builder() + .cloudFoundryClient(this.cloudFoundryClient) + .dopplerClient(this.dopplerClient) + .routingClient(this.routingClient) + .organization(TEST_ORGANIZATION_NAME) + .space(TEST_SPACE_NAME) + .uaaClient(this.uaaClient) + .build(); + } @Test void advanced() { diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index cdc9619d2d..2398d3325d 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -161,10 +161,7 @@ final class DefaultApplicationsTest extends AbstractOperationsTest { private final DefaultApplications applications = new DefaultApplications( - Mono.just(this.cloudFoundryClient), - Mono.just(this.dopplerClient), - this.randomWords, - Mono.just(TEST_SPACE_ID)); + this.cloudFoundryClient, this.dopplerClient, this.randomWords, TEST_SPACE_ID); @Test void copySourceNoRestartOrgSpace() { diff --git a/integration-test/src/test/java/org/cloudfoundry/IntegrationTestConfiguration.java b/integration-test/src/test/java/org/cloudfoundry/IntegrationTestConfiguration.java index 36c30c3578..bc98757ffb 100644 --- a/integration-test/src/test/java/org/cloudfoundry/IntegrationTestConfiguration.java +++ b/integration-test/src/test/java/org/cloudfoundry/IntegrationTestConfiguration.java @@ -270,6 +270,7 @@ ReactorCloudFoundryClient cloudFoundryClient( } @Bean + @DependsOn({"organizationId", "spaceId"}) DefaultCloudFoundryOperations cloudFoundryOperations( CloudFoundryClient cloudFoundryClient, DopplerClient dopplerClient, From 6c4aa8fc1678a57b881e251767e76d4babb747d6 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Tue, 16 Dec 2025 22:51:19 +0100 Subject: [PATCH 02/16] DefaultApplications: remove parameter CloudFoundryClient and use this. instead --- .../applications/DefaultApplications.java | 1131 ++++++----------- 1 file changed, 393 insertions(+), 738 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index b670f2c70b..50b0fdd087 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -124,8 +124,6 @@ import org.cloudfoundry.client.v3.builds.CreateBuildResponse; import org.cloudfoundry.client.v3.builds.GetBuildRequest; import org.cloudfoundry.client.v3.builds.GetBuildResponse; -import org.cloudfoundry.client.v3.domains.DomainResource; -import org.cloudfoundry.client.v3.domains.ListDomainsRequest; import org.cloudfoundry.client.v3.packages.BitsData; import org.cloudfoundry.client.v3.packages.CreatePackageRequest; import org.cloudfoundry.client.v3.packages.CreatePackageResponse; @@ -247,9 +245,8 @@ public DefaultApplications( @Override public Mono copySource(CopySourceApplicationRequest request) { return Mono.zip( - getApplicationId(this.cloudFoundryClient, request.getName(), spaceId), + getApplicationId(request.getName(), spaceId), getApplicationIdFromOrgSpace( - cloudFoundryClient, request.getTargetName(), spaceId, request.getTargetOrganization(), @@ -258,7 +255,6 @@ public Mono copySource(CopySourceApplicationRequest request) { function( (sourceApplicationId, targetApplicationId) -> copyBits( - cloudFoundryClient, request.getStagingTimeout(), sourceApplicationId, targetApplicationId) @@ -269,7 +265,6 @@ public Mono copySource(CopySourceApplicationRequest request) { .flatMap( targetApplicationId -> restartApplication( - cloudFoundryClient, request.getTargetName(), targetApplicationId, request.getStagingTimeout(), @@ -281,37 +276,26 @@ public Mono copySource(CopySourceApplicationRequest request) { @Override public Mono delete(DeleteApplicationRequest request) { return getRoutesAndApplicationId( - cloudFoundryClient, request, spaceId, Optional.ofNullable(request.getDeleteRoutes()).orElse(false)) - .map(function((routes, applicationId) -> Tuples.of(routes, applicationId))) .flatMap( function( (routes, applicationId) -> - deleteRoutes( - cloudFoundryClient, - request.getCompletionTimeout(), - routes) - .thenReturn( - Tuples.of( - cloudFoundryClient, - applicationId)))) - .delayUntil(function(DefaultApplications::removeServiceBindings)) - .flatMap(function(DefaultApplications::requestDeleteApplication)) + deleteRoutes(request.getCompletionTimeout(), routes) + .thenReturn(applicationId))) + .delayUntil(this::removeServiceBindings) + .flatMap(this::requestDeleteApplication) .transform(OperationsLogging.log("Delete Application")) .checkpoint(); } @Override public Mono disableSsh(DisableApplicationSshRequest request) { - return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) + return getApplicationIdV3(request.getName(), spaceId) // TODO dgarnier: is this correct? - .filterWhen(applicationId -> getSshEnabled(cloudFoundryClient, applicationId)) - .flatMap( - applicationId -> - requestUpdateApplicationSsh( - cloudFoundryClient, applicationId, false)) + .filterWhen(applicationId -> getSshEnabled(applicationId)) + .flatMap(applicationId -> requestUpdateApplicationSsh(applicationId, false)) .then() .transform(OperationsLogging.log("Disable Application SSH")) .checkpoint(); @@ -319,15 +303,9 @@ public Mono disableSsh(DisableApplicationSshRequest request) { @Override public Mono enableSsh(EnableApplicationSshRequest request) { - return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) - .filterWhen( - applicationId -> - getSshEnabled(cloudFoundryClient, applicationId) - .map(enabled -> !enabled)) - .flatMap( - applicationId -> - requestUpdateApplicationSsh( - cloudFoundryClient, applicationId, true)) + return getApplicationIdV3(request.getName(), spaceId) + .filterWhen(applicationId -> getSshEnabled(applicationId).map(enabled -> !enabled)) + .flatMap(applicationId -> requestUpdateApplicationSsh(applicationId, true)) .then() .transform(OperationsLogging.log("Enable Application SSH")) .checkpoint(); @@ -335,8 +313,8 @@ public Mono enableSsh(EnableApplicationSshRequest request) { @Override public Mono get(GetApplicationRequest request) { - return getApplication(cloudFoundryClient, request.getName(), spaceId) - .flatMap(app -> getAuxiliaryContent(cloudFoundryClient, app)) + return getApplication(request.getName(), spaceId) + .flatMap(app -> getAuxiliaryContent(app)) .map(function(DefaultApplications::toApplicationDetail)) .transform(OperationsLogging.log("Get Application")) .checkpoint(); @@ -345,23 +323,20 @@ public Mono get(GetApplicationRequest request) { // TODO dgarnier: manifest v3? @Override public Mono getApplicationManifest(GetApplicationManifestRequest request) { - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) + return getApplicationId(request.getName(), spaceId) .flatMap( applicationId -> Mono.zip( Mono.just(applicationId), - requestApplicationSummary( - cloudFoundryClient, applicationId))) + requestApplicationSummary(applicationId))) .flatMap( function( (applicationId, summary) -> Mono.zip( - getApplicationBuildpacks( - cloudFoundryClient, applicationId), + getApplicationBuildpacks(applicationId), Mono.just(summary), - getStackName( - cloudFoundryClient, summary.getStackId())))) - .flatMap(function(DefaultApplications::toApplicationManifest)) + getStackName(summary.getStackId())))) + .flatMap(function(this::toApplicationManifest)) .transform(OperationsLogging.log("Get Application Manifest")) .checkpoint(); } @@ -369,10 +344,8 @@ public Mono getApplicationManifest(GetApplicationManifestRe @Override public Mono getEnvironments( GetApplicationEnvironmentsRequest request) { - return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) - .flatMap( - applicationId -> - requestApplicationEnvironment(cloudFoundryClient, applicationId)) + return getApplicationIdV3(request.getName(), spaceId) + .flatMap(applicationId -> requestApplicationEnvironment(applicationId)) .map(DefaultApplications::toApplicationEnvironments) .transform(OperationsLogging.log("Get Application Environments")) .checkpoint(); @@ -380,10 +353,10 @@ public Mono getEnvironments( @Override public Flux getEvents(GetApplicationEventsRequest request) { - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) + return getApplicationId(request.getName(), spaceId) .flatMapMany( applicationId -> - requestEvents(applicationId, cloudFoundryClient) + requestEvents(applicationId) .take( Optional.ofNullable(request.getMaxNumberOfEvents()) .orElse(MAX_NUMBER_OF_RECENT_EVENTS))) @@ -394,7 +367,7 @@ public Flux getEvents(GetApplicationEventsRequest request) { @Override public Mono getHealthCheck(GetApplicationHealthCheckRequest request) { - return getApplication(cloudFoundryClient, request.getName(), spaceId) + return getApplication(request.getName(), spaceId) .map(DefaultApplications::toHealthCheck) .transform(OperationsLogging.log("Get Application Health Check")) .checkpoint(); @@ -402,7 +375,7 @@ public Mono getHealthCheck(GetApplicationHealthCheckRequ @Override public Flux list() { - return requestSpaceSummary(cloudFoundryClient, spaceId) + return requestSpaceSummary(spaceId) .flatMapMany(DefaultApplications::extractApplications) .map(DefaultApplications::toApplicationSummary) .transform(OperationsLogging.log("List Applications")) @@ -411,8 +384,8 @@ public Flux list() { @Override public Flux listTasks(ListApplicationTasksRequest request) { - return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) - .flatMapMany(applicationId -> requestListTasks(cloudFoundryClient, applicationId)) + return getApplicationIdV3(request.getName(), spaceId) + .flatMapMany(applicationId -> requestListTasks(applicationId)) .map(DefaultApplications::toTask) .transform(OperationsLogging.log("List Application Tasks")) .checkpoint(); @@ -420,10 +393,8 @@ public Flux listTasks(ListApplicationTasksRequest request) { @Override public Flux logs(LogsRequest request) { - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) - .flatMapMany( - applicationId -> - getLogs(this.dopplerClient, applicationId, request.getRecent())) + return getApplicationId(request.getName(), spaceId) + .flatMapMany(applicationId -> getLogs(applicationId, request.getRecent())) .transform(OperationsLogging.log("Get Application Logs")) .checkpoint(); } @@ -497,8 +468,8 @@ public Mono push(PushApplicationRequest request) { // TODO dgarnier: pass orgId to constructor? @Override public Mono pushManifest(PushApplicationManifestRequest request) { - return getSpaceOrganizationId(cloudFoundryClient, spaceId) - .flatMap(organizationId -> listAvailableDomains(cloudFoundryClient, organizationId)) + return getSpaceOrganizationId(spaceId) + .flatMap(organizationId -> listAvailableDomains(organizationId)) .flatMapMany( availableDomains -> Flux.fromIterable(request.getManifests()) @@ -506,7 +477,6 @@ public Mono pushManifest(PushApplicationManifestRequest request) { manifest -> { if (manifest.getPath() != null) { return pushApplication( - cloudFoundryClient, availableDomains, manifest, this.randomWords, @@ -516,7 +486,6 @@ public Mono pushManifest(PushApplicationManifestRequest request) { .getImage() .isEmpty()) { return pushDocker( - cloudFoundryClient, availableDomains, manifest, this.randomWords, @@ -544,25 +513,20 @@ public Mono pushManifestV3(PushManifestV3Request request) { throw new RuntimeException("Could not serialize manifest", e); } - return applyManifestAndWaitForCompletion(cloudFoundryClient, spaceId, manifestSerialized) + return applyManifestAndWaitForCompletion(spaceId, manifestSerialized) .flatMapMany(ignored -> Flux.fromIterable(request.getManifest().getApplications())) .flatMap( manifestApp -> - getApplicationIdV3( - cloudFoundryClient, manifestApp.getName(), spaceId) + getApplicationIdV3(manifestApp.getName(), spaceId) .flatMap( appId -> Mono.zip( Mono.just(appId), - createPackage( - cloudFoundryClient, - appId, - manifestApp))) + createPackage(appId, manifestApp))) .flatMap( function( (appId, packageId) -> buildAndStageAndWaitForRunning( - cloudFoundryClient, manifestApp, packageId, appId)))) @@ -571,11 +535,10 @@ public Mono pushManifestV3(PushManifestV3Request request) { @Override public Mono rename(RenameApplicationRequest request) { - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) + return getApplicationId(request.getName(), spaceId) .flatMap( applicationId -> - requestUpdateApplicationName( - cloudFoundryClient, applicationId, request.getNewName())) + requestUpdateApplicationName(applicationId, request.getNewName())) .then() .transform(OperationsLogging.log("Rename Application")) .checkpoint(); @@ -583,11 +546,10 @@ public Mono rename(RenameApplicationRequest request) { @Override public Mono restage(RestageApplicationRequest request) { - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) + return getApplicationId(request.getName(), spaceId) .flatMap( applicationId -> restageApplication( - cloudFoundryClient, request.getName(), applicationId, request.getStagingTimeout(), @@ -598,12 +560,11 @@ public Mono restage(RestageApplicationRequest request) { @Override public Mono restart(RestartApplicationRequest request) { - return getApplication(cloudFoundryClient, request.getName(), spaceId) - .flatMap(resource -> stopApplicationIfNotStopped(cloudFoundryClient, resource)) + return getApplication(request.getName(), spaceId) + .flatMap(resource -> stopApplicationIfNotStopped(resource)) .flatMap( stoppedApplication -> startApplicationAndWait( - cloudFoundryClient, request.getName(), ResourceUtils.getId(stoppedApplication), request.getStagingTimeout(), @@ -614,23 +575,19 @@ public Mono restart(RestartApplicationRequest request) { @Override public Mono restartInstance(RestartApplicationInstanceRequest request) { - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) + return getApplicationId(request.getName(), spaceId) .flatMap( applicationId -> requestTerminateApplicationInstance( - cloudFoundryClient, - applicationId, - String.valueOf(request.getInstanceIndex()))) + applicationId, String.valueOf(request.getInstanceIndex()))) .transform(OperationsLogging.log("Restart Application Instance")) .checkpoint(); } @Override public Mono runTask(RunApplicationTaskRequest request) { - return getApplicationIdV3(cloudFoundryClient, request.getApplicationName(), spaceId) - .flatMap( - applicationId -> - requestCreateTask(cloudFoundryClient, applicationId, request)) + return getApplicationIdV3(request.getApplicationName(), spaceId) + .flatMap(applicationId -> requestCreateTask(applicationId, request)) .map(DefaultApplications::toTask) .transform(OperationsLogging.log("Run Application Task Instance")) .checkpoint(); @@ -641,11 +598,10 @@ public Mono scale(ScaleApplicationRequest request) { if (!areModifiersPresent(request)) { return Mono.empty(); } - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) + return getApplicationId(request.getName(), spaceId) .flatMap( applicationId -> requestUpdateApplicationScale( - cloudFoundryClient, applicationId, request.getDiskLimit(), request.getInstances(), @@ -654,7 +610,6 @@ public Mono scale(ScaleApplicationRequest request) { .flatMap( resource -> restartApplication( - cloudFoundryClient, request.getName(), ResourceUtils.getId(resource), request.getStagingTimeout(), @@ -665,11 +620,10 @@ public Mono scale(ScaleApplicationRequest request) { @Override public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationRequest request) { - return getApplication(cloudFoundryClient, request.getName(), spaceId) + return getApplication(request.getName(), spaceId) .flatMap( resource -> requestUpdateApplicationEnvironment( - cloudFoundryClient, ResourceUtils.getId(resource), addToEnvironment( getEnvironment(resource), @@ -682,11 +636,11 @@ public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationReques @Override public Mono setHealthCheck(SetApplicationHealthCheckRequest request) { - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) + return getApplicationId(request.getName(), spaceId) .flatMap( applicationId -> requestUpdateApplicationHealthCheckType( - cloudFoundryClient, applicationId, request.getType())) + applicationId, request.getType())) .then() .transform(OperationsLogging.log("Set Application Health Check")) .checkpoint(); @@ -694,31 +648,18 @@ public Mono setHealthCheck(SetApplicationHealthCheckRequest request) { @Override public Mono sshEnabled(ApplicationSshEnabledRequest request) { - return getApplicationIdV3(cloudFoundryClient, request.getName(), spaceId) - .flatMap(applicationId -> getSshEnabled(cloudFoundryClient, applicationId)) + return getApplicationIdV3(request.getName(), spaceId) + .flatMap(applicationId -> getSshEnabled(applicationId)) .transform(OperationsLogging.log("Is Application SSH Enabled")) .checkpoint(); } - private static Mono getSshEnabled( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient - .applicationsV3() - .getSshEnabled( - GetApplicationSshEnabledRequest.builder() - .applicationId(applicationId) - .build()) - .map(GetApplicationSshEnabledResponse::getEnabled); - } - @Override public Mono start(StartApplicationRequest request) { - return getApplicationIdWhere( - cloudFoundryClient, request.getName(), spaceId, isNotIn(STARTED_STATE)) + return getApplicationIdWhere(request.getName(), spaceId, isNotIn(STARTED_STATE)) .flatMap( applicationId -> startApplicationAndWait( - cloudFoundryClient, request.getName(), applicationId, request.getStagingTimeout(), @@ -729,9 +670,8 @@ public Mono start(StartApplicationRequest request) { @Override public Mono stop(StopApplicationRequest request) { - return getApplicationIdWhere( - cloudFoundryClient, request.getName(), spaceId, isNotIn(STOPPED_STATE)) - .flatMap(applicationId -> stopApplication(cloudFoundryClient, applicationId)) + return getApplicationIdWhere(request.getName(), spaceId, isNotIn(STOPPED_STATE)) + .flatMap(applicationId -> stopApplication(applicationId)) .then() .transform(OperationsLogging.log("Stop Application")) .checkpoint(); @@ -739,12 +679,9 @@ public Mono stop(StopApplicationRequest request) { @Override public Mono terminateTask(TerminateApplicationTaskRequest request) { - return getApplicationIdV3(cloudFoundryClient, request.getApplicationName(), spaceId) - .flatMap( - applicationId -> - getTaskId( - cloudFoundryClient, applicationId, request.getSequenceId())) - .flatMap(taskId -> requestTerminateTask(cloudFoundryClient, taskId)) + return getApplicationIdV3(request.getApplicationName(), spaceId) + .flatMap(applicationId -> getTaskId(applicationId, request.getSequenceId())) + .flatMap(taskId -> requestTerminateTask(taskId)) .then() .transform(OperationsLogging.log("Terminate Application Task Instance")) .checkpoint(); @@ -752,11 +689,10 @@ public Mono terminateTask(TerminateApplicationTaskRequest request) { @Override public Mono unsetEnvironmentVariable(UnsetEnvironmentVariableApplicationRequest request) { - return getApplication(cloudFoundryClient, request.getName(), spaceId) + return getApplication(request.getName(), spaceId) .flatMap( resource -> requestUpdateApplicationEnvironment( - cloudFoundryClient, ResourceUtils.getId(resource), removeFromEnvironment( getEnvironment(resource), @@ -766,6 +702,16 @@ public Mono unsetEnvironmentVariable(UnsetEnvironmentVariableApplicationRe .checkpoint(); } + private Mono getSshEnabled(String applicationId) { + return this.cloudFoundryClient + .applicationsV3() + .getSshEnabled( + GetApplicationSshEnabledRequest.builder() + .applicationId(applicationId) + .build()) + .map(GetApplicationSshEnabledResponse::getEnabled); + } + private static Map addToEnvironment( Map environment, String variableName, Object variableValue) { return FluentMap.builder() @@ -774,9 +720,9 @@ private static Map addToEnvironment( .build(); } - private static Mono applyDropletAndWaitForRunning( - CloudFoundryClient cloudFoundryClient, String appname, String appId, String dropletId) { - return cloudFoundryClient + private Mono applyDropletAndWaitForRunning( + String appname, String appId, String dropletId) { + return this.cloudFoundryClient .applicationsV3() .setCurrentDroplet( SetApplicationCurrentDropletRequest.builder() @@ -784,19 +730,19 @@ private static Mono applyDropletAndWaitForRunning( .data(Relationship.builder().id(dropletId).build()) .build()) .then( - cloudFoundryClient + this.cloudFoundryClient .applicationsV3() .restart( org.cloudfoundry.client.v3.applications .RestartApplicationRequest.builder() .applicationId(appId) .build())) - .then(waitForRunningV3(cloudFoundryClient, appname, appId, null)); + .then(waitForRunningV3(appname, appId, null)); } - private static Mono applyManifestAndWaitForCompletion( - CloudFoundryClient cloudFoundryClient, String spaceId, byte[] manifestSerialized) { - return cloudFoundryClient + private Mono applyManifestAndWaitForCompletion( + String spaceId, byte[] manifestSerialized) { + return this.cloudFoundryClient .spacesV3() .applyManifest( ApplyManifestRequest.builder() @@ -814,7 +760,7 @@ private static Mono applyManifestAndWaitForCompletion( .flatMap( jobId -> JobUtils.waitForCompletion( - cloudFoundryClient, Duration.ofMinutes(5), jobId)); + this.cloudFoundryClient, Duration.ofMinutes(5), jobId)); } private static boolean areModifiersPresent(ScaleApplicationRequest request) { @@ -823,84 +769,56 @@ private static boolean areModifiersPresent(ScaleApplicationRequest request) { || request.getInstances() != null; } - private static Flux associateDefaultDomain( - CloudFoundryClient cloudFoundryClient, + private Flux associateDefaultDomain( String applicationId, List availableDomains, ApplicationManifest manifest, RandomWords randomWords, String spaceId) { - return getDefaultDomainId(cloudFoundryClient) + return getDefaultDomainId() .flatMapMany( domainId -> getPushRouteIdFromDomain( - cloudFoundryClient, - availableDomains, - domainId, - manifest, - randomWords, - spaceId)) - .flatMap( - routeId -> - requestAssociateRoute(cloudFoundryClient, applicationId, routeId)) + availableDomains, domainId, manifest, randomWords, spaceId)) + .flatMap(routeId -> requestAssociateRoute(applicationId, routeId)) .map(ResourceUtils::getId); } - private static Mono bindServices( - CloudFoundryClient cloudFoundryClient, - String applicationId, - ApplicationManifest manifest, - String spaceId) { + private Mono bindServices( + String applicationId, ApplicationManifest manifest, String spaceId) { if (manifest.getServices() == null || manifest.getServices().size() == 0) { return Mono.empty(); } return Flux.fromIterable(manifest.getServices()) - .flatMap( - serviceInstanceName -> - getServiceId(cloudFoundryClient, serviceInstanceName, spaceId)) + .flatMap(serviceInstanceName -> getServiceId(serviceInstanceName, spaceId)) .flatMap( serviceInstanceId -> - requestCreateServiceBinding( - cloudFoundryClient, - applicationId, - serviceInstanceId) + requestCreateServiceBinding(applicationId, serviceInstanceId) .onErrorResume( ExceptionUtils.statusCode(CF_SERVICE_ALREADY_BOUND), t -> Mono.empty())) .then(); } - private static Mono buildAndStageAndWaitForRunning( - CloudFoundryClient cloudFoundryClient, - ManifestV3Application manifestApp, - String packageId, - String appId) { - return buildAndStage(cloudFoundryClient, manifestApp, packageId) + private Mono buildAndStageAndWaitForRunning( + ManifestV3Application manifestApp, String packageId, String appId) { + return buildAndStage(manifestApp, packageId) .flatMap( dropletId -> applyDropletAndWaitForRunning( - cloudFoundryClient, - manifestApp.getName(), - appId, - dropletId)); + manifestApp.getName(), appId, dropletId)); } - private static Mono buildAndStage( - CloudFoundryClient cloudFoundryClient, - ManifestV3Application manifestApp, - String packageId) { - return cloudFoundryClient + private Mono buildAndStage(ManifestV3Application manifestApp, String packageId) { + return this.cloudFoundryClient .builds() .create( CreateBuildRequest.builder() .getPackage(Relationship.builder().id(packageId).build()) .build()) .map(CreateBuildResponse::getId) - .flatMap( - buildId -> - waitForBuildStaging( - cloudFoundryClient, buildId, manifestApp.getName(), null)) + .flatMap(buildId -> waitForBuildStaging(buildId, manifestApp.getName(), null)) .map(build -> build.getDroplet().getId()); } @@ -941,24 +859,18 @@ private static ApplicationEvent convertToApplicationEvent(EventResource resource .build(); } - private static Mono copyBits( - CloudFoundryClient cloudFoundryClient, - Duration completionTimeout, - String sourceApplicationId, - String targetApplicationId) { - return requestCopyBits(cloudFoundryClient, sourceApplicationId, targetApplicationId) + private Mono copyBits( + Duration completionTimeout, String sourceApplicationId, String targetApplicationId) { + return requestCopyBits(sourceApplicationId, targetApplicationId) .flatMap( job -> JobUtils.waitForCompletion( - cloudFoundryClient, completionTimeout, job)); + this.cloudFoundryClient, completionTimeout, job)); } - private static Mono createPackage( - CloudFoundryClient cloudFoundryClient, - String appId, - ManifestV3Application manifestApp) { + private Mono createPackage(String appId, ManifestV3Application manifestApp) { if (manifestApp.getDocker() != null) { - return cloudFoundryClient + return this.cloudFoundryClient .packages() .create( CreatePackageRequest.builder() @@ -982,7 +894,7 @@ private static Mono createPackage( .build()) .map(CreatePackageResponse::getId); } else { - return cloudFoundryClient + return this.cloudFoundryClient .packages() .create( CreatePackageRequest.builder() @@ -1009,11 +921,10 @@ private static Mono createPackage( .flatMap( packageId -> ResourceMatchingUtilsV3.getMatchedResources( - cloudFoundryClient, manifestApp.getPath()) + this.cloudFoundryClient, manifestApp.getPath()) .flatMap( matchedResources -> uploadPackageBitsAndWait( - cloudFoundryClient, packageId, manifestApp.getPath(), matchedResources, @@ -1022,23 +933,21 @@ private static Mono createPackage( } } - private static Mono deleteRoute( - CloudFoundryClient cloudFoundryClient, String routeId, Duration completionTimeout) { - return requestDeleteRoute(cloudFoundryClient, routeId) + private Mono deleteRoute(String routeId, Duration completionTimeout) { + return requestDeleteRoute(routeId) .flatMap( job -> JobUtils.waitForCompletion( - cloudFoundryClient, completionTimeout, job)); + this.cloudFoundryClient, completionTimeout, job)); } - private static Mono deleteRoutes( - CloudFoundryClient cloudFoundryClient, + private Mono deleteRoutes( Duration completionTimeout, Optional> routes) { return routes.map(Flux::fromIterable) .orElse(Flux.empty()) .map(org.cloudfoundry.client.v2.routes.Route::getId) - .flatMap(routeId -> deleteRoute(cloudFoundryClient, routeId, completionTimeout)) + .flatMap(routeId -> deleteRoute(routeId, completionTimeout)) .then(); } @@ -1093,9 +1002,8 @@ private static Flux extractApplications( return Flux.fromIterable(getSpaceSummaryResponse.getApplications()); } - private static Mono getApplication( - CloudFoundryClient cloudFoundryClient, String application, String spaceId) { - return requestApplications(cloudFoundryClient, application, spaceId) + private Mono getApplication(String application, String spaceId) { + return requestApplications(application, spaceId) .single() .onErrorResume( NoSuchElementException.class, @@ -1104,9 +1012,8 @@ private static Mono getApplication( "Application %s does not exist", application)); } - private static Mono> getApplicationBuildpacks( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient + private Mono> getApplicationBuildpacks(String applicationId) { + return this.cloudFoundryClient .applicationsV3() .get( org.cloudfoundry.client.v3.applications.GetApplicationRequest.builder() @@ -1120,17 +1027,13 @@ private static Mono> getApplicationBuildpacks( .defaultIfEmpty(Collections.emptyList()); } - private static Mono getApplicationId( - CloudFoundryClient cloudFoundryClient, String application, String spaceId) { - return getApplication(cloudFoundryClient, application, spaceId).map(ResourceUtils::getId); + private Mono getApplicationId(String application, String spaceId) { + return getApplication(application, spaceId).map(ResourceUtils::getId); } - private static Mono getApplicationId( - CloudFoundryClient cloudFoundryClient, - ApplicationManifest manifest, - String spaceId, - String stackId) { - return requestApplications(cloudFoundryClient, manifest.getName(), spaceId) + private Mono getApplicationId( + ApplicationManifest manifest, String spaceId, String stackId) { + return requestApplications(manifest.getName(), spaceId) .singleOrEmpty() .flatMap( application -> { @@ -1143,7 +1046,6 @@ private static Mono getApplicationId( .ifPresent(merge::putAll); return requestUpdateApplication( - cloudFoundryClient, ResourceUtils.getId(application), merge, manifest, @@ -1151,49 +1053,37 @@ private static Mono getApplicationId( .map(ResourceUtils::getId); }) .switchIfEmpty( - requestCreateApplication(cloudFoundryClient, manifest, spaceId, stackId) + requestCreateApplication(manifest, spaceId, stackId) .map(ResourceUtils::getId)); } - private static Mono getApplicationIdFromOrgSpace( - CloudFoundryClient cloudFoundryClient, - String application, - String spaceId, - String organization, - String space) { - return getSpaceOrganizationId(cloudFoundryClient, spaceId) + private Mono getApplicationIdFromOrgSpace( + String application, String spaceId, String organization, String space) { + return getSpaceOrganizationId(spaceId) .flatMap( organizationId -> organization != null - ? getOrganizationId(cloudFoundryClient, organization) + ? getOrganizationId(organization) : Mono.just(organizationId)) .flatMap( organizationId -> space != null - ? getSpaceId(cloudFoundryClient, organizationId, space) + ? getSpaceId(organizationId, space) : Mono.just(spaceId)) - .flatMap(spaceId1 -> getApplicationId(cloudFoundryClient, application, spaceId1)); + .flatMap(spaceId1 -> getApplicationId(application, spaceId1)); } - private static Mono getApplicationIdV3( - CloudFoundryClient cloudFoundryClient, String applicationName, String spaceId) { - return getApplicationV3(cloudFoundryClient, applicationName, spaceId) - .map(ApplicationResource::getId); + private Mono getApplicationIdV3(String applicationName, String spaceId) { + return getApplicationV3(applicationName, spaceId).map(ApplicationResource::getId); } - private static Mono getApplicationIdWhere( - CloudFoundryClient cloudFoundryClient, - String application, - String spaceId, - Predicate predicate) { - return getApplication(cloudFoundryClient, application, spaceId) - .filter(predicate) - .map(ResourceUtils::getId); + private Mono getApplicationIdWhere( + String application, String spaceId, Predicate predicate) { + return getApplication(application, spaceId).filter(predicate).map(ResourceUtils::getId); } - private static Mono getApplicationInstances( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return requestApplicationInstances(cloudFoundryClient, applicationId) + private Mono getApplicationInstances(String applicationId) { + return requestApplicationInstances(applicationId) .onErrorResume( ExceptionUtils.statusCode( CF_BUILDPACK_COMPILED_FAILED, @@ -1205,22 +1095,19 @@ private static Mono getApplicationInstances( t -> Mono.just(ApplicationInstancesResponse.builder().build())); } - private static Mono> getApplicationRoutes( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return requestApplicationRoutes(cloudFoundryClient, applicationId).collectList(); + private Mono> getApplicationRoutes(String applicationId) { + return requestApplicationRoutes(applicationId).collectList(); } - private static Mono getApplicationStatistics( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return requestApplicationStatistics(cloudFoundryClient, applicationId) + private Mono getApplicationStatistics(String applicationId) { + return requestApplicationStatistics(applicationId) .onErrorResume( ExceptionUtils.statusCode(CF_APP_STOPPED_STATS_ERROR), t -> Mono.just(ApplicationStatisticsResponse.builder().build())); } - private static Mono getApplicationV3( - CloudFoundryClient cloudFoundryClient, String application, String spaceId) { - return requestApplicationsV3(cloudFoundryClient, application, spaceId) + private Mono getApplicationV3(String application, String spaceId) { + return requestApplicationsV3(application, spaceId) .single() .onErrorResume( NoSuchElementException.class, @@ -1229,41 +1116,38 @@ private static Mono getApplicationV3( "Application %s does not exist", application)); } - private static Mono< + private Mono< Tuple5< List, SummaryApplicationResponse, GetStackResponse, List, List>> - getAuxiliaryContent( - CloudFoundryClient cloudFoundryClient, - AbstractApplicationResource applicationResource) { + getAuxiliaryContent(AbstractApplicationResource applicationResource) { String applicationId = ResourceUtils.getId(applicationResource); String stackId = ResourceUtils.getEntity(applicationResource).getStackId(); return Mono.zip( - getApplicationStatistics(cloudFoundryClient, applicationId), - requestApplicationSummary(cloudFoundryClient, applicationId), - getApplicationInstances(cloudFoundryClient, applicationId)) + getApplicationStatistics(applicationId), + requestApplicationSummary(applicationId), + getApplicationInstances(applicationId)) .flatMap( function( (applicationStatisticsResponse, summaryApplicationResponse, applicationInstancesResponse) -> Mono.zip( - getApplicationBuildpacks( - cloudFoundryClient, applicationId), + getApplicationBuildpacks(applicationId), Mono.just(summaryApplicationResponse), - requestStack(cloudFoundryClient, stackId), + requestStack(stackId), toInstanceDetailList( applicationInstancesResponse, applicationStatisticsResponse), toUrls(summaryApplicationResponse.getRoutes())))); } - private static Mono getDefaultDomainId(CloudFoundryClient cloudFoundryClient) { - return requestSharedDomains(cloudFoundryClient) + private Mono getDefaultDomainId() { + return requestSharedDomains() .filter( resource -> !Optional.ofNullable( @@ -1299,16 +1183,15 @@ private static int getInstances(AbstractApplicationResource resource) { .orElse(0); } - private static Flux getLogs( - DopplerClient dopplerClient, String applicationId, Boolean recent) { + private Flux getLogs(String applicationId, Boolean recent) { if (Optional.ofNullable(recent).orElse(false)) { - return requestLogsRecent(dopplerClient, applicationId) + return requestLogsRecent(applicationId) .filter(e -> EventType.LOG_MESSAGE == e.getEventType()) .map(Envelope::getLogMessage) .collectSortedList(LOG_MESSAGE_COMPARATOR) .flatMapIterable(d -> d); } else { - return requestLogsStream(dopplerClient, applicationId) + return requestLogsStream(applicationId) .filter(e -> EventType.LOG_MESSAGE == e.getEventType()) .map(Envelope::getLogMessage) .transformDeferred( @@ -1333,25 +1216,23 @@ private static Map getMetadataRequest(EventEntity entity) { } } - private static Mono>> getOptionalRoutes( - CloudFoundryClient cloudFoundryClient, boolean deleteRoutes, String applicationId) { + private Mono>> getOptionalRoutes( + boolean deleteRoutes, String applicationId) { if (deleteRoutes) { - return getRoutes(cloudFoundryClient, applicationId).map(Optional::of); + return getRoutes(applicationId).map(Optional::of); } else { return Mono.just(Optional.empty()); } } - private static Mono> getOptionalStackId( - CloudFoundryClient cloudFoundryClient, String stack) { + private Mono> getOptionalStackId(String stack) { return Optional.ofNullable(stack) - .map(stack1 -> getStackId(cloudFoundryClient, stack1).map(Optional::of)) + .map(stack1 -> getStackId(stack1).map(Optional::of)) .orElse(Mono.just(Optional.empty())); } - private static Mono getOrganization( - CloudFoundryClient cloudFoundryClient, String organization) { - return requestOrganizations(cloudFoundryClient, organization) + private Mono getOrganization(String organization) { + return requestOrganizations(organization) .single() .onErrorResume( NoSuchElementException.class, @@ -1360,14 +1241,12 @@ private static Mono getOrganization( "Organization %s not found", organization)); } - private static Mono getOrganizationId( - CloudFoundryClient cloudFoundryClient, String organization) { - return getOrganization(cloudFoundryClient, organization).map(ResourceUtils::getId); + private Mono getOrganizationId(String organization) { + return getOrganization(organization).map(ResourceUtils::getId); } - private static Mono getOrganizationSpaceByName( - CloudFoundryClient cloudFoundryClient, String organizationId, String space) { - return requestOrganizationSpacesByName(cloudFoundryClient, organizationId, space) + private Mono getOrganizationSpaceByName(String organizationId, String space) { + return requestOrganizationSpacesByName(organizationId, space) .single() .onErrorResume( NoSuchElementException.class, @@ -1380,17 +1259,14 @@ private static String getPassword(DockerCredentials dockerCredentials) { .orElse(null); } - private static Flux getPushRouteIdFromDomain( - CloudFoundryClient cloudFoundryClient, + private Flux getPushRouteIdFromDomain( List availableDomains, String domainId, ApplicationManifest manifest, RandomWords randomWords, String spaceId) { if (isTcpDomain(availableDomains, domainId)) { - return requestCreateTcpRoute(cloudFoundryClient, domainId, spaceId) - .map(ResourceUtils::getId) - .flux(); + return requestCreateTcpRoute(domainId, spaceId).map(ResourceUtils::getId).flux(); } List hosts; @@ -1414,14 +1290,9 @@ private static Flux getPushRouteIdFromDomain( return Flux.fromIterable(hosts) .flatMap( host -> - getRouteId( - cloudFoundryClient, - domainId, - host, - manifest.getRoutePath()) + getRouteId(domainId, host, manifest.getRoutePath()) .switchIfEmpty( requestCreateRoute( - cloudFoundryClient, domainId, host, manifest.getRoutePath(), @@ -1429,8 +1300,7 @@ private static Flux getPushRouteIdFromDomain( .map(ResourceUtils::getId))); } - private static Flux getPushRouteIdFromRoute( - CloudFoundryClient cloudFoundryClient, + private Flux getPushRouteIdFromRoute( List availableDomains, ApplicationManifest manifest, RandomWords randomWords, @@ -1448,26 +1318,16 @@ private static Flux getPushRouteIdFromRoute( getDomainId(availableDomains, decomposedRoute.getDomain()); if (isTcpDomain(availableDomains, domainId)) { return getRouteIdForTcpRoute( - cloudFoundryClient, - decomposedRoute, - domainId, - manifest, - spaceId); + decomposedRoute, domainId, manifest, spaceId); } else { return getRouteIdForHttpRoute( - cloudFoundryClient, - decomposedRoute, - domainId, - manifest, - randomWords, - spaceId); + decomposedRoute, domainId, manifest, randomWords, spaceId); } }); } - private static Mono getRouteId( - CloudFoundryClient cloudFoundryClient, String domainId, String host, String routePath) { - return requestRoutes(cloudFoundryClient, domainId, host, null, routePath) + private Mono getRouteId(String domainId, String host, String routePath) { + return requestRoutes(domainId, host, null, routePath) .filter(resource -> isIdentical(host, ResourceUtils.getEntity(resource).getHost())) .filter( resource -> @@ -1478,68 +1338,51 @@ private static Mono getRouteId( .map(ResourceUtils::getId); } - private static Mono getRouteIdForHttpRoute( - CloudFoundryClient cloudFoundryClient, + private Mono getRouteIdForHttpRoute( DecomposedRoute decomposedRoute, String domainId, ApplicationManifest manifest, RandomWords randomWords, String spaceId) { String derivedHost = deriveHostname(decomposedRoute.getHost(), manifest, randomWords); - return getRouteId(cloudFoundryClient, domainId, derivedHost, decomposedRoute.getPath()) + return getRouteId(domainId, derivedHost, decomposedRoute.getPath()) .switchIfEmpty( requestCreateRoute( - cloudFoundryClient, - domainId, - derivedHost, - decomposedRoute.getPath(), - spaceId) + domainId, derivedHost, decomposedRoute.getPath(), spaceId) .map(ResourceUtils::getId)); } - private static Mono getRouteIdForTcpRoute( - CloudFoundryClient cloudFoundryClient, + private Mono getRouteIdForTcpRoute( DecomposedRoute decomposedRoute, String domainId, ApplicationManifest manifest, String spaceId) { if (Optional.ofNullable(manifest.getRandomRoute()).orElse(false)) { - return requestCreateTcpRoute(cloudFoundryClient, domainId, spaceId) - .map(ResourceUtils::getId); + return requestCreateTcpRoute(domainId, spaceId).map(ResourceUtils::getId); } - return getTcpRouteId(cloudFoundryClient, domainId, decomposedRoute.getPort()) + return getTcpRouteId(domainId, decomposedRoute.getPort()) .switchIfEmpty( - requestCreateTcpRoute( - cloudFoundryClient, - domainId, - decomposedRoute.getPort(), - spaceId) + requestCreateTcpRoute(domainId, decomposedRoute.getPort(), spaceId) .map(ResourceUtils::getId)); } - private static Mono> getRoutes( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return requestApplicationSummary(cloudFoundryClient, applicationId) - .map(SummaryApplicationResponse::getRoutes); + private Mono> getRoutes(String applicationId) { + return requestApplicationSummary(applicationId).map(SummaryApplicationResponse::getRoutes); } - private static Mono>, String>> + private Mono>, String>> getRoutesAndApplicationId( - CloudFoundryClient cloudFoundryClient, - DeleteApplicationRequest request, - String spaceId, - boolean deleteRoutes) { - return getApplicationId(cloudFoundryClient, request.getName(), spaceId) + DeleteApplicationRequest request, String spaceId, boolean deleteRoutes) { + return getApplicationId(request.getName(), spaceId) .flatMap( applicationId -> - getOptionalRoutes(cloudFoundryClient, deleteRoutes, applicationId) + getOptionalRoutes(deleteRoutes, applicationId) .zipWith(Mono.just(applicationId))); } - private static Mono getServiceId( - CloudFoundryClient cloudFoundryClient, String serviceInstanceName, String spaceId) { - return requestListServiceInstances(cloudFoundryClient, serviceInstanceName, spaceId) + private Mono getServiceId(String serviceInstanceName, String spaceId) { + return requestListServiceInstances(serviceInstanceName, spaceId) .map(ResourceUtils::getId) .single() .onErrorResume( @@ -1550,20 +1393,17 @@ private static Mono getServiceId( serviceInstanceName)); } - private static Mono getSpaceId( - CloudFoundryClient cloudFoundryClient, String organizationId, String space) { - return getOrganizationSpaceByName(cloudFoundryClient, organizationId, space) - .map(ResourceUtils::getId); + private Mono getSpaceId(String organizationId, String space) { + return getOrganizationSpaceByName(organizationId, space).map(ResourceUtils::getId); } - private static Mono getSpaceOrganizationId( - CloudFoundryClient cloudFoundryClient, String spaceId) { - return requestSpace(cloudFoundryClient, spaceId) + private Mono getSpaceOrganizationId(String spaceId) { + return requestSpace(spaceId) .map(response -> ResourceUtils.getEntity(response).getOrganizationId()); } - private static Mono getStackId(CloudFoundryClient cloudFoundryClient, String stack) { - return requestStacks(cloudFoundryClient, stack) + private Mono getStackId(String stack) { + return requestStacks(stack) .map(ResourceUtils::getId) .single() .onErrorResume( @@ -1571,15 +1411,13 @@ private static Mono getStackId(CloudFoundryClient cloudFoundryClient, St t -> ExceptionUtils.illegalArgument("Stack %s does not exist", stack)); } - private static Mono getStackName( - CloudFoundryClient cloudFoundryClient, String stackId) { - return requestStack(cloudFoundryClient, stackId) + private Mono getStackName(String stackId) { + return requestStack(stackId) .map(getStackResponse -> getStackResponse.getEntity().getName()); } - private static Mono getTaskId( - CloudFoundryClient cloudFoundryClient, String applicationId, Integer sequenceId) { - return listTasks(cloudFoundryClient, applicationId, sequenceId) + private Mono getTaskId(String applicationId, Integer sequenceId) { + return listTasks(applicationId, sequenceId) .single() .map(Resource::getId) .onErrorResume( @@ -1589,11 +1427,8 @@ private static Mono getTaskId( "Task with sequence id of %s does not exist", sequenceId)); } - private static Mono getTcpRouteId( - CloudFoundryClient cloudFoundryClient, String domainId, Integer port) { - return requestRoutes(cloudFoundryClient, domainId, null, port, null) - .singleOrEmpty() - .map(ResourceUtils::getId); + private Mono getTcpRouteId(String domainId, Integer port) { + return requestRoutes(domainId, null, port, null).singleOrEmpty().map(ResourceUtils::getId); } private static String getUsername(DockerCredentials dockerCredentials) { @@ -1646,24 +1481,20 @@ private static boolean isTcpDomain(List availableDomains, String return tcpDomainIds.contains(domainId); } - private static Mono> listAvailableDomains( - CloudFoundryClient cloudFoundryClient, String organizationId) { - return requestListPrivateDomains(cloudFoundryClient, organizationId) + private Mono> listAvailableDomains(String organizationId) { + return requestListPrivateDomains(organizationId) .map(DefaultApplications::toDomain) - .mergeWith( - requestListSharedDomains(cloudFoundryClient) - .map(DefaultApplications::toDomain)) + .mergeWith(requestListSharedDomains().map(DefaultApplications::toDomain)) .collectList(); } - private static Flux listTasks( - CloudFoundryClient cloudFoundryClient, String applicationId, Integer sequenceId) { - return requestListTasks(cloudFoundryClient, applicationId, sequenceId) + private Flux listTasks( + String applicationId, Integer sequenceId) { + return requestListTasks(applicationId, sequenceId) .cast(org.cloudfoundry.client.v3.tasks.Task.class); } - private static Mono prepareDomainsAndRoutes( - CloudFoundryClient cloudFoundryClient, + private Mono prepareDomainsAndRoutes( String applicationId, List availableDomains, ApplicationManifest manifest, @@ -1673,10 +1504,7 @@ private static Mono prepareDomainsAndRoutes( if (Optional.ofNullable(manifest.getNoRoute()).orElse(false)) { return Flux.fromIterable(existingRoutes) .map(ResourceUtils::getId) - .flatMap( - routeId -> - requestRemoveRouteFromApplication( - cloudFoundryClient, applicationId, routeId)) + .flatMap(routeId -> requestRemoveRouteFromApplication(applicationId, routeId)) .then(); } @@ -1684,12 +1512,7 @@ private static Mono prepareDomainsAndRoutes( if (manifest.getDomains() == null) { if (existingRoutes.isEmpty()) { return associateDefaultDomain( - cloudFoundryClient, - applicationId, - availableDomains, - manifest, - randomWords, - spaceId) + applicationId, availableDomains, manifest, randomWords, spaceId) .then(); } return Mono.empty(); // A route already exists for the application, do nothing @@ -1698,7 +1521,6 @@ private static Mono prepareDomainsAndRoutes( .flatMap( domain -> getPushRouteIdFromDomain( - cloudFoundryClient, availableDomains, getDomainId(availableDomains, domain), manifest, @@ -1707,53 +1529,39 @@ private static Mono prepareDomainsAndRoutes( .flatMap( routeId -> requestAssociateRoute( - cloudFoundryClient, - applicationId, - routeId))) + applicationId, routeId))) .then(); } List existingRouteIds = existingRoutes.stream().map(ResourceUtils::getId).collect(Collectors.toList()); - return getPushRouteIdFromRoute( - cloudFoundryClient, availableDomains, manifest, randomWords, spaceId) + return getPushRouteIdFromRoute(availableDomains, manifest, randomWords, spaceId) .filter(routeId -> !existingRouteIds.contains(routeId)) - .flatMapSequential( - routeId -> - requestAssociateRoute(cloudFoundryClient, applicationId, routeId), - 1) + .flatMapSequential(routeId -> requestAssociateRoute(applicationId, routeId), 1) .then(); } - private static Flux pushApplication( - CloudFoundryClient cloudFoundryClient, + private Flux pushApplication( List availableDomains, ApplicationManifest manifest, RandomWords randomWords, PushApplicationManifestRequest request, String spaceId) { - return getOptionalStackId(cloudFoundryClient, manifest.getStack()) - .flatMapMany( - stackId -> - getApplicationId( - cloudFoundryClient, - manifest, - spaceId, - stackId.orElse(null))) + return getOptionalStackId(manifest.getStack()) + .flatMapMany(stackId -> getApplicationId(manifest, spaceId, stackId.orElse(null))) .flatMap( applicationId -> Mono.zip( Mono.just(applicationId), - getApplicationRoutes(cloudFoundryClient, applicationId), + getApplicationRoutes(applicationId), ResourceMatchingUtils.getMatchedResources( - cloudFoundryClient, manifest.getPath()))) + this.cloudFoundryClient, manifest.getPath()))) .flatMap( function( (applicationId, existingRoutes, matchedResources) -> prepareDomainsAndRoutes( - cloudFoundryClient, applicationId, availableDomains, manifest, @@ -1768,16 +1576,9 @@ private static Flux pushApplication( (applicationId, matchedResources) -> Mono.when( bindServices( - cloudFoundryClient, - applicationId, - manifest, - spaceId), - updateBuildpacks( - cloudFoundryClient, - applicationId, - manifest), + applicationId, manifest, spaceId), + updateBuildpacks(applicationId, manifest), uploadApplicationAndWait( - cloudFoundryClient, applicationId, manifest.getPath(), matchedResources, @@ -1786,38 +1587,27 @@ private static Flux pushApplication( .flatMap( applicationId -> stopAndStartApplication( - cloudFoundryClient, - applicationId, - manifest.getName(), - request)); + applicationId, manifest.getName(), request)); } - private static Flux pushDocker( - CloudFoundryClient cloudFoundryClient, + private Flux pushDocker( List availableDomains, ApplicationManifest manifest, RandomWords randomWords, PushApplicationManifestRequest request, String spaceId) { - return getOptionalStackId(cloudFoundryClient, manifest.getStack()) - .flatMapMany( - stackId -> - getApplicationId( - cloudFoundryClient, - manifest, - spaceId, - stackId.orElse(null))) + return getOptionalStackId(manifest.getStack()) + .flatMapMany(stackId -> getApplicationId(manifest, spaceId, stackId.orElse(null))) .flatMap( applicationId -> Mono.zip( Mono.just(applicationId), - getApplicationRoutes(cloudFoundryClient, applicationId))) + getApplicationRoutes(applicationId))) .flatMap( function( (applicationId, existingRoutes) -> prepareDomainsAndRoutes( - cloudFoundryClient, applicationId, availableDomains, manifest, @@ -1825,16 +1615,11 @@ private static Flux pushDocker( randomWords, spaceId) .thenReturn(applicationId))) - .delayUntil( - applicationId -> - bindServices(cloudFoundryClient, applicationId, manifest, spaceId)) + .delayUntil(applicationId -> bindServices(applicationId, manifest, spaceId)) .flatMap( applicationId -> stopAndStartApplication( - cloudFoundryClient, - applicationId, - manifest.getName(), - request)); + applicationId, manifest.getName(), request)); } private static Map removeFromEnvironment( @@ -1844,20 +1629,18 @@ private static Map removeFromEnvironment( return modified; } - private static Mono removeServiceBindings( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return requestListServiceBindings(cloudFoundryClient, applicationId) + private Mono removeServiceBindings(String applicationId) { + return requestListServiceBindings(applicationId) .map(ResourceUtils::getId) .flatMap( serviceBindingId -> - requestRemoveServiceBinding( - cloudFoundryClient, applicationId, serviceBindingId)) + requestRemoveServiceBinding(applicationId, serviceBindingId)) .then(); } - private static Mono requestApplicationEnvironment( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient + private Mono requestApplicationEnvironment( + String applicationId) { + return this.cloudFoundryClient .applicationsV3() .getEnvironment( GetApplicationEnvironmentRequest.builder() @@ -1865,19 +1648,17 @@ private static Mono requestApplicationEnviron .build()); } - private static Mono requestApplicationInstances( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient + private Mono requestApplicationInstances(String applicationId) { + return this.cloudFoundryClient .applicationsV2() .instances( ApplicationInstancesRequest.builder().applicationId(applicationId).build()); } - private static Flux requestApplicationRoutes( - CloudFoundryClient cloudFoundryClient, String applicationId) { + private Flux requestApplicationRoutes(String applicationId) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .applicationsV2() .listRoutes( ListApplicationRoutesRequest.builder() @@ -1886,9 +1667,8 @@ private static Flux requestApplicationRoutes( .build())); } - private static Mono requestApplicationStatistics( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient + private Mono requestApplicationStatistics(String applicationId) { + return this.cloudFoundryClient .applicationsV2() .statistics( ApplicationStatisticsRequest.builder() @@ -1896,18 +1676,17 @@ private static Mono requestApplicationStatistics( .build()); } - private static Mono requestApplicationSummary( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient + private Mono requestApplicationSummary(String applicationId) { + return this.cloudFoundryClient .applicationsV2() .summary(SummaryApplicationRequest.builder().applicationId(applicationId).build()); } - private static Flux requestApplications( - CloudFoundryClient cloudFoundryClient, String application, String spaceId) { + private Flux requestApplications( + String application, String spaceId) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .spaces() .listApplications( ListSpaceApplicationsRequest.builder() @@ -1918,11 +1697,10 @@ private static Flux requestApplications( .cast(AbstractApplicationResource.class); } - private static Flux requestApplicationsV3( - CloudFoundryClient cloudFoundryClient, String application, String spaceId) { + private Flux requestApplicationsV3(String application, String spaceId) { return PaginationUtils.requestClientV3Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .applicationsV3() .list( ListApplicationsRequest.builder() @@ -1932,9 +1710,9 @@ private static Flux requestApplicationsV3( .build())); } - private static Mono requestAssociateRoute( - CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { - return cloudFoundryClient + private Mono requestAssociateRoute( + String applicationId, String routeId) { + return this.cloudFoundryClient .applicationsV2() .associateRoute( AssociateApplicationRouteRequest.builder() @@ -1943,11 +1721,9 @@ private static Mono requestAssociateRoute( .build()); } - private static Mono requestCopyBits( - CloudFoundryClient cloudFoundryClient, - String sourceApplicationId, - String targetApplicationId) { - return cloudFoundryClient + private Mono requestCopyBits( + String sourceApplicationId, String targetApplicationId) { + return this.cloudFoundryClient .applicationsV2() .copy( CopyApplicationRequest.builder() @@ -1956,11 +1732,8 @@ private static Mono requestCopyBits( .build()); } - private static Mono requestCreateApplication( - CloudFoundryClient cloudFoundryClient, - ApplicationManifest manifest, - String spaceId, - String stackId) { + private Mono requestCreateApplication( + ApplicationManifest manifest, String spaceId, String stackId) { CreateApplicationRequest.Builder builder = CreateApplicationRequest.builder() .command(manifest.getCommand()) @@ -1998,16 +1771,12 @@ private static Mono requestCreateApplication( }); } - return cloudFoundryClient.applicationsV2().create(builder.build()); + return this.cloudFoundryClient.applicationsV2().create(builder.build()); } - private static Mono requestCreateRoute( - CloudFoundryClient cloudFoundryClient, - String domainId, - String host, - String routePath, - String spaceId) { - return cloudFoundryClient + private Mono requestCreateRoute( + String domainId, String host, String routePath, String spaceId) { + return this.cloudFoundryClient .routes() .create( org.cloudfoundry.client.v2.routes.CreateRouteRequest.builder() @@ -2018,9 +1787,9 @@ private static Mono requestCreateRoute( .build()); } - private static Mono requestCreateServiceBinding( - CloudFoundryClient cloudFoundryClient, String applicationId, String serviceInstanceId) { - return cloudFoundryClient + private Mono requestCreateServiceBinding( + String applicationId, String serviceInstanceId) { + return this.cloudFoundryClient .serviceBindingsV2() .create( CreateServiceBindingRequest.builder() @@ -2029,11 +1798,9 @@ private static Mono requestCreateServiceBinding( .build()); } - private static Mono requestCreateTask( - CloudFoundryClient cloudFoundryClient, - String applicationId, - RunApplicationTaskRequest request) { - return cloudFoundryClient + private Mono requestCreateTask( + String applicationId, RunApplicationTaskRequest request) { + return this.cloudFoundryClient .tasks() .create( CreateTaskRequest.builder() @@ -2045,9 +1812,8 @@ private static Mono requestCreateTask( .build()); } - private static Mono requestCreateTcpRoute( - CloudFoundryClient cloudFoundryClient, String domainId, String spaceId) { - return cloudFoundryClient + private Mono requestCreateTcpRoute(String domainId, String spaceId) { + return this.cloudFoundryClient .routes() .create( org.cloudfoundry.client.v2.routes.CreateRouteRequest.builder() @@ -2057,9 +1823,9 @@ private static Mono requestCreateTcpRoute( .build()); } - private static Mono requestCreateTcpRoute( - CloudFoundryClient cloudFoundryClient, String domainId, Integer port, String spaceId) { - return cloudFoundryClient + private Mono requestCreateTcpRoute( + String domainId, Integer port, String spaceId) { + return this.cloudFoundryClient .routes() .create( org.cloudfoundry.client.v2.routes.CreateRouteRequest.builder() @@ -2069,9 +1835,8 @@ private static Mono requestCreateTcpRoute( .build()); } - private static Mono requestDeleteApplication( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient + private Mono requestDeleteApplication(String applicationId) { + return this.cloudFoundryClient .applicationsV2() .delete( org.cloudfoundry.client.v2.applications.DeleteApplicationRequest.builder() @@ -2079,18 +1844,16 @@ private static Mono requestDeleteApplication( .build()); } - private static Mono requestDeleteRoute( - CloudFoundryClient cloudFoundryClient, String routeId) { - return cloudFoundryClient + private Mono requestDeleteRoute(String routeId) { + return this.cloudFoundryClient .routes() .delete(DeleteRouteRequest.builder().async(true).routeId(routeId).build()); } - private static Flux requestEvents( - String applicationId, CloudFoundryClient cloudFoundryClient) { + private Flux requestEvents(String applicationId) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .events() .list( ListEventsRequest.builder() @@ -2101,9 +1864,8 @@ private static Flux requestEvents( .build())); } - private static Mono requestGetApplication( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient + private Mono requestGetApplication(String applicationId) { + return this.cloudFoundryClient .applicationsV2() .get( org.cloudfoundry.client.v2.applications.GetApplicationRequest.builder() @@ -2112,20 +1874,10 @@ private static Mono requestGetApplication( .cast(AbstractApplicationResource.class); } - private static Flux requestListDomains( - CloudFoundryClient cloudFoundryClient, String organizationId) { - return PaginationUtils.requestClientV3Resources( - page -> - cloudFoundryClient - .domainsV3() - .list(ListDomainsRequest.builder().page(page).build())); - } - - private static Flux requestListPrivateDomains( - CloudFoundryClient cloudFoundryClient, String organizationId) { + private Flux requestListPrivateDomains(String organizationId) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .organizations() .listPrivateDomains( ListOrganizationPrivateDomainsRequest.builder() @@ -2134,11 +1886,10 @@ private static Flux requestListPrivateDomains( .build())); } - private static Flux requestListServiceBindings( - CloudFoundryClient cloudFoundryClient, String applicationId) { + private Flux requestListServiceBindings(String applicationId) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .applicationsV2() .listServiceBindings( ListApplicationServiceBindingsRequest.builder() @@ -2147,11 +1898,11 @@ private static Flux requestListServiceBindings( .build())); } - private static Flux requestListServiceInstances( - CloudFoundryClient cloudFoundryClient, String serviceInstanceName, String spaceId) { + private Flux requestListServiceInstances( + String serviceInstanceName, String spaceId) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .spaces() .listServiceInstances( ListSpaceServiceInstancesRequest.builder() @@ -2162,20 +1913,18 @@ private static Flux requestListServiceInstances( .build())); } - private static Flux requestListSharedDomains( - CloudFoundryClient cloudFoundryClient) { + private Flux requestListSharedDomains() { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .sharedDomains() .list(ListSharedDomainsRequest.builder().page(page).build())); } - private static Flux requestListTasks( - CloudFoundryClient cloudFoundryClient, String applicationId) { + private Flux requestListTasks(String applicationId) { return PaginationUtils.requestClientV3Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .applicationsV3() .listTasks( org.cloudfoundry.client.v3.applications @@ -2185,11 +1934,10 @@ private static Flux requestListTasks( .build())); } - private static Flux requestListTasks( - CloudFoundryClient cloudFoundryClient, String applicationId, Integer sequenceId) { + private Flux requestListTasks(String applicationId, Integer sequenceId) { return PaginationUtils.requestClientV3Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .applicationsV3() .listTasks( org.cloudfoundry.client.v3.applications @@ -2200,22 +1948,20 @@ private static Flux requestListTasks( .build())); } - private static Flux requestLogsRecent( - DopplerClient dopplerClient, String applicationId) { + private Flux requestLogsRecent(String applicationId) { return dopplerClient.recentLogs( RecentLogsRequest.builder().applicationId(applicationId).build()); } - private static Flux requestLogsStream( - DopplerClient dopplerClient, String applicationId) { + private Flux requestLogsStream(String applicationId) { return dopplerClient.stream(StreamRequest.builder().applicationId(applicationId).build()); } - private static Flux requestOrganizationSpacesByName( - CloudFoundryClient cloudFoundryClient, String organizationId, String space) { + private Flux requestOrganizationSpacesByName( + String organizationId, String space) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .organizations() .listSpaces( ListOrganizationSpacesRequest.builder() @@ -2225,11 +1971,10 @@ private static Flux requestOrganizationSpacesByName( .build())); } - private static Flux requestOrganizations( - CloudFoundryClient cloudFoundryClient, String organization) { + private Flux requestOrganizations(String organization) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .organizations() .list( ListOrganizationsRequest.builder() @@ -2238,9 +1983,8 @@ private static Flux requestOrganizations( .build())); } - private static Mono requestRemoveRouteFromApplication( - CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { - return cloudFoundryClient + private Mono requestRemoveRouteFromApplication(String applicationId, String routeId) { + return this.cloudFoundryClient .applicationsV2() .removeRoute( RemoveApplicationRouteRequest.builder() @@ -2249,9 +1993,8 @@ private static Mono requestRemoveRouteFromApplication( .build()); } - private static Mono requestRemoveServiceBinding( - CloudFoundryClient cloudFoundryClient, String applicationId, String serviceBindingId) { - return cloudFoundryClient + private Mono requestRemoveServiceBinding(String applicationId, String serviceBindingId) { + return this.cloudFoundryClient .applicationsV2() .removeServiceBinding( RemoveApplicationServiceBindingRequest.builder() @@ -2260,9 +2003,8 @@ private static Mono requestRemoveServiceBinding( .build()); } - private static Mono requestRestageApplication( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return cloudFoundryClient + private Mono requestRestageApplication(String applicationId) { + return this.cloudFoundryClient .applicationsV2() .restage( org.cloudfoundry.client.v2.applications.RestageApplicationRequest.builder() @@ -2270,59 +2012,54 @@ private static Mono requestRestageApplication( .build()); } - private static Flux requestRoutes( - CloudFoundryClient cloudFoundryClient, - String domainId, - String host, - Integer port, - String routePath) { + private Flux requestRoutes( + String domainId, String host, Integer port, String routePath) { ListRoutesRequest.Builder requestBuilder = ListRoutesRequest.builder().domainId(domainId); Optional.ofNullable(host).ifPresent(requestBuilder::host); Optional.ofNullable(routePath).ifPresent(requestBuilder::path); Optional.ofNullable(port).ifPresent(requestBuilder::port); return PaginationUtils.requestClientV2Resources( - page -> cloudFoundryClient.routes().list(requestBuilder.page(page).build())); + page -> this.cloudFoundryClient.routes().list(requestBuilder.page(page).build())); } - private static Flux requestSharedDomains( - CloudFoundryClient cloudFoundryClient) { + private Flux requestSharedDomains() { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .sharedDomains() .list(ListSharedDomainsRequest.builder().page(page).build())); } - private static Mono requestSpace( - CloudFoundryClient cloudFoundryClient, String spaceId) { - return cloudFoundryClient.spaces().get(GetSpaceRequest.builder().spaceId(spaceId).build()); + private Mono requestSpace(String spaceId) { + return this.cloudFoundryClient + .spaces() + .get(GetSpaceRequest.builder().spaceId(spaceId).build()); } - private static Mono requestSpaceSummary( - CloudFoundryClient cloudFoundryClient, String spaceId) { - return cloudFoundryClient + private Mono requestSpaceSummary(String spaceId) { + return this.cloudFoundryClient .spaces() .getSummary(GetSpaceSummaryRequest.builder().spaceId(spaceId).build()); } - private static Mono requestStack( - CloudFoundryClient cloudFoundryClient, String stackId) { - return cloudFoundryClient.stacks().get(GetStackRequest.builder().stackId(stackId).build()); + private Mono requestStack(String stackId) { + return this.cloudFoundryClient + .stacks() + .get(GetStackRequest.builder().stackId(stackId).build()); } - private static Flux requestStacks( - CloudFoundryClient cloudFoundryClient, String stack) { + private Flux requestStacks(String stack) { return PaginationUtils.requestClientV2Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .stacks() .list(ListStacksRequest.builder().page(page).name(stack).build())); } - private static Mono requestTerminateApplicationInstance( - CloudFoundryClient cloudFoundryClient, String applicationId, String instanceIndex) { - return cloudFoundryClient + private Mono requestTerminateApplicationInstance( + String applicationId, String instanceIndex) { + return this.cloudFoundryClient .applicationsV2() .terminateInstance( TerminateApplicationInstanceRequest.builder() @@ -2331,21 +2068,18 @@ private static Mono requestTerminateApplicationInstance( .build()); } - private static Mono requestTerminateTask( - CloudFoundryClient cloudFoundryClient, String taskId) { - return cloudFoundryClient + private Mono requestTerminateTask(String taskId) { + return this.cloudFoundryClient .tasks() .cancel(CancelTaskRequest.builder().taskId(taskId).build()); } - private static Mono requestUpdateApplication( - CloudFoundryClient cloudFoundryClient, + private Mono requestUpdateApplication( String applicationId, Map environmentJsons, ApplicationManifest manifest, String stackId) { return requestUpdateApplication( - cloudFoundryClient, applicationId, builder -> { builder.command(manifest.getCommand()) @@ -2386,11 +2120,9 @@ private static Mono requestUpdateApplication( }); } - private static Mono requestUpdateApplication( - CloudFoundryClient cloudFoundryClient, - String applicationId, - UnaryOperator modifier) { - return cloudFoundryClient + private Mono requestUpdateApplication( + String applicationId, UnaryOperator modifier) { + return this.cloudFoundryClient .applicationsV2() .update( modifier.apply( @@ -2400,45 +2132,32 @@ private static Mono requestUpdateApplication( .cast(AbstractApplicationResource.class); } - private static Mono requestUpdateApplicationEnvironment( - CloudFoundryClient cloudFoundryClient, - String applicationId, - Map environment) { + private Mono requestUpdateApplicationEnvironment( + String applicationId, Map environment) { return requestUpdateApplication( - cloudFoundryClient, - applicationId, - builder -> builder.environmentJsons(environment)); + applicationId, builder -> builder.environmentJsons(environment)); } - private static Mono requestUpdateApplicationHealthCheckType( - CloudFoundryClient cloudFoundryClient, - String applicationId, - ApplicationHealthCheck type) { + private Mono requestUpdateApplicationHealthCheckType( + String applicationId, ApplicationHealthCheck type) { return requestUpdateApplication( - cloudFoundryClient, - applicationId, - builder -> builder.healthCheckType(type.getValue())); + applicationId, builder -> builder.healthCheckType(type.getValue())); } - private static Mono requestUpdateApplicationName( - CloudFoundryClient cloudFoundryClient, String applicationId, String name) { - return requestUpdateApplication( - cloudFoundryClient, applicationId, builder -> builder.name(name)); + private Mono requestUpdateApplicationName( + String applicationId, String name) { + return requestUpdateApplication(applicationId, builder -> builder.name(name)); } - private static Mono requestUpdateApplicationSsh( - CloudFoundryClient cloudFoundryClient, String applicationId, boolean enabled) { + private Mono requestUpdateApplicationSsh( + String applicationId, boolean enabled) { return requestUpdateApplicationFeature( - cloudFoundryClient, - applicationId, - builder -> builder.featureName(APP_FEATURE_SSH).enabled(enabled)); + applicationId, builder -> builder.featureName(APP_FEATURE_SSH).enabled(enabled)); } - private static Mono requestUpdateApplicationFeature( - CloudFoundryClient cloudFoundryClient, - String applicationId, - UnaryOperator modifier) { - return cloudFoundryClient + private Mono requestUpdateApplicationFeature( + String applicationId, UnaryOperator modifier) { + return this.cloudFoundryClient .applicationsV3() .updateFeature( modifier.apply( @@ -2449,32 +2168,24 @@ private static Mono requestUpdateApplicationFeature( .cast(ApplicationFeature.class); } - private static Mono requestUpdateApplicationScale( - CloudFoundryClient cloudFoundryClient, - String applicationId, - Integer disk, - Integer instances, - Integer memory) { + private Mono requestUpdateApplicationScale( + String applicationId, Integer disk, Integer instances, Integer memory) { return requestUpdateApplication( - cloudFoundryClient, applicationId, builder -> builder.diskQuota(disk).instances(instances).memory(memory)); } - private static Mono requestUpdateApplicationSsh( - CloudFoundryClient cloudFoundryClient, String applicationId, Boolean enabled) { - return requestUpdateApplication( - cloudFoundryClient, applicationId, builder -> builder.enableSsh(enabled)); + private Mono requestUpdateApplicationSsh( + String applicationId, Boolean enabled) { + return requestUpdateApplication(applicationId, builder -> builder.enableSsh(enabled)); } - private static Mono requestUpdateApplicationState( - CloudFoundryClient cloudFoundryClient, String applicationId, String state) { - return requestUpdateApplication( - cloudFoundryClient, applicationId, builder -> builder.state(state)); + private Mono requestUpdateApplicationState( + String applicationId, String state) { + return requestUpdateApplication(applicationId, builder -> builder.state(state)); } - private static Mono requestUploadApplication( - CloudFoundryClient cloudFoundryClient, + private Mono requestUploadApplication( String applicationId, Path application, List matchedResources) { @@ -2497,15 +2208,12 @@ private static Mono requestUploadApplication( (a, b) -> a) .build(); - return cloudFoundryClient.applicationsV2().upload(request); + return this.cloudFoundryClient.applicationsV2().upload(request); } - private static Mono requestUploadPackage( - CloudFoundryClient cloudFoundryClient, - String packageId, - Path bits, - List matchedResources) { - return cloudFoundryClient + private Mono requestUploadPackage( + String packageId, Path bits, List matchedResources) { + return this.cloudFoundryClient .packages() .upload( UploadPackageRequest.builder() @@ -2516,39 +2224,25 @@ private static Mono requestUploadPackage( .then(); } - private static Mono restageApplication( - CloudFoundryClient cloudFoundryClient, + private Mono restageApplication( String application, String applicationId, Duration stagingTimeout, Duration startupTimeout) { - return requestRestageApplication(cloudFoundryClient, applicationId) - .flatMap( - response -> - waitForStaging( - cloudFoundryClient, - application, - applicationId, - stagingTimeout)) - .then( - waitForRunning( - cloudFoundryClient, application, applicationId, startupTimeout)); + return requestRestageApplication(applicationId) + .flatMap(response -> waitForStaging(application, applicationId, stagingTimeout)) + .then(waitForRunning(application, applicationId, startupTimeout)); } - private static Mono restartApplication( - CloudFoundryClient cloudFoundryClient, + private Mono restartApplication( String application, String applicationId, Duration stagingTimeout, Duration startupTimeout) { - return stopApplication(cloudFoundryClient, applicationId) + return stopApplication(applicationId) .then( startApplicationAndWait( - cloudFoundryClient, - application, - applicationId, - stagingTimeout, - startupTimeout)); + application, applicationId, stagingTimeout, startupTimeout)); } private static boolean shouldStartApplication( @@ -2560,51 +2254,37 @@ private static boolean shouldStartApplication(PushApplicationManifestRequest req return !Optional.ofNullable(request.getNoStart()).orElse(false); } - private static Mono startApplicationAndWait( - CloudFoundryClient cloudFoundryClient, + private Mono startApplicationAndWait( String application, String applicationId, Duration stagingTimeout, Duration startupTimeout) { - return requestUpdateApplicationState(cloudFoundryClient, applicationId, STARTED_STATE) - .flatMap( - response -> - waitForStaging( - cloudFoundryClient, - application, - applicationId, - stagingTimeout)) - .then( - waitForRunning( - cloudFoundryClient, application, applicationId, startupTimeout)); + return requestUpdateApplicationState(applicationId, STARTED_STATE) + .flatMap(response -> waitForStaging(application, applicationId, stagingTimeout)) + .then(waitForRunning(application, applicationId, startupTimeout)); } - private static Mono stopAndStartApplication( - CloudFoundryClient cloudFoundryClient, - String applicationId, - String name, - PushApplicationManifestRequest request) { - return stopApplication(cloudFoundryClient, applicationId) + private Mono stopAndStartApplication( + String applicationId, String name, PushApplicationManifestRequest request) { + return stopApplication(applicationId) .filter(resource -> shouldStartApplication(request, resource)) .flatMap( resource -> startApplicationAndWait( - cloudFoundryClient, name, applicationId, request.getStagingTimeout(), request.getStartupTimeout())); } - private static Mono stopApplication( - CloudFoundryClient cloudFoundryClient, String applicationId) { - return requestUpdateApplicationState(cloudFoundryClient, applicationId, STOPPED_STATE); + private Mono stopApplication(String applicationId) { + return requestUpdateApplicationState(applicationId, STOPPED_STATE); } - private static Mono stopApplicationIfNotStopped( - CloudFoundryClient cloudFoundryClient, AbstractApplicationResource resource) { + private Mono stopApplicationIfNotStopped( + AbstractApplicationResource resource) { return isNotIn(resource, STOPPED_STATE) - ? stopApplication(cloudFoundryClient, ResourceUtils.getId(resource)) + ? stopApplication(ResourceUtils.getId(resource)) : Mono.just(resource); } @@ -2645,7 +2325,7 @@ private static ApplicationEnvironments toApplicationEnvironments( .build(); } - private static Mono toApplicationManifest( + private Mono toApplicationManifest( List buildpacks, SummaryApplicationResponse response, String stackName) { ApplicationManifest.Builder builder = ApplicationManifest.builder() @@ -2773,7 +2453,7 @@ private static InstanceDetail toInstanceDetail( .build(); } - private static Mono> toInstanceDetailList( + private Mono> toInstanceDetailList( ApplicationInstancesResponse instancesResponse, ApplicationStatisticsResponse statisticsResponse) { return Flux.fromIterable(instancesResponse.getInstances().entrySet()) @@ -2807,19 +2487,16 @@ private static String toUrl(org.cloudfoundry.client.v2.routes.Route route) { return sb.toString(); } - private static Mono> toUrls(List routes) { + private Mono> toUrls(List routes) { return Flux.fromIterable(routes).map(DefaultApplications::toUrl).collectList(); } - private static Mono updateBuildpacks( - CloudFoundryClient cloudFoundryClient, - String applicationId, - ApplicationManifest manifest) { + private Mono updateBuildpacks(String applicationId, ApplicationManifest manifest) { if (manifest.getBuildpacks() == null || manifest.getBuildpacks().size() < 2) { return Mono.empty(); } - return cloudFoundryClient + return this.cloudFoundryClient .applicationsV3() .update( org.cloudfoundry.client.v3.applications.UpdateApplicationRequest.builder() @@ -2837,8 +2514,7 @@ private static Mono updateBuildpacks( .then(); } - private static Mono uploadApplicationAndWait( - CloudFoundryClient cloudFoundryClient, + private Mono uploadApplicationAndWait( String applicationId, Path application, List matchedResources, @@ -2847,10 +2523,7 @@ private static Mono uploadApplicationAndWait( () -> { if (matchedResources.isEmpty()) { return requestUploadApplication( - cloudFoundryClient, - applicationId, - application, - matchedResources); + applicationId, application, matchedResources); } else { List paths = matchedResources.stream() @@ -2863,7 +2536,6 @@ private static Mono uploadApplicationAndWait( .flatMap( filteredApplication -> requestUploadApplication( - cloudFoundryClient, applicationId, filteredApplication, matchedResources) @@ -2882,11 +2554,12 @@ private static Mono uploadApplicationAndWait( } }) .flatMap( - job -> JobUtils.waitForCompletion(cloudFoundryClient, stagingTimeout, job)); + job -> + JobUtils.waitForCompletion( + this.cloudFoundryClient, stagingTimeout, job)); } - private static Mono uploadPackageBitsAndWait( - CloudFoundryClient cloudFoundryClient, + private Mono uploadPackageBitsAndWait( String packageId, Path application, List matchedResources, @@ -2895,10 +2568,7 @@ private static Mono uploadPackageBitsAndWait( () -> { if (matchedResources.isEmpty()) { return requestUploadPackage( - cloudFoundryClient, - packageId, - application, - matchedResources); + packageId, application, matchedResources); } else { List paths = matchedResources.stream() @@ -2909,7 +2579,6 @@ private static Mono uploadPackageBitsAndWait( .flatMap( filteredApplication -> requestUploadPackage( - cloudFoundryClient, packageId, filteredApplication, matchedResources) @@ -2927,18 +2596,13 @@ private static Mono uploadPackageBitsAndWait( })); } }) - .then( - waitForUploadProcessingCompleted( - cloudFoundryClient, packageId, processingTimeout)); + .then(waitForUploadProcessingCompleted(packageId, processingTimeout)); } - private static Mono waitForBuildStaging( - CloudFoundryClient cloudFoundryClient, - String buildId, - String applicationName, - Duration stagingTimeout) { + private Mono waitForBuildStaging( + String buildId, String applicationName, Duration stagingTimeout) { Duration timeout = Optional.ofNullable(stagingTimeout).orElse(Duration.ofMinutes(15)); - return cloudFoundryClient + return this.cloudFoundryClient .builds() .get(GetBuildRequest.builder().buildId(buildId).build()) .filter( @@ -2960,14 +2624,11 @@ private static Mono waitForBuildStaging( buildId, applicationName)); } - private static Mono waitForRunning( - CloudFoundryClient cloudFoundryClient, - String application, - String applicationId, - Duration startupTimeout) { + private Mono waitForRunning( + String application, String applicationId, Duration startupTimeout) { Duration timeout = Optional.ofNullable(startupTimeout).orElse(Duration.ofMinutes(5)); - return requestApplicationInstances(cloudFoundryClient, applicationId) + return requestApplicationInstances(applicationId) .flatMapMany(response -> Flux.fromIterable(response.getInstances().values())) .map(ApplicationInstanceInfo::getState) .reduce("UNKNOWN", collectStates()) @@ -2986,16 +2647,13 @@ private static Mono waitForRunning( .then(); } - private static Mono waitForRunningV3( - CloudFoundryClient cloudFoundryClient, - String applicationName, - String applicationId, - Duration startupTimeout) { + private Mono waitForRunningV3( + String applicationName, String applicationId, Duration startupTimeout) { Duration timeout = Optional.ofNullable(startupTimeout).orElse(Duration.ofMinutes(5)); return PaginationUtils.requestClientV3Resources( page -> - cloudFoundryClient + this.cloudFoundryClient .applicationsV3() .listProcesses( ListApplicationProcessesRequest.builder() @@ -3005,7 +2663,7 @@ private static Mono waitForRunningV3( .filter(p -> p.getInstances() != 0) .flatMap( process -> - cloudFoundryClient + this.cloudFoundryClient .processes() .getStatistics( GetProcessStatisticsRequest.builder() @@ -3048,14 +2706,11 @@ private static Mono waitForRunningV3( .then(); } - private static Mono waitForStaging( - CloudFoundryClient cloudFoundryClient, - String application, - String applicationId, - Duration stagingTimeout) { + private Mono waitForStaging( + String application, String applicationId, Duration stagingTimeout) { Duration timeout = Optional.ofNullable(stagingTimeout).orElse(Duration.ofMinutes(15)); - return requestGetApplication(cloudFoundryClient, applicationId) + return requestGetApplication(applicationId) .map(response -> ResourceUtils.getEntity(response).getPackageState()) .filter(isStagingComplete()) .repeatWhenEmpty( @@ -3072,9 +2727,9 @@ private static Mono waitForStaging( .then(); } - private static Mono waitForUploadProcessingCompleted( - CloudFoundryClient cloudFoundryClient, String packageId, Duration processingTimeout) { - return cloudFoundryClient + private Mono waitForUploadProcessingCompleted( + String packageId, Duration processingTimeout) { + return this.cloudFoundryClient .packages() .get(GetPackageRequest.builder().packageId(packageId).build()) .filter( From 016e3c93b1a857215ea6d117d0523853ba50f06a Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Wed, 17 Dec 2025 17:54:20 +0100 Subject: [PATCH 03/16] DefaultApplications: remove parameter spaceId and use this. instead --- .../applications/DefaultApplications.java | 206 +++++++++--------- 1 file changed, 97 insertions(+), 109 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 50b0fdd087..34fd46da09 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -245,10 +245,10 @@ public DefaultApplications( @Override public Mono copySource(CopySourceApplicationRequest request) { return Mono.zip( - getApplicationId(request.getName(), spaceId), + getApplicationId(request.getName()), getApplicationIdFromOrgSpace( request.getTargetName(), - spaceId, + this.spaceId, request.getTargetOrganization(), request.getTargetSpace())) .flatMap( @@ -292,7 +292,7 @@ public Mono delete(DeleteApplicationRequest request) { @Override public Mono disableSsh(DisableApplicationSshRequest request) { - return getApplicationIdV3(request.getName(), spaceId) + return getApplicationIdV3(request.getName()) // TODO dgarnier: is this correct? .filterWhen(applicationId -> getSshEnabled(applicationId)) .flatMap(applicationId -> requestUpdateApplicationSsh(applicationId, false)) @@ -303,7 +303,7 @@ public Mono disableSsh(DisableApplicationSshRequest request) { @Override public Mono enableSsh(EnableApplicationSshRequest request) { - return getApplicationIdV3(request.getName(), spaceId) + return getApplicationIdV3(request.getName()) .filterWhen(applicationId -> getSshEnabled(applicationId).map(enabled -> !enabled)) .flatMap(applicationId -> requestUpdateApplicationSsh(applicationId, true)) .then() @@ -313,7 +313,7 @@ public Mono enableSsh(EnableApplicationSshRequest request) { @Override public Mono get(GetApplicationRequest request) { - return getApplication(request.getName(), spaceId) + return getApplication(request.getName()) .flatMap(app -> getAuxiliaryContent(app)) .map(function(DefaultApplications::toApplicationDetail)) .transform(OperationsLogging.log("Get Application")) @@ -323,7 +323,7 @@ public Mono get(GetApplicationRequest request) { // TODO dgarnier: manifest v3? @Override public Mono getApplicationManifest(GetApplicationManifestRequest request) { - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMap( applicationId -> Mono.zip( @@ -344,7 +344,7 @@ public Mono getApplicationManifest(GetApplicationManifestRe @Override public Mono getEnvironments( GetApplicationEnvironmentsRequest request) { - return getApplicationIdV3(request.getName(), spaceId) + return getApplicationIdV3(request.getName()) .flatMap(applicationId -> requestApplicationEnvironment(applicationId)) .map(DefaultApplications::toApplicationEnvironments) .transform(OperationsLogging.log("Get Application Environments")) @@ -353,7 +353,7 @@ public Mono getEnvironments( @Override public Flux getEvents(GetApplicationEventsRequest request) { - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMapMany( applicationId -> requestEvents(applicationId) @@ -367,7 +367,7 @@ public Flux getEvents(GetApplicationEventsRequest request) { @Override public Mono getHealthCheck(GetApplicationHealthCheckRequest request) { - return getApplication(request.getName(), spaceId) + return getApplication(request.getName()) .map(DefaultApplications::toHealthCheck) .transform(OperationsLogging.log("Get Application Health Check")) .checkpoint(); @@ -375,7 +375,7 @@ public Mono getHealthCheck(GetApplicationHealthCheckRequ @Override public Flux list() { - return requestSpaceSummary(spaceId) + return requestSpaceSummary() .flatMapMany(DefaultApplications::extractApplications) .map(DefaultApplications::toApplicationSummary) .transform(OperationsLogging.log("List Applications")) @@ -384,7 +384,7 @@ public Flux list() { @Override public Flux listTasks(ListApplicationTasksRequest request) { - return getApplicationIdV3(request.getName(), spaceId) + return getApplicationIdV3(request.getName()) .flatMapMany(applicationId -> requestListTasks(applicationId)) .map(DefaultApplications::toTask) .transform(OperationsLogging.log("List Application Tasks")) @@ -393,7 +393,7 @@ public Flux listTasks(ListApplicationTasksRequest request) { @Override public Flux logs(LogsRequest request) { - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMapMany(applicationId -> getLogs(applicationId, request.getRecent())) .transform(OperationsLogging.log("Get Application Logs")) .checkpoint(); @@ -468,7 +468,7 @@ public Mono push(PushApplicationRequest request) { // TODO dgarnier: pass orgId to constructor? @Override public Mono pushManifest(PushApplicationManifestRequest request) { - return getSpaceOrganizationId(spaceId) + return getSpaceOrganizationId(this.spaceId) .flatMap(organizationId -> listAvailableDomains(organizationId)) .flatMapMany( availableDomains -> @@ -480,8 +480,7 @@ public Mono pushManifest(PushApplicationManifestRequest request) { availableDomains, manifest, this.randomWords, - request, - spaceId); + request); } else if (!manifest.getDocker() .getImage() .isEmpty()) { @@ -489,8 +488,7 @@ public Mono pushManifest(PushApplicationManifestRequest request) { availableDomains, manifest, this.randomWords, - request, - spaceId); + request); } else { throw new IllegalStateException( "One of application or" @@ -513,11 +511,11 @@ public Mono pushManifestV3(PushManifestV3Request request) { throw new RuntimeException("Could not serialize manifest", e); } - return applyManifestAndWaitForCompletion(spaceId, manifestSerialized) + return applyManifestAndWaitForCompletion(manifestSerialized) .flatMapMany(ignored -> Flux.fromIterable(request.getManifest().getApplications())) .flatMap( manifestApp -> - getApplicationIdV3(manifestApp.getName(), spaceId) + getApplicationIdV3(manifestApp.getName()) .flatMap( appId -> Mono.zip( @@ -535,7 +533,7 @@ public Mono pushManifestV3(PushManifestV3Request request) { @Override public Mono rename(RenameApplicationRequest request) { - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMap( applicationId -> requestUpdateApplicationName(applicationId, request.getNewName())) @@ -546,7 +544,7 @@ public Mono rename(RenameApplicationRequest request) { @Override public Mono restage(RestageApplicationRequest request) { - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMap( applicationId -> restageApplication( @@ -560,7 +558,7 @@ public Mono restage(RestageApplicationRequest request) { @Override public Mono restart(RestartApplicationRequest request) { - return getApplication(request.getName(), spaceId) + return getApplication(request.getName()) .flatMap(resource -> stopApplicationIfNotStopped(resource)) .flatMap( stoppedApplication -> @@ -575,7 +573,7 @@ public Mono restart(RestartApplicationRequest request) { @Override public Mono restartInstance(RestartApplicationInstanceRequest request) { - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMap( applicationId -> requestTerminateApplicationInstance( @@ -586,7 +584,7 @@ public Mono restartInstance(RestartApplicationInstanceRequest request) { @Override public Mono runTask(RunApplicationTaskRequest request) { - return getApplicationIdV3(request.getApplicationName(), spaceId) + return getApplicationIdV3(request.getApplicationName()) .flatMap(applicationId -> requestCreateTask(applicationId, request)) .map(DefaultApplications::toTask) .transform(OperationsLogging.log("Run Application Task Instance")) @@ -598,7 +596,7 @@ public Mono scale(ScaleApplicationRequest request) { if (!areModifiersPresent(request)) { return Mono.empty(); } - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMap( applicationId -> requestUpdateApplicationScale( @@ -620,7 +618,7 @@ public Mono scale(ScaleApplicationRequest request) { @Override public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationRequest request) { - return getApplication(request.getName(), spaceId) + return getApplication(request.getName()) .flatMap( resource -> requestUpdateApplicationEnvironment( @@ -636,7 +634,7 @@ public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationReques @Override public Mono setHealthCheck(SetApplicationHealthCheckRequest request) { - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMap( applicationId -> requestUpdateApplicationHealthCheckType( @@ -648,7 +646,7 @@ public Mono setHealthCheck(SetApplicationHealthCheckRequest request) { @Override public Mono sshEnabled(ApplicationSshEnabledRequest request) { - return getApplicationIdV3(request.getName(), spaceId) + return getApplicationIdV3(request.getName()) .flatMap(applicationId -> getSshEnabled(applicationId)) .transform(OperationsLogging.log("Is Application SSH Enabled")) .checkpoint(); @@ -656,7 +654,7 @@ public Mono sshEnabled(ApplicationSshEnabledRequest request) { @Override public Mono start(StartApplicationRequest request) { - return getApplicationIdWhere(request.getName(), spaceId, isNotIn(STARTED_STATE)) + return getApplicationIdWhere(request.getName(), isNotIn(STARTED_STATE)) .flatMap( applicationId -> startApplicationAndWait( @@ -670,7 +668,7 @@ public Mono start(StartApplicationRequest request) { @Override public Mono stop(StopApplicationRequest request) { - return getApplicationIdWhere(request.getName(), spaceId, isNotIn(STOPPED_STATE)) + return getApplicationIdWhere(request.getName(), isNotIn(STOPPED_STATE)) .flatMap(applicationId -> stopApplication(applicationId)) .then() .transform(OperationsLogging.log("Stop Application")) @@ -679,7 +677,7 @@ public Mono stop(StopApplicationRequest request) { @Override public Mono terminateTask(TerminateApplicationTaskRequest request) { - return getApplicationIdV3(request.getApplicationName(), spaceId) + return getApplicationIdV3(request.getApplicationName()) .flatMap(applicationId -> getTaskId(applicationId, request.getSequenceId())) .flatMap(taskId -> requestTerminateTask(taskId)) .then() @@ -689,7 +687,7 @@ public Mono terminateTask(TerminateApplicationTaskRequest request) { @Override public Mono unsetEnvironmentVariable(UnsetEnvironmentVariableApplicationRequest request) { - return getApplication(request.getName(), spaceId) + return getApplication(request.getName()) .flatMap( resource -> requestUpdateApplicationEnvironment( @@ -740,14 +738,13 @@ private Mono applyDropletAndWaitForRunning( .then(waitForRunningV3(appname, appId, null)); } - private Mono applyManifestAndWaitForCompletion( - String spaceId, byte[] manifestSerialized) { + private Mono applyManifestAndWaitForCompletion(byte[] manifestSerialized) { return this.cloudFoundryClient .spacesV3() .applyManifest( ApplyManifestRequest.builder() .manifest(manifestSerialized) - .spaceId(spaceId) + .spaceId(this.spaceId) .build()) .map( response -> @@ -773,25 +770,23 @@ private Flux associateDefaultDomain( String applicationId, List availableDomains, ApplicationManifest manifest, - RandomWords randomWords, - String spaceId) { + RandomWords randomWords) { return getDefaultDomainId() .flatMapMany( domainId -> getPushRouteIdFromDomain( - availableDomains, domainId, manifest, randomWords, spaceId)) + availableDomains, domainId, manifest, randomWords)) .flatMap(routeId -> requestAssociateRoute(applicationId, routeId)) .map(ResourceUtils::getId); } - private Mono bindServices( - String applicationId, ApplicationManifest manifest, String spaceId) { + private Mono bindServices(String applicationId, ApplicationManifest manifest) { if (manifest.getServices() == null || manifest.getServices().size() == 0) { return Mono.empty(); } return Flux.fromIterable(manifest.getServices()) - .flatMap(serviceInstanceName -> getServiceId(serviceInstanceName, spaceId)) + .flatMap(serviceInstanceName -> getServiceId(serviceInstanceName)) .flatMap( serviceInstanceId -> requestCreateServiceBinding(applicationId, serviceInstanceId) @@ -1002,6 +997,10 @@ private static Flux extractApplications( return Flux.fromIterable(getSpaceSummaryResponse.getApplications()); } + private Mono getApplication(String application) { + return getApplication(application, spaceId); + } + private Mono getApplication(String application, String spaceId) { return requestApplications(application, spaceId) .single() @@ -1027,13 +1026,16 @@ private Mono> getApplicationBuildpacks(String applicationId) { .defaultIfEmpty(Collections.emptyList()); } + private Mono getApplicationId(String application) { + return getApplicationId(application, spaceId); + } + private Mono getApplicationId(String application, String spaceId) { return getApplication(application, spaceId).map(ResourceUtils::getId); } - private Mono getApplicationId( - ApplicationManifest manifest, String spaceId, String stackId) { - return requestApplications(manifest.getName(), spaceId) + private Mono getApplicationId(ApplicationManifest manifest, String stackId) { + return requestApplications(manifest.getName()) .singleOrEmpty() .flatMap( application -> { @@ -1053,8 +1055,7 @@ private Mono getApplicationId( .map(ResourceUtils::getId); }) .switchIfEmpty( - requestCreateApplication(manifest, spaceId, stackId) - .map(ResourceUtils::getId)); + requestCreateApplication(manifest, stackId).map(ResourceUtils::getId)); } private Mono getApplicationIdFromOrgSpace( @@ -1073,13 +1074,13 @@ private Mono getApplicationIdFromOrgSpace( .flatMap(spaceId1 -> getApplicationId(application, spaceId1)); } - private Mono getApplicationIdV3(String applicationName, String spaceId) { - return getApplicationV3(applicationName, spaceId).map(ApplicationResource::getId); + private Mono getApplicationIdV3(String applicationName) { + return getApplicationV3(applicationName).map(ApplicationResource::getId); } private Mono getApplicationIdWhere( - String application, String spaceId, Predicate predicate) { - return getApplication(application, spaceId).filter(predicate).map(ResourceUtils::getId); + String application, Predicate predicate) { + return getApplication(application).filter(predicate).map(ResourceUtils::getId); } private Mono getApplicationInstances(String applicationId) { @@ -1106,8 +1107,8 @@ private Mono getApplicationStatistics(String appl t -> Mono.just(ApplicationStatisticsResponse.builder().build())); } - private Mono getApplicationV3(String application, String spaceId) { - return requestApplicationsV3(application, spaceId) + private Mono getApplicationV3(String application) { + return requestApplicationsV3(application) .single() .onErrorResume( NoSuchElementException.class, @@ -1263,10 +1264,9 @@ private Flux getPushRouteIdFromDomain( List availableDomains, String domainId, ApplicationManifest manifest, - RandomWords randomWords, - String spaceId) { + RandomWords randomWords) { if (isTcpDomain(availableDomains, domainId)) { - return requestCreateTcpRoute(domainId, spaceId).map(ResourceUtils::getId).flux(); + return requestCreateTcpRoute(domainId).map(ResourceUtils::getId).flux(); } List hosts; @@ -1295,16 +1295,14 @@ private Flux getPushRouteIdFromDomain( requestCreateRoute( domainId, host, - manifest.getRoutePath(), - spaceId) + manifest.getRoutePath()) .map(ResourceUtils::getId))); } private Flux getPushRouteIdFromRoute( List availableDomains, ApplicationManifest manifest, - RandomWords randomWords, - String spaceId) { + RandomWords randomWords) { return Flux.fromIterable(manifest.getRoutes()) .flatMap( route -> @@ -1317,11 +1315,10 @@ private Flux getPushRouteIdFromRoute( String domainId = getDomainId(availableDomains, decomposedRoute.getDomain()); if (isTcpDomain(availableDomains, domainId)) { - return getRouteIdForTcpRoute( - decomposedRoute, domainId, manifest, spaceId); + return getRouteIdForTcpRoute(decomposedRoute, domainId, manifest); } else { return getRouteIdForHttpRoute( - decomposedRoute, domainId, manifest, randomWords, spaceId); + decomposedRoute, domainId, manifest, randomWords); } }); } @@ -1342,28 +1339,23 @@ private Mono getRouteIdForHttpRoute( DecomposedRoute decomposedRoute, String domainId, ApplicationManifest manifest, - RandomWords randomWords, - String spaceId) { + RandomWords randomWords) { String derivedHost = deriveHostname(decomposedRoute.getHost(), manifest, randomWords); return getRouteId(domainId, derivedHost, decomposedRoute.getPath()) .switchIfEmpty( - requestCreateRoute( - domainId, derivedHost, decomposedRoute.getPath(), spaceId) + requestCreateRoute(domainId, derivedHost, decomposedRoute.getPath()) .map(ResourceUtils::getId)); } private Mono getRouteIdForTcpRoute( - DecomposedRoute decomposedRoute, - String domainId, - ApplicationManifest manifest, - String spaceId) { + DecomposedRoute decomposedRoute, String domainId, ApplicationManifest manifest) { if (Optional.ofNullable(manifest.getRandomRoute()).orElse(false)) { - return requestCreateTcpRoute(domainId, spaceId).map(ResourceUtils::getId); + return requestCreateTcpRoute(domainId).map(ResourceUtils::getId); } return getTcpRouteId(domainId, decomposedRoute.getPort()) .switchIfEmpty( - requestCreateTcpRoute(domainId, decomposedRoute.getPort(), spaceId) + requestCreateTcpRoute(domainId, decomposedRoute.getPort()) .map(ResourceUtils::getId)); } @@ -1374,15 +1366,15 @@ private Mono> getRoutes(String app private Mono>, String>> getRoutesAndApplicationId( DeleteApplicationRequest request, String spaceId, boolean deleteRoutes) { - return getApplicationId(request.getName(), spaceId) + return getApplicationId(request.getName()) .flatMap( applicationId -> getOptionalRoutes(deleteRoutes, applicationId) .zipWith(Mono.just(applicationId))); } - private Mono getServiceId(String serviceInstanceName, String spaceId) { - return requestListServiceInstances(serviceInstanceName, spaceId) + private Mono getServiceId(String serviceInstanceName) { + return requestListServiceInstances(serviceInstanceName) .map(ResourceUtils::getId) .single() .onErrorResume( @@ -1499,8 +1491,7 @@ private Mono prepareDomainsAndRoutes( List availableDomains, ApplicationManifest manifest, List existingRoutes, - RandomWords randomWords, - String spaceId) { + RandomWords randomWords) { if (Optional.ofNullable(manifest.getNoRoute()).orElse(false)) { return Flux.fromIterable(existingRoutes) .map(ResourceUtils::getId) @@ -1512,7 +1503,7 @@ private Mono prepareDomainsAndRoutes( if (manifest.getDomains() == null) { if (existingRoutes.isEmpty()) { return associateDefaultDomain( - applicationId, availableDomains, manifest, randomWords, spaceId) + applicationId, availableDomains, manifest, randomWords) .then(); } return Mono.empty(); // A route already exists for the application, do nothing @@ -1524,8 +1515,7 @@ private Mono prepareDomainsAndRoutes( availableDomains, getDomainId(availableDomains, domain), manifest, - randomWords, - spaceId) + randomWords) .flatMap( routeId -> requestAssociateRoute( @@ -1536,7 +1526,7 @@ private Mono prepareDomainsAndRoutes( List existingRouteIds = existingRoutes.stream().map(ResourceUtils::getId).collect(Collectors.toList()); - return getPushRouteIdFromRoute(availableDomains, manifest, randomWords, spaceId) + return getPushRouteIdFromRoute(availableDomains, manifest, randomWords) .filter(routeId -> !existingRouteIds.contains(routeId)) .flatMapSequential(routeId -> requestAssociateRoute(applicationId, routeId), 1) .then(); @@ -1546,11 +1536,10 @@ private Flux pushApplication( List availableDomains, ApplicationManifest manifest, RandomWords randomWords, - PushApplicationManifestRequest request, - String spaceId) { + PushApplicationManifestRequest request) { return getOptionalStackId(manifest.getStack()) - .flatMapMany(stackId -> getApplicationId(manifest, spaceId, stackId.orElse(null))) + .flatMapMany(stackId -> getApplicationId(manifest, stackId.orElse(null))) .flatMap( applicationId -> Mono.zip( @@ -1566,8 +1555,7 @@ private Flux pushApplication( availableDomains, manifest, existingRoutes, - randomWords, - spaceId) + randomWords) .thenReturn( Tuples.of( applicationId, matchedResources)))) @@ -1575,8 +1563,7 @@ private Flux pushApplication( function( (applicationId, matchedResources) -> Mono.when( - bindServices( - applicationId, manifest, spaceId), + bindServices(applicationId, manifest), updateBuildpacks(applicationId, manifest), uploadApplicationAndWait( applicationId, @@ -1594,11 +1581,10 @@ private Flux pushDocker( List availableDomains, ApplicationManifest manifest, RandomWords randomWords, - PushApplicationManifestRequest request, - String spaceId) { + PushApplicationManifestRequest request) { return getOptionalStackId(manifest.getStack()) - .flatMapMany(stackId -> getApplicationId(manifest, spaceId, stackId.orElse(null))) + .flatMapMany(stackId -> getApplicationId(manifest, stackId.orElse(null))) .flatMap( applicationId -> Mono.zip( @@ -1612,10 +1598,9 @@ private Flux pushDocker( availableDomains, manifest, existingRoutes, - randomWords, - spaceId) + randomWords) .thenReturn(applicationId))) - .delayUntil(applicationId -> bindServices(applicationId, manifest, spaceId)) + .delayUntil(applicationId -> bindServices(applicationId, manifest)) .flatMap( applicationId -> stopAndStartApplication( @@ -1682,6 +1667,10 @@ private Mono requestApplicationSummary(String applic .summary(SummaryApplicationRequest.builder().applicationId(applicationId).build()); } + private Flux requestApplications(String application) { + return requestApplications(application, spaceId); + } + private Flux requestApplications( String application, String spaceId) { return PaginationUtils.requestClientV2Resources( @@ -1697,7 +1686,7 @@ private Flux requestApplications( .cast(AbstractApplicationResource.class); } - private Flux requestApplicationsV3(String application, String spaceId) { + private Flux requestApplicationsV3(String application) { return PaginationUtils.requestClientV3Resources( page -> this.cloudFoundryClient @@ -1705,7 +1694,7 @@ private Flux requestApplicationsV3(String application, Stri .list( ListApplicationsRequest.builder() .name(application) - .spaceId(spaceId) + .spaceId(this.spaceId) .page(page) .build())); } @@ -1733,7 +1722,7 @@ private Mono requestCopyBits( } private Mono requestCreateApplication( - ApplicationManifest manifest, String spaceId, String stackId) { + ApplicationManifest manifest, String stackId) { CreateApplicationRequest.Builder builder = CreateApplicationRequest.builder() .command(manifest.getCommand()) @@ -1748,7 +1737,7 @@ private Mono requestCreateApplication( .instances(manifest.getInstances()) .memory(manifest.getMemory()) .name(manifest.getName()) - .spaceId(spaceId) + .spaceId(this.spaceId) .stackId(stackId); if (manifest.getBuildpacks() != null && manifest.getBuildpacks().size() == 1) { @@ -1775,7 +1764,7 @@ private Mono requestCreateApplication( } private Mono requestCreateRoute( - String domainId, String host, String routePath, String spaceId) { + String domainId, String host, String routePath) { return this.cloudFoundryClient .routes() .create( @@ -1783,7 +1772,7 @@ private Mono requestCreateRoute( .domainId(domainId) .host(host) .path(routePath) - .spaceId(spaceId) + .spaceId(this.spaceId) .build()); } @@ -1812,26 +1801,25 @@ private Mono requestCreateTask( .build()); } - private Mono requestCreateTcpRoute(String domainId, String spaceId) { + private Mono requestCreateTcpRoute(String domainId) { return this.cloudFoundryClient .routes() .create( org.cloudfoundry.client.v2.routes.CreateRouteRequest.builder() .domainId(domainId) .generatePort(true) - .spaceId(spaceId) + .spaceId(this.spaceId) .build()); } - private Mono requestCreateTcpRoute( - String domainId, Integer port, String spaceId) { + private Mono requestCreateTcpRoute(String domainId, Integer port) { return this.cloudFoundryClient .routes() .create( org.cloudfoundry.client.v2.routes.CreateRouteRequest.builder() .domainId(domainId) .port(port) - .spaceId(spaceId) + .spaceId(this.spaceId) .build()); } @@ -1899,7 +1887,7 @@ private Flux requestListServiceBindings(String applicati } private Flux requestListServiceInstances( - String serviceInstanceName, String spaceId) { + String serviceInstanceName) { return PaginationUtils.requestClientV2Resources( page -> this.cloudFoundryClient @@ -1909,7 +1897,7 @@ private Flux requestListServiceInstances( .page(page) .returnUserProvidedServiceInstances(true) .name(serviceInstanceName) - .spaceId(spaceId) + .spaceId(this.spaceId) .build())); } @@ -2037,10 +2025,10 @@ private Mono requestSpace(String spaceId) { .get(GetSpaceRequest.builder().spaceId(spaceId).build()); } - private Mono requestSpaceSummary(String spaceId) { + private Mono requestSpaceSummary() { return this.cloudFoundryClient .spaces() - .getSummary(GetSpaceSummaryRequest.builder().spaceId(spaceId).build()); + .getSummary(GetSpaceSummaryRequest.builder().spaceId(this.spaceId).build()); } private Mono requestStack(String stackId) { From 5e22e963c77037fb95ada210db5c090e2432657a Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Wed, 17 Dec 2025 18:12:47 +0100 Subject: [PATCH 04/16] DefaultApplications: use applicationsV3 for routes --- .../applications/DefaultApplications.java | 60 +- .../applications/DefaultApplicationsTest.java | 1298 +++++++++-------- 2 files changed, 723 insertions(+), 635 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 34fd46da09..7d2cac7464 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -56,7 +56,6 @@ import org.cloudfoundry.client.v2.applications.CreateApplicationResponse; import org.cloudfoundry.client.v2.applications.DockerCredentials; import org.cloudfoundry.client.v2.applications.InstanceStatistics; -import org.cloudfoundry.client.v2.applications.ListApplicationRoutesRequest; import org.cloudfoundry.client.v2.applications.ListApplicationServiceBindingsRequest; import org.cloudfoundry.client.v2.applications.RemoveApplicationRouteRequest; import org.cloudfoundry.client.v2.applications.RemoveApplicationServiceBindingRequest; @@ -112,10 +111,13 @@ import org.cloudfoundry.client.v3.applications.ApplicationResource; import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentRequest; import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse; import org.cloudfoundry.client.v3.applications.GetApplicationResponse; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledRequest; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledResponse; import org.cloudfoundry.client.v3.applications.ListApplicationProcessesRequest; +import org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest; import org.cloudfoundry.client.v3.applications.ListApplicationsRequest; import org.cloudfoundry.client.v3.applications.SetApplicationCurrentDropletRequest; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; @@ -821,14 +823,15 @@ private static String cleanName(ApplicationManifest manifest) { return manifest.getName().replaceAll("\\.", ""); } - private static BiFunction collectStates() { + public static BiFunction collectStates() { return (totalState, instanceState) -> { - if ("RUNNING".equals(instanceState) || "RUNNING".equals(totalState)) { - return "RUNNING"; + if (ProcessState.RUNNING.equals(instanceState) + || ProcessState.RUNNING.equals(totalState)) { + return ProcessState.RUNNING; } - if ("FLAPPING".equals(instanceState) || "CRASHED".equals(instanceState)) { - return "FAILED"; + if (ProcessState.CRASHED.equals(instanceState)) { + return ProcessState.CRASHED; } return totalState; @@ -1096,7 +1099,8 @@ private Mono getApplicationInstances(String applic t -> Mono.just(ApplicationInstancesResponse.builder().build())); } - private Mono> getApplicationRoutes(String applicationId) { + private Mono> getApplicationRoutes( + String applicationId) { return requestApplicationRoutes(applicationId).collectList(); } @@ -1433,8 +1437,8 @@ private static boolean isIdentical(String s, String t) { return Objects.equals(s, t); } - private static Predicate isInstanceComplete() { - return state -> "RUNNING".equals(state) || "FAILED".equals(state); + private static Predicate isInstanceComplete() { + return state -> ProcessState.RUNNING.equals(state) || ProcessState.CRASHED.equals(state); } private static Predicate isNotIn(String expectedState) { @@ -1451,8 +1455,8 @@ private static boolean isRestartRequired( && STARTED_STATE.equals(ResourceUtils.getEntity(applicationResource).getState()); } - private static Predicate isRunning() { - return "RUNNING"::equals; + private static Predicate isRunning() { + return ProcessState.RUNNING::equals; } private static Predicate isStaged() { @@ -1490,11 +1494,11 @@ private Mono prepareDomainsAndRoutes( String applicationId, List availableDomains, ApplicationManifest manifest, - List existingRoutes, + List existingRoutes, RandomWords randomWords) { if (Optional.ofNullable(manifest.getNoRoute()).orElse(false)) { return Flux.fromIterable(existingRoutes) - .map(ResourceUtils::getId) + .map(org.cloudfoundry.client.v3.routes.RouteResource::getId) .flatMap(routeId -> requestRemoveRouteFromApplication(applicationId, routeId)) .then(); } @@ -1524,7 +1528,9 @@ private Mono prepareDomainsAndRoutes( } List existingRouteIds = - existingRoutes.stream().map(ResourceUtils::getId).collect(Collectors.toList()); + existingRoutes.stream() + .map(org.cloudfoundry.client.v3.routes.RouteResource::getId) + .collect(Collectors.toList()); return getPushRouteIdFromRoute(availableDomains, manifest, randomWords) .filter(routeId -> !existingRouteIds.contains(routeId)) @@ -1640,11 +1646,23 @@ private Mono requestApplicationInstances(String ap ApplicationInstancesRequest.builder().applicationId(applicationId).build()); } - private Flux requestApplicationRoutes(String applicationId) { - return PaginationUtils.requestClientV2Resources( + private Mono requestApplicationStatisticsV3( + String applicationId) { + return this.cloudFoundryClient + .applicationsV3() + .getProcessStatistics( + GetApplicationProcessStatisticsRequest.builder() + .applicationId(applicationId) + .type("web") + .build()); + } + + private Flux requestApplicationRoutes( + String applicationId) { + return PaginationUtils.requestClientV3Resources( page -> this.cloudFoundryClient - .applicationsV2() + .applicationsV3() .listRoutes( ListApplicationRoutesRequest.builder() .applicationId(applicationId) @@ -2616,10 +2634,10 @@ private Mono waitForRunning( String application, String applicationId, Duration startupTimeout) { Duration timeout = Optional.ofNullable(startupTimeout).orElse(Duration.ofMinutes(5)); - return requestApplicationInstances(applicationId) - .flatMapMany(response -> Flux.fromIterable(response.getInstances().values())) - .map(ApplicationInstanceInfo::getState) - .reduce("UNKNOWN", collectStates()) + return requestApplicationStatisticsV3(applicationId) + .flatMapIterable(GetApplicationProcessStatisticsResponse::getResources) + .map(ProcessStatisticsResource::getState) + .reduce(ProcessState.STARTING, collectStates()) .filter(isInstanceComplete()) .repeatWhenEmpty( exponentialBackOff(Duration.ofSeconds(1), Duration.ofSeconds(15), timeout)) diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index 2398d3325d..14b20a5eb3 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -16,14 +16,6 @@ package org.cloudfoundry.operations.applications; -import static org.assertj.core.api.Assertions.assertThat; -import static org.cloudfoundry.client.v3.LifecycleType.BUILDPACK; -import static org.cloudfoundry.client.v3.LifecycleType.DOCKER; -import static org.cloudfoundry.operations.TestObjects.fill; -import static org.mockito.Mockito.RETURNS_SMART_NULLS; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.io.IOException; import java.nio.file.Path; import java.time.Duration; @@ -36,6 +28,7 @@ import java.util.Optional; import java.util.Queue; import java.util.function.Supplier; + import org.cloudfoundry.client.CloudFoundryClient; import org.cloudfoundry.client.v2.ClientV2Exception; import org.cloudfoundry.client.v2.Metadata; @@ -55,8 +48,6 @@ import org.cloudfoundry.client.v2.applications.DockerCredentials; import org.cloudfoundry.client.v2.applications.GetApplicationResponse; import org.cloudfoundry.client.v2.applications.InstanceStatistics; -import org.cloudfoundry.client.v2.applications.ListApplicationRoutesRequest; -import org.cloudfoundry.client.v2.applications.ListApplicationRoutesResponse; import org.cloudfoundry.client.v2.applications.ListApplicationServiceBindingsRequest; import org.cloudfoundry.client.v2.applications.ListApplicationServiceBindingsResponse; import org.cloudfoundry.client.v2.applications.RemoveApplicationRouteRequest; @@ -124,15 +115,21 @@ import org.cloudfoundry.client.v3.BuildpackData; import org.cloudfoundry.client.v3.DockerData; import org.cloudfoundry.client.v3.Lifecycle; +import org.cloudfoundry.client.v3.Pagination; import org.cloudfoundry.client.v3.applications.ApplicationState; import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentRequest; import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledRequest; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledResponse; +import org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest; +import org.cloudfoundry.client.v3.applications.ListApplicationRoutesResponse; import org.cloudfoundry.client.v3.applications.ListApplicationsRequest; import org.cloudfoundry.client.v3.applications.ListApplicationsResponse; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureResponse; +import org.cloudfoundry.client.v3.processes.ProcessState; +import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; import org.cloudfoundry.client.v3.tasks.CancelTaskRequest; import org.cloudfoundry.client.v3.tasks.CancelTaskResponse; import org.cloudfoundry.client.v3.tasks.CreateTaskRequest; @@ -149,12 +146,21 @@ import org.cloudfoundry.util.FluentMap; import org.cloudfoundry.util.ResourceMatchingUtils; import org.junit.jupiter.api.Test; -import org.springframework.core.io.ClassPathResource; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import reactor.test.scheduler.VirtualTimeScheduler; +import org.springframework.core.io.ClassPathResource; +import static org.assertj.core.api.Assertions.assertThat; +import static org.cloudfoundry.client.v3.LifecycleType.BUILDPACK; +import static org.cloudfoundry.client.v3.LifecycleType.DOCKER; +import static org.cloudfoundry.operations.TestObjects.fill; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.RETURNS_SMART_NULLS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + final class DefaultApplicationsTest extends AbstractOperationsTest { private RandomWords randomWords = mock(RandomWords.class, RETURNS_SMART_NULLS); @@ -362,7 +368,7 @@ void deleteAndDeleteRoutesFailure() { .isInstanceOf(ClientV2Exception.class) .hasMessage( "test-error-details-errorCode(1):" - + " test-error-details-description")) + + " test-error-details-description")) .verify(Duration.ofSeconds(5)); } @@ -803,7 +809,7 @@ void getEvents() { .actor("test-event-actorName") .description( "instances: 1, memory: 2, state: test-state," - + " environment_json: test-data") + + " environment_json: test-data") .event("test-event-type") .id("test-event-id") .time(DateUtils.parseFromIso8601("2016-02-08T15:45:59Z")) @@ -949,7 +955,7 @@ void getEventsTwo() { .actor("test-event-actorName") .description( "instances: 1, memory: 2, state: test-state," - + " environment_json: test-data") + + " environment_json: test-data") .event("test-event-type") .id("test-event-id") .time(DateUtils.parseFromIso8601("2016-02-08T15:45:59Z")) @@ -3197,7 +3203,7 @@ void pushUploadFails() throws IOException { .isInstanceOf(ClientV2Exception.class) .hasMessage( "test-error-details-errorCode(1):" - + " test-error-details-description")) + + " test-error-details-description")) .verify(Duration.ofSeconds(5)); } @@ -3296,7 +3302,7 @@ void restageStagingFailure() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name failed during" - + " staging")) + + " staging")) .verify(Duration.ofSeconds(5)); } @@ -3346,7 +3352,7 @@ void restageStartingFailureTotal() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name failed during" - + " start")) + + " start")) .verify(Duration.ofSeconds(5)); } @@ -3374,7 +3380,7 @@ void restageTimeout() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name timed out during" - + " staging")) + + " staging")) .verify(Duration.ofSeconds(5)); } @@ -3461,7 +3467,7 @@ void restartNoApp() { .isInstanceOf(IllegalArgumentException.class) .hasMessage( "Application test-non-existent-app-name does not" - + " exist")) + + " exist")) .verify(Duration.ofSeconds(5)); } @@ -3774,7 +3780,7 @@ void startApplicationFailureTotal() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name failed during" - + " start")) + + " start")) .verify(Duration.ofSeconds(5)); } @@ -3799,7 +3805,7 @@ void startApplicationTimeout() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name timed out during" - + " start")) + + " start")) .verify(Duration.ofSeconds(5)); } @@ -3995,11 +4001,11 @@ private static void provideRandomWords(RandomWords randomWords) { private static void requestApplicationEmptyInstance( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationInstancesResponse.builder() @@ -4012,22 +4018,22 @@ private static void requestApplicationEmptyInstance( private static void requestApplicationEmptyStats( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn(Mono.just(ApplicationStatisticsResponse.builder().build())); } private static void requestApplicationEnvironment( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .getEnvironment( - GetApplicationEnvironmentRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .getEnvironment( + GetApplicationEnvironmentRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( GetApplicationEnvironmentResponse.builder() @@ -4046,19 +4052,19 @@ private static void requestApplicationEnvironment( private static void requestApplicationInstances( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationInstancesResponse.builder() .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .build()) .build())); } @@ -4066,11 +4072,11 @@ private static void requestApplicationInstances( private static void requestApplicationInstancesError( CloudFoundryClient cloudFoundryClient, String applicationId, Integer code) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.error( new ClientV2Exception( @@ -4083,129 +4089,193 @@ private static void requestApplicationInstancesError( private static void requestApplicationInstancesFailingPartial( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("RUNNING") .build()) .instance( "instance-1", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("FLAPPING") .build()) .build())); + when(cloudFoundryClient.applicationsV3().getProcessStatistics(any())) + .thenReturn( + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resources( + fill( + ProcessStatisticsResource.builder()) + .state(ProcessState.RUNNING) + .type("web") + .uptime(1L) + .fileDescriptorQuota(1L) + .host("test-host") + .build(), + fill(ProcessStatisticsResource.builder()) + .state(ProcessState.CRASHED) + .type("web") + .uptime(1L) + .fileDescriptorQuota(1L) + .host("test-host") + .build()) + .build())); } private static void requestApplicationInstancesFailingTotal( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("FLAPPING") .build()) .build())); + when(cloudFoundryClient.applicationsV3().getProcessStatistics(any())) + .thenReturn( + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resource( + fill( + ProcessStatisticsResource.builder()) + .state(ProcessState.CRASHED) + .type("web") + .uptime(1L) + .fileDescriptorQuota(1L) + .host("test-host") + .build()) + .build())); } private static void requestApplicationInstancesRunning( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("RUNNING") .build()) .build())); + + when(cloudFoundryClient.applicationsV3().getProcessStatistics(any())) + .thenReturn( + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resource( + fill( + ProcessStatisticsResource.builder()) + .state(ProcessState.RUNNING) + .type("web") + .uptime(1L) + .fileDescriptorQuota(1L) + .host("test-host") + .build()) + .build())); } private static void requestApplicationInstancesTimeout( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("STARTING") .build()) .build())); + when(cloudFoundryClient.applicationsV3().getProcessStatistics(any())) + .thenReturn( + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resource( + fill( + ProcessStatisticsResource.builder()) + .state(ProcessState.STARTING) + .type("web") + .uptime(1L) + .fileDescriptorQuota(1L) + .host("test-host") + .build()) + .build())); } private static void requestApplicationNoInstances( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn(Mono.just(ApplicationInstancesResponse.builder().build())); } private static void requestApplicationNullStats( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationStatisticsResponse.builder() .instance( "instance-0", fill( - InstanceStatistics.builder(), - "instance-statistics-") + InstanceStatistics.builder(), + "instance-statistics-") .statistics(null) .build()) .build())); @@ -4214,24 +4284,24 @@ private static void requestApplicationNullStats( private static void requestApplicationNullUsage( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationStatisticsResponse.builder() .instance( "instance-0", fill( - InstanceStatistics.builder(), - "instance-statistics-") + InstanceStatistics.builder(), + "instance-statistics-") .statistics( fill( - Statistics - .builder(), - "statistics-") + Statistics + .builder(), + "statistics-") .usage(null) .build()) .build()) @@ -4241,56 +4311,56 @@ private static void requestApplicationNullUsage( private static void requestApplicationRoutes( CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { when(cloudFoundryClient - .applicationsV2() - .listRoutes( - ListApplicationRoutesRequest.builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV3() + .listRoutes( + org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest + .builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn( Mono.just( - fill(ListApplicationRoutesResponse.builder()) + fill(org.cloudfoundry.client.v3.applications + .ListApplicationRoutesResponse.builder()) .resource( - fill(RouteResource.builder()) - .metadata( - fill(Metadata.builder()) - .id(routeId) - .build()) + fill(org.cloudfoundry.client.v3.routes.RouteResource + .builder()) + .id(routeId) .build()) - .totalPages(1) + .pagination(Pagination.builder().totalPages(1).build()) .build())); } private static void requestApplicationRoutesEmpty( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .listRoutes( - ListApplicationRoutesRequest.builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV3() + .listRoutes( + ListApplicationRoutesRequest.builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListApplicationRoutesResponse.builder()) - .totalPages(1) + .pagination(Pagination.builder().totalPages(1).build()) .build())); } private static void requestApplicationServiceBindings( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .listServiceBindings( - ListApplicationServiceBindingsRequest.builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV2() + .listServiceBindings( + ListApplicationServiceBindingsRequest.builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn( Mono.just( fill( - ListApplicationServiceBindingsResponse.builder(), - "test-service-binding-") + ListApplicationServiceBindingsResponse.builder(), + "test-service-binding-") .resource( fill(ServiceBindingResource.builder()) .metadata( @@ -4306,41 +4376,41 @@ private static void requestApplicationServiceBindings( private static void requestApplicationServiceBindingsEmpty( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .listServiceBindings( - ListApplicationServiceBindingsRequest.builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV2() + .listServiceBindings( + ListApplicationServiceBindingsRequest.builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn(Mono.empty()); } private static void requestApplicationStatistics( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationStatisticsResponse.builder() .instance( "instance-0", fill( - InstanceStatistics.builder(), - "instance-statistics-") + InstanceStatistics.builder(), + "instance-statistics-") .statistics( fill( - Statistics - .builder(), - "statistics-") + Statistics + .builder(), + "statistics-") .usage( fill( - Usage - .builder(), - "usage-") + Usage + .builder(), + "usage-") .build()) .build()) .build()) @@ -4350,11 +4420,11 @@ private static void requestApplicationStatistics( private static void requestApplicationStatisticsError( CloudFoundryClient cloudFoundryClient, String applicationId, Integer code) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.error( new ClientV2Exception( @@ -4367,11 +4437,11 @@ private static void requestApplicationStatisticsError( private static void requestApplicationSummary( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") @@ -4380,17 +4450,17 @@ private static void requestApplicationSummary( .packageUpdatedAt(DateUtils.formatToIso8601(new Date(0))) .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .path("/test-path") .port(null) @@ -4407,27 +4477,27 @@ private static void requestApplicationSummary( private static void requestApplicationSummaryDetectedBuildpack( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .build()) .buildpack(null) @@ -4438,11 +4508,11 @@ private static void requestApplicationSummaryDetectedBuildpack( private static void requestApplicationSummaryDocker( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") @@ -4451,17 +4521,17 @@ private static void requestApplicationSummaryDocker( .packageUpdatedAt(DateUtils.formatToIso8601(new Date(0))) .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .path("/test-path") .port(null) @@ -4482,27 +4552,27 @@ private static void requestApplicationSummaryDocker( private static void requestApplicationSummaryNoBuildpack( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .build()) .buildpack(null) @@ -4514,11 +4584,11 @@ private static void requestApplicationSummaryNoBuildpack( private static void requestApplicationSummaryNoRoutes( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") @@ -4533,11 +4603,11 @@ private static void requestApplicationSummaryNoRoutes( private static void requestApplicationSummaryTcp( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") @@ -4546,17 +4616,17 @@ private static void requestApplicationSummaryTcp( .packageUpdatedAt(DateUtils.formatToIso8601(new Date(0))) .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .port(999) .build()) @@ -4589,13 +4659,13 @@ private static void requestApplications( String applicationId, Map envResponse) { when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .page(1) - .spaceId(spaceId) - .build())) + .spaces() + .listApplications( + ListSpaceApplicationsRequest.builder() + .name(application) + .page(1) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(ListSpaceApplicationsResponse.builder()) @@ -4607,9 +4677,9 @@ private static void requestApplications( .build()) .entity( fill( - ApplicationEntity - .builder(), - "application-") + ApplicationEntity + .builder(), + "application-") .environmentJsons( envResponse) .healthCheckType( @@ -4625,26 +4695,26 @@ private static void requestApplications( private static void requestApplicationsEmpty( CloudFoundryClient cloudFoundryClient, String application, String spaceId) { when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .page(1) - .spaceId(spaceId) - .build())) + .spaces() + .listApplications( + ListSpaceApplicationsRequest.builder() + .name(application) + .page(1) + .spaceId(spaceId) + .build())) .thenReturn(Mono.just(fill(ListSpaceApplicationsResponse.builder()).build())); } private static void requestApplicationsEmptyV3( CloudFoundryClient cloudFoundryClient, String application, String spaceId) { when(cloudFoundryClient - .applicationsV3() - .list( - ListApplicationsRequest.builder() - .name(application) - .spaceId(spaceId) - .page(1) - .build())) + .applicationsV3() + .list( + ListApplicationsRequest.builder() + .name(application) + .spaceId(spaceId) + .page(1) + .build())) .thenReturn(Mono.just(fill(ListApplicationsResponse.builder()).build())); } @@ -4654,13 +4724,13 @@ private static void requestApplicationsSpecificState( String spaceId, String stateReturned) { when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .page(1) - .spaceId(spaceId) - .build())) + .spaces() + .listApplications( + ListSpaceApplicationsRequest.builder() + .name(application) + .page(1) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(ListSpaceApplicationsResponse.builder()) @@ -4668,9 +4738,9 @@ private static void requestApplicationsSpecificState( fill(ApplicationResource.builder(), "application-") .entity( fill( - ApplicationEntity - .builder(), - "application-entity-") + ApplicationEntity + .builder(), + "application-entity-") .state(stateReturned) .build()) .build()) @@ -4683,13 +4753,13 @@ private static void requestApplicationsV3( String spaceId, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .list( - ListApplicationsRequest.builder() - .name(application) - .page(1) - .spaceId(spaceId) - .build())) + .applicationsV3() + .list( + ListApplicationsRequest.builder() + .name(application) + .page(1) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(ListApplicationsResponse.builder()) @@ -4721,13 +4791,13 @@ private static void requestApplicationsWithSsh( String spaceId, Boolean sshEnabled) { when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .spaceId(spaceId) - .page(1) - .build())) + .spaces() + .listApplications( + ListSpaceApplicationsRequest.builder() + .name(application) + .spaceId(spaceId) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListSpaceApplicationsResponse.builder()) @@ -4739,9 +4809,9 @@ private static void requestApplicationsWithSsh( .build()) .entity( fill( - ApplicationEntity - .builder(), - "application-") + ApplicationEntity + .builder(), + "application-") .environmentJson( "test-var", "test-value") @@ -4755,12 +4825,12 @@ private static void requestApplicationsWithSsh( private static void requestAssociateRoute( CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { when(cloudFoundryClient - .applicationsV2() - .associateRoute( - AssociateApplicationRouteRequest.builder() - .applicationId(applicationId) - .routeId(routeId) - .build())) + .applicationsV2() + .associateRoute( + AssociateApplicationRouteRequest.builder() + .applicationId(applicationId) + .routeId(routeId) + .build())) .thenReturn(Mono.empty()); } @@ -4774,12 +4844,12 @@ private static void requestCopyBits( String sourceApplicationId, String targetApplicationId) { when(cloudFoundryClient - .applicationsV2() - .copy( - CopyApplicationRequest.builder() - .applicationId(targetApplicationId) - .sourceApplicationId(sourceApplicationId) - .build())) + .applicationsV2() + .copy( + CopyApplicationRequest.builder() + .applicationId(targetApplicationId) + .sourceApplicationId(sourceApplicationId) + .build())) .thenReturn( Mono.just(fill(CopyApplicationResponse.builder(), "copy-bits-").build())); } @@ -4834,24 +4904,24 @@ private static void requestCreateDockerApplication( .build()); when(cloudFoundryClient - .applicationsV2() - .create( - requestBuilder - .command(request.getCommand()) - .diego(true) - .diskQuota(request.getDiskQuota()) - .dockerImage(request.getDockerImage()) - .healthCheckTimeout(request.getTimeout()) - .healthCheckType( - Optional.ofNullable(request.getHealthCheckType()) - .map(ApplicationHealthCheck::getValue) - .orElse(null)) - .instances(request.getInstances()) - .memory(request.getMemory()) - .name(request.getName()) - .spaceId(spaceId) - .stackId(stackId) - .build())) + .applicationsV2() + .create( + requestBuilder + .command(request.getCommand()) + .diego(true) + .diskQuota(request.getDiskQuota()) + .dockerImage(request.getDockerImage()) + .healthCheckTimeout(request.getTimeout()) + .healthCheckType( + Optional.ofNullable(request.getHealthCheckType()) + .map(ApplicationHealthCheck::getValue) + .orElse(null)) + .instances(request.getInstances()) + .memory(request.getMemory()) + .name(request.getName()) + .spaceId(spaceId) + .stackId(stackId) + .build())) .thenReturn( Mono.just( fill(CreateApplicationResponse.builder(), "create-") @@ -4869,15 +4939,15 @@ private static void requestCreateRoute( String spaceId, String routeId) { when(cloudFoundryClient - .routes() - .create( - CreateRouteRequest.builder() - .domainId(domainId) - .host(host) - .path(path) - .port(port) - .spaceId(spaceId) - .build())) + .routes() + .create( + CreateRouteRequest.builder() + .domainId(domainId) + .host(host) + .path(path) + .port(port) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(CreateRouteResponse.builder()) @@ -4894,14 +4964,14 @@ private static void requestCreateRoute( String spaceId, String routeId) { when(cloudFoundryClient - .routes() - .create( - CreateRouteRequest.builder() - .domainId(domainId) - .generatePort(generatePort) - .port(port) - .spaceId(spaceId) - .build())) + .routes() + .create( + CreateRouteRequest.builder() + .domainId(domainId) + .generatePort(generatePort) + .port(port) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(CreateRouteResponse.builder()) @@ -4913,23 +4983,23 @@ private static void requestCreateRoute( private static void requestDeleteApplication( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .delete( - org.cloudfoundry.client.v2.applications.DeleteApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .delete( + org.cloudfoundry.client.v2.applications.DeleteApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn(Mono.empty()); } private static void requestDeleteRoute(CloudFoundryClient cloudFoundryClient, String routeId) { when(cloudFoundryClient - .routes() - .delete( - org.cloudfoundry.client.v2.routes.DeleteRouteRequest.builder() - .async(true) - .routeId(routeId) - .build())) + .routes() + .delete( + org.cloudfoundry.client.v2.routes.DeleteRouteRequest.builder() + .async(true) + .routeId(routeId) + .build())) .thenReturn( Mono.just( fill(DeleteRouteResponse.builder()) @@ -4950,26 +5020,26 @@ private static void requestEvents( } when(cloudFoundryClient - .events() - .list( - ListEventsRequest.builder() - .actee(applicationId) - .orderDirection(OrderDirection.DESCENDING) - .resultsPerPage(50) - .page(1) - .build())) + .events() + .list( + ListEventsRequest.builder() + .actee(applicationId) + .orderDirection(OrderDirection.DESCENDING) + .resultsPerPage(50) + .page(1) + .build())) .thenReturn(Mono.just(responseBuilder.totalPages(1).build())); } private static void requestGetApplication( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .get( - org.cloudfoundry.client.v2.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .get( + org.cloudfoundry.client.v2.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.defer( new Supplier>() { @@ -4978,23 +5048,23 @@ private static void requestGetApplication( new LinkedList<>( Arrays.asList( fill( - GetApplicationResponse - .builder(), - "job-") + GetApplicationResponse + .builder(), + "job-") .entity( fill(ApplicationEntity - .builder()) + .builder()) .packageState( "STAGING") .build()) .build(), fill( - GetApplicationResponse - .builder(), - "job-") + GetApplicationResponse + .builder(), + "job-") .entity( fill(ApplicationEntity - .builder()) + .builder()) .packageState( "STAGED") .build()) @@ -5010,12 +5080,12 @@ public Mono get() { private static void requestGetApplicationFailing( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .get( - org.cloudfoundry.client.v2.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .get( + org.cloudfoundry.client.v2.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(GetApplicationResponse.builder()) @@ -5029,21 +5099,21 @@ private static void requestGetApplicationFailing( private static void requestInstancesApplicationFailing( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("FAILED") .build()) .build())); @@ -5052,12 +5122,12 @@ private static void requestInstancesApplicationFailing( private static void requestGetApplicationTimeout( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .get( - org.cloudfoundry.client.v2.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .get( + org.cloudfoundry.client.v2.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(GetApplicationResponse.builder()) @@ -5071,12 +5141,12 @@ private static void requestGetApplicationTimeout( private static void requestGetApplicationV3Buildpack( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .get( - org.cloudfoundry.client.v3.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .get( + org.cloudfoundry.client.v3.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( org.cloudfoundry.client.v3.applications.GetApplicationResponse @@ -5100,12 +5170,12 @@ private static void requestGetApplicationV3Buildpack( private static void requestGetApplicationV3BuildpackMultiple( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .get( - org.cloudfoundry.client.v3.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .get( + org.cloudfoundry.client.v3.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( org.cloudfoundry.client.v3.applications.GetApplicationResponse @@ -5131,12 +5201,12 @@ private static void requestGetApplicationV3BuildpackMultiple( private static void requestGetApplicationV3Docker( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .get( - org.cloudfoundry.client.v3.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .get( + org.cloudfoundry.client.v3.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( org.cloudfoundry.client.v3.applications.GetApplicationResponse @@ -5157,8 +5227,8 @@ private static void requestGetApplicationV3Docker( private static void requestGetSharedDomain( CloudFoundryClient cloudFoundryClient, String domainId) { when(cloudFoundryClient - .sharedDomains() - .get(GetSharedDomainRequest.builder().sharedDomainId(domainId).build())) + .sharedDomains() + .get(GetSharedDomainRequest.builder().sharedDomainId(domainId).build())) .thenReturn( Mono.just( fill(GetSharedDomainResponse.builder()) @@ -5178,7 +5248,7 @@ private static void requestJobFailure(CloudFoundryClient cloudFoundryClient, Str fill(GetJobResponse.builder(), "job-") .entity( fill(JobEntity - .builder()) + .builder()) .status( "running") .build()) @@ -5186,12 +5256,12 @@ private static void requestJobFailure(CloudFoundryClient cloudFoundryClient, Str fill(GetJobResponse.builder(), "job-") .entity( fill(JobEntity - .builder()) + .builder()) .errorDetails( fill( - ErrorDetails - .builder(), - "error-details-") + ErrorDetails + .builder(), + "error-details-") .build()) .status( "failed") @@ -5217,7 +5287,7 @@ private static void requestJobSuccess(CloudFoundryClient cloudFoundryClient, Str fill(GetJobResponse.builder(), "job-") .entity( fill(JobEntity - .builder()) + .builder()) .status( "running") .build()) @@ -5225,7 +5295,7 @@ private static void requestJobSuccess(CloudFoundryClient cloudFoundryClient, Str fill(GetJobResponse.builder(), "job-") .entity( fill(JobEntity - .builder()) + .builder()) .status( "finished") .build()) @@ -5262,17 +5332,17 @@ private static void requestListMatchingResources( private static void requestListTasks( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .listTasks( - org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest - .builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV3() + .listTasks( + org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest + .builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn( Mono.just( fill(org.cloudfoundry.client.v3.applications - .ListApplicationTasksResponse.builder()) + .ListApplicationTasksResponse.builder()) .resource(fill(TaskResource.builder()).build()) .build())); } @@ -5280,18 +5350,18 @@ private static void requestListTasks( private static void requestListTasks( CloudFoundryClient cloudFoundryClient, String applicationId, Integer sequenceId) { when(cloudFoundryClient - .applicationsV3() - .listTasks( - org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest - .builder() - .applicationId(applicationId) - .page(1) - .sequenceId(sequenceId.toString()) - .build())) + .applicationsV3() + .listTasks( + org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest + .builder() + .applicationId(applicationId) + .page(1) + .sequenceId(sequenceId.toString()) + .build())) .thenReturn( Mono.just( fill(org.cloudfoundry.client.v3.applications - .ListApplicationTasksResponse.builder()) + .ListApplicationTasksResponse.builder()) .resource(fill(TaskResource.builder()).build()) .build())); } @@ -5299,24 +5369,24 @@ private static void requestListTasks( private static void requestListTasksEmpty( CloudFoundryClient cloudFoundryClient, String applicationId, Integer sequenceId) { when(cloudFoundryClient - .applicationsV3() - .listTasks( - org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest - .builder() - .applicationId(applicationId) - .page(1) - .sequenceId(sequenceId.toString()) - .build())) + .applicationsV3() + .listTasks( + org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest + .builder() + .applicationId(applicationId) + .page(1) + .sequenceId(sequenceId.toString()) + .build())) .thenReturn( Mono.just( fill(org.cloudfoundry.client.v3.applications - .ListApplicationTasksResponse.builder()) + .ListApplicationTasksResponse.builder()) .build())); } private static void requestLogsRecent(DopplerClient dopplerClient, String applicationId) { when(dopplerClient.recentLogs( - RecentLogsRequest.builder().applicationId(applicationId).build())) + RecentLogsRequest.builder().applicationId(applicationId).build())) .thenReturn( Flux.just( Envelope.builder() @@ -5342,13 +5412,13 @@ private static void requestLogsStream(DopplerClient dopplerClient, String applic private static void requestOrganizationSpacesByName( CloudFoundryClient cloudFoundryClient, String organizationId, String space) { when(cloudFoundryClient - .organizations() - .listSpaces( - ListOrganizationSpacesRequest.builder() - .organizationId(organizationId) - .name(space) - .page(1) - .build())) + .organizations() + .listSpaces( + ListOrganizationSpacesRequest.builder() + .organizationId(organizationId) + .name(space) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListOrganizationSpacesResponse.builder()) @@ -5356,8 +5426,8 @@ private static void requestOrganizationSpacesByName( SpaceResource.builder() .metadata( fill( - Metadata.builder(), - "space-resource-metadata-") + Metadata.builder(), + "space-resource-metadata-") .build()) .entity(fill(SpaceEntity.builder()).build()) .build()) @@ -5368,13 +5438,13 @@ private static void requestOrganizationSpacesByName( private static void requestOrganizationSpacesByNameNotFound( CloudFoundryClient cloudFoundryClient, String organizationId, String space) { when(cloudFoundryClient - .organizations() - .listSpaces( - ListOrganizationSpacesRequest.builder() - .organizationId(organizationId) - .name(space) - .page(1) - .build())) + .organizations() + .listSpaces( + ListOrganizationSpacesRequest.builder() + .organizationId(organizationId) + .name(space) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListOrganizationSpacesResponse.builder()) @@ -5385,12 +5455,12 @@ private static void requestOrganizationSpacesByNameNotFound( private static void requestOrganizations( CloudFoundryClient cloudFoundryClient, String organization) { when(cloudFoundryClient - .organizations() - .list( - ListOrganizationsRequest.builder() - .name(organization) - .page(1) - .build())) + .organizations() + .list( + ListOrganizationsRequest.builder() + .name(organization) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListOrganizationsResponse.builder()) @@ -5398,8 +5468,8 @@ private static void requestOrganizations( OrganizationResource.builder() .metadata( fill( - Metadata.builder(), - "organization-resource-metadata-") + Metadata.builder(), + "organization-resource-metadata-") .build()) .entity( fill(OrganizationEntity.builder()) @@ -5412,12 +5482,12 @@ private static void requestOrganizations( private static void requestOrganizationsNotFound( CloudFoundryClient cloudFoundryClient, String organization) { when(cloudFoundryClient - .organizations() - .list( - ListOrganizationsRequest.builder() - .name(organization) - .page(1) - .build())) + .organizations() + .list( + ListOrganizationsRequest.builder() + .name(organization) + .page(1) + .build())) .thenReturn( Mono.just(fill(ListOrganizationsResponse.builder()).totalPages(1).build())); } @@ -5425,13 +5495,13 @@ private static void requestOrganizationsNotFound( private static void requestPrivateDomainNotFound( CloudFoundryClient cloudFoundryClient, String domain, String organizationId) { when(cloudFoundryClient - .organizations() - .listPrivateDomains( - ListOrganizationPrivateDomainsRequest.builder() - .name(domain) - .organizationId(organizationId) - .page(1) - .build())) + .organizations() + .listPrivateDomains( + ListOrganizationPrivateDomainsRequest.builder() + .name(domain) + .organizationId(organizationId) + .page(1) + .build())) .thenReturn( Mono.just(fill(ListOrganizationPrivateDomainsResponse.builder()).build())); } @@ -5439,12 +5509,12 @@ private static void requestPrivateDomainNotFound( private static void requestPrivateDomains( CloudFoundryClient cloudFoundryClient, String organizationId, String domainId) { when(cloudFoundryClient - .organizations() - .listPrivateDomains( - ListOrganizationPrivateDomainsRequest.builder() - .organizationId(organizationId) - .page(1) - .build())) + .organizations() + .listPrivateDomains( + ListOrganizationPrivateDomainsRequest.builder() + .organizationId(organizationId) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListOrganizationPrivateDomainsResponse.builder()) @@ -5465,12 +5535,12 @@ private static void requestPrivateDomains( private static void requestPrivateDomainsEmpty( CloudFoundryClient cloudFoundryClient, String organizationId) { when(cloudFoundryClient - .organizations() - .listPrivateDomains( - ListOrganizationPrivateDomainsRequest.builder() - .organizationId(organizationId) - .page(1) - .build())) + .organizations() + .listPrivateDomains( + ListOrganizationPrivateDomainsRequest.builder() + .organizationId(organizationId) + .page(1) + .build())) .thenReturn( Mono.just(fill(ListOrganizationPrivateDomainsResponse.builder()).build())); } @@ -5478,36 +5548,36 @@ private static void requestPrivateDomainsEmpty( private static void requestRemoveApplicationRoute( CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { when(cloudFoundryClient - .applicationsV2() - .removeRoute( - RemoveApplicationRouteRequest.builder() - .applicationId(applicationId) - .routeId(routeId) - .build())) + .applicationsV2() + .removeRoute( + RemoveApplicationRouteRequest.builder() + .applicationId(applicationId) + .routeId(routeId) + .build())) .thenReturn(Mono.empty()); } private static void requestRemoveServiceBinding( CloudFoundryClient cloudFoundryClient, String applicationId, String serviceBindingId) { when(cloudFoundryClient - .applicationsV2() - .removeServiceBinding( - RemoveApplicationServiceBindingRequest.builder() - .applicationId(applicationId) - .serviceBindingId(serviceBindingId) - .build())) + .applicationsV2() + .removeServiceBinding( + RemoveApplicationServiceBindingRequest.builder() + .applicationId(applicationId) + .serviceBindingId(serviceBindingId) + .build())) .thenReturn(Mono.empty()); } private static void requestRestageApplication( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .restage( - org.cloudfoundry.client.v2.applications.RestageApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .restage( + org.cloudfoundry.client.v2.applications.RestageApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(RestageApplicationResponse.builder(), "application-") @@ -5570,20 +5640,20 @@ private static void requestRoutesEmpty( private static void requestRunTask( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .tasks() - .create( - CreateTaskRequest.builder() - .applicationId(applicationId) - .command("test-command") - .build())) + .tasks() + .create( + CreateTaskRequest.builder() + .applicationId(applicationId) + .command("test-command") + .build())) .thenReturn(Mono.just(fill(CreateTaskResponse.builder()).build())); } private static void requestSharedDomain( CloudFoundryClient cloudFoundryClient, String domain, String domainId) { when(cloudFoundryClient - .sharedDomains() - .list(ListSharedDomainsRequest.builder().page(1).name(domain).build())) + .sharedDomains() + .list(ListSharedDomainsRequest.builder().page(1).name(domain).build())) .thenReturn( Mono.just( fill(ListSharedDomainsResponse.builder()) @@ -5604,8 +5674,8 @@ private static void requestSharedDomain( private static void requestSharedDomains( CloudFoundryClient cloudFoundryClient, String domain, String domainId) { when(cloudFoundryClient - .sharedDomains() - .list(ListSharedDomainsRequest.builder().page(1).build())) + .sharedDomains() + .list(ListSharedDomainsRequest.builder().page(1).build())) .thenReturn( Mono.just( fill(ListSharedDomainsResponse.builder()) @@ -5626,8 +5696,8 @@ private static void requestSharedDomains( private static void requestSharedDomainsEmpty(CloudFoundryClient cloudFoundryClient) { when(cloudFoundryClient - .sharedDomains() - .list(ListSharedDomainsRequest.builder().page(1).build())) + .sharedDomains() + .list(ListSharedDomainsRequest.builder().page(1).build())) .thenReturn(Mono.just(fill(ListSharedDomainsResponse.builder()).build())); } @@ -5646,15 +5716,15 @@ private static void requestSpace( private static void requestSpaceSummary(CloudFoundryClient cloudFoundryClient, String spaceId) { when(cloudFoundryClient - .spaces() - .getSummary(GetSpaceSummaryRequest.builder().spaceId(spaceId).build())) + .spaces() + .getSummary(GetSpaceSummaryRequest.builder().spaceId(spaceId).build())) .thenReturn( Mono.just( fill(GetSpaceSummaryResponse.builder(), "space-summary-") .application( fill( - SpaceApplicationSummary.builder(), - "application-summary-") + SpaceApplicationSummary.builder(), + "application-summary-") .build()) .build())); } @@ -5672,16 +5742,16 @@ private static void requestStack(CloudFoundryClient cloudFoundryClient, String s private static void requestStackIdEmpty(CloudFoundryClient cloudFoundryClient, String stack) { when(cloudFoundryClient - .stacks() - .list(ListStacksRequest.builder().name(stack).page(1).build())) + .stacks() + .list(ListStacksRequest.builder().name(stack).page(1).build())) .thenReturn(Mono.just(fill(ListStacksResponse.builder()).build())); } private static void requestTcpDomains( CloudFoundryClient cloudFoundryClient, String domain, String domainId) { when(cloudFoundryClient - .sharedDomains() - .list(ListSharedDomainsRequest.builder().page(1).build())) + .sharedDomains() + .list(ListSharedDomainsRequest.builder().page(1).build())) .thenReturn( Mono.just( fill(ListSharedDomainsResponse.builder()) @@ -5703,12 +5773,12 @@ private static void requestTcpDomains( private static void requestTerminateApplicationInstance( CloudFoundryClient cloudFoundryClient, String applicationId, String instanceIndex) { when(cloudFoundryClient - .applicationsV2() - .terminateInstance( - TerminateApplicationInstanceRequest.builder() - .applicationId(applicationId) - .index(instanceIndex) - .build())) + .applicationsV2() + .terminateInstance( + TerminateApplicationInstanceRequest.builder() + .applicationId(applicationId) + .index(instanceIndex) + .build())) .thenReturn(Mono.empty()); } @@ -5734,22 +5804,22 @@ private static void requestUpdateApplication( } when(cloudFoundryClient - .applicationsV2() - .update( - builder.applicationId(applicationId) - .command(manifest.getCommand()) - .diskQuota(manifest.getDisk()) - .environmentJsons(manifest.getEnvironmentVariables()) - .healthCheckTimeout(manifest.getTimeout()) - .healthCheckType( - Optional.ofNullable(manifest.getHealthCheckType()) - .map(ApplicationHealthCheck::getValue) - .orElse(null)) - .instances(manifest.getInstances()) - .memory(manifest.getMemory()) - .name(manifest.getName()) - .stackId(stackId) - .build())) + .applicationsV2() + .update( + builder.applicationId(applicationId) + .command(manifest.getCommand()) + .diskQuota(manifest.getDisk()) + .environmentJsons(manifest.getEnvironmentVariables()) + .healthCheckTimeout(manifest.getTimeout()) + .healthCheckType( + Optional.ofNullable(manifest.getHealthCheckType()) + .map(ApplicationHealthCheck::getValue) + .orElse(null)) + .instances(manifest.getInstances()) + .memory(manifest.getMemory()) + .name(manifest.getName()) + .stackId(stackId) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) @@ -5763,12 +5833,12 @@ private static void requestUpdateApplicationEnvironment( String applicationId, Map environment) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .environmentJsons(environment) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .environmentJsons(environment) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) @@ -5784,19 +5854,19 @@ private static void requestUpdateApplicationHealthCheck( String applicationId, ApplicationHealthCheck type) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .healthCheckType(type.getValue()) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .healthCheckType(type.getValue()) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) .entity( fill( - ApplicationEntity.builder(), - "application-entity-") + ApplicationEntity.builder(), + "application-entity-") .build()) .build())); } @@ -5804,19 +5874,19 @@ private static void requestUpdateApplicationHealthCheck( private static void requestUpdateApplicationRename( CloudFoundryClient cloudFoundryClient, String applicationId, String name) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .name(name) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .name(name) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) .entity( fill( - ApplicationEntity.builder(), - "application-entity-") + ApplicationEntity.builder(), + "application-entity-") .build()) .build())); } @@ -5828,14 +5898,14 @@ private static void requestUpdateApplicationScale( Integer instances, Integer memory) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .diskQuota(disk) - .instances(instances) - .memory(memory) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .diskQuota(disk) + .instances(instances) + .memory(memory) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) @@ -5846,19 +5916,19 @@ private static void requestUpdateApplicationScale( private static void requestUpdateApplicationSsh( CloudFoundryClient cloudFoundryClient, String applicationId, Boolean enabled) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .enableSsh(enabled) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .enableSsh(enabled) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) .entity( fill( - ApplicationEntity.builder(), - "application-entity-") + ApplicationEntity.builder(), + "application-entity-") .build()) .build())); } @@ -5867,13 +5937,13 @@ private static void requestUpdateApplicationSshV3( CloudFoundryClient cloudFoundryClient, String applicationId, Boolean enabled) { when(cloudFoundryClient - .applicationsV3() - .updateFeature( - UpdateApplicationFeatureRequest.builder() - .applicationId(applicationId) - .featureName(APP_FEATURE_SSH) - .enabled(enabled) - .build())) + .applicationsV3() + .updateFeature( + UpdateApplicationFeatureRequest.builder() + .applicationId(applicationId) + .featureName(APP_FEATURE_SSH) + .enabled(enabled) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationFeatureResponse.builder()) @@ -5886,11 +5956,11 @@ private static void requestUpdateApplicationSshV3( private static void requestGetSshEnabled( CloudFoundryClient cloudFoundryClient, String applicationId, boolean status) { when(cloudFoundryClient - .applicationsV3() - .getSshEnabled( - GetApplicationSshEnabledRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .getSshEnabled( + GetApplicationSshEnabledRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(GetApplicationSshEnabledResponse.builder()) @@ -5910,12 +5980,12 @@ private static void requestUpdateApplicationState( String state, int instances) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .state(state) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .state(state) + .build())) .thenReturn( Mono.just( UpdateApplicationResponse.builder() @@ -5935,13 +6005,13 @@ private static void requestUpload( Path application, String jobId) { when(cloudFoundryClient - .applicationsV2() - .upload( - UploadApplicationRequest.builder() - .applicationId(applicationId) - .async(true) - .application(application) - .build())) + .applicationsV2() + .upload( + UploadApplicationRequest.builder() + .applicationId(applicationId) + .async(true) + .application(application) + .build())) .thenReturn( Mono.just( fill(UploadApplicationResponse.builder()) From 41e0d6c4d6c01bb1dd11200b4eee0d4cad7b5ca8 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Thu, 18 Dec 2025 18:07:51 +0100 Subject: [PATCH 05/16] DefaultApplications: use applicationsV3 to determine app started --- .../applications/DefaultApplications.java | 59 +- .../operations/AbstractOperationsTest.java | 3 + .../applications/DefaultApplicationsTest.java | 1243 +++++++++-------- 3 files changed, 630 insertions(+), 675 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 7d2cac7464..9d915cd1e1 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -116,7 +116,6 @@ import org.cloudfoundry.client.v3.applications.GetApplicationResponse; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledRequest; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledResponse; -import org.cloudfoundry.client.v3.applications.ListApplicationProcessesRequest; import org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest; import org.cloudfoundry.client.v3.applications.ListApplicationsRequest; import org.cloudfoundry.client.v3.applications.SetApplicationCurrentDropletRequest; @@ -136,8 +135,6 @@ import org.cloudfoundry.client.v3.packages.PackageState; import org.cloudfoundry.client.v3.packages.PackageType; import org.cloudfoundry.client.v3.packages.UploadPackageRequest; -import org.cloudfoundry.client.v3.processes.GetProcessStatisticsRequest; -import org.cloudfoundry.client.v3.processes.GetProcessStatisticsResponse; import org.cloudfoundry.client.v3.processes.ProcessState; import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; import org.cloudfoundry.client.v3.resourcematch.MatchedResource; @@ -2655,61 +2652,7 @@ private Mono waitForRunning( private Mono waitForRunningV3( String applicationName, String applicationId, Duration startupTimeout) { - Duration timeout = Optional.ofNullable(startupTimeout).orElse(Duration.ofMinutes(5)); - - return PaginationUtils.requestClientV3Resources( - page -> - this.cloudFoundryClient - .applicationsV3() - .listProcesses( - ListApplicationProcessesRequest.builder() - .applicationId(applicationId) - .page(page) - .build())) - .filter(p -> p.getInstances() != 0) - .flatMap( - process -> - this.cloudFoundryClient - .processes() - .getStatistics( - GetProcessStatisticsRequest.builder() - .processId(process.getId()) - .build()) - .flatMapIterable(GetProcessStatisticsResponse::getResources) - .map(ProcessStatisticsResource::getState) - .filter( - state -> - EnumSet.of( - ProcessState.RUNNING, - ProcessState.CRASHED) - .contains(state)) - .reduce( - (totalState, instanceState) -> - totalState.ordinal() - < instanceState.ordinal() - ? totalState - : instanceState) // CRASHED takes - // precedence over - // RUNNING - .repeatWhenEmpty( - exponentialBackOff( - Duration.ofSeconds(1), - Duration.ofSeconds(15), - timeout)) - .filter(state -> state == ProcessState.RUNNING) - .switchIfEmpty( - ExceptionUtils.illegalState( - "Process %s of Application %s failed during" - + " start", - process.getId(), applicationName)) - .onErrorResume( - DelayTimeoutException.class, - t -> - ExceptionUtils.illegalState( - "Process %s of Application %s timed" - + " out during start", - process.getId(), applicationName))) - .then(); + return waitForRunning(applicationName, applicationId, startupTimeout); } private Mono waitForStaging( diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java index ab1250658a..168e0756c8 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java @@ -48,6 +48,7 @@ import org.cloudfoundry.client.v3.domains.DomainsV3; import org.cloudfoundry.client.v3.jobs.JobsV3; import org.cloudfoundry.client.v3.organizations.OrganizationsV3; +import org.cloudfoundry.client.v3.processes.Processes; import org.cloudfoundry.client.v3.routes.RoutesV3; import org.cloudfoundry.client.v3.spaces.SpacesV3; import org.cloudfoundry.client.v3.stacks.StacksV3; @@ -117,6 +118,7 @@ public abstract class AbstractOperationsTest { protected final Organizations organizations = mock(Organizations.class, RETURNS_SMART_NULLS); protected final OrganizationsV3 organizationsV3 = mock(OrganizationsV3.class, RETURNS_SMART_NULLS); + protected final Processes processes = mock(Processes.class, RETURNS_SMART_NULLS); protected final PrivateDomains privateDomains = mock(PrivateDomains.class, RETURNS_SMART_NULLS); @@ -188,6 +190,7 @@ public final void mockClient() { when(this.cloudFoundryClient.organizationQuotaDefinitions()) .thenReturn(this.organizationQuotaDefinitions); when(this.cloudFoundryClient.privateDomains()).thenReturn(this.privateDomains); + when(this.cloudFoundryClient.processes()).thenReturn(this.processes); when(this.cloudFoundryClient.resourceMatch()).thenReturn(this.resourceMatch); when(this.cloudFoundryClient.routes()).thenReturn(this.routes); when(this.cloudFoundryClient.routesV3()).thenReturn(this.routesV3); diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index 14b20a5eb3..cf74e13f80 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -16,6 +16,15 @@ package org.cloudfoundry.operations.applications; +import static org.assertj.core.api.Assertions.assertThat; +import static org.cloudfoundry.client.v3.LifecycleType.BUILDPACK; +import static org.cloudfoundry.client.v3.LifecycleType.DOCKER; +import static org.cloudfoundry.operations.TestObjects.fill; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.RETURNS_SMART_NULLS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import java.io.IOException; import java.nio.file.Path; import java.time.Duration; @@ -28,7 +37,6 @@ import java.util.Optional; import java.util.Queue; import java.util.function.Supplier; - import org.cloudfoundry.client.CloudFoundryClient; import org.cloudfoundry.client.v2.ClientV2Exception; import org.cloudfoundry.client.v2.Metadata; @@ -146,21 +154,12 @@ import org.cloudfoundry.util.FluentMap; import org.cloudfoundry.util.ResourceMatchingUtils; import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import reactor.test.scheduler.VirtualTimeScheduler; -import org.springframework.core.io.ClassPathResource; -import static org.assertj.core.api.Assertions.assertThat; -import static org.cloudfoundry.client.v3.LifecycleType.BUILDPACK; -import static org.cloudfoundry.client.v3.LifecycleType.DOCKER; -import static org.cloudfoundry.operations.TestObjects.fill; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.RETURNS_SMART_NULLS; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - final class DefaultApplicationsTest extends AbstractOperationsTest { private RandomWords randomWords = mock(RandomWords.class, RETURNS_SMART_NULLS); @@ -368,7 +367,7 @@ void deleteAndDeleteRoutesFailure() { .isInstanceOf(ClientV2Exception.class) .hasMessage( "test-error-details-errorCode(1):" - + " test-error-details-description")) + + " test-error-details-description")) .verify(Duration.ofSeconds(5)); } @@ -809,7 +808,7 @@ void getEvents() { .actor("test-event-actorName") .description( "instances: 1, memory: 2, state: test-state," - + " environment_json: test-data") + + " environment_json: test-data") .event("test-event-type") .id("test-event-id") .time(DateUtils.parseFromIso8601("2016-02-08T15:45:59Z")) @@ -955,7 +954,7 @@ void getEventsTwo() { .actor("test-event-actorName") .description( "instances: 1, memory: 2, state: test-state," - + " environment_json: test-data") + + " environment_json: test-data") .event("test-event-type") .id("test-event-id") .time(DateUtils.parseFromIso8601("2016-02-08T15:45:59Z")) @@ -3203,7 +3202,7 @@ void pushUploadFails() throws IOException { .isInstanceOf(ClientV2Exception.class) .hasMessage( "test-error-details-errorCode(1):" - + " test-error-details-description")) + + " test-error-details-description")) .verify(Duration.ofSeconds(5)); } @@ -3302,7 +3301,7 @@ void restageStagingFailure() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name failed during" - + " staging")) + + " staging")) .verify(Duration.ofSeconds(5)); } @@ -3352,7 +3351,7 @@ void restageStartingFailureTotal() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name failed during" - + " start")) + + " start")) .verify(Duration.ofSeconds(5)); } @@ -3380,7 +3379,7 @@ void restageTimeout() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name timed out during" - + " staging")) + + " staging")) .verify(Duration.ofSeconds(5)); } @@ -3467,7 +3466,7 @@ void restartNoApp() { .isInstanceOf(IllegalArgumentException.class) .hasMessage( "Application test-non-existent-app-name does not" - + " exist")) + + " exist")) .verify(Duration.ofSeconds(5)); } @@ -3780,7 +3779,7 @@ void startApplicationFailureTotal() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name failed during" - + " start")) + + " start")) .verify(Duration.ofSeconds(5)); } @@ -3805,7 +3804,7 @@ void startApplicationTimeout() { .isInstanceOf(IllegalStateException.class) .hasMessage( "Application test-application-name timed out during" - + " start")) + + " start")) .verify(Duration.ofSeconds(5)); } @@ -4001,11 +4000,11 @@ private static void provideRandomWords(RandomWords randomWords) { private static void requestApplicationEmptyInstance( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationInstancesResponse.builder() @@ -4018,22 +4017,22 @@ private static void requestApplicationEmptyInstance( private static void requestApplicationEmptyStats( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn(Mono.just(ApplicationStatisticsResponse.builder().build())); } private static void requestApplicationEnvironment( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .getEnvironment( - GetApplicationEnvironmentRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .getEnvironment( + GetApplicationEnvironmentRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( GetApplicationEnvironmentResponse.builder() @@ -4052,19 +4051,19 @@ private static void requestApplicationEnvironment( private static void requestApplicationInstances( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationInstancesResponse.builder() .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .build()) .build())); } @@ -4072,11 +4071,11 @@ private static void requestApplicationInstances( private static void requestApplicationInstancesError( CloudFoundryClient cloudFoundryClient, String applicationId, Integer code) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.error( new ClientV2Exception( @@ -4089,28 +4088,28 @@ private static void requestApplicationInstancesError( private static void requestApplicationInstancesFailingPartial( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("RUNNING") .build()) .instance( "instance-1", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("FLAPPING") .build()) .build())); @@ -4119,8 +4118,7 @@ private static void requestApplicationInstancesFailingPartial( Mono.just( GetApplicationProcessStatisticsResponse.builder() .resources( - fill( - ProcessStatisticsResource.builder()) + fill(ProcessStatisticsResource.builder()) .state(ProcessState.RUNNING) .type("web") .uptime(1L) @@ -4140,21 +4138,21 @@ private static void requestApplicationInstancesFailingPartial( private static void requestApplicationInstancesFailingTotal( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("FLAPPING") .build()) .build())); @@ -4163,8 +4161,7 @@ private static void requestApplicationInstancesFailingTotal( Mono.just( GetApplicationProcessStatisticsResponse.builder() .resource( - fill( - ProcessStatisticsResource.builder()) + fill(ProcessStatisticsResource.builder()) .state(ProcessState.CRASHED) .type("web") .uptime(1L) @@ -4177,21 +4174,21 @@ private static void requestApplicationInstancesFailingTotal( private static void requestApplicationInstancesRunning( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("RUNNING") .build()) .build())); @@ -4201,8 +4198,7 @@ private static void requestApplicationInstancesRunning( Mono.just( GetApplicationProcessStatisticsResponse.builder() .resource( - fill( - ProcessStatisticsResource.builder()) + fill(ProcessStatisticsResource.builder()) .state(ProcessState.RUNNING) .type("web") .uptime(1L) @@ -4215,21 +4211,21 @@ private static void requestApplicationInstancesRunning( private static void requestApplicationInstancesTimeout( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("STARTING") .build()) .build())); @@ -4238,8 +4234,7 @@ private static void requestApplicationInstancesTimeout( Mono.just( GetApplicationProcessStatisticsResponse.builder() .resource( - fill( - ProcessStatisticsResource.builder()) + fill(ProcessStatisticsResource.builder()) .state(ProcessState.STARTING) .type("web") .uptime(1L) @@ -4252,30 +4247,30 @@ private static void requestApplicationInstancesTimeout( private static void requestApplicationNoInstances( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn(Mono.just(ApplicationInstancesResponse.builder().build())); } private static void requestApplicationNullStats( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationStatisticsResponse.builder() .instance( "instance-0", fill( - InstanceStatistics.builder(), - "instance-statistics-") + InstanceStatistics.builder(), + "instance-statistics-") .statistics(null) .build()) .build())); @@ -4284,24 +4279,24 @@ private static void requestApplicationNullStats( private static void requestApplicationNullUsage( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationStatisticsResponse.builder() .instance( "instance-0", fill( - InstanceStatistics.builder(), - "instance-statistics-") + InstanceStatistics.builder(), + "instance-statistics-") .statistics( fill( - Statistics - .builder(), - "statistics-") + Statistics + .builder(), + "statistics-") .usage(null) .build()) .build()) @@ -4311,20 +4306,20 @@ private static void requestApplicationNullUsage( private static void requestApplicationRoutes( CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { when(cloudFoundryClient - .applicationsV3() - .listRoutes( - org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest - .builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV3() + .listRoutes( + org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest + .builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn( Mono.just( fill(org.cloudfoundry.client.v3.applications - .ListApplicationRoutesResponse.builder()) + .ListApplicationRoutesResponse.builder()) .resource( fill(org.cloudfoundry.client.v3.routes.RouteResource - .builder()) + .builder()) .id(routeId) .build()) .pagination(Pagination.builder().totalPages(1).build()) @@ -4334,12 +4329,12 @@ private static void requestApplicationRoutes( private static void requestApplicationRoutesEmpty( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .listRoutes( - ListApplicationRoutesRequest.builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV3() + .listRoutes( + ListApplicationRoutesRequest.builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListApplicationRoutesResponse.builder()) @@ -4350,17 +4345,17 @@ private static void requestApplicationRoutesEmpty( private static void requestApplicationServiceBindings( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .listServiceBindings( - ListApplicationServiceBindingsRequest.builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV2() + .listServiceBindings( + ListApplicationServiceBindingsRequest.builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn( Mono.just( fill( - ListApplicationServiceBindingsResponse.builder(), - "test-service-binding-") + ListApplicationServiceBindingsResponse.builder(), + "test-service-binding-") .resource( fill(ServiceBindingResource.builder()) .metadata( @@ -4376,41 +4371,41 @@ private static void requestApplicationServiceBindings( private static void requestApplicationServiceBindingsEmpty( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .listServiceBindings( - ListApplicationServiceBindingsRequest.builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV2() + .listServiceBindings( + ListApplicationServiceBindingsRequest.builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn(Mono.empty()); } private static void requestApplicationStatistics( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( ApplicationStatisticsResponse.builder() .instance( "instance-0", fill( - InstanceStatistics.builder(), - "instance-statistics-") + InstanceStatistics.builder(), + "instance-statistics-") .statistics( fill( - Statistics - .builder(), - "statistics-") + Statistics + .builder(), + "statistics-") .usage( fill( - Usage - .builder(), - "usage-") + Usage + .builder(), + "usage-") .build()) .build()) .build()) @@ -4420,11 +4415,11 @@ private static void requestApplicationStatistics( private static void requestApplicationStatisticsError( CloudFoundryClient cloudFoundryClient, String applicationId, Integer code) { when(cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .statistics( + ApplicationStatisticsRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.error( new ClientV2Exception( @@ -4437,11 +4432,11 @@ private static void requestApplicationStatisticsError( private static void requestApplicationSummary( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") @@ -4450,17 +4445,17 @@ private static void requestApplicationSummary( .packageUpdatedAt(DateUtils.formatToIso8601(new Date(0))) .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .path("/test-path") .port(null) @@ -4477,27 +4472,27 @@ private static void requestApplicationSummary( private static void requestApplicationSummaryDetectedBuildpack( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .build()) .buildpack(null) @@ -4508,11 +4503,11 @@ private static void requestApplicationSummaryDetectedBuildpack( private static void requestApplicationSummaryDocker( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") @@ -4521,17 +4516,17 @@ private static void requestApplicationSummaryDocker( .packageUpdatedAt(DateUtils.formatToIso8601(new Date(0))) .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .path("/test-path") .port(null) @@ -4552,27 +4547,27 @@ private static void requestApplicationSummaryDocker( private static void requestApplicationSummaryNoBuildpack( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .build()) .buildpack(null) @@ -4584,11 +4579,11 @@ private static void requestApplicationSummaryNoBuildpack( private static void requestApplicationSummaryNoRoutes( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") @@ -4603,11 +4598,11 @@ private static void requestApplicationSummaryNoRoutes( private static void requestApplicationSummaryTcp( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .summary( - SummaryApplicationRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .summary( + SummaryApplicationRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(SummaryApplicationResponse.builder(), "application-summary-") @@ -4616,17 +4611,17 @@ private static void requestApplicationSummaryTcp( .packageUpdatedAt(DateUtils.formatToIso8601(new Date(0))) .route( fill( - org.cloudfoundry.client.v2.routes - .Route.builder(), - "route-") + org.cloudfoundry.client.v2.routes + .Route.builder(), + "route-") .domain( fill( - org.cloudfoundry - .client.v2 - .domains - .Domain - .builder(), - "domain-") + org.cloudfoundry + .client.v2 + .domains + .Domain + .builder(), + "domain-") .build()) .port(999) .build()) @@ -4659,13 +4654,13 @@ private static void requestApplications( String applicationId, Map envResponse) { when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .page(1) - .spaceId(spaceId) - .build())) + .spaces() + .listApplications( + ListSpaceApplicationsRequest.builder() + .name(application) + .page(1) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(ListSpaceApplicationsResponse.builder()) @@ -4677,9 +4672,9 @@ private static void requestApplications( .build()) .entity( fill( - ApplicationEntity - .builder(), - "application-") + ApplicationEntity + .builder(), + "application-") .environmentJsons( envResponse) .healthCheckType( @@ -4695,26 +4690,26 @@ private static void requestApplications( private static void requestApplicationsEmpty( CloudFoundryClient cloudFoundryClient, String application, String spaceId) { when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .page(1) - .spaceId(spaceId) - .build())) + .spaces() + .listApplications( + ListSpaceApplicationsRequest.builder() + .name(application) + .page(1) + .spaceId(spaceId) + .build())) .thenReturn(Mono.just(fill(ListSpaceApplicationsResponse.builder()).build())); } private static void requestApplicationsEmptyV3( CloudFoundryClient cloudFoundryClient, String application, String spaceId) { when(cloudFoundryClient - .applicationsV3() - .list( - ListApplicationsRequest.builder() - .name(application) - .spaceId(spaceId) - .page(1) - .build())) + .applicationsV3() + .list( + ListApplicationsRequest.builder() + .name(application) + .spaceId(spaceId) + .page(1) + .build())) .thenReturn(Mono.just(fill(ListApplicationsResponse.builder()).build())); } @@ -4724,13 +4719,13 @@ private static void requestApplicationsSpecificState( String spaceId, String stateReturned) { when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .page(1) - .spaceId(spaceId) - .build())) + .spaces() + .listApplications( + ListSpaceApplicationsRequest.builder() + .name(application) + .page(1) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(ListSpaceApplicationsResponse.builder()) @@ -4738,9 +4733,9 @@ private static void requestApplicationsSpecificState( fill(ApplicationResource.builder(), "application-") .entity( fill( - ApplicationEntity - .builder(), - "application-entity-") + ApplicationEntity + .builder(), + "application-entity-") .state(stateReturned) .build()) .build()) @@ -4753,13 +4748,13 @@ private static void requestApplicationsV3( String spaceId, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .list( - ListApplicationsRequest.builder() - .name(application) - .page(1) - .spaceId(spaceId) - .build())) + .applicationsV3() + .list( + ListApplicationsRequest.builder() + .name(application) + .page(1) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(ListApplicationsResponse.builder()) @@ -4791,13 +4786,13 @@ private static void requestApplicationsWithSsh( String spaceId, Boolean sshEnabled) { when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .spaceId(spaceId) - .page(1) - .build())) + .spaces() + .listApplications( + ListSpaceApplicationsRequest.builder() + .name(application) + .spaceId(spaceId) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListSpaceApplicationsResponse.builder()) @@ -4809,9 +4804,9 @@ private static void requestApplicationsWithSsh( .build()) .entity( fill( - ApplicationEntity - .builder(), - "application-") + ApplicationEntity + .builder(), + "application-") .environmentJson( "test-var", "test-value") @@ -4825,12 +4820,12 @@ private static void requestApplicationsWithSsh( private static void requestAssociateRoute( CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { when(cloudFoundryClient - .applicationsV2() - .associateRoute( - AssociateApplicationRouteRequest.builder() - .applicationId(applicationId) - .routeId(routeId) - .build())) + .applicationsV2() + .associateRoute( + AssociateApplicationRouteRequest.builder() + .applicationId(applicationId) + .routeId(routeId) + .build())) .thenReturn(Mono.empty()); } @@ -4844,12 +4839,12 @@ private static void requestCopyBits( String sourceApplicationId, String targetApplicationId) { when(cloudFoundryClient - .applicationsV2() - .copy( - CopyApplicationRequest.builder() - .applicationId(targetApplicationId) - .sourceApplicationId(sourceApplicationId) - .build())) + .applicationsV2() + .copy( + CopyApplicationRequest.builder() + .applicationId(targetApplicationId) + .sourceApplicationId(sourceApplicationId) + .build())) .thenReturn( Mono.just(fill(CopyApplicationResponse.builder(), "copy-bits-").build())); } @@ -4904,24 +4899,24 @@ private static void requestCreateDockerApplication( .build()); when(cloudFoundryClient - .applicationsV2() - .create( - requestBuilder - .command(request.getCommand()) - .diego(true) - .diskQuota(request.getDiskQuota()) - .dockerImage(request.getDockerImage()) - .healthCheckTimeout(request.getTimeout()) - .healthCheckType( - Optional.ofNullable(request.getHealthCheckType()) - .map(ApplicationHealthCheck::getValue) - .orElse(null)) - .instances(request.getInstances()) - .memory(request.getMemory()) - .name(request.getName()) - .spaceId(spaceId) - .stackId(stackId) - .build())) + .applicationsV2() + .create( + requestBuilder + .command(request.getCommand()) + .diego(true) + .diskQuota(request.getDiskQuota()) + .dockerImage(request.getDockerImage()) + .healthCheckTimeout(request.getTimeout()) + .healthCheckType( + Optional.ofNullable(request.getHealthCheckType()) + .map(ApplicationHealthCheck::getValue) + .orElse(null)) + .instances(request.getInstances()) + .memory(request.getMemory()) + .name(request.getName()) + .spaceId(spaceId) + .stackId(stackId) + .build())) .thenReturn( Mono.just( fill(CreateApplicationResponse.builder(), "create-") @@ -4939,15 +4934,15 @@ private static void requestCreateRoute( String spaceId, String routeId) { when(cloudFoundryClient - .routes() - .create( - CreateRouteRequest.builder() - .domainId(domainId) - .host(host) - .path(path) - .port(port) - .spaceId(spaceId) - .build())) + .routes() + .create( + CreateRouteRequest.builder() + .domainId(domainId) + .host(host) + .path(path) + .port(port) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(CreateRouteResponse.builder()) @@ -4964,14 +4959,14 @@ private static void requestCreateRoute( String spaceId, String routeId) { when(cloudFoundryClient - .routes() - .create( - CreateRouteRequest.builder() - .domainId(domainId) - .generatePort(generatePort) - .port(port) - .spaceId(spaceId) - .build())) + .routes() + .create( + CreateRouteRequest.builder() + .domainId(domainId) + .generatePort(generatePort) + .port(port) + .spaceId(spaceId) + .build())) .thenReturn( Mono.just( fill(CreateRouteResponse.builder()) @@ -4983,23 +4978,23 @@ private static void requestCreateRoute( private static void requestDeleteApplication( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .delete( - org.cloudfoundry.client.v2.applications.DeleteApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .delete( + org.cloudfoundry.client.v2.applications.DeleteApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn(Mono.empty()); } private static void requestDeleteRoute(CloudFoundryClient cloudFoundryClient, String routeId) { when(cloudFoundryClient - .routes() - .delete( - org.cloudfoundry.client.v2.routes.DeleteRouteRequest.builder() - .async(true) - .routeId(routeId) - .build())) + .routes() + .delete( + org.cloudfoundry.client.v2.routes.DeleteRouteRequest.builder() + .async(true) + .routeId(routeId) + .build())) .thenReturn( Mono.just( fill(DeleteRouteResponse.builder()) @@ -5020,26 +5015,26 @@ private static void requestEvents( } when(cloudFoundryClient - .events() - .list( - ListEventsRequest.builder() - .actee(applicationId) - .orderDirection(OrderDirection.DESCENDING) - .resultsPerPage(50) - .page(1) - .build())) + .events() + .list( + ListEventsRequest.builder() + .actee(applicationId) + .orderDirection(OrderDirection.DESCENDING) + .resultsPerPage(50) + .page(1) + .build())) .thenReturn(Mono.just(responseBuilder.totalPages(1).build())); } private static void requestGetApplication( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .get( - org.cloudfoundry.client.v2.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .get( + org.cloudfoundry.client.v2.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.defer( new Supplier>() { @@ -5048,23 +5043,23 @@ private static void requestGetApplication( new LinkedList<>( Arrays.asList( fill( - GetApplicationResponse - .builder(), - "job-") + GetApplicationResponse + .builder(), + "job-") .entity( fill(ApplicationEntity - .builder()) + .builder()) .packageState( "STAGING") .build()) .build(), fill( - GetApplicationResponse - .builder(), - "job-") + GetApplicationResponse + .builder(), + "job-") .entity( fill(ApplicationEntity - .builder()) + .builder()) .packageState( "STAGED") .build()) @@ -5080,12 +5075,12 @@ public Mono get() { private static void requestGetApplicationFailing( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .get( - org.cloudfoundry.client.v2.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .get( + org.cloudfoundry.client.v2.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(GetApplicationResponse.builder()) @@ -5099,35 +5094,49 @@ private static void requestGetApplicationFailing( private static void requestInstancesApplicationFailing( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .instances( + ApplicationInstancesRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill( - ApplicationInstancesResponse.builder(), - "application-instances-") + ApplicationInstancesResponse.builder(), + "application-instances-") .instance( "instance-0", fill( - ApplicationInstanceInfo.builder(), - "application-instance-info-") + ApplicationInstanceInfo.builder(), + "application-instance-info-") .state("FAILED") .build()) .build())); + + when(cloudFoundryClient.applicationsV3().getProcessStatistics(any())) + .thenReturn( + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resources( + fill(ProcessStatisticsResource.builder()) + .state(ProcessState.CRASHED) + .type("web") + .uptime(1L) + .fileDescriptorQuota(1L) + .host("test-host") + .build()) + .build())); } private static void requestGetApplicationTimeout( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .get( - org.cloudfoundry.client.v2.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .get( + org.cloudfoundry.client.v2.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(GetApplicationResponse.builder()) @@ -5141,12 +5150,12 @@ private static void requestGetApplicationTimeout( private static void requestGetApplicationV3Buildpack( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .get( - org.cloudfoundry.client.v3.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .get( + org.cloudfoundry.client.v3.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( org.cloudfoundry.client.v3.applications.GetApplicationResponse @@ -5170,12 +5179,12 @@ private static void requestGetApplicationV3Buildpack( private static void requestGetApplicationV3BuildpackMultiple( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .get( - org.cloudfoundry.client.v3.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .get( + org.cloudfoundry.client.v3.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( org.cloudfoundry.client.v3.applications.GetApplicationResponse @@ -5201,12 +5210,12 @@ private static void requestGetApplicationV3BuildpackMultiple( private static void requestGetApplicationV3Docker( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .get( - org.cloudfoundry.client.v3.applications.GetApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .get( + org.cloudfoundry.client.v3.applications.GetApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( org.cloudfoundry.client.v3.applications.GetApplicationResponse @@ -5227,8 +5236,8 @@ private static void requestGetApplicationV3Docker( private static void requestGetSharedDomain( CloudFoundryClient cloudFoundryClient, String domainId) { when(cloudFoundryClient - .sharedDomains() - .get(GetSharedDomainRequest.builder().sharedDomainId(domainId).build())) + .sharedDomains() + .get(GetSharedDomainRequest.builder().sharedDomainId(domainId).build())) .thenReturn( Mono.just( fill(GetSharedDomainResponse.builder()) @@ -5248,7 +5257,7 @@ private static void requestJobFailure(CloudFoundryClient cloudFoundryClient, Str fill(GetJobResponse.builder(), "job-") .entity( fill(JobEntity - .builder()) + .builder()) .status( "running") .build()) @@ -5256,12 +5265,12 @@ private static void requestJobFailure(CloudFoundryClient cloudFoundryClient, Str fill(GetJobResponse.builder(), "job-") .entity( fill(JobEntity - .builder()) + .builder()) .errorDetails( fill( - ErrorDetails - .builder(), - "error-details-") + ErrorDetails + .builder(), + "error-details-") .build()) .status( "failed") @@ -5287,7 +5296,7 @@ private static void requestJobSuccess(CloudFoundryClient cloudFoundryClient, Str fill(GetJobResponse.builder(), "job-") .entity( fill(JobEntity - .builder()) + .builder()) .status( "running") .build()) @@ -5295,7 +5304,7 @@ private static void requestJobSuccess(CloudFoundryClient cloudFoundryClient, Str fill(GetJobResponse.builder(), "job-") .entity( fill(JobEntity - .builder()) + .builder()) .status( "finished") .build()) @@ -5332,17 +5341,17 @@ private static void requestListMatchingResources( private static void requestListTasks( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV3() - .listTasks( - org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest - .builder() - .applicationId(applicationId) - .page(1) - .build())) + .applicationsV3() + .listTasks( + org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest + .builder() + .applicationId(applicationId) + .page(1) + .build())) .thenReturn( Mono.just( fill(org.cloudfoundry.client.v3.applications - .ListApplicationTasksResponse.builder()) + .ListApplicationTasksResponse.builder()) .resource(fill(TaskResource.builder()).build()) .build())); } @@ -5350,18 +5359,18 @@ private static void requestListTasks( private static void requestListTasks( CloudFoundryClient cloudFoundryClient, String applicationId, Integer sequenceId) { when(cloudFoundryClient - .applicationsV3() - .listTasks( - org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest - .builder() - .applicationId(applicationId) - .page(1) - .sequenceId(sequenceId.toString()) - .build())) + .applicationsV3() + .listTasks( + org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest + .builder() + .applicationId(applicationId) + .page(1) + .sequenceId(sequenceId.toString()) + .build())) .thenReturn( Mono.just( fill(org.cloudfoundry.client.v3.applications - .ListApplicationTasksResponse.builder()) + .ListApplicationTasksResponse.builder()) .resource(fill(TaskResource.builder()).build()) .build())); } @@ -5369,24 +5378,24 @@ private static void requestListTasks( private static void requestListTasksEmpty( CloudFoundryClient cloudFoundryClient, String applicationId, Integer sequenceId) { when(cloudFoundryClient - .applicationsV3() - .listTasks( - org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest - .builder() - .applicationId(applicationId) - .page(1) - .sequenceId(sequenceId.toString()) - .build())) + .applicationsV3() + .listTasks( + org.cloudfoundry.client.v3.applications.ListApplicationTasksRequest + .builder() + .applicationId(applicationId) + .page(1) + .sequenceId(sequenceId.toString()) + .build())) .thenReturn( Mono.just( fill(org.cloudfoundry.client.v3.applications - .ListApplicationTasksResponse.builder()) + .ListApplicationTasksResponse.builder()) .build())); } private static void requestLogsRecent(DopplerClient dopplerClient, String applicationId) { when(dopplerClient.recentLogs( - RecentLogsRequest.builder().applicationId(applicationId).build())) + RecentLogsRequest.builder().applicationId(applicationId).build())) .thenReturn( Flux.just( Envelope.builder() @@ -5412,13 +5421,13 @@ private static void requestLogsStream(DopplerClient dopplerClient, String applic private static void requestOrganizationSpacesByName( CloudFoundryClient cloudFoundryClient, String organizationId, String space) { when(cloudFoundryClient - .organizations() - .listSpaces( - ListOrganizationSpacesRequest.builder() - .organizationId(organizationId) - .name(space) - .page(1) - .build())) + .organizations() + .listSpaces( + ListOrganizationSpacesRequest.builder() + .organizationId(organizationId) + .name(space) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListOrganizationSpacesResponse.builder()) @@ -5426,8 +5435,8 @@ private static void requestOrganizationSpacesByName( SpaceResource.builder() .metadata( fill( - Metadata.builder(), - "space-resource-metadata-") + Metadata.builder(), + "space-resource-metadata-") .build()) .entity(fill(SpaceEntity.builder()).build()) .build()) @@ -5438,13 +5447,13 @@ private static void requestOrganizationSpacesByName( private static void requestOrganizationSpacesByNameNotFound( CloudFoundryClient cloudFoundryClient, String organizationId, String space) { when(cloudFoundryClient - .organizations() - .listSpaces( - ListOrganizationSpacesRequest.builder() - .organizationId(organizationId) - .name(space) - .page(1) - .build())) + .organizations() + .listSpaces( + ListOrganizationSpacesRequest.builder() + .organizationId(organizationId) + .name(space) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListOrganizationSpacesResponse.builder()) @@ -5455,12 +5464,12 @@ private static void requestOrganizationSpacesByNameNotFound( private static void requestOrganizations( CloudFoundryClient cloudFoundryClient, String organization) { when(cloudFoundryClient - .organizations() - .list( - ListOrganizationsRequest.builder() - .name(organization) - .page(1) - .build())) + .organizations() + .list( + ListOrganizationsRequest.builder() + .name(organization) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListOrganizationsResponse.builder()) @@ -5468,8 +5477,8 @@ private static void requestOrganizations( OrganizationResource.builder() .metadata( fill( - Metadata.builder(), - "organization-resource-metadata-") + Metadata.builder(), + "organization-resource-metadata-") .build()) .entity( fill(OrganizationEntity.builder()) @@ -5482,12 +5491,12 @@ private static void requestOrganizations( private static void requestOrganizationsNotFound( CloudFoundryClient cloudFoundryClient, String organization) { when(cloudFoundryClient - .organizations() - .list( - ListOrganizationsRequest.builder() - .name(organization) - .page(1) - .build())) + .organizations() + .list( + ListOrganizationsRequest.builder() + .name(organization) + .page(1) + .build())) .thenReturn( Mono.just(fill(ListOrganizationsResponse.builder()).totalPages(1).build())); } @@ -5495,13 +5504,13 @@ private static void requestOrganizationsNotFound( private static void requestPrivateDomainNotFound( CloudFoundryClient cloudFoundryClient, String domain, String organizationId) { when(cloudFoundryClient - .organizations() - .listPrivateDomains( - ListOrganizationPrivateDomainsRequest.builder() - .name(domain) - .organizationId(organizationId) - .page(1) - .build())) + .organizations() + .listPrivateDomains( + ListOrganizationPrivateDomainsRequest.builder() + .name(domain) + .organizationId(organizationId) + .page(1) + .build())) .thenReturn( Mono.just(fill(ListOrganizationPrivateDomainsResponse.builder()).build())); } @@ -5509,12 +5518,12 @@ private static void requestPrivateDomainNotFound( private static void requestPrivateDomains( CloudFoundryClient cloudFoundryClient, String organizationId, String domainId) { when(cloudFoundryClient - .organizations() - .listPrivateDomains( - ListOrganizationPrivateDomainsRequest.builder() - .organizationId(organizationId) - .page(1) - .build())) + .organizations() + .listPrivateDomains( + ListOrganizationPrivateDomainsRequest.builder() + .organizationId(organizationId) + .page(1) + .build())) .thenReturn( Mono.just( fill(ListOrganizationPrivateDomainsResponse.builder()) @@ -5535,12 +5544,12 @@ private static void requestPrivateDomains( private static void requestPrivateDomainsEmpty( CloudFoundryClient cloudFoundryClient, String organizationId) { when(cloudFoundryClient - .organizations() - .listPrivateDomains( - ListOrganizationPrivateDomainsRequest.builder() - .organizationId(organizationId) - .page(1) - .build())) + .organizations() + .listPrivateDomains( + ListOrganizationPrivateDomainsRequest.builder() + .organizationId(organizationId) + .page(1) + .build())) .thenReturn( Mono.just(fill(ListOrganizationPrivateDomainsResponse.builder()).build())); } @@ -5548,36 +5557,36 @@ private static void requestPrivateDomainsEmpty( private static void requestRemoveApplicationRoute( CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { when(cloudFoundryClient - .applicationsV2() - .removeRoute( - RemoveApplicationRouteRequest.builder() - .applicationId(applicationId) - .routeId(routeId) - .build())) + .applicationsV2() + .removeRoute( + RemoveApplicationRouteRequest.builder() + .applicationId(applicationId) + .routeId(routeId) + .build())) .thenReturn(Mono.empty()); } private static void requestRemoveServiceBinding( CloudFoundryClient cloudFoundryClient, String applicationId, String serviceBindingId) { when(cloudFoundryClient - .applicationsV2() - .removeServiceBinding( - RemoveApplicationServiceBindingRequest.builder() - .applicationId(applicationId) - .serviceBindingId(serviceBindingId) - .build())) + .applicationsV2() + .removeServiceBinding( + RemoveApplicationServiceBindingRequest.builder() + .applicationId(applicationId) + .serviceBindingId(serviceBindingId) + .build())) .thenReturn(Mono.empty()); } private static void requestRestageApplication( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .applicationsV2() - .restage( - org.cloudfoundry.client.v2.applications.RestageApplicationRequest - .builder() - .applicationId(applicationId) - .build())) + .applicationsV2() + .restage( + org.cloudfoundry.client.v2.applications.RestageApplicationRequest + .builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(RestageApplicationResponse.builder(), "application-") @@ -5640,20 +5649,20 @@ private static void requestRoutesEmpty( private static void requestRunTask( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient - .tasks() - .create( - CreateTaskRequest.builder() - .applicationId(applicationId) - .command("test-command") - .build())) + .tasks() + .create( + CreateTaskRequest.builder() + .applicationId(applicationId) + .command("test-command") + .build())) .thenReturn(Mono.just(fill(CreateTaskResponse.builder()).build())); } private static void requestSharedDomain( CloudFoundryClient cloudFoundryClient, String domain, String domainId) { when(cloudFoundryClient - .sharedDomains() - .list(ListSharedDomainsRequest.builder().page(1).name(domain).build())) + .sharedDomains() + .list(ListSharedDomainsRequest.builder().page(1).name(domain).build())) .thenReturn( Mono.just( fill(ListSharedDomainsResponse.builder()) @@ -5674,8 +5683,8 @@ private static void requestSharedDomain( private static void requestSharedDomains( CloudFoundryClient cloudFoundryClient, String domain, String domainId) { when(cloudFoundryClient - .sharedDomains() - .list(ListSharedDomainsRequest.builder().page(1).build())) + .sharedDomains() + .list(ListSharedDomainsRequest.builder().page(1).build())) .thenReturn( Mono.just( fill(ListSharedDomainsResponse.builder()) @@ -5696,8 +5705,8 @@ private static void requestSharedDomains( private static void requestSharedDomainsEmpty(CloudFoundryClient cloudFoundryClient) { when(cloudFoundryClient - .sharedDomains() - .list(ListSharedDomainsRequest.builder().page(1).build())) + .sharedDomains() + .list(ListSharedDomainsRequest.builder().page(1).build())) .thenReturn(Mono.just(fill(ListSharedDomainsResponse.builder()).build())); } @@ -5716,15 +5725,15 @@ private static void requestSpace( private static void requestSpaceSummary(CloudFoundryClient cloudFoundryClient, String spaceId) { when(cloudFoundryClient - .spaces() - .getSummary(GetSpaceSummaryRequest.builder().spaceId(spaceId).build())) + .spaces() + .getSummary(GetSpaceSummaryRequest.builder().spaceId(spaceId).build())) .thenReturn( Mono.just( fill(GetSpaceSummaryResponse.builder(), "space-summary-") .application( fill( - SpaceApplicationSummary.builder(), - "application-summary-") + SpaceApplicationSummary.builder(), + "application-summary-") .build()) .build())); } @@ -5742,16 +5751,16 @@ private static void requestStack(CloudFoundryClient cloudFoundryClient, String s private static void requestStackIdEmpty(CloudFoundryClient cloudFoundryClient, String stack) { when(cloudFoundryClient - .stacks() - .list(ListStacksRequest.builder().name(stack).page(1).build())) + .stacks() + .list(ListStacksRequest.builder().name(stack).page(1).build())) .thenReturn(Mono.just(fill(ListStacksResponse.builder()).build())); } private static void requestTcpDomains( CloudFoundryClient cloudFoundryClient, String domain, String domainId) { when(cloudFoundryClient - .sharedDomains() - .list(ListSharedDomainsRequest.builder().page(1).build())) + .sharedDomains() + .list(ListSharedDomainsRequest.builder().page(1).build())) .thenReturn( Mono.just( fill(ListSharedDomainsResponse.builder()) @@ -5773,12 +5782,12 @@ private static void requestTcpDomains( private static void requestTerminateApplicationInstance( CloudFoundryClient cloudFoundryClient, String applicationId, String instanceIndex) { when(cloudFoundryClient - .applicationsV2() - .terminateInstance( - TerminateApplicationInstanceRequest.builder() - .applicationId(applicationId) - .index(instanceIndex) - .build())) + .applicationsV2() + .terminateInstance( + TerminateApplicationInstanceRequest.builder() + .applicationId(applicationId) + .index(instanceIndex) + .build())) .thenReturn(Mono.empty()); } @@ -5804,22 +5813,22 @@ private static void requestUpdateApplication( } when(cloudFoundryClient - .applicationsV2() - .update( - builder.applicationId(applicationId) - .command(manifest.getCommand()) - .diskQuota(manifest.getDisk()) - .environmentJsons(manifest.getEnvironmentVariables()) - .healthCheckTimeout(manifest.getTimeout()) - .healthCheckType( - Optional.ofNullable(manifest.getHealthCheckType()) - .map(ApplicationHealthCheck::getValue) - .orElse(null)) - .instances(manifest.getInstances()) - .memory(manifest.getMemory()) - .name(manifest.getName()) - .stackId(stackId) - .build())) + .applicationsV2() + .update( + builder.applicationId(applicationId) + .command(manifest.getCommand()) + .diskQuota(manifest.getDisk()) + .environmentJsons(manifest.getEnvironmentVariables()) + .healthCheckTimeout(manifest.getTimeout()) + .healthCheckType( + Optional.ofNullable(manifest.getHealthCheckType()) + .map(ApplicationHealthCheck::getValue) + .orElse(null)) + .instances(manifest.getInstances()) + .memory(manifest.getMemory()) + .name(manifest.getName()) + .stackId(stackId) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) @@ -5833,12 +5842,12 @@ private static void requestUpdateApplicationEnvironment( String applicationId, Map environment) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .environmentJsons(environment) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .environmentJsons(environment) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) @@ -5854,19 +5863,19 @@ private static void requestUpdateApplicationHealthCheck( String applicationId, ApplicationHealthCheck type) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .healthCheckType(type.getValue()) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .healthCheckType(type.getValue()) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) .entity( fill( - ApplicationEntity.builder(), - "application-entity-") + ApplicationEntity.builder(), + "application-entity-") .build()) .build())); } @@ -5874,19 +5883,19 @@ private static void requestUpdateApplicationHealthCheck( private static void requestUpdateApplicationRename( CloudFoundryClient cloudFoundryClient, String applicationId, String name) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .name(name) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .name(name) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) .entity( fill( - ApplicationEntity.builder(), - "application-entity-") + ApplicationEntity.builder(), + "application-entity-") .build()) .build())); } @@ -5898,14 +5907,14 @@ private static void requestUpdateApplicationScale( Integer instances, Integer memory) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .diskQuota(disk) - .instances(instances) - .memory(memory) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .diskQuota(disk) + .instances(instances) + .memory(memory) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) @@ -5916,19 +5925,19 @@ private static void requestUpdateApplicationScale( private static void requestUpdateApplicationSsh( CloudFoundryClient cloudFoundryClient, String applicationId, Boolean enabled) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .enableSsh(enabled) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .enableSsh(enabled) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationResponse.builder()) .entity( fill( - ApplicationEntity.builder(), - "application-entity-") + ApplicationEntity.builder(), + "application-entity-") .build()) .build())); } @@ -5937,13 +5946,13 @@ private static void requestUpdateApplicationSshV3( CloudFoundryClient cloudFoundryClient, String applicationId, Boolean enabled) { when(cloudFoundryClient - .applicationsV3() - .updateFeature( - UpdateApplicationFeatureRequest.builder() - .applicationId(applicationId) - .featureName(APP_FEATURE_SSH) - .enabled(enabled) - .build())) + .applicationsV3() + .updateFeature( + UpdateApplicationFeatureRequest.builder() + .applicationId(applicationId) + .featureName(APP_FEATURE_SSH) + .enabled(enabled) + .build())) .thenReturn( Mono.just( fill(UpdateApplicationFeatureResponse.builder()) @@ -5956,11 +5965,11 @@ private static void requestUpdateApplicationSshV3( private static void requestGetSshEnabled( CloudFoundryClient cloudFoundryClient, String applicationId, boolean status) { when(cloudFoundryClient - .applicationsV3() - .getSshEnabled( - GetApplicationSshEnabledRequest.builder() - .applicationId(applicationId) - .build())) + .applicationsV3() + .getSshEnabled( + GetApplicationSshEnabledRequest.builder() + .applicationId(applicationId) + .build())) .thenReturn( Mono.just( fill(GetApplicationSshEnabledResponse.builder()) @@ -5980,12 +5989,12 @@ private static void requestUpdateApplicationState( String state, int instances) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .state(state) - .build())) + .applicationsV2() + .update( + UpdateApplicationRequest.builder() + .applicationId(applicationId) + .state(state) + .build())) .thenReturn( Mono.just( UpdateApplicationResponse.builder() @@ -6005,13 +6014,13 @@ private static void requestUpload( Path application, String jobId) { when(cloudFoundryClient - .applicationsV2() - .upload( - UploadApplicationRequest.builder() - .applicationId(applicationId) - .async(true) - .application(application) - .build())) + .applicationsV2() + .upload( + UploadApplicationRequest.builder() + .applicationId(applicationId) + .async(true) + .application(application) + .build())) .thenReturn( Mono.just( fill(UploadApplicationResponse.builder()) From b69b4026683e37eb6bbc7ecd8c24c269bd6f7385 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Wed, 31 Dec 2025 08:02:32 +0100 Subject: [PATCH 06/16] DefaultApplications: use process v3 for healtchecks --- .../operations/applications/Applications.java | 2 +- .../applications/DefaultApplications.java | 34 ++++++++++++----- .../applications/DefaultApplicationsTest.java | 38 ++++++++++++++++--- 3 files changed, 59 insertions(+), 15 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/Applications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/Applications.java index 5196fef6c8..e8902d25aa 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/Applications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/Applications.java @@ -92,7 +92,7 @@ public interface Applications { Flux getEvents(GetApplicationEventsRequest request); /** - * Retrieve the Health Check Type of an application + * Retrieve the Health Check Type of the web process of an application. * * @param request the get health check request * @return the health check diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 9d915cd1e1..8f2fd36dce 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -111,6 +111,8 @@ import org.cloudfoundry.client.v3.applications.ApplicationResource; import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentRequest; import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessResponse; import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsRequest; import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse; import org.cloudfoundry.client.v3.applications.GetApplicationResponse; @@ -135,6 +137,8 @@ import org.cloudfoundry.client.v3.packages.PackageState; import org.cloudfoundry.client.v3.packages.PackageType; import org.cloudfoundry.client.v3.packages.UploadPackageRequest; +import org.cloudfoundry.client.v3.processes.HealthCheck; +import org.cloudfoundry.client.v3.processes.HealthCheckType; import org.cloudfoundry.client.v3.processes.ProcessState; import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; import org.cloudfoundry.client.v3.resourcematch.MatchedResource; @@ -366,7 +370,11 @@ public Flux getEvents(GetApplicationEventsRequest request) { @Override public Mono getHealthCheck(GetApplicationHealthCheckRequest request) { - return getApplication(request.getName()) + return getApplicationV3(request.getName()) + .map(ApplicationResource::getId) + .flatMap(this::requestApplicationWebProcess) + .map(GetApplicationProcessResponse::getHealthCheck) + .map(HealthCheck::getType) .map(DefaultApplications::toHealthCheck) .transform(OperationsLogging.log("Get Application Health Check")) .checkpoint(); @@ -1654,6 +1662,16 @@ private Mono requestApplicationStatisti .build()); } + private Mono requestApplicationWebProcess(String applicationId) { + return this.cloudFoundryClient + .applicationsV3() + .getProcess( + GetApplicationProcessRequest.builder() + .applicationId(applicationId) + .type("web") + .build()); + } + private Flux requestApplicationRoutes( String applicationId) { return PaginationUtils.requestClientV3Resources( @@ -2417,17 +2435,15 @@ private static DomainSummary toDomain(PrivateDomainResource resource) { .build(); } - private static ApplicationHealthCheck toHealthCheck(AbstractApplicationResource resource) { - String type = resource.getEntity().getHealthCheckType(); - - if (ApplicationHealthCheck.HTTP.getValue().equals(type)) { + private static ApplicationHealthCheck toHealthCheck(HealthCheckType type) { + if (type == HealthCheckType.HTTP) { return ApplicationHealthCheck.HTTP; - } else if (ApplicationHealthCheck.NONE.getValue().equals(type)) { - return ApplicationHealthCheck.NONE; - } else if (ApplicationHealthCheck.PORT.getValue().equals(type)) { + } else if (type == HealthCheckType.PORT) { return ApplicationHealthCheck.PORT; - } else if (ApplicationHealthCheck.PROCESS.getValue().equals(type)) { + } else if (type == HealthCheckType.PROCESS) { return ApplicationHealthCheck.PROCESS; + } else if (type == HealthCheckType.NONE) { + return ApplicationHealthCheck.NONE; } else { return null; } diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index cf74e13f80..616ee8eeb5 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -127,6 +127,8 @@ import org.cloudfoundry.client.v3.applications.ApplicationState; import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentRequest; import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessRequest; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessResponse; import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledRequest; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledResponse; @@ -136,6 +138,8 @@ import org.cloudfoundry.client.v3.applications.ListApplicationsResponse; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureResponse; +import org.cloudfoundry.client.v3.processes.HealthCheck; +import org.cloudfoundry.client.v3.processes.HealthCheckType; import org.cloudfoundry.client.v3.processes.ProcessState; import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; import org.cloudfoundry.client.v3.tasks.CancelTaskRequest; @@ -154,6 +158,8 @@ import org.cloudfoundry.util.FluentMap; import org.cloudfoundry.util.ResourceMatchingUtils; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.core.io.ClassPathResource; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -970,21 +976,27 @@ void getEventsTwo() { .verify(Duration.ofSeconds(5)); } - @Test - void getHealthCheck() { - requestApplications( + @ParameterizedTest + @ValueSource(strings = {"http", "process"}) + void getHealthCheck(String healthCheckType) { + requestApplicationsV3( this.cloudFoundryClient, "test-application-name", TEST_SPACE_ID, - "test-metadata-id"); + "test-application-id"); + requestApplicationProcesses( + this.cloudFoundryClient, + "test-application-id", + HealthCheckType.from(healthCheckType)); this.applications .getHealthCheck( GetApplicationHealthCheckRequest.builder() .name("test-application-name") .build()) + .map(ApplicationHealthCheck::getValue) .as(StepVerifier::create) - .expectNext(ApplicationHealthCheck.PORT) + .expectNext(healthCheckType) .expectComplete() .verify(Duration.ofSeconds(5)); } @@ -4780,6 +4792,22 @@ private static void requestApplicationsV3( .build())); } + private static void requestApplicationProcesses( + CloudFoundryClient cloudFoundryClient, String applicationId, HealthCheckType type) { + when(cloudFoundryClient + .applicationsV3() + .getProcess( + GetApplicationProcessRequest.builder() + .applicationId(applicationId) + .type("web") + .build())) + .thenReturn( + Mono.just( + fill(GetApplicationProcessResponse.builder()) + .healthCheck(fill(HealthCheck.builder()).type(type).build()) + .build())); + } + private static void requestApplicationsWithSsh( CloudFoundryClient cloudFoundryClient, String application, From 7b2553ffd50061d3674041a3e8ca251dd1c639db Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Fri, 2 Jan 2026 11:40:18 +0100 Subject: [PATCH 07/16] DefaultApplications: use audit events v3 for getEvents() --- .../applications/DefaultApplications.java | 44 ++--- .../operations/AbstractOperationsTest.java | 3 + .../applications/DefaultApplicationsTest.java | 182 ++++++++++-------- 3 files changed, 123 insertions(+), 106 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 8f2fd36dce..68f25adf2c 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -40,7 +40,6 @@ import java.util.function.UnaryOperator; import java.util.stream.Collectors; import org.cloudfoundry.client.CloudFoundryClient; -import org.cloudfoundry.client.v2.OrderDirection; import org.cloudfoundry.client.v2.applications.AbstractApplicationResource; import org.cloudfoundry.client.v2.applications.ApplicationEntity; import org.cloudfoundry.client.v2.applications.ApplicationInstanceInfo; @@ -68,9 +67,6 @@ import org.cloudfoundry.client.v2.applications.UploadApplicationRequest; import org.cloudfoundry.client.v2.applications.UploadApplicationResponse; import org.cloudfoundry.client.v2.applications.Usage; -import org.cloudfoundry.client.v2.events.EventEntity; -import org.cloudfoundry.client.v2.events.EventResource; -import org.cloudfoundry.client.v2.events.ListEventsRequest; import org.cloudfoundry.client.v2.organizations.ListOrganizationPrivateDomainsRequest; import org.cloudfoundry.client.v2.organizations.ListOrganizationSpacesRequest; import org.cloudfoundry.client.v2.organizations.ListOrganizationsRequest; @@ -122,6 +118,8 @@ import org.cloudfoundry.client.v3.applications.ListApplicationsRequest; import org.cloudfoundry.client.v3.applications.SetApplicationCurrentDropletRequest; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; +import org.cloudfoundry.client.v3.auditevents.AuditEventResource; +import org.cloudfoundry.client.v3.auditevents.ListAuditEventsRequest; import org.cloudfoundry.client.v3.builds.BuildState; import org.cloudfoundry.client.v3.builds.CreateBuildRequest; import org.cloudfoundry.client.v3.builds.CreateBuildResponse; @@ -356,7 +354,7 @@ public Mono getEnvironments( @Override public Flux getEvents(GetApplicationEventsRequest request) { - return getApplicationId(request.getName()) + return getApplicationIdV3(request.getName()) .flatMapMany( applicationId -> requestEvents(applicationId) @@ -843,20 +841,19 @@ public static BiFunction collectStates }; } - private static ApplicationEvent convertToApplicationEvent(EventResource resource) { - EventEntity entity = resource.getEntity(); + private static ApplicationEvent convertToApplicationEvent(AuditEventResource entity) { Date timestamp = null; try { - timestamp = DateUtils.parseFromIso8601(entity.getTimestamp()); + timestamp = DateUtils.parseFromIso8601(entity.getCreatedAt()); } catch (IllegalArgumentException iae) { // do not set time } return ApplicationEvent.builder() - .actor(entity.getActorName()) + .actor(entity.getAuditEventActor().getName()) .description( eventDescription( getMetadataRequest(entity), getEntryNames(entity.getType()))) - .id(ResourceUtils.getId(resource)) + .id(entity.getId()) .event(entity.getType()) .time(timestamp) .build(); @@ -1210,17 +1207,14 @@ private Flux getLogs(String applicationId, Boolean recent) { } @SuppressWarnings("unchecked") - private static Map getMetadataRequest(EventEntity entity) { - Map> metadata = - Optional.ofNullable(entity.getMetadatas()).orElse(Collections.emptyMap()); + private static Map getMetadataRequest(AuditEventResource entity) { + Map metadata = + Optional.ofNullable(entity.getData()).orElse(Collections.emptyMap()); if (metadata.get("request") != null) { - return metadata.get("request") - .map(m -> (Map) m) - .orElse(Collections.emptyMap()); + return (Map) metadata.getOrDefault("request", Collections.emptyMap()); } else if (metadata.get("instance") != null) { - return metadata.entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, v -> v.getValue().orElse(""))); + return Collections.unmodifiableMap(metadata); } else { return Collections.emptyMap(); } @@ -1871,16 +1865,16 @@ private Mono requestDeleteRoute(String routeId) { .delete(DeleteRouteRequest.builder().async(true).routeId(routeId).build()); } - private Flux requestEvents(String applicationId) { - return PaginationUtils.requestClientV2Resources( + private Flux requestEvents(String applicationId) { + return PaginationUtils.requestClientV3Resources( page -> this.cloudFoundryClient - .events() + .auditEventsV3() .list( - ListEventsRequest.builder() - .actee(applicationId) - .orderDirection(OrderDirection.DESCENDING) - .resultsPerPage(50) + ListAuditEventsRequest.builder() + .targetId(applicationId) + .orderBy("-created_at") + .perPage(50) .page(page) .build())); } diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java index 168e0756c8..5af35b353b 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/AbstractOperationsTest.java @@ -44,6 +44,7 @@ import org.cloudfoundry.client.v2.userprovidedserviceinstances.UserProvidedServiceInstances; import org.cloudfoundry.client.v2.users.Users; import org.cloudfoundry.client.v3.applications.ApplicationsV3; +import org.cloudfoundry.client.v3.auditevents.AuditEventsV3; import org.cloudfoundry.client.v3.buildpacks.BuildpacksV3; import org.cloudfoundry.client.v3.domains.DomainsV3; import org.cloudfoundry.client.v3.jobs.JobsV3; @@ -106,6 +107,7 @@ public abstract class AbstractOperationsTest { protected final DopplerClient dopplerClient = mock(DopplerClient.class, RETURNS_SMART_NULLS); protected final Events events = mock(Events.class, RETURNS_SMART_NULLS); + protected final AuditEventsV3 auditEventsV3 = mock(AuditEventsV3.class, RETURNS_SMART_NULLS); protected final FeatureFlags featureFlags = mock(FeatureFlags.class, RETURNS_SMART_NULLS); @@ -182,6 +184,7 @@ public final void mockClient() { when(this.cloudFoundryClient.domains()).thenReturn(this.domains); when(this.cloudFoundryClient.domainsV3()).thenReturn(this.domainsV3); when(this.cloudFoundryClient.events()).thenReturn(this.events); + when(this.cloudFoundryClient.auditEventsV3()).thenReturn(this.auditEventsV3); when(this.cloudFoundryClient.featureFlags()).thenReturn(this.featureFlags); when(this.cloudFoundryClient.jobs()).thenReturn(this.jobs); when(this.cloudFoundryClient.jobsV3()).thenReturn(this.jobsV3); diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index 616ee8eeb5..ecb76f7c13 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -40,7 +40,6 @@ import org.cloudfoundry.client.CloudFoundryClient; import org.cloudfoundry.client.v2.ClientV2Exception; import org.cloudfoundry.client.v2.Metadata; -import org.cloudfoundry.client.v2.OrderDirection; import org.cloudfoundry.client.v2.applications.ApplicationEntity; import org.cloudfoundry.client.v2.applications.ApplicationInstanceInfo; import org.cloudfoundry.client.v2.applications.ApplicationInstancesRequest; @@ -70,10 +69,6 @@ import org.cloudfoundry.client.v2.applications.UploadApplicationRequest; import org.cloudfoundry.client.v2.applications.UploadApplicationResponse; import org.cloudfoundry.client.v2.applications.Usage; -import org.cloudfoundry.client.v2.events.EventEntity; -import org.cloudfoundry.client.v2.events.EventResource; -import org.cloudfoundry.client.v2.events.ListEventsRequest; -import org.cloudfoundry.client.v2.events.ListEventsResponse; import org.cloudfoundry.client.v2.jobs.ErrorDetails; import org.cloudfoundry.client.v2.jobs.GetJobRequest; import org.cloudfoundry.client.v2.jobs.GetJobResponse; @@ -138,6 +133,10 @@ import org.cloudfoundry.client.v3.applications.ListApplicationsResponse; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureResponse; +import org.cloudfoundry.client.v3.auditevents.AuditEventActor; +import org.cloudfoundry.client.v3.auditevents.AuditEventResource; +import org.cloudfoundry.client.v3.auditevents.ListAuditEventsRequest; +import org.cloudfoundry.client.v3.auditevents.ListAuditEventsResponse; import org.cloudfoundry.client.v3.processes.HealthCheck; import org.cloudfoundry.client.v3.processes.HealthCheckType; import org.cloudfoundry.client.v3.processes.ProcessState; @@ -789,21 +788,24 @@ void getEnvironmentsNoApp() { @Test void getEvents() { - requestApplications(this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); + requestApplicationsV3( + this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); requestEvents( this.cloudFoundryClient, "test-metadata-id", - fill(EventEntity.builder(), "event-") - .timestamp("2016-02-08T15:45:59Z") - .metadata( + AuditEventResource.builder() + .id("test-event-id") + .createdAt("2016-02-08T15:45:59Z") + .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) + .type("test-event-type") + .data( "request", - Optional.of( - FluentMap.builder() - .entry("instances", 1) - .entry("memory", 2) - .entry("environment_json", "test-data") - .entry("state", "test-state") - .build())) + FluentMap.builder() + .entry("instances", 1) + .entry("memory", 2) + .entry("environment_json", "test-data") + .entry("state", "test-state") + .build()) .build()); this.applications @@ -811,7 +813,7 @@ void getEvents() { .as(StepVerifier::create) .expectNext( ApplicationEvent.builder() - .actor("test-event-actorName") + .actor("test-event-actor-name") .description( "instances: 1, memory: 2, state: test-state," + " environment_json: test-data") @@ -825,20 +827,23 @@ void getEvents() { @Test void getEventsBadTimeSparseMetadata() { - requestApplications(this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); + requestApplicationsV3( + this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); requestEvents( this.cloudFoundryClient, "test-metadata-id", - fill(EventEntity.builder(), "event-") - .timestamp("BAD-TIMESTAMP") - .metadata( + AuditEventResource.builder() + .id("test-event-id") + .createdAt("BAD-TIMESTAMP") + .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) + .type("test-event-type") + .data( "request", - Optional.of( - FluentMap.builder() - .entry("memory", 2) - .entry("environment_json", "test-data") - .entry("state", "test-state") - .build())) + FluentMap.builder() + .entry("memory", 2) + .entry("environment_json", "test-data") + .entry("state", "test-state") + .build()) .build()); this.applications @@ -846,7 +851,7 @@ void getEventsBadTimeSparseMetadata() { .as(StepVerifier::create) .expectNext( ApplicationEvent.builder() - .actor("test-event-actorName") + .actor("test-event-actor-name") .description( "memory: 2, state: test-state, environment_json: test-data") .event("test-event-type") @@ -858,7 +863,8 @@ void getEventsBadTimeSparseMetadata() { @Test void getEventsFoundZero() { - requestApplications(this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); + requestApplicationsV3( + this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); requestEvents(this.cloudFoundryClient, "test-metadata-id"); this.applications @@ -870,21 +876,24 @@ void getEventsFoundZero() { @Test void getEventsLimitZero() { - requestApplications(this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); + requestApplicationsV3( + this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); requestEvents( this.cloudFoundryClient, "test-metadata-id", - fill(EventEntity.builder(), "event-") - .timestamp("2016-02-08T15:45:59Z") - .metadata( + AuditEventResource.builder() + .id("test-event-id") + .createdAt("2016-02-08T15:45:59Z") + .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) + .type("test-event-type") + .data( "request", - Optional.of( - FluentMap.builder() - .entry("instances", 1) - .entry("memory", 2) - .entry("environment_json", "test-data") - .entry("state", "test-state") - .build())) + FluentMap.builder() + .entry("instances", 1) + .entry("memory", 2) + .entry("environment_json", "test-data") + .entry("state", "test-state") + .build()) .build()); this.applications @@ -900,13 +909,17 @@ void getEventsLimitZero() { @Test void getEventsNoRequestMetadata() { - requestApplications(this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); + requestApplicationsV3( + this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); requestEvents( this.cloudFoundryClient, "test-metadata-id", - fill(EventEntity.builder(), "event-") - .timestamp("2016-02-08T15:45:59Z") - .metadata("index", Optional.of(1)) + AuditEventResource.builder() + .id("test-event-id") + .createdAt("2016-02-08T15:45:59Z") + .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) + .type("test-event-type") + .data("index", 1) .build()); this.applications @@ -914,7 +927,7 @@ void getEventsNoRequestMetadata() { .as(StepVerifier::create) .expectNext( ApplicationEvent.builder() - .actor("test-event-actorName") + .actor("test-event-actor-name") .description("") .event("test-event-type") .time(DateUtils.parseFromIso8601("2016-02-08T15:45:59Z")) @@ -926,30 +939,33 @@ void getEventsNoRequestMetadata() { @Test void getEventsTwo() { - requestApplications(this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); + requestApplicationsV3( + this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-metadata-id"); requestEvents( this.cloudFoundryClient, "test-metadata-id", - fill(EventEntity.builder(), "event-") - .timestamp("2016-02-08T15:45:59Z") - .metadata( + AuditEventResource.builder() + .id("test-event-id") + .createdAt("2016-02-08T15:45:59Z") + .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) + .type("test-event-type") + .data( "request", - Optional.of( - FluentMap.builder() - .entry("instances", 1) - .entry("memory", 2) - .entry("environment_json", "test-data") - .entry("state", "test-state") - .build())) + FluentMap.builder() + .entry("instances", 1) + .entry("memory", 2) + .entry("environment_json", "test-data") + .entry("state", "test-state") + .build()) .build(), - fill(EventEntity.builder(), "event-") - .timestamp("2016-02-08T15:49:07Z") - .metadata( + AuditEventResource.builder() + .id("test-event-id") + .createdAt("2016-02-08T15:49:07Z") + .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) + .type("test-event-type") + .data( "request", - Optional.of( - FluentMap.builder() - .entry("state", "test-state-two") - .build())) + FluentMap.builder().entry("state", "test-state-two").build()) .build()); this.applications @@ -957,7 +973,7 @@ void getEventsTwo() { .as(StepVerifier::create) .expectNext( ApplicationEvent.builder() - .actor("test-event-actorName") + .actor("test-event-actor-name") .description( "instances: 1, memory: 2, state: test-state," + " environment_json: test-data") @@ -966,7 +982,7 @@ void getEventsTwo() { .time(DateUtils.parseFromIso8601("2016-02-08T15:45:59Z")) .build(), ApplicationEvent.builder() - .actor("test-event-actorName") + .actor("test-event-actor-name") .description("state: test-state-two") .event("test-event-type") .id("test-event-id") @@ -5031,27 +5047,31 @@ private static void requestDeleteRoute(CloudFoundryClient cloudFoundryClient, St } private static void requestEvents( - CloudFoundryClient cloudFoundryClient, String applicationId, EventEntity... entities) { - ListEventsResponse.Builder responseBuilder = fill(ListEventsResponse.builder()); - - for (EventEntity entity : entities) { - responseBuilder.resource( - EventResource.builder() - .metadata(fill(Metadata.builder()).id("test-event-id").build()) - .entity(entity) - .build()); - } + CloudFoundryClient cloudFoundryClient, + String applicationId, + AuditEventResource... entities) { + ListAuditEventsResponse.Builder responseBuilder = fill(ListAuditEventsResponse.builder()); + responseBuilder.resources(entities); + + // for (AuditEventResource entity : entities) { + // HashMap data = new HashMap<>(); + // data.put("id", "test-event-id"); + // } when(cloudFoundryClient - .events() + .auditEventsV3() .list( - ListEventsRequest.builder() - .actee(applicationId) - .orderDirection(OrderDirection.DESCENDING) - .resultsPerPage(50) + ListAuditEventsRequest.builder() + .targetId(applicationId) + .orderBy("-created_at") + .perPage(50) .page(1) .build())) - .thenReturn(Mono.just(responseBuilder.totalPages(1).build())); + .thenReturn( + Mono.just( + responseBuilder + .pagination(Pagination.builder().totalPages(1).build()) + .build())); } private static void requestGetApplication( From 142ce60065aed90c8d5da0e9606ef84f82a05c7e Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Fri, 2 Jan 2026 12:09:08 +0100 Subject: [PATCH 08/16] DefaultApplications: logs use application v3 --- .../operations/applications/DefaultApplications.java | 2 +- .../operations/applications/DefaultApplicationsTest.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 68f25adf2c..e1aa974f65 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -398,7 +398,7 @@ public Flux listTasks(ListApplicationTasksRequest request) { @Override public Flux logs(LogsRequest request) { - return getApplicationId(request.getName()) + return getApplicationIdV3(request.getName()) .flatMapMany(applicationId -> getLogs(applicationId, request.getRecent())) .transform(OperationsLogging.log("Get Application Logs")) .checkpoint(); diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index ecb76f7c13..880822ae77 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -1338,7 +1338,7 @@ void listTasks() { @Test void logs() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-application-name", TEST_SPACE_ID, @@ -1355,7 +1355,7 @@ void logs() { @Test void logsNoApp() { - requestApplicationsEmpty(this.cloudFoundryClient, "test-application-name", TEST_SPACE_ID); + requestApplicationsEmptyV3(this.cloudFoundryClient, "test-application-name", TEST_SPACE_ID); this.applications .logs(LogsRequest.builder().name("test-application-name").build()) @@ -1371,7 +1371,7 @@ void logsNoApp() { @Test void logsRecent() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-application-name", TEST_SPACE_ID, @@ -1388,7 +1388,7 @@ void logsRecent() { @Test void logsRecentNotSet() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-application-name", TEST_SPACE_ID, From 21b443036bb6012f1d1ab16ef7cdfc1539f229be Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Fri, 2 Jan 2026 12:21:59 +0100 Subject: [PATCH 09/16] DefaultApplications: rename uses v3 api --- .../applications/DefaultApplications.java | 21 ++++++++++++++-- .../applications/DefaultApplicationsTest.java | 24 ++++++++++++------- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index e1aa974f65..8413392d04 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -538,10 +538,12 @@ public Mono pushManifestV3(PushManifestV3Request request) { @Override public Mono rename(RenameApplicationRequest request) { - return getApplicationId(request.getName()) + return getApplicationIdV3(request.getName()) .flatMap( applicationId -> - requestUpdateApplicationName(applicationId, request.getNewName())) + requestUpdateApplicationV3( + applicationId, + builder -> builder.name(request.getNewName()))) .then() .transform(OperationsLogging.log("Rename Application")) .checkpoint(); @@ -2147,6 +2149,21 @@ private Mono requestUpdateApplication( .cast(AbstractApplicationResource.class); } + private Mono requestUpdateApplicationV3( + String applicationId, + UnaryOperator + modifier) { + return this.cloudFoundryClient + .applicationsV3() + .update( + modifier.apply( + org.cloudfoundry.client.v3.applications + .UpdateApplicationRequest.builder() + .applicationId(applicationId)) + .build()) + .then(); + } + private Mono requestUpdateApplicationEnvironment( String applicationId, Map environment) { return requestUpdateApplication( diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index 880822ae77..cde0c0dc4e 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -3236,7 +3236,7 @@ void pushUploadFails() throws IOException { @Test void rename() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app-name", TEST_SPACE_ID, "test-metadata-id"); requestUpdateApplicationRename( this.cloudFoundryClient, "test-metadata-id", "test-new-app-name"); @@ -3254,7 +3254,7 @@ void rename() { @Test void renameNoApp() { - requestApplicationsEmpty(this.cloudFoundryClient, "test-app-name", TEST_SPACE_ID); + requestApplicationsEmptyV3(this.cloudFoundryClient, "test-app-name", TEST_SPACE_ID); this.applications .rename( @@ -5931,19 +5931,25 @@ private static void requestUpdateApplicationHealthCheck( private static void requestUpdateApplicationRename( CloudFoundryClient cloudFoundryClient, String applicationId, String name) { when(cloudFoundryClient - .applicationsV2() + .applicationsV3() .update( - UpdateApplicationRequest.builder() + org.cloudfoundry.client.v3.applications.UpdateApplicationRequest + .builder() .applicationId(applicationId) .name(name) .build())) .thenReturn( Mono.just( - fill(UpdateApplicationResponse.builder()) - .entity( - fill( - ApplicationEntity.builder(), - "application-entity-") + org.cloudfoundry.client.v3.applications.UpdateApplicationResponse + .builder() + .id("test-application-id") + .createdAt("2016-02-08T15:45:59Z") + .state(ApplicationState.STARTED) + .name("test-application-name") + .lifecycle( + Lifecycle.builder() + .data(BuildpackData.builder().build()) + .type(BUILDPACK) .build()) .build())); } From 8986d79e84ce093f003a7220a8eb752b6ab70ff3 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Fri, 2 Jan 2026 17:59:57 +0100 Subject: [PATCH 10/16] tests: improve TestObjects.fill(...) to support interface params that have builder implementations - For example, v3.GetApplicationResponse.Builder had a nested param of type LifecycleData. That's a method-less interface, with multiple possible implementations. Each implementation has a builder. We now pick whatever implementation we find, fill its builder, and use that in the root object. --- .../operations/ReflectionUtils.java | 136 ++++++++++++++++++ .../cloudfoundry/operations/TestObjects.java | 22 ++- .../applications/DefaultApplicationsTest.java | 112 ++++----------- 3 files changed, 181 insertions(+), 89 deletions(-) create mode 100644 cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/ReflectionUtils.java diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/ReflectionUtils.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/ReflectionUtils.java new file mode 100644 index 0000000000..2dda61e5ab --- /dev/null +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/ReflectionUtils.java @@ -0,0 +1,136 @@ +package org.cloudfoundry.operations; + +import java.io.File; +import java.lang.reflect.Modifier; +import java.net.JarURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; +import java.util.Objects; +import java.util.jar.JarFile; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +class ReflectionUtils { + + private ReflectionUtils() { // do not instantiate this class + } + + /** + * Find implementations for a given interface type. Uses reflection. + */ + public static List> findImplementations(Class interfaceType) { + try { + ClassLoader classLoader = interfaceType.getClassLoader(); + + String path = interfaceType.getPackage().getName().replace('.', '/'); + Enumeration resources = classLoader.getResources(path); + ArrayList lr = Collections.list(resources); + + return lr.stream() + .flatMap( + url -> { + if (url.getProtocol().equals("jar")) { + // Handle JAR URLs + return scanJar( + url, + interfaceType.getPackage().getName(), + interfaceType); + } else { + return scanDirectory( + new File(url.getFile()), + interfaceType.getPackage().getName(), + interfaceType); + } + }) + .collect(Collectors.toList()); + } catch (Exception ignored) { + + } + return Collections.emptyList(); + } + + /** + * Find implementations for the given interface type in a source directory. + */ + private static Stream> scanDirectory( + File directory, String packageName, Class interfaceType) { + File[] files = directory.listFiles(); + if (files == null) { + return Stream.empty(); + } + + Stream> classes = + Arrays.stream(files) + .filter(fileName -> fileName.getName().endsWith(".class")) + .map( + fileName -> + packageName + + '.' + + fileName.getName().replaceAll("\\.class$", "")) + .>map( + className -> + getClassIfImplementsInterface(className, interfaceType)) + .filter(Objects::nonNull); + Stream> directories = + Arrays.stream(files) + .filter(File::isDirectory) + .flatMap( + fileName -> + scanDirectory( + fileName, + packageName + "." + fileName.getName(), + interfaceType)); + return Stream.concat(classes, directories); + } + + /** + * Find implementations for the given interface type in a packaged jar. + * When running {@code mvn package}, class files are packaged in jar files, + * and is not available directly on the filesystem. + */ + private static Stream> scanJar( + URL jarUrl, String packageName, Class interfaceType) { + try { + JarURLConnection jarConnection = (JarURLConnection) jarUrl.openConnection(); + JarFile jarFile = jarConnection.getJarFile(); + String packagePath = packageName.replace('.', '/'); + + return jarFile.stream() + .filter( + entry -> { + String name = entry.getName(); + return name.startsWith(packagePath) + && name.endsWith(".class") + && !name.equals(packagePath + ".class"); + }) + .map(entry -> entry.getName().replace('/', '.').replaceAll("\\.class$", "")) + .>map( + className -> getClassIfImplementsInterface(className, interfaceType)) + .filter(Objects::nonNull); + } catch (Exception e) { + return Stream.empty(); + } + } + + /** + * Return the {@link Class} instance for {@code className}, if it implements {@code interfaceType}. Otherwise, return null. + */ + private static Class getClassIfImplementsInterface( + String className, Class interfaceType) { + try { + Class clazz = Class.forName(className); + if (interfaceType.isAssignableFrom(clazz) + && !clazz.isInterface() + && !Modifier.isAbstract(clazz.getModifiers())) { + Class subclass = clazz.asSubclass(interfaceType); + return subclass; + } + } catch (ClassNotFoundException ignored) { + } + return null; + } +} diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/TestObjects.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/TestObjects.java index 119b62fabb..8dff992136 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/TestObjects.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/TestObjects.java @@ -109,9 +109,12 @@ private static T fill(T builder, Optional modifier) { return getConfigurationMethods(builderType, builderMethods, builtGetters).stream() .collect( () -> builder, - (b, method) -> - ReflectionUtils.invokeMethod( - method, b, getConfiguredValue(method, modifier)), + (b, method) -> { + Object configuredValue = getConfiguredValue(method, modifier); + if (configuredValue != null) { + ReflectionUtils.invokeMethod(method, b, configuredValue); + } + }, (a, b) -> {}); } @@ -190,10 +193,19 @@ private static Object getConfiguredValue( return getConfiguredString(configurationMethod, modifier); } else if (parameterType.isArray()) { return Array.newInstance(parameterType.getComponentType(), 0); + } else if (parameterType == Map.Entry.class) { + return null; } else { - throw new IllegalStateException( - String.format("Unable to configure %s", configurationMethod)); + for (Class implementation : + org.cloudfoundry.operations.ReflectionUtils.findImplementations( + parameterType)) { + if (isBuiltType(implementation)) { + return getConfiguredBuilder(implementation, modifier); + } + } } + throw new IllegalStateException( + String.format("Unable to configure %s", configurationMethod)); } private static List getMethods(Class builderType) { diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index cde0c0dc4e..cf8b75f2aa 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -133,7 +133,6 @@ import org.cloudfoundry.client.v3.applications.ListApplicationsResponse; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureResponse; -import org.cloudfoundry.client.v3.auditevents.AuditEventActor; import org.cloudfoundry.client.v3.auditevents.AuditEventResource; import org.cloudfoundry.client.v3.auditevents.ListAuditEventsRequest; import org.cloudfoundry.client.v3.auditevents.ListAuditEventsResponse; @@ -546,7 +545,9 @@ void getApplicationManifest() { .as(StepVerifier::create) .expectNext( ApplicationManifest.builder() - .buildpacks("test-buildpack-1", "test-buildpack-2") + .buildpacks( + "test-application-summary-detectedBuildpack-1", + "test-application-summary-detectedBuildpack-2") .command("test-application-summary-command") .disk(1) .environmentVariables(Collections.emptyMap()) @@ -793,11 +794,8 @@ void getEvents() { requestEvents( this.cloudFoundryClient, "test-metadata-id", - AuditEventResource.builder() - .id("test-event-id") + fill(AuditEventResource.builder(), "event-") .createdAt("2016-02-08T15:45:59Z") - .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) - .type("test-event-type") .data( "request", FluentMap.builder() @@ -813,7 +811,7 @@ void getEvents() { .as(StepVerifier::create) .expectNext( ApplicationEvent.builder() - .actor("test-event-actor-name") + .actor("test-event-name") .description( "instances: 1, memory: 2, state: test-state," + " environment_json: test-data") @@ -832,11 +830,8 @@ void getEventsBadTimeSparseMetadata() { requestEvents( this.cloudFoundryClient, "test-metadata-id", - AuditEventResource.builder() - .id("test-event-id") + fill(AuditEventResource.builder(), "event-") .createdAt("BAD-TIMESTAMP") - .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) - .type("test-event-type") .data( "request", FluentMap.builder() @@ -851,7 +846,7 @@ void getEventsBadTimeSparseMetadata() { .as(StepVerifier::create) .expectNext( ApplicationEvent.builder() - .actor("test-event-actor-name") + .actor("test-event-name") .description( "memory: 2, state: test-state, environment_json: test-data") .event("test-event-type") @@ -881,19 +876,9 @@ void getEventsLimitZero() { requestEvents( this.cloudFoundryClient, "test-metadata-id", - AuditEventResource.builder() - .id("test-event-id") + fill(AuditEventResource.builder(), "event-") .createdAt("2016-02-08T15:45:59Z") - .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) - .type("test-event-type") - .data( - "request", - FluentMap.builder() - .entry("instances", 1) - .entry("memory", 2) - .entry("environment_json", "test-data") - .entry("state", "test-state") - .build()) + .data("index", 1) .build()); this.applications @@ -914,11 +899,8 @@ void getEventsNoRequestMetadata() { requestEvents( this.cloudFoundryClient, "test-metadata-id", - AuditEventResource.builder() - .id("test-event-id") + fill(AuditEventResource.builder(), "event-") .createdAt("2016-02-08T15:45:59Z") - .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) - .type("test-event-type") .data("index", 1) .build()); @@ -927,7 +909,7 @@ void getEventsNoRequestMetadata() { .as(StepVerifier::create) .expectNext( ApplicationEvent.builder() - .actor("test-event-actor-name") + .actor("test-event-name") .description("") .event("test-event-type") .time(DateUtils.parseFromIso8601("2016-02-08T15:45:59Z")) @@ -944,11 +926,8 @@ void getEventsTwo() { requestEvents( this.cloudFoundryClient, "test-metadata-id", - AuditEventResource.builder() - .id("test-event-id") + fill(AuditEventResource.builder(), "event-") .createdAt("2016-02-08T15:45:59Z") - .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) - .type("test-event-type") .data( "request", FluentMap.builder() @@ -958,11 +937,8 @@ void getEventsTwo() { .entry("state", "test-state") .build()) .build(), - AuditEventResource.builder() - .id("test-event-id") + fill(AuditEventResource.builder(), "event-") .createdAt("2016-02-08T15:49:07Z") - .auditEventActor(fill(AuditEventActor.builder(), "event-actor-").build()) - .type("test-event-type") .data( "request", FluentMap.builder().entry("state", "test-state-two").build()) @@ -973,7 +949,7 @@ void getEventsTwo() { .as(StepVerifier::create) .expectNext( ApplicationEvent.builder() - .actor("test-event-actor-name") + .actor("test-event-name") .description( "instances: 1, memory: 2, state: test-state," + " environment_json: test-data") @@ -982,7 +958,7 @@ void getEventsTwo() { .time(DateUtils.parseFromIso8601("2016-02-08T15:45:59Z")) .build(), ApplicationEvent.builder() - .actor("test-event-actor-name") + .actor("test-event-name") .description("state: test-state-two") .event("test-event-type") .id("test-event-id") @@ -4787,23 +4763,10 @@ private static void requestApplicationsV3( Mono.just( fill(ListApplicationsResponse.builder()) .resource( - org.cloudfoundry.client.v3.applications - .ApplicationResource.builder() - .createdAt("test-created-at") + fill(org.cloudfoundry.client.v3.applications + .ApplicationResource.builder()) .id(applicationId) - .lifecycle( - Lifecycle.builder() - .data( - BuildpackData - .builder() - .buildpack( - "test-buildpack") - .build()) - .type(BUILDPACK) - .build()) - .name("test-name") .state(ApplicationState.STOPPED) - .updatedAt("test-updated-at") .build()) .build())); } @@ -5206,21 +5169,18 @@ private static void requestGetApplicationV3Buildpack( .build())) .thenReturn( Mono.just( - org.cloudfoundry.client.v3.applications.GetApplicationResponse - .builder() - .createdAt("test-created-at") + fill(org.cloudfoundry.client.v3.applications.GetApplicationResponse + .builder()) .id(applicationId) .lifecycle( - Lifecycle.builder() + fill(Lifecycle.builder()) .data( BuildpackData.builder() .buildpack("test-buildpack") .build()) .type(BUILDPACK) .build()) - .name("test-name") .state(ApplicationState.STOPPED) - .updatedAt("test-updated-at") .build())); } @@ -5235,23 +5195,19 @@ private static void requestGetApplicationV3BuildpackMultiple( .build())) .thenReturn( Mono.just( - org.cloudfoundry.client.v3.applications.GetApplicationResponse - .builder() - .createdAt("test-created-at") - .id(applicationId) + fill(org.cloudfoundry.client.v3.applications.GetApplicationResponse + .builder()) .lifecycle( Lifecycle.builder() .data( BuildpackData.builder() .buildpacks( - "test-buildpack-1", - "test-buildpack-2") + "test-application-summary-detectedBuildpack-1", + "test-application-summary-detectedBuildpack-2") .build()) .type(BUILDPACK) .build()) - .name("test-name") .state(ApplicationState.STOPPED) - .updatedAt("test-updated-at") .build())); } @@ -5266,18 +5222,15 @@ private static void requestGetApplicationV3Docker( .build())) .thenReturn( Mono.just( - org.cloudfoundry.client.v3.applications.GetApplicationResponse - .builder() - .createdAt("test-created-at") + fill(org.cloudfoundry.client.v3.applications.GetApplicationResponse + .builder()) .id(applicationId) .lifecycle( Lifecycle.builder() .data(DockerData.builder().build()) .type(DOCKER) .build()) - .name("test-name") .state(ApplicationState.STOPPED) - .updatedAt("test-updated-at") .build())); } @@ -5940,17 +5893,8 @@ private static void requestUpdateApplicationRename( .build())) .thenReturn( Mono.just( - org.cloudfoundry.client.v3.applications.UpdateApplicationResponse - .builder() - .id("test-application-id") - .createdAt("2016-02-08T15:45:59Z") - .state(ApplicationState.STARTED) - .name("test-application-name") - .lifecycle( - Lifecycle.builder() - .data(BuildpackData.builder().build()) - .type(BUILDPACK) - .build()) + fill(org.cloudfoundry.client.v3.applications + .UpdateApplicationResponse.builder()) .build())); } From 15d243f601208f6bcd2a17f0b31daff5e0846979 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Mon, 5 Jan 2026 18:39:25 +0100 Subject: [PATCH 11/16] DefaultApplications: setHealthCheck uses v3 api --- .../operations/applications/Applications.java | 2 +- .../applications/DefaultApplications.java | 37 ++++++++++++--- .../applications/DefaultApplicationsTest.java | 45 +++++++++++-------- 3 files changed, 59 insertions(+), 25 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/Applications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/Applications.java index e8902d25aa..8377d53742 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/Applications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/Applications.java @@ -225,7 +225,7 @@ public interface Applications { Mono setEnvironmentVariable(SetEnvironmentVariableApplicationRequest request); /** - * Set the Health Check Type of an application + * Set the Health Check Type of the web process of an application * * @param request the set health check request * @return a completion indicator diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 8413392d04..e030d44d83 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -139,6 +139,7 @@ import org.cloudfoundry.client.v3.processes.HealthCheckType; import org.cloudfoundry.client.v3.processes.ProcessState; import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; +import org.cloudfoundry.client.v3.processes.UpdateProcessRequest; import org.cloudfoundry.client.v3.resourcematch.MatchedResource; import org.cloudfoundry.client.v3.spaces.ApplyManifestRequest; import org.cloudfoundry.client.v3.tasks.CancelTaskRequest; @@ -641,12 +642,12 @@ public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationReques @Override public Mono setHealthCheck(SetApplicationHealthCheckRequest request) { - return getApplicationId(request.getName()) + return getApplicationIdV3(request.getName()) + .flatMap(this::requestApplicationWebProcess) .flatMap( - applicationId -> - requestUpdateApplicationHealthCheckType( - applicationId, request.getType())) - .then() + webProcess -> + this.requestUpdateProcessHealthCheckType( + webProcess.getId(), fromHealthCheck(request.getType()))) .transform(OperationsLogging.log("Set Application Health Check")) .checkpoint(); } @@ -1668,6 +1669,18 @@ private Mono requestApplicationWebProcess(String .build()); } + private Mono requestUpdateProcessHealthCheckType( + String processId, HealthCheckType healthCheckType) { + return this.cloudFoundryClient + .processes() + .update( + UpdateProcessRequest.builder() + .processId(processId) + .healthCheck(HealthCheck.builder().type(healthCheckType).build()) + .build()) + .then(); + } + private Flux requestApplicationRoutes( String applicationId) { return PaginationUtils.requestClientV3Resources( @@ -2460,6 +2473,20 @@ private static ApplicationHealthCheck toHealthCheck(HealthCheckType type) { } } + private static HealthCheckType fromHealthCheck(ApplicationHealthCheck type) { + if (type == ApplicationHealthCheck.HTTP) { + return HealthCheckType.HTTP; + } else if (type == ApplicationHealthCheck.PORT) { + return HealthCheckType.PORT; + } else if (type == ApplicationHealthCheck.PROCESS) { + return HealthCheckType.PROCESS; + } else if (type == ApplicationHealthCheck.NONE) { + return HealthCheckType.NONE; + } else { + return null; + } + } + private static InstanceDetail toInstanceDetail( Map.Entry entry, ApplicationStatisticsResponse statisticsResponse) { diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index cf8b75f2aa..1daeb3d7a0 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -21,8 +21,10 @@ import static org.cloudfoundry.client.v3.LifecycleType.DOCKER; import static org.cloudfoundry.operations.TestObjects.fill; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.RETURNS_SMART_NULLS; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.IOException; @@ -140,6 +142,8 @@ import org.cloudfoundry.client.v3.processes.HealthCheckType; import org.cloudfoundry.client.v3.processes.ProcessState; import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; +import org.cloudfoundry.client.v3.processes.UpdateProcessRequest; +import org.cloudfoundry.client.v3.processes.UpdateProcessResponse; import org.cloudfoundry.client.v3.tasks.CancelTaskRequest; import org.cloudfoundry.client.v3.tasks.CancelTaskResponse; import org.cloudfoundry.client.v3.tasks.CreateTaskRequest; @@ -3695,13 +3699,15 @@ void setEnvironmentVariableNoApp() { @Test void setHealthCheck() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-application-name", TEST_SPACE_ID, "test-application-id"); + requestApplicationProcesses( + cloudFoundryClient, "test-application-id", HealthCheckType.HTTP); requestUpdateApplicationHealthCheck( - this.cloudFoundryClient, "test-application-id", ApplicationHealthCheck.PORT); + this.cloudFoundryClient, "test-process-id", ApplicationHealthCheck.PORT); this.applications .setHealthCheck( @@ -3712,6 +3718,14 @@ void setHealthCheck() { .as(StepVerifier::create) .expectComplete() .verify(Duration.ofSeconds(5)); + + verify(this.cloudFoundryClient.processes()) + .update( + argThat( + argument -> + argument.getHealthCheck() + .getType() + .equals(HealthCheckType.PORT))); } @Test @@ -4782,7 +4796,7 @@ private static void requestApplicationProcesses( .build())) .thenReturn( Mono.just( - fill(GetApplicationProcessResponse.builder()) + fill(GetApplicationProcessResponse.builder(), "process-") .healthCheck(fill(HealthCheck.builder()).type(type).build()) .build())); } @@ -5860,25 +5874,18 @@ private static void requestUpdateApplicationEnvironment( } private static void requestUpdateApplicationHealthCheck( - CloudFoundryClient cloudFoundryClient, - String applicationId, - ApplicationHealthCheck type) { + CloudFoundryClient cloudFoundryClient, String processId, ApplicationHealthCheck type) { when(cloudFoundryClient - .applicationsV2() + .processes() .update( - UpdateApplicationRequest.builder() - .applicationId(applicationId) - .healthCheckType(type.getValue()) - .build())) - .thenReturn( - Mono.just( - fill(UpdateApplicationResponse.builder()) - .entity( - fill( - ApplicationEntity.builder(), - "application-entity-") + UpdateProcessRequest.builder() + .processId(processId) + .healthCheck( + HealthCheck.builder() + .type(HealthCheckType.from(type.getValue())) .build()) - .build())); + .build())) + .thenReturn(Mono.just(fill(UpdateProcessResponse.builder()).build())); } private static void requestUpdateApplicationRename( From 00f99c907c752faad4f850ff3fcf8f5e1450bf6e Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Tue, 6 Jan 2026 15:19:59 +0100 Subject: [PATCH 12/16] DefaultApplications: setEnvironmentVariable and unsetEnvironmentVariable use v3 api --- ...pplicationEnvironmentVariablesRequest.java | 6 +- .../applications/DefaultApplications.java | 64 +++++++++++-------- .../applications/DefaultApplicationsTest.java | 58 ++++++----------- 3 files changed, 58 insertions(+), 70 deletions(-) diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/applications/_UpdateApplicationEnvironmentVariablesRequest.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/applications/_UpdateApplicationEnvironmentVariablesRequest.java index 90da3bfe42..837622ca1f 100644 --- a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/applications/_UpdateApplicationEnvironmentVariablesRequest.java +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/applications/_UpdateApplicationEnvironmentVariablesRequest.java @@ -16,14 +16,15 @@ package org.cloudfoundry.client.v3.applications; +import java.util.Map; + import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.cloudfoundry.AllowNulls; import org.immutables.value.Value; -import java.util.Map; - @JsonSerialize @Value.Immutable abstract class _UpdateApplicationEnvironmentVariablesRequest { @@ -39,6 +40,7 @@ abstract class _UpdateApplicationEnvironmentVariablesRequest { */ @AllowNulls @JsonProperty("var") + @JsonInclude(value = JsonInclude.Include.ALWAYS) abstract Map getVars(); } diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index e030d44d83..3ac4260c93 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -117,6 +117,8 @@ import org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest; import org.cloudfoundry.client.v3.applications.ListApplicationsRequest; import org.cloudfoundry.client.v3.applications.SetApplicationCurrentDropletRequest; +import org.cloudfoundry.client.v3.applications.UpdateApplicationEnvironmentVariablesRequest; +import org.cloudfoundry.client.v3.applications.UpdateApplicationEnvironmentVariablesResponse; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; import org.cloudfoundry.client.v3.auditevents.AuditEventResource; import org.cloudfoundry.client.v3.auditevents.ListAuditEventsRequest; @@ -624,22 +626,6 @@ public Mono scale(ScaleApplicationRequest request) { .checkpoint(); } - @Override - public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationRequest request) { - return getApplication(request.getName()) - .flatMap( - resource -> - requestUpdateApplicationEnvironment( - ResourceUtils.getId(resource), - addToEnvironment( - getEnvironment(resource), - request.getVariableName(), - request.getVariableValue()))) - .then() - .transform(OperationsLogging.log("Set Application Environment Variable")) - .checkpoint(); - } - @Override public Mono setHealthCheck(SetApplicationHealthCheckRequest request) { return getApplicationIdV3(request.getName()) @@ -694,15 +680,21 @@ public Mono terminateTask(TerminateApplicationTaskRequest request) { } @Override - public Mono unsetEnvironmentVariable(UnsetEnvironmentVariableApplicationRequest request) { - return getApplication(request.getName()) + public Mono setEnvironmentVariable(SetEnvironmentVariableApplicationRequest request) { + return getApplicationIdV3(request.getName()) .flatMap( - resource -> - requestUpdateApplicationEnvironment( - ResourceUtils.getId(resource), - removeFromEnvironment( - getEnvironment(resource), - request.getVariableName()))) + id -> + requestSetEnvironmentVariable( + id, request.getVariableName(), request.getVariableValue())) + .then() + .transform(OperationsLogging.log("Set Application Environment Variable")) + .checkpoint(); + } + + @Override + public Mono unsetEnvironmentVariable(UnsetEnvironmentVariableApplicationRequest request) { + return getApplicationIdV3(request.getName()) + .flatMap(id -> requestUnsetEnvironmentVariable(id, request.getVariableName())) .then() .transform(OperationsLogging.log("Unset Application Environment Variable")) .checkpoint(); @@ -2177,10 +2169,26 @@ private Mono requestUpdateApplicationV3( .then(); } - private Mono requestUpdateApplicationEnvironment( - String applicationId, Map environment) { - return requestUpdateApplication( - applicationId, builder -> builder.environmentJsons(environment)); + private Mono requestSetEnvironmentVariable( + String applicationId, String name, String value) { + return this.cloudFoundryClient + .applicationsV3() + .updateEnvironmentVariables( + UpdateApplicationEnvironmentVariablesRequest.builder() + .applicationId(applicationId) + .var(name, value) + .build()); + } + + private Mono requestUnsetEnvironmentVariable( + String applicationId, String name) { + return this.cloudFoundryClient + .applicationsV3() + .updateEnvironmentVariables( + UpdateApplicationEnvironmentVariablesRequest.builder() + .applicationId(applicationId) + .var(name, null) + .build()); } private Mono requestUpdateApplicationHealthCheckType( diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index 1daeb3d7a0..05508a161e 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -133,6 +133,8 @@ import org.cloudfoundry.client.v3.applications.ListApplicationRoutesResponse; import org.cloudfoundry.client.v3.applications.ListApplicationsRequest; import org.cloudfoundry.client.v3.applications.ListApplicationsResponse; +import org.cloudfoundry.client.v3.applications.UpdateApplicationEnvironmentVariablesRequest; +import org.cloudfoundry.client.v3.applications.UpdateApplicationEnvironmentVariablesResponse; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest; import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureResponse; import org.cloudfoundry.client.v3.auditevents.AuditEventResource; @@ -3647,21 +3649,12 @@ void scaleNoChange() { @Test void setEnvironmentVariable() { - requestApplications( - this.cloudFoundryClient, - "test-app", - TEST_SPACE_ID, - "test-metadata-id", - FluentMap.builder() - .entry("test-var", "test-value") - .entry("test-var2", "test-value2") - .build()); + requestApplicationsV3( + this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); requestUpdateApplicationEnvironment( this.cloudFoundryClient, - "test-metadata-id", - FluentMap.builder() - .entry("test-var", "test-value") - .entry("test-var2", "test-value2") + "test-application-id", + FluentMap.builder() .entry("test-var-name", "test-var-value") .build()); @@ -3679,7 +3672,7 @@ void setEnvironmentVariable() { @Test void setEnvironmentVariableNoApp() { - requestApplicationsEmpty(this.cloudFoundryClient, "test-app", TEST_SPACE_ID); + requestApplicationsEmptyV3(this.cloudFoundryClient, "test-app", TEST_SPACE_ID); this.applications .setEnvironmentVariable( @@ -3962,23 +3955,12 @@ void terminateTaskNoTask() { @Test void unsetEnvironmentVariable() { - requestApplications( - this.cloudFoundryClient, - "test-app", - TEST_SPACE_ID, - "test-metadata-id", - FluentMap.builder() - .entry("test-var", "test-value") - .entry("test-var2", "test-value2") - .entry("test-var-name", "test-var-value") - .build()); + requestApplicationsV3( + this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); requestUpdateApplicationEnvironment( this.cloudFoundryClient, - "test-metadata-id", - FluentMap.builder() - .entry("test-var2", "test-value2") - .entry("test-var-name", "test-var-value") - .build()); + "test-application-id", + FluentMap.builder().entry("test-var", null).build()); this.applications .unsetEnvironmentVariable( @@ -3993,7 +3975,7 @@ void unsetEnvironmentVariable() { @Test void unsetEnvironmentVariableNoApp() { - requestApplicationsEmpty(this.cloudFoundryClient, "test-app", TEST_SPACE_ID); + requestApplicationsEmptyV3(this.cloudFoundryClient, "test-app", TEST_SPACE_ID); this.applications .unsetEnvironmentVariable( @@ -5855,21 +5837,17 @@ private static void requestUpdateApplication( private static void requestUpdateApplicationEnvironment( CloudFoundryClient cloudFoundryClient, String applicationId, - Map environment) { + Map environment) { when(cloudFoundryClient - .applicationsV2() - .update( - UpdateApplicationRequest.builder() + .applicationsV3() + .updateEnvironmentVariables( + UpdateApplicationEnvironmentVariablesRequest.builder() .applicationId(applicationId) - .environmentJsons(environment) + .putAllVars(environment) .build())) .thenReturn( Mono.just( - fill(UpdateApplicationResponse.builder()) - .entity( - fill(ApplicationEntity.builder()) - .environmentJsons(environment) - .build()) + fill(UpdateApplicationEnvironmentVariablesResponse.builder()) .build())); } From 0a30f7752414622baeca0fb2cf4663cfe5aeb15c Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Tue, 6 Jan 2026 15:55:38 +0100 Subject: [PATCH 13/16] DefaultApplications: remove unused methods --- .../applications/DefaultApplications.java | 45 ++----------------- .../applications/DefaultApplicationsTest.java | 37 --------------- 2 files changed, 3 insertions(+), 79 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 3ac4260c93..d9f7545039 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -160,7 +160,6 @@ import org.cloudfoundry.util.DelayTimeoutException; import org.cloudfoundry.util.ExceptionUtils; import org.cloudfoundry.util.FileUtils; -import org.cloudfoundry.util.FluentMap; import org.cloudfoundry.util.JobUtils; import org.cloudfoundry.util.PaginationUtils; import org.cloudfoundry.util.ResourceMatchingUtils; @@ -280,9 +279,7 @@ public Mono copySource(CopySourceApplicationRequest request) { @Override public Mono delete(DeleteApplicationRequest request) { return getRoutesAndApplicationId( - request, - spaceId, - Optional.ofNullable(request.getDeleteRoutes()).orElse(false)) + request, Optional.ofNullable(request.getDeleteRoutes()).orElse(false)) .flatMap( function( (routes, applicationId) -> @@ -710,14 +707,6 @@ private Mono getSshEnabled(String applicationId) { .map(GetApplicationSshEnabledResponse::getEnabled); } - private static Map addToEnvironment( - Map environment, String variableName, Object variableValue) { - return FluentMap.builder() - .entries(environment) - .entry(variableName, variableValue) - .build(); - } - private Mono applyDropletAndWaitForRunning( String appname, String appId, String dropletId) { return this.cloudFoundryClient @@ -987,7 +976,7 @@ private static String eventDescription(Map request, String... en sb.append(", "); } first = false; - sb.append(entryName).append(": ").append(String.valueOf(value)); + sb.append(entryName).append(": ").append(value); } return sb.toString(); } @@ -1175,10 +1164,6 @@ private static String[] getEntryNames(String type) { return type.contains("crash") ? ENTRY_FIELDS_CRASH : ENTRY_FIELDS_NORMAL; } - private static Map getEnvironment(AbstractApplicationResource resource) { - return ResourceUtils.getEntity(resource).getEnvironmentJsons(); - } - private static int getInstances(AbstractApplicationResource resource) { return Optional.ofNullable(resource.getEntity()) .map(ApplicationEntity::getInstances) @@ -1362,8 +1347,7 @@ private Mono> getRoutes(String app } private Mono>, String>> - getRoutesAndApplicationId( - DeleteApplicationRequest request, String spaceId, boolean deleteRoutes) { + getRoutesAndApplicationId(DeleteApplicationRequest request, boolean deleteRoutes) { return getApplicationId(request.getName()) .flatMap( applicationId -> @@ -1607,13 +1591,6 @@ private Flux pushDocker( applicationId, manifest.getName(), request)); } - private static Map removeFromEnvironment( - Map environment, String variableName) { - Map modified = new HashMap<>(environment); - modified.remove(variableName); - return modified; - } - private Mono removeServiceBindings(String applicationId) { return requestListServiceBindings(applicationId) .map(ResourceUtils::getId) @@ -2191,17 +2168,6 @@ private Mono requestUnsetEnvironm .build()); } - private Mono requestUpdateApplicationHealthCheckType( - String applicationId, ApplicationHealthCheck type) { - return requestUpdateApplication( - applicationId, builder -> builder.healthCheckType(type.getValue())); - } - - private Mono requestUpdateApplicationName( - String applicationId, String name) { - return requestUpdateApplication(applicationId, builder -> builder.name(name)); - } - private Mono requestUpdateApplicationSsh( String applicationId, boolean enabled) { return requestUpdateApplicationFeature( @@ -2228,11 +2194,6 @@ private Mono requestUpdateApplicationScale( builder -> builder.diskQuota(disk).instances(instances).memory(memory)); } - private Mono requestUpdateApplicationSsh( - String applicationId, Boolean enabled) { - return requestUpdateApplication(applicationId, builder -> builder.enableSsh(enabled)); - } - private Mono requestUpdateApplicationState( String applicationId, String state) { return requestUpdateApplication(applicationId, builder -> builder.state(state)); diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index 05508a161e..593b2fdd31 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -4783,43 +4783,6 @@ private static void requestApplicationProcesses( .build())); } - private static void requestApplicationsWithSsh( - CloudFoundryClient cloudFoundryClient, - String application, - String spaceId, - Boolean sshEnabled) { - when(cloudFoundryClient - .spaces() - .listApplications( - ListSpaceApplicationsRequest.builder() - .name(application) - .spaceId(spaceId) - .page(1) - .build())) - .thenReturn( - Mono.just( - fill(ListSpaceApplicationsResponse.builder()) - .resource( - ApplicationResource.builder() - .metadata( - fill(Metadata.builder()) - .id("test-application-id") - .build()) - .entity( - fill( - ApplicationEntity - .builder(), - "application-") - .environmentJson( - "test-var", - "test-value") - .enableSsh(sshEnabled) - .build()) - .build()) - .totalPages(1) - .build())); - } - private static void requestAssociateRoute( CloudFoundryClient cloudFoundryClient, String applicationId, String routeId) { when(cloudFoundryClient From 7041647b4c90b5353d8fdfae07b661f74816c4c4 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Thu, 8 Jan 2026 10:19:49 +0100 Subject: [PATCH 14/16] DefaultApplications: all stacks() references now use v3 API --- .../applications/DefaultApplications.java | 40 +++++++++---------- .../applications/DefaultApplicationsTest.java | 20 +++++----- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index d9f7545039..7660c34b87 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -94,10 +94,6 @@ import org.cloudfoundry.client.v2.spaces.ListSpaceServiceInstancesRequest; import org.cloudfoundry.client.v2.spaces.SpaceApplicationSummary; import org.cloudfoundry.client.v2.spaces.SpaceResource; -import org.cloudfoundry.client.v2.stacks.GetStackRequest; -import org.cloudfoundry.client.v2.stacks.GetStackResponse; -import org.cloudfoundry.client.v2.stacks.ListStacksRequest; -import org.cloudfoundry.client.v2.stacks.StackResource; import org.cloudfoundry.client.v3.BuildpackData; import org.cloudfoundry.client.v3.Lifecycle; import org.cloudfoundry.client.v3.Relationship; @@ -144,6 +140,10 @@ import org.cloudfoundry.client.v3.processes.UpdateProcessRequest; import org.cloudfoundry.client.v3.resourcematch.MatchedResource; import org.cloudfoundry.client.v3.spaces.ApplyManifestRequest; +import org.cloudfoundry.client.v3.stacks.GetStackRequest; +import org.cloudfoundry.client.v3.stacks.GetStackResponse; +import org.cloudfoundry.client.v3.stacks.ListStacksRequest; +import org.cloudfoundry.client.v3.stacks.StackResource; import org.cloudfoundry.client.v3.tasks.CancelTaskRequest; import org.cloudfoundry.client.v3.tasks.CancelTaskResponse; import org.cloudfoundry.client.v3.tasks.CreateTaskRequest; @@ -1111,7 +1111,7 @@ private Mono getApplicationV3(String application) { Tuple5< List, SummaryApplicationResponse, - GetStackResponse, + String, List, List>> getAuxiliaryContent(AbstractApplicationResource applicationResource) { @@ -1130,7 +1130,7 @@ private Mono getApplicationV3(String application) { Mono.zip( getApplicationBuildpacks(applicationId), Mono.just(summaryApplicationResponse), - requestStack(stackId), + getStackName(stackId), toInstanceDetailList( applicationInstancesResponse, applicationStatisticsResponse), @@ -1376,18 +1376,20 @@ private Mono getSpaceOrganizationId(String spaceId) { .map(response -> ResourceUtils.getEntity(response).getOrganizationId()); } - private Mono getStackId(String stack) { - return requestStacks(stack) - .map(ResourceUtils::getId) + private Mono getStackId(String stackName) { + return requestStacks(stackName) + .map(StackResource::getId) .single() .onErrorResume( NoSuchElementException.class, - t -> ExceptionUtils.illegalArgument("Stack %s does not exist", stack)); + t -> ExceptionUtils.illegalArgument("Stack %s does not exist", stackName)); } private Mono getStackName(String stackId) { - return requestStack(stackId) - .map(getStackResponse -> getStackResponse.getEntity().getName()); + return this.cloudFoundryClient + .stacksV3() + .get(GetStackRequest.builder().stackId(stackId).build()) + .map(GetStackResponse::getName); } private Mono getTaskId(String applicationId, Integer sequenceId) { @@ -2042,17 +2044,11 @@ private Mono requestSpaceSummary() { .getSummary(GetSpaceSummaryRequest.builder().spaceId(this.spaceId).build()); } - private Mono requestStack(String stackId) { - return this.cloudFoundryClient - .stacks() - .get(GetStackRequest.builder().stackId(stackId).build()); - } - private Flux requestStacks(String stack) { - return PaginationUtils.requestClientV2Resources( + return PaginationUtils.requestClientV3Resources( page -> this.cloudFoundryClient - .stacks() + .stacksV3() .list(ListStacksRequest.builder().page(page).name(stack).build())); } @@ -2305,7 +2301,7 @@ private Mono stopApplicationIfNotStopped( private static ApplicationDetail toApplicationDetail( List buildpacks, SummaryApplicationResponse summaryApplicationResponse, - GetStackResponse getStackResponse, + String stackName, List instanceDetails, List urls) { if (buildpacks.size() == 0) { @@ -2324,7 +2320,7 @@ private static ApplicationDetail toApplicationDetail( .name(summaryApplicationResponse.getName()) .requestedState(summaryApplicationResponse.getState()) .runningInstances(summaryApplicationResponse.getRunningInstances()) - .stack(getStackResponse.getEntity().getName()) + .stack(stackName) .urls(urls) .build(); } diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index 593b2fdd31..8ac4e6cdbe 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -112,11 +112,6 @@ import org.cloudfoundry.client.v2.spaces.SpaceApplicationSummary; import org.cloudfoundry.client.v2.spaces.SpaceEntity; import org.cloudfoundry.client.v2.spaces.SpaceResource; -import org.cloudfoundry.client.v2.stacks.GetStackRequest; -import org.cloudfoundry.client.v2.stacks.GetStackResponse; -import org.cloudfoundry.client.v2.stacks.ListStacksRequest; -import org.cloudfoundry.client.v2.stacks.ListStacksResponse; -import org.cloudfoundry.client.v2.stacks.StackEntity; import org.cloudfoundry.client.v3.BuildpackData; import org.cloudfoundry.client.v3.DockerData; import org.cloudfoundry.client.v3.Lifecycle; @@ -146,6 +141,9 @@ import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; import org.cloudfoundry.client.v3.processes.UpdateProcessRequest; import org.cloudfoundry.client.v3.processes.UpdateProcessResponse; +import org.cloudfoundry.client.v3.stacks.GetStackRequest; +import org.cloudfoundry.client.v3.stacks.ListStacksRequest; +import org.cloudfoundry.client.v3.stacks.ListStacksResponse; import org.cloudfoundry.client.v3.tasks.CancelTaskRequest; import org.cloudfoundry.client.v3.tasks.CancelTaskResponse; import org.cloudfoundry.client.v3.tasks.CreateTaskRequest; @@ -5699,19 +5697,19 @@ private static void requestSpaceSummary(CloudFoundryClient cloudFoundryClient, S } private static void requestStack(CloudFoundryClient cloudFoundryClient, String stackId) { - when(cloudFoundryClient.stacks().get(GetStackRequest.builder().stackId(stackId).build())) + when(cloudFoundryClient.stacksV3().get(GetStackRequest.builder().stackId(stackId).build())) .thenReturn( Mono.just( - fill(GetStackResponse.builder()) - .entity( - fill(StackEntity.builder(), "stack-entity-") - .build()) + fill( + org.cloudfoundry.client.v3.stacks.GetStackResponse + .builder(), + "stack-entity-") .build())); } private static void requestStackIdEmpty(CloudFoundryClient cloudFoundryClient, String stack) { when(cloudFoundryClient - .stacks() + .stacksV3() .list(ListStacksRequest.builder().name(stack).page(1).build())) .thenReturn(Mono.just(fill(ListStacksResponse.builder()).build())); } From 5681319108702c258e7e16a5468dc71d92879342 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Thu, 8 Jan 2026 17:40:19 +0100 Subject: [PATCH 15/16] ProcessState: Introduce STOPPING state --- .../cloudfoundry/client/v3/processes/ProcessState.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/processes/ProcessState.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/processes/ProcessState.java index c9ac2c22c2..bf40f480e8 100644 --- a/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/processes/ProcessState.java +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/client/v3/processes/ProcessState.java @@ -42,7 +42,12 @@ public enum ProcessState { /** * The starting state */ - STARTING("STARTING"); + STARTING("STARTING"), + + /** + * The stopping state + */ + STOPPING("STOPPING"); private final String value; @@ -61,6 +66,8 @@ public static ProcessState from(String s) { return RUNNING; case "starting": return STARTING; + case "stopping": + return STOPPING; default: throw new IllegalArgumentException(String.format("Unknown process state: %s", s)); } From c09a203a2c84e3820eccbf84ace41ac300d82cf3 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Fri, 9 Jan 2026 16:08:51 +0100 Subject: [PATCH 16/16] DefaultApplications: migrate instance details & statistics to v3 API - Use process stats instead --- .../applications/DefaultApplications.java | 170 ++++----- .../applications/_InstanceDetail.java | 7 +- .../applications/DefaultApplicationsTest.java | 326 ++++++++---------- .../org/cloudfoundry/util/ExceptionUtils.java | 22 ++ 4 files changed, 235 insertions(+), 290 deletions(-) diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java index 7660c34b87..626a14f9e3 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java @@ -42,11 +42,6 @@ import org.cloudfoundry.client.CloudFoundryClient; import org.cloudfoundry.client.v2.applications.AbstractApplicationResource; import org.cloudfoundry.client.v2.applications.ApplicationEntity; -import org.cloudfoundry.client.v2.applications.ApplicationInstanceInfo; -import org.cloudfoundry.client.v2.applications.ApplicationInstancesRequest; -import org.cloudfoundry.client.v2.applications.ApplicationInstancesResponse; -import org.cloudfoundry.client.v2.applications.ApplicationStatisticsRequest; -import org.cloudfoundry.client.v2.applications.ApplicationStatisticsResponse; import org.cloudfoundry.client.v2.applications.AssociateApplicationRouteRequest; import org.cloudfoundry.client.v2.applications.AssociateApplicationRouteResponse; import org.cloudfoundry.client.v2.applications.CopyApplicationRequest; @@ -95,7 +90,9 @@ import org.cloudfoundry.client.v2.spaces.SpaceApplicationSummary; import org.cloudfoundry.client.v2.spaces.SpaceResource; import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.CnbData; import org.cloudfoundry.client.v3.Lifecycle; +import org.cloudfoundry.client.v3.LifecycleData; import org.cloudfoundry.client.v3.Relationship; import org.cloudfoundry.client.v3.Resource; import org.cloudfoundry.client.v3.ToOneRelationship; @@ -137,6 +134,7 @@ import org.cloudfoundry.client.v3.processes.HealthCheckType; import org.cloudfoundry.client.v3.processes.ProcessState; import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource; +import org.cloudfoundry.client.v3.processes.ProcessUsage; import org.cloudfoundry.client.v3.processes.UpdateProcessRequest; import org.cloudfoundry.client.v3.resourcematch.MatchedResource; import org.cloudfoundry.client.v3.spaces.ApplyManifestRequest; @@ -170,7 +168,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.function.Tuple2; -import reactor.util.function.Tuple5; +import reactor.util.function.Tuple4; import reactor.util.function.Tuples; public final class DefaultApplications implements Applications { @@ -314,8 +312,8 @@ public Mono enableSsh(EnableApplicationSshRequest request) { @Override public Mono get(GetApplicationRequest request) { - return getApplication(request.getName()) - .flatMap(app -> getAuxiliaryContent(app)) + return getApplicationV3(request.getName()) + .flatMap(this::getAuxiliaryContent) .map(function(DefaultApplications::toApplicationDetail)) .transform(OperationsLogging.log("Get Application")) .checkpoint(); @@ -1072,31 +1070,11 @@ private Mono getApplicationIdWhere( return getApplication(application).filter(predicate).map(ResourceUtils::getId); } - private Mono getApplicationInstances(String applicationId) { - return requestApplicationInstances(applicationId) - .onErrorResume( - ExceptionUtils.statusCode( - CF_BUILDPACK_COMPILED_FAILED, - CF_INSTANCES_ERROR, - CF_STAGING_NOT_FINISHED, - CF_STAGING_TIME_EXPIRED, - CF_INSUFFICIENT_RESOURCES, - CF_STAGING_ERROR), - t -> Mono.just(ApplicationInstancesResponse.builder().build())); - } - private Mono> getApplicationRoutes( String applicationId) { return requestApplicationRoutes(applicationId).collectList(); } - private Mono getApplicationStatistics(String applicationId) { - return requestApplicationStatistics(applicationId) - .onErrorResume( - ExceptionUtils.statusCode(CF_APP_STOPPED_STATS_ERROR), - t -> Mono.just(ApplicationStatisticsResponse.builder().build())); - } - private Mono getApplicationV3(String application) { return requestApplicationsV3(application) .single() @@ -1107,34 +1085,25 @@ private Mono getApplicationV3(String application) { "Application %s does not exist", application)); } - private Mono< - Tuple5< - List, - SummaryApplicationResponse, - String, - List, - List>> - getAuxiliaryContent(AbstractApplicationResource applicationResource) { - String applicationId = ResourceUtils.getId(applicationResource); - String stackId = ResourceUtils.getEntity(applicationResource).getStackId(); + private Mono, SummaryApplicationResponse, String, List>> + getAuxiliaryContent(ApplicationResource applicationResource) { + String applicationId = applicationResource.getId(); + LifecycleData data = applicationResource.getLifecycle().getData(); + String stackName = ""; + if (data instanceof CnbData) { + stackName = ((CnbData) data).getStack(); + } else if (data instanceof BuildpackData) { + stackName = ((BuildpackData) data).getStack(); + } + + Mono> appInstanceDetails = + requestApplicationStatisticsV3(applicationId).map(this::toInstanceDetailList); return Mono.zip( - getApplicationStatistics(applicationId), - requestApplicationSummary(applicationId), - getApplicationInstances(applicationId)) - .flatMap( - function( - (applicationStatisticsResponse, - summaryApplicationResponse, - applicationInstancesResponse) -> - Mono.zip( - getApplicationBuildpacks(applicationId), - Mono.just(summaryApplicationResponse), - getStackName(stackId), - toInstanceDetailList( - applicationInstancesResponse, - applicationStatisticsResponse), - toUrls(summaryApplicationResponse.getRoutes())))); + getApplicationBuildpacks(applicationId), + requestApplicationSummary(applicationId), + Mono.just(stackName), + appInstanceDetails); } private Mono getDefaultDomainId() { @@ -1612,13 +1581,6 @@ private Mono requestApplicationEnvironment( .build()); } - private Mono requestApplicationInstances(String applicationId) { - return this.cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder().applicationId(applicationId).build()); - } - private Mono requestApplicationStatisticsV3( String applicationId) { return this.cloudFoundryClient @@ -1627,7 +1589,25 @@ private Mono requestApplicationStatisti GetApplicationProcessStatisticsRequest.builder() .applicationId(applicationId) .type("web") - .build()); + .build()) + .onErrorResume( + ExceptionUtils.statusCodeV3( + CF_BUILDPACK_COMPILED_FAILED, + CF_INSTANCES_ERROR, + CF_STAGING_NOT_FINISHED, + CF_STAGING_TIME_EXPIRED, + CF_INSUFFICIENT_RESOURCES, + CF_STAGING_ERROR, + // NOTE: this used to be an error from the v2 API apps/instances + // endpoint. It probably does not apply to the v3 processes/stats + // endpoint, but it is hard to test. Leaving it in, worst case this + // never gets triggered. + CF_APP_STOPPED_STATS_ERROR), + t -> + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resources() + .build())); } private Mono requestApplicationWebProcess(String applicationId) { @@ -1665,15 +1645,6 @@ private Flux requestApplication .build())); } - private Mono requestApplicationStatistics(String applicationId) { - return this.cloudFoundryClient - .applicationsV2() - .statistics( - ApplicationStatisticsRequest.builder() - .applicationId(applicationId) - .build()); - } - private Mono requestApplicationSummary(String applicationId) { return this.cloudFoundryClient .applicationsV2() @@ -2302,8 +2273,7 @@ private static ApplicationDetail toApplicationDetail( List buildpacks, SummaryApplicationResponse summaryApplicationResponse, String stackName, - List instanceDetails, - List urls) { + List instanceDetails) { if (buildpacks.size() == 0) { buildpacks = Collections.singletonList(summaryApplicationResponse.getDetectedBuildpack()); @@ -2321,7 +2291,7 @@ private static ApplicationDetail toApplicationDetail( .requestedState(summaryApplicationResponse.getState()) .runningInstances(summaryApplicationResponse.getRunningInstances()) .stack(stackName) - .urls(urls) + .urls(toUrls(summaryApplicationResponse.getRoutes())) .build(); } @@ -2452,35 +2422,25 @@ private static HealthCheckType fromHealthCheck(ApplicationHealthCheck type) { } } - private static InstanceDetail toInstanceDetail( - Map.Entry entry, - ApplicationStatisticsResponse statisticsResponse) { - InstanceStatistics instanceStatistics = - Optional.ofNullable(statisticsResponse.getInstances().get(entry.getKey())) - .orElse(emptyInstanceStats()); - Statistics stats = - Optional.ofNullable(instanceStatistics.getStatistics()) - .orElse(emptyApplicationStatistics()); - Usage usage = Optional.ofNullable(stats.getUsage()).orElse(emptyApplicationUsage()); - - return InstanceDetail.builder() - .index(entry.getKey()) - .state(entry.getValue().getState()) - .since(toDate(entry.getValue().getSince())) - .cpu(usage.getCpu()) - .memoryUsage(usage.getMemory()) - .diskUsage(usage.getDisk()) - .diskQuota(stats.getDiskQuota()) - .memoryQuota(stats.getMemoryQuota()) - .build(); - } - - private Mono> toInstanceDetailList( - ApplicationInstancesResponse instancesResponse, - ApplicationStatisticsResponse statisticsResponse) { - return Flux.fromIterable(instancesResponse.getInstances().entrySet()) - .map(entry -> toInstanceDetail(entry, statisticsResponse)) - .collectList(); + private List toInstanceDetailList( + GetApplicationProcessStatisticsResponse statisticsResponse) { + return statisticsResponse.getResources().stream() + .map( + statisticsResource -> { + ProcessUsage usage = + Optional.ofNullable(statisticsResource.getUsage()) + .orElse(ProcessUsage.builder().build()); + return InstanceDetail.builder() + .index(statisticsResource.getIndex().toString()) + .state(statisticsResource.getState().getValue()) + .cpu(usage.getCpu()) + .memoryUsage(usage.getMemory()) + .diskUsage(usage.getDisk()) + .diskQuota(statisticsResource.getDiskQuota()) + .memoryQuota(statisticsResource.getMemoryQuota()) + .build(); + }) + .collect(Collectors.toList()); } private static Task toTask(org.cloudfoundry.client.v3.tasks.Task task) { @@ -2509,8 +2469,8 @@ private static String toUrl(org.cloudfoundry.client.v2.routes.Route route) { return sb.toString(); } - private Mono> toUrls(List routes) { - return Flux.fromIterable(routes).map(DefaultApplications::toUrl).collectList(); + private static List toUrls(List routes) { + return routes.stream().map(DefaultApplications::toUrl).collect(Collectors.toList()); } private Mono updateBuildpacks(String applicationId, ApplicationManifest manifest) { diff --git a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/_InstanceDetail.java b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/_InstanceDetail.java index c0a146668a..85b338704a 100644 --- a/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/_InstanceDetail.java +++ b/cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/_InstanceDetail.java @@ -16,11 +16,11 @@ package org.cloudfoundry.operations.applications; +import java.util.Date; + import org.cloudfoundry.Nullable; import org.immutables.value.Value; -import java.util.Date; - /** * Information about an instance of an application */ @@ -64,8 +64,11 @@ abstract class _InstanceDetail { /** * The time this instance was created + * + * @deprecated Always returns null. The "since" field is not returned by the CF v3 API. */ @Nullable + @Deprecated abstract Date getSince(); /** diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java index 8ac4e6cdbe..bc36b0b974 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/applications/DefaultApplicationsTest.java @@ -113,7 +113,9 @@ import org.cloudfoundry.client.v2.spaces.SpaceEntity; import org.cloudfoundry.client.v2.spaces.SpaceResource; import org.cloudfoundry.client.v3.BuildpackData; +import org.cloudfoundry.client.v3.ClientV3Exception; import org.cloudfoundry.client.v3.DockerData; +import org.cloudfoundry.client.v3.Error; import org.cloudfoundry.client.v3.Lifecycle; import org.cloudfoundry.client.v3.Pagination; import org.cloudfoundry.client.v3.applications.ApplicationState; @@ -121,6 +123,7 @@ import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentResponse; import org.cloudfoundry.client.v3.applications.GetApplicationProcessRequest; import org.cloudfoundry.client.v3.applications.GetApplicationProcessResponse; +import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsRequest; import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledRequest; import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledResponse; @@ -504,12 +507,11 @@ void enableSshNoApp() { @Test void get() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatistics(this.cloudFoundryClient, "test-application-id"); + requestApplicationProcessStatistics(this.cloudFoundryClient, "test-application-id"); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstances(this.cloudFoundryClient, "test-application-id"); requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); this.applications @@ -521,14 +523,14 @@ void get() { .id("test-application-summary-id") .instanceDetail( fill(InstanceDetail.builder()) - .index("instance-0") - .since(new Date(1000)) - .state("test-application-instance-info-state") + .since(null) + .index("1") + .state("RUNNING") .build()) .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") + .stack("test-stack") .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() @@ -684,12 +686,11 @@ void getApplicationManifestTcp() { @Test void getBuildpackError() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatistics(this.cloudFoundryClient, "test-application-id"); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstancesError(this.cloudFoundryClient, "test-application-id", 170004); + requestProcessStatisticsError(this.cloudFoundryClient, "test-application-id", 170004); requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); this.applications @@ -702,7 +703,7 @@ void getBuildpackError() { .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") + .stack("test-stack") .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() @@ -711,12 +712,11 @@ void getBuildpackError() { @Test void getDetectedBuildpack() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatistics(this.cloudFoundryClient, "test-application-id"); + requestApplicationProcessStatistics(this.cloudFoundryClient, "test-application-id"); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummaryDetectedBuildpack(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstances(this.cloudFoundryClient, "test-application-id"); requestGetApplicationV3Docker(this.cloudFoundryClient, "test-application-id"); this.applications @@ -728,15 +728,15 @@ void getDetectedBuildpack() { .id("test-application-summary-id") .instanceDetail( fill(InstanceDetail.builder()) - .index("instance-0") - .since(new Date(1000)) - .state("test-application-instance-info-state") + .since(null) + .index("1") + .state("RUNNING") .build()) .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") - .url("test-route-host.test-domain-name:1") + .stack("test-stack") + .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() .verify(Duration.ofSeconds(5)); @@ -999,12 +999,11 @@ void getHealthCheck(String healthCheckType) { @Test void getInstancesError() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatistics(this.cloudFoundryClient, "test-application-id"); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstancesError(this.cloudFoundryClient, "test-application-id", 220001); + requestProcessStatisticsError(this.cloudFoundryClient, "test-application-id", 220001); requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); this.applications @@ -1017,7 +1016,7 @@ void getInstancesError() { .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") + .stack("test-stack") .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() @@ -1026,12 +1025,11 @@ void getInstancesError() { @Test void getNoBuildpack() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatistics(this.cloudFoundryClient, "test-application-id"); + requestApplicationProcessStatistics(this.cloudFoundryClient, "test-application-id"); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummaryNoBuildpack(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstances(this.cloudFoundryClient, "test-application-id"); requestGetApplicationV3Docker(this.cloudFoundryClient, "test-application-id"); this.applications @@ -1043,15 +1041,15 @@ void getNoBuildpack() { .id("test-application-summary-id") .instanceDetail( fill(InstanceDetail.builder()) - .index("instance-0") - .since(new Date(1000)) - .state("test-application-instance-info-state") + .since(null) + .index("1") + .state("RUNNING") .build()) .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") - .url("test-route-host.test-domain-name:1") + .stack("test-stack") + .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() .verify(Duration.ofSeconds(5)); @@ -1059,12 +1057,11 @@ void getNoBuildpack() { @Test void getStagingError() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatistics(this.cloudFoundryClient, "test-application-id"); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstancesError(this.cloudFoundryClient, "test-application-id", 170002); + requestProcessStatisticsError(this.cloudFoundryClient, "test-application-id", 170002); requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); this.applications @@ -1077,7 +1074,7 @@ void getStagingError() { .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") + .stack("test-stack") .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() @@ -1086,12 +1083,11 @@ void getStagingError() { @Test void getStoppedError() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatisticsError(this.cloudFoundryClient, "test-application-id", 200003); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstances(this.cloudFoundryClient, "test-application-id"); + requestProcessStatisticsError(this.cloudFoundryClient, "test-application-id", 200003); requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); this.applications @@ -1101,16 +1097,10 @@ void getStoppedError() { fill(ApplicationDetail.builder()) .buildpack("test-buildpack") .id("test-application-summary-id") - .instanceDetail( - InstanceDetail.builder() - .index("instance-0") - .since(new Date(1000)) - .state("test-application-instance-info-state") - .build()) .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") + .stack("test-stack") .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() @@ -1119,105 +1109,11 @@ void getStoppedError() { @Test void getWithEmptyInstance() { - requestApplications( - this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatistics(this.cloudFoundryClient, "test-application-id"); - requestStack(this.cloudFoundryClient, "test-application-stackId"); - requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationEmptyInstance(this.cloudFoundryClient, "test-application-id"); - requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); - - this.applications - .get(GetApplicationRequest.builder().name("test-app").build()) - .as(StepVerifier::create) - .expectNext( - fill(ApplicationDetail.builder()) - .buildpack("test-buildpack") - .id("test-application-summary-id") - .instanceDetail( - fill(InstanceDetail.builder()) - .index("instance-0") - .since(null) - .state(null) - .build()) - .lastUploaded(new Date(0)) - .name("test-application-summary-name") - .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") - .url("test-route-host.test-domain-name/test-path") - .build()) - .expectComplete() - .verify(Duration.ofSeconds(5)); - } - - @Test - void getWithEmptyInstanceStats() { - requestApplications( - this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationEmptyStats(this.cloudFoundryClient, "test-application-id"); - requestStack(this.cloudFoundryClient, "test-application-stackId"); - requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstances(this.cloudFoundryClient, "test-application-id"); - requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); - - this.applications - .get(GetApplicationRequest.builder().name("test-app").build()) - .as(StepVerifier::create) - .expectNext( - fill(ApplicationDetail.builder()) - .buildpack("test-buildpack") - .id("test-application-summary-id") - .instanceDetail( - InstanceDetail.builder() - .index("instance-0") - .since(new Date(1000)) - .state("test-application-instance-info-state") - .build()) - .lastUploaded(new Date(0)) - .name("test-application-summary-name") - .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") - .url("test-route-host.test-domain-name/test-path") - .build()) - .expectComplete() - .verify(Duration.ofSeconds(5)); - } - - @Test - void getWithNoInstances() { - requestApplications( - this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationStatistics(this.cloudFoundryClient, "test-application-id"); - requestStack(this.cloudFoundryClient, "test-application-stackId"); - requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationNoInstances(this.cloudFoundryClient, "test-application-id"); - requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); - - this.applications - .get(GetApplicationRequest.builder().name("test-app").build()) - .as(StepVerifier::create) - .expectNext( - fill(ApplicationDetail.builder()) - .buildpack("test-buildpack") - .id("test-application-summary-id") - .lastUploaded(new Date(0)) - .name("test-application-summary-name") - .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") - .url("test-route-host.test-domain-name/test-path") - .build()) - .expectComplete() - .verify(Duration.ofSeconds(5)); - } - - @Test - void getWithNullStats() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationNullStats(this.cloudFoundryClient, "test-application-id"); + requestApplicationProcessStatisticsEmpty(this.cloudFoundryClient, "test-application-id"); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstances(this.cloudFoundryClient, "test-application-id"); requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); this.applications @@ -1227,16 +1123,10 @@ void getWithNullStats() { fill(ApplicationDetail.builder()) .buildpack("test-buildpack") .id("test-application-summary-id") - .instanceDetail( - InstanceDetail.builder() - .index("instance-0") - .since(new Date(1000)) - .state("test-application-instance-info-state") - .build()) .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") + .stack("test-stack") .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() @@ -1245,12 +1135,12 @@ void getWithNullStats() { @Test void getWithNullUsage() { - requestApplications( + requestApplicationsV3( this.cloudFoundryClient, "test-app", TEST_SPACE_ID, "test-application-id"); - requestApplicationNullUsage(this.cloudFoundryClient, "test-application-id"); + requestApplicationProcessStatisticsNullUsage( + this.cloudFoundryClient, "test-application-id"); requestStack(this.cloudFoundryClient, "test-application-stackId"); requestApplicationSummary(this.cloudFoundryClient, "test-application-id"); - requestApplicationInstances(this.cloudFoundryClient, "test-application-id"); requestGetApplicationV3Buildpack(this.cloudFoundryClient, "test-application-id"); this.applications @@ -1262,16 +1152,16 @@ void getWithNullUsage() { .id("test-application-summary-id") .instanceDetail( InstanceDetail.builder() - .index("instance-0") + .index("1") .diskQuota(1L) .memoryQuota(1L) - .since(new Date(1000)) - .state("test-application-instance-info-state") + .since(null) + .state("RUNNING") .build()) .lastUploaded(new Date(0)) .name("test-application-summary-name") .requestedState("test-application-summary-state") - .stack("test-stack-entity-name") + .stack("test-stack") .url("test-route-host.test-domain-name/test-path") .build()) .expectComplete() @@ -3995,23 +3885,6 @@ private static void provideRandomWords(RandomWords randomWords) { when(randomWords.getNoun()).thenReturn("test-noun"); } - private static void requestApplicationEmptyInstance( - CloudFoundryClient cloudFoundryClient, String applicationId) { - when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) - .thenReturn( - Mono.just( - ApplicationInstancesResponse.builder() - .instance( - "instance-0", - ApplicationInstanceInfo.builder().build()) - .build())); - } - private static void requestApplicationEmptyStats( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient @@ -4066,6 +3939,27 @@ private static void requestApplicationInstances( .build())); } + private static void requestProcessStatisticsError( + CloudFoundryClient cloudFoundryClient, String applicationId, Integer code) { + when(cloudFoundryClient + .applicationsV3() + .getProcessStatistics( + GetApplicationProcessStatisticsRequest.builder() + .applicationId(applicationId) + .type("web") + .build())) + .thenReturn( + Mono.error( + new ClientV3Exception( + null, + Collections.singletonList( + Error.builder() + .code(code) + .title("test-error-title") + .detail("test-error-detail") + .build())))); + } + private static void requestApplicationInstancesError( CloudFoundryClient cloudFoundryClient, String applicationId, Integer code) { when(cloudFoundryClient @@ -4242,17 +4136,6 @@ private static void requestApplicationInstancesTimeout( .build())); } - private static void requestApplicationNoInstances( - CloudFoundryClient cloudFoundryClient, String applicationId) { - when(cloudFoundryClient - .applicationsV2() - .instances( - ApplicationInstancesRequest.builder() - .applicationId(applicationId) - .build())) - .thenReturn(Mono.just(ApplicationInstancesResponse.builder().build())); - } - private static void requestApplicationNullStats( CloudFoundryClient cloudFoundryClient, String applicationId) { when(cloudFoundryClient @@ -4492,6 +4375,8 @@ private static void requestApplicationSummaryDetectedBuildpack( .builder(), "domain-") .build()) + .port(null) + .path("/test-path") .build()) .buildpack(null) .packageUpdatedAt(DateUtils.formatToIso8601(new Date(0))) @@ -4567,6 +4452,8 @@ private static void requestApplicationSummaryNoBuildpack( .builder(), "domain-") .build()) + .path("/test-path") + .port(null) .build()) .buildpack(null) .detectedBuildpack(null) @@ -4632,6 +4519,69 @@ private static void requestApplicationSummaryTcp( .build())); } + private static void requestApplicationProcessStatistics( + CloudFoundryClient cloudFoundryClient, String applicationId) { + when(cloudFoundryClient + .applicationsV3() + .getProcessStatistics( + GetApplicationProcessStatisticsRequest.builder() + .applicationId(applicationId) + .type("web") + .build())) + .thenReturn( + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resources( + fill(ProcessStatisticsResource.builder()) + .state(ProcessState.RUNNING) + .type("web") + .uptime(1L) + .fileDescriptorQuota(1L) + .host("test-host") + .build()) + .build())); + } + + private static void requestApplicationProcessStatisticsEmpty( + CloudFoundryClient cloudFoundryClient, String applicationId) { + when(cloudFoundryClient + .applicationsV3() + .getProcessStatistics( + GetApplicationProcessStatisticsRequest.builder() + .applicationId(applicationId) + .type("web") + .build())) + .thenReturn( + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resources() + .build())); + } + + private static void requestApplicationProcessStatisticsNullUsage( + CloudFoundryClient cloudFoundryClient, String applicationId) { + when(cloudFoundryClient + .applicationsV3() + .getProcessStatistics( + GetApplicationProcessStatisticsRequest.builder() + .applicationId(applicationId) + .type("web") + .build())) + .thenReturn( + Mono.just( + GetApplicationProcessStatisticsResponse.builder() + .resources( + fill(ProcessStatisticsResource.builder()) + .state(ProcessState.RUNNING) + .type("web") + .uptime(1L) + .fileDescriptorQuota(1L) + .host("test-host") + .usage(null) + .build()) + .build())); + } + private static void requestApplications( CloudFoundryClient cloudFoundryClient, String application, @@ -4759,6 +4709,16 @@ private static void requestApplicationsV3( .resource( fill(org.cloudfoundry.client.v3.applications .ApplicationResource.builder()) + .lifecycle( + fill(Lifecycle.builder()) + .type(BUILDPACK) + .data( + BuildpackData + .builder() + .stack( + "test-stack") + .build()) + .build()) .id(applicationId) .state(ApplicationState.STOPPED) .build()) diff --git a/cloudfoundry-util/src/main/java/org/cloudfoundry/util/ExceptionUtils.java b/cloudfoundry-util/src/main/java/org/cloudfoundry/util/ExceptionUtils.java index 0d128ea5c6..5ede066f3c 100644 --- a/cloudfoundry-util/src/main/java/org/cloudfoundry/util/ExceptionUtils.java +++ b/cloudfoundry-util/src/main/java/org/cloudfoundry/util/ExceptionUtils.java @@ -17,8 +17,12 @@ package org.cloudfoundry.util; import java.util.Arrays; +import java.util.Set; import java.util.function.Predicate; +import java.util.stream.Collectors; import org.cloudfoundry.client.v2.ClientV2Exception; +import org.cloudfoundry.client.v3.ClientV3Exception; +import org.cloudfoundry.client.v3.Error; import reactor.core.publisher.Mono; /** @@ -74,4 +78,22 @@ public static Predicate statusCode(int... codes) { .getCode() .equals(candidate)); } + + /** + * A predicate that returns {@code true} if the exception is a {@link ClientV2Exception} and its code matches expectation + * + * @param codes the codes to match + * @return {@code true} if the exception is a {@link ClientV2Exception} and its code matches + */ + public static Predicate statusCodeV3(int... codes) { + return t -> { + if (!(t instanceof ClientV3Exception)) { + return false; + } + ClientV3Exception exception = (ClientV3Exception) t; + Set errorCodes = + exception.getErrors().stream().map(Error::getCode).collect(Collectors.toSet()); + return Arrays.stream(codes).anyMatch(errorCodes::contains); + }; + } }