diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonClusterProvider.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonClusterProvider.groovy index 5dcfae3c348..46643ba6590 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonClusterProvider.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonClusterProvider.groovy @@ -209,6 +209,14 @@ class AmazonClusterProvider implements ClusterProvider { } instances.get(it) } ?: [] + + if (!serverGroup.instances && serverGroupEntry.attributes.instances) { + // has no direct instance relationships but we can partially populate instances based on attributes.instances + serverGroup.instances = serverGroupEntry.attributes.instances.collect { + new AmazonInstance(((Map) it) + [name: it.instanceId]) + } + } + [(serverGroupEntry.id) : serverGroup] } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/model/ClusterProvider.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/model/ClusterProvider.groovy index e1053c0bdf4..810698199ad 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/model/ClusterProvider.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/model/ClusterProvider.groovy @@ -100,6 +100,12 @@ interface ClusterProvider { * Determines whether or not optimizations can be made by retrieving minimal or unexpanded clusters. * * This primarily affects how server groups are loaded for a cluster (@see com.netflix.spinnaker.clouddriver.controllers.ClusterController}. + * + * Minimal cluster support requires that server groups contained within a cluster be populated with: + * - creation time stamps + * - region / zone details + * - disabled status + * - instance counts (fully populated instances are not necessary) */ boolean supportsMinimalClusters() } diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/ClusterController.groovy b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/ClusterController.groovy index f2b3ccce904..0f02e43402a 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/ClusterController.groovy +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/ClusterController.groovy @@ -234,10 +234,6 @@ class ClusterController { ) } - def expandServerGroups = { List serverGroups -> - return sortedServerGroups.collect { expandServerGroup(it) } - } - switch (tsg) { case TargetServerGroup.CURRENT: return expandServerGroup(sortedServerGroups.get(0)) @@ -254,10 +250,10 @@ class ClusterController { return expandServerGroup(sortedServerGroups.last()) case TargetServerGroup.LARGEST: // Choose the server group with the most instances, falling back to newest in the case of a tie. - return expandServerGroups(sortedServerGroups).sort { lhs, rhs -> + return expandServerGroup(sortedServerGroups.sort { lhs, rhs -> rhs.instances.size() <=> lhs.instances.size() ?: - rhs.createdTime <=> lhs.createdTime - }.get(0) + rhs.createdTime <=> lhs.createdTime + }.get(0)) case TargetServerGroup.FAIL: if (sortedServerGroups.size() > 1) { throw new NotFoundException("More than one target found (scope: ${scope}, serverGroups: ${sortedServerGroups*.name})")