4242import org .cloudfoundry .client .CloudFoundryClient ;
4343import org .cloudfoundry .client .v2 .applications .AbstractApplicationResource ;
4444import 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 ;
5045import org .cloudfoundry .client .v2 .applications .AssociateApplicationRouteRequest ;
5146import org .cloudfoundry .client .v2 .applications .AssociateApplicationRouteResponse ;
5247import org .cloudfoundry .client .v2 .applications .CopyApplicationRequest ;
9590import org .cloudfoundry .client .v2 .spaces .SpaceApplicationSummary ;
9691import org .cloudfoundry .client .v2 .spaces .SpaceResource ;
9792import org .cloudfoundry .client .v3 .BuildpackData ;
93+ import org .cloudfoundry .client .v3 .CnbData ;
9894import org .cloudfoundry .client .v3 .Lifecycle ;
95+ import org .cloudfoundry .client .v3 .LifecycleData ;
9996import org .cloudfoundry .client .v3 .Relationship ;
10097import org .cloudfoundry .client .v3 .Resource ;
10198import org .cloudfoundry .client .v3 .ToOneRelationship ;
137134import org .cloudfoundry .client .v3 .processes .HealthCheckType ;
138135import org .cloudfoundry .client .v3 .processes .ProcessState ;
139136import org .cloudfoundry .client .v3 .processes .ProcessStatisticsResource ;
137+ import org .cloudfoundry .client .v3 .processes .ProcessUsage ;
140138import org .cloudfoundry .client .v3 .processes .UpdateProcessRequest ;
141139import org .cloudfoundry .client .v3 .resourcematch .MatchedResource ;
142140import org .cloudfoundry .client .v3 .spaces .ApplyManifestRequest ;
170168import reactor .core .publisher .Flux ;
171169import reactor .core .publisher .Mono ;
172170import reactor .util .function .Tuple2 ;
173- import reactor .util .function .Tuple5 ;
171+ import reactor .util .function .Tuple4 ;
174172import reactor .util .function .Tuples ;
175173
176174public 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,25 @@ 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+ // NOTE: this used to be an error from the v2 API apps/instances
1602+ // endpoint. It probably does not apply to the v3 processes/stats
1603+ // endpoint, but it is hard to test. Leaving it in, worst case this
1604+ // never gets triggered.
1605+ CF_APP_STOPPED_STATS_ERROR ),
1606+ t ->
1607+ Mono .just (
1608+ GetApplicationProcessStatisticsResponse .builder ()
1609+ .resources ()
1610+ .build ()));
16311611 }
16321612
16331613 private Mono <GetApplicationProcessResponse > requestApplicationWebProcess (String applicationId ) {
@@ -1665,15 +1645,6 @@ private Flux<org.cloudfoundry.client.v3.routes.RouteResource> requestApplication
16651645 .build ()));
16661646 }
16671647
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-
16771648 private Mono <SummaryApplicationResponse > requestApplicationSummary (String applicationId ) {
16781649 return this .cloudFoundryClient
16791650 .applicationsV2 ()
@@ -2302,8 +2273,7 @@ private static ApplicationDetail toApplicationDetail(
23022273 List <String > buildpacks ,
23032274 SummaryApplicationResponse summaryApplicationResponse ,
23042275 String stackName ,
2305- List <InstanceDetail > instanceDetails ,
2306- List <String > urls ) {
2276+ List <InstanceDetail > instanceDetails ) {
23072277 if (buildpacks .size () == 0 ) {
23082278 buildpacks =
23092279 Collections .singletonList (summaryApplicationResponse .getDetectedBuildpack ());
@@ -2321,7 +2291,7 @@ private static ApplicationDetail toApplicationDetail(
23212291 .requestedState (summaryApplicationResponse .getState ())
23222292 .runningInstances (summaryApplicationResponse .getRunningInstances ())
23232293 .stack (stackName )
2324- .urls (urls )
2294+ .urls (toUrls ( summaryApplicationResponse . getRoutes ()) )
23252295 .build ();
23262296 }
23272297
@@ -2452,35 +2422,25 @@ private static HealthCheckType fromHealthCheck(ApplicationHealthCheck type) {
24522422 }
24532423 }
24542424
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 ();
2425+ private List <InstanceDetail > toInstanceDetailList (
2426+ GetApplicationProcessStatisticsResponse statisticsResponse ) {
2427+ return statisticsResponse .getResources ().stream ()
2428+ .map (
2429+ statisticsResource -> {
2430+ ProcessUsage usage =
2431+ Optional .ofNullable (statisticsResource .getUsage ())
2432+ .orElse (ProcessUsage .builder ().build ());
2433+ return InstanceDetail .builder ()
2434+ .index (statisticsResource .getIndex ().toString ())
2435+ .state (statisticsResource .getState ().getValue ())
2436+ .cpu (usage .getCpu ())
2437+ .memoryUsage (usage .getMemory ())
2438+ .diskUsage (usage .getDisk ())
2439+ .diskQuota (statisticsResource .getDiskQuota ())
2440+ .memoryQuota (statisticsResource .getMemoryQuota ())
2441+ .build ();
2442+ })
2443+ .collect (Collectors .toList ());
24842444 }
24852445
24862446 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) {
25092469 return sb .toString ();
25102470 }
25112471
2512- private Mono < List <String > > toUrls (List <org .cloudfoundry .client .v2 .routes .Route > routes ) {
2513- return Flux . fromIterable ( routes ).map (DefaultApplications ::toUrl ).collectList ( );
2472+ private static List <String > toUrls (List <org .cloudfoundry .client .v2 .routes .Route > routes ) {
2473+ return routes . stream ( ).map (DefaultApplications ::toUrl ).collect ( Collectors . toList () );
25142474 }
25152475
25162476 private Mono <Void > updateBuildpacks (String applicationId , ApplicationManifest manifest ) {
0 commit comments