Skip to content

Commit e37654e

Browse files
committed
DefaultApplications: start migrating "get" to v3 api
1 parent 5681319 commit e37654e

File tree

4 files changed

+147
-126
lines changed

4 files changed

+147
-126
lines changed

cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/DefaultApplications.java

Lines changed: 56 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,6 @@
4242
import org.cloudfoundry.client.CloudFoundryClient;
4343
import org.cloudfoundry.client.v2.applications.AbstractApplicationResource;
4444
import org.cloudfoundry.client.v2.applications.ApplicationEntity;
45-
import org.cloudfoundry.client.v2.applications.ApplicationInstanceInfo;
46-
import org.cloudfoundry.client.v2.applications.ApplicationInstancesRequest;
47-
import org.cloudfoundry.client.v2.applications.ApplicationInstancesResponse;
48-
import org.cloudfoundry.client.v2.applications.ApplicationStatisticsRequest;
49-
import org.cloudfoundry.client.v2.applications.ApplicationStatisticsResponse;
5045
import org.cloudfoundry.client.v2.applications.AssociateApplicationRouteRequest;
5146
import org.cloudfoundry.client.v2.applications.AssociateApplicationRouteResponse;
5247
import org.cloudfoundry.client.v2.applications.CopyApplicationRequest;
@@ -95,7 +90,9 @@
9590
import org.cloudfoundry.client.v2.spaces.SpaceApplicationSummary;
9691
import org.cloudfoundry.client.v2.spaces.SpaceResource;
9792
import org.cloudfoundry.client.v3.BuildpackData;
93+
import org.cloudfoundry.client.v3.CnbData;
9894
import org.cloudfoundry.client.v3.Lifecycle;
95+
import org.cloudfoundry.client.v3.LifecycleData;
9996
import org.cloudfoundry.client.v3.Relationship;
10097
import org.cloudfoundry.client.v3.Resource;
10198
import org.cloudfoundry.client.v3.ToOneRelationship;
@@ -137,6 +134,7 @@
137134
import org.cloudfoundry.client.v3.processes.HealthCheckType;
138135
import org.cloudfoundry.client.v3.processes.ProcessState;
139136
import org.cloudfoundry.client.v3.processes.ProcessStatisticsResource;
137+
import org.cloudfoundry.client.v3.processes.ProcessUsage;
140138
import org.cloudfoundry.client.v3.processes.UpdateProcessRequest;
141139
import org.cloudfoundry.client.v3.resourcematch.MatchedResource;
142140
import org.cloudfoundry.client.v3.spaces.ApplyManifestRequest;
@@ -170,7 +168,7 @@
170168
import reactor.core.publisher.Flux;
171169
import reactor.core.publisher.Mono;
172170
import reactor.util.function.Tuple2;
173-
import reactor.util.function.Tuple5;
171+
import reactor.util.function.Tuple4;
174172
import reactor.util.function.Tuples;
175173

176174
public final class DefaultApplications implements Applications {
@@ -314,8 +312,8 @@ public Mono<Void> enableSsh(EnableApplicationSshRequest request) {
314312

315313
@Override
316314
public Mono<ApplicationDetail> get(GetApplicationRequest request) {
317-
return getApplication(request.getName())
318-
.flatMap(app -> getAuxiliaryContent(app))
315+
return getApplicationV3(request.getName())
316+
.flatMap(this::getAuxiliaryContent)
319317
.map(function(DefaultApplications::toApplicationDetail))
320318
.transform(OperationsLogging.log("Get Application"))
321319
.checkpoint();
@@ -1072,31 +1070,11 @@ private Mono<String> getApplicationIdWhere(
10721070
return getApplication(application).filter(predicate).map(ResourceUtils::getId);
10731071
}
10741072

1075-
private Mono<ApplicationInstancesResponse> getApplicationInstances(String applicationId) {
1076-
return requestApplicationInstances(applicationId)
1077-
.onErrorResume(
1078-
ExceptionUtils.statusCode(
1079-
CF_BUILDPACK_COMPILED_FAILED,
1080-
CF_INSTANCES_ERROR,
1081-
CF_STAGING_NOT_FINISHED,
1082-
CF_STAGING_TIME_EXPIRED,
1083-
CF_INSUFFICIENT_RESOURCES,
1084-
CF_STAGING_ERROR),
1085-
t -> Mono.just(ApplicationInstancesResponse.builder().build()));
1086-
}
1087-
10881073
private Mono<List<org.cloudfoundry.client.v3.routes.RouteResource>> getApplicationRoutes(
10891074
String applicationId) {
10901075
return requestApplicationRoutes(applicationId).collectList();
10911076
}
10921077

1093-
private Mono<ApplicationStatisticsResponse> getApplicationStatistics(String applicationId) {
1094-
return requestApplicationStatistics(applicationId)
1095-
.onErrorResume(
1096-
ExceptionUtils.statusCode(CF_APP_STOPPED_STATS_ERROR),
1097-
t -> Mono.just(ApplicationStatisticsResponse.builder().build()));
1098-
}
1099-
11001078
private Mono<ApplicationResource> getApplicationV3(String application) {
11011079
return requestApplicationsV3(application)
11021080
.single()
@@ -1107,34 +1085,25 @@ private Mono<ApplicationResource> getApplicationV3(String application) {
11071085
"Application %s does not exist", application));
11081086
}
11091087

1110-
private Mono<
1111-
Tuple5<
1112-
List<String>,
1113-
SummaryApplicationResponse,
1114-
String,
1115-
List<InstanceDetail>,
1116-
List<String>>>
1117-
getAuxiliaryContent(AbstractApplicationResource applicationResource) {
1118-
String applicationId = ResourceUtils.getId(applicationResource);
1119-
String stackId = ResourceUtils.getEntity(applicationResource).getStackId();
1088+
private Mono<Tuple4<List<String>, SummaryApplicationResponse, String, List<InstanceDetail>>>
1089+
getAuxiliaryContent(ApplicationResource applicationResource) {
1090+
String applicationId = applicationResource.getId();
1091+
LifecycleData data = applicationResource.getLifecycle().getData();
1092+
String stackName = "<UNKNOWN>";
1093+
if (data instanceof CnbData) {
1094+
stackName = ((CnbData) data).getStack();
1095+
} else if (data instanceof BuildpackData) {
1096+
stackName = ((BuildpackData) data).getStack();
1097+
}
1098+
1099+
Mono<List<InstanceDetail>> appInstanceDetails =
1100+
requestApplicationStatisticsV3(applicationId).map(this::toInstanceDetailList);
11201101

11211102
return Mono.zip(
1122-
getApplicationStatistics(applicationId),
1123-
requestApplicationSummary(applicationId),
1124-
getApplicationInstances(applicationId))
1125-
.flatMap(
1126-
function(
1127-
(applicationStatisticsResponse,
1128-
summaryApplicationResponse,
1129-
applicationInstancesResponse) ->
1130-
Mono.zip(
1131-
getApplicationBuildpacks(applicationId),
1132-
Mono.just(summaryApplicationResponse),
1133-
getStackName(stackId),
1134-
toInstanceDetailList(
1135-
applicationInstancesResponse,
1136-
applicationStatisticsResponse),
1137-
toUrls(summaryApplicationResponse.getRoutes()))));
1103+
getApplicationBuildpacks(applicationId),
1104+
requestApplicationSummary(applicationId),
1105+
Mono.just(stackName),
1106+
appInstanceDetails);
11381107
}
11391108

11401109
private Mono<String> getDefaultDomainId() {
@@ -1612,13 +1581,6 @@ private Mono<GetApplicationEnvironmentResponse> requestApplicationEnvironment(
16121581
.build());
16131582
}
16141583

1615-
private Mono<ApplicationInstancesResponse> requestApplicationInstances(String applicationId) {
1616-
return this.cloudFoundryClient
1617-
.applicationsV2()
1618-
.instances(
1619-
ApplicationInstancesRequest.builder().applicationId(applicationId).build());
1620-
}
1621-
16221584
private Mono<GetApplicationProcessStatisticsResponse> requestApplicationStatisticsV3(
16231585
String applicationId) {
16241586
return this.cloudFoundryClient
@@ -1627,7 +1589,16 @@ private Mono<GetApplicationProcessStatisticsResponse> requestApplicationStatisti
16271589
GetApplicationProcessStatisticsRequest.builder()
16281590
.applicationId(applicationId)
16291591
.type("web")
1630-
.build());
1592+
.build())
1593+
.onErrorResume(
1594+
ExceptionUtils.statusCodeV3(
1595+
CF_BUILDPACK_COMPILED_FAILED,
1596+
CF_INSTANCES_ERROR,
1597+
CF_STAGING_NOT_FINISHED,
1598+
CF_STAGING_TIME_EXPIRED,
1599+
CF_INSUFFICIENT_RESOURCES,
1600+
CF_STAGING_ERROR),
1601+
t -> Mono.just(GetApplicationProcessStatisticsResponse.builder().resources().build()));
16311602
}
16321603

16331604
private Mono<GetApplicationProcessResponse> requestApplicationWebProcess(String applicationId) {
@@ -1665,15 +1636,6 @@ private Flux<org.cloudfoundry.client.v3.routes.RouteResource> requestApplication
16651636
.build()));
16661637
}
16671638

1668-
private Mono<ApplicationStatisticsResponse> requestApplicationStatistics(String applicationId) {
1669-
return this.cloudFoundryClient
1670-
.applicationsV2()
1671-
.statistics(
1672-
ApplicationStatisticsRequest.builder()
1673-
.applicationId(applicationId)
1674-
.build());
1675-
}
1676-
16771639
private Mono<SummaryApplicationResponse> requestApplicationSummary(String applicationId) {
16781640
return this.cloudFoundryClient
16791641
.applicationsV2()
@@ -2302,8 +2264,7 @@ private static ApplicationDetail toApplicationDetail(
23022264
List<String> buildpacks,
23032265
SummaryApplicationResponse summaryApplicationResponse,
23042266
String stackName,
2305-
List<InstanceDetail> instanceDetails,
2306-
List<String> urls) {
2267+
List<InstanceDetail> instanceDetails) {
23072268
if (buildpacks.size() == 0) {
23082269
buildpacks =
23092270
Collections.singletonList(summaryApplicationResponse.getDetectedBuildpack());
@@ -2321,7 +2282,7 @@ private static ApplicationDetail toApplicationDetail(
23212282
.requestedState(summaryApplicationResponse.getState())
23222283
.runningInstances(summaryApplicationResponse.getRunningInstances())
23232284
.stack(stackName)
2324-
.urls(urls)
2285+
.urls(toUrls(summaryApplicationResponse.getRoutes()))
23252286
.build();
23262287
}
23272288

@@ -2452,35 +2413,25 @@ private static HealthCheckType fromHealthCheck(ApplicationHealthCheck type) {
24522413
}
24532414
}
24542415

2455-
private static InstanceDetail toInstanceDetail(
2456-
Map.Entry<String, ApplicationInstanceInfo> entry,
2457-
ApplicationStatisticsResponse statisticsResponse) {
2458-
InstanceStatistics instanceStatistics =
2459-
Optional.ofNullable(statisticsResponse.getInstances().get(entry.getKey()))
2460-
.orElse(emptyInstanceStats());
2461-
Statistics stats =
2462-
Optional.ofNullable(instanceStatistics.getStatistics())
2463-
.orElse(emptyApplicationStatistics());
2464-
Usage usage = Optional.ofNullable(stats.getUsage()).orElse(emptyApplicationUsage());
2465-
2466-
return InstanceDetail.builder()
2467-
.index(entry.getKey())
2468-
.state(entry.getValue().getState())
2469-
.since(toDate(entry.getValue().getSince()))
2470-
.cpu(usage.getCpu())
2471-
.memoryUsage(usage.getMemory())
2472-
.diskUsage(usage.getDisk())
2473-
.diskQuota(stats.getDiskQuota())
2474-
.memoryQuota(stats.getMemoryQuota())
2475-
.build();
2476-
}
2477-
2478-
private Mono<List<InstanceDetail>> toInstanceDetailList(
2479-
ApplicationInstancesResponse instancesResponse,
2480-
ApplicationStatisticsResponse statisticsResponse) {
2481-
return Flux.fromIterable(instancesResponse.getInstances().entrySet())
2482-
.map(entry -> toInstanceDetail(entry, statisticsResponse))
2483-
.collectList();
2416+
private List<InstanceDetail> toInstanceDetailList(
2417+
GetApplicationProcessStatisticsResponse statisticsResponse) {
2418+
return statisticsResponse.getResources().stream()
2419+
.map(
2420+
statisticsResource -> {
2421+
ProcessUsage usage =
2422+
Optional.ofNullable(statisticsResource.getUsage())
2423+
.orElse(ProcessUsage.builder().build());
2424+
return InstanceDetail.builder()
2425+
.index(statisticsResource.getIndex().toString())
2426+
.state(statisticsResource.getState().getValue())
2427+
.cpu(usage.getCpu())
2428+
.memoryUsage(usage.getMemory())
2429+
.diskUsage(usage.getDisk())
2430+
.diskQuota(statisticsResource.getDiskQuota())
2431+
.memoryQuota(statisticsResource.getMemoryQuota())
2432+
.build();
2433+
})
2434+
.collect(Collectors.toList());
24842435
}
24852436

24862437
private static Task toTask(org.cloudfoundry.client.v3.tasks.Task task) {
@@ -2509,8 +2460,8 @@ private static String toUrl(org.cloudfoundry.client.v2.routes.Route route) {
25092460
return sb.toString();
25102461
}
25112462

2512-
private Mono<List<String>> toUrls(List<org.cloudfoundry.client.v2.routes.Route> routes) {
2513-
return Flux.fromIterable(routes).map(DefaultApplications::toUrl).collectList();
2463+
private static List<String> toUrls(List<org.cloudfoundry.client.v2.routes.Route> routes) {
2464+
return routes.stream().map(DefaultApplications::toUrl).collect(Collectors.toList());
25142465
}
25152466

25162467
private Mono<Void> updateBuildpacks(String applicationId, ApplicationManifest manifest) {

cloudfoundry-operations/src/main/java/org/cloudfoundry/operations/applications/_InstanceDetail.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616

1717
package org.cloudfoundry.operations.applications;
1818

19+
import java.util.Date;
20+
1921
import org.cloudfoundry.Nullable;
2022
import org.immutables.value.Value;
2123

22-
import java.util.Date;
23-
2424
/**
2525
* Information about an instance of an application
2626
*/
@@ -64,8 +64,11 @@ abstract class _InstanceDetail {
6464

6565
/**
6666
* The time this instance was created
67+
*
68+
* @deprecated Always returns null. The "since" field is not returned by the CF v3 API.
6769
*/
6870
@Nullable
71+
@Deprecated
6972
abstract Date getSince();
7073

7174
/**

0 commit comments

Comments
 (0)