diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/data/Keys.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/data/Keys.groovy index b5c8ff5e944..4233dc0bf18 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/data/Keys.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/data/Keys.groovy @@ -113,8 +113,8 @@ class Keys implements KeyParser { break case Namespace.TARGET_GROUPS.ns: def names = Names.parseName(parts[4]) - String vpcId = parts.length > 5 ? (parts[5] ?: null) : null - result << [account: parts[2], region: parts[3], targetGroup: parts[4], vpcId: vpcId, application: names.app?.toLowerCase(), stack: names.stack, detail: names.detail] + String vpcId = parts.length > 6 ? (parts[6] ?: null) : null + result << [account: parts[2], region: parts[3], targetGroup: parts[4], vpcId: vpcId, application: names.app?.toLowerCase(), stack: names.stack, detail: names.detail, targetType: parts[5]] break case Namespace.CLUSTERS.ns: def names = Names.parseName(parts[4]) @@ -170,8 +170,8 @@ class Keys implements KeyParser { return key } - static String getTargetGroupKey(String targetGroupName, String account, String region, String vpcId) { - "${ID}:${Namespace.TARGET_GROUPS}:${account}:${region}:${targetGroupName}:${vpcId}" + static String getTargetGroupKey(String targetGroupName, String account, String region, String targetGroupType, String vpcId) { + "${ID}:${Namespace.TARGET_GROUPS}:${account}:${region}:${targetGroupName}:${targetGroupType}:${vpcId}" } static String getClusterKey(String clusterName, String application, String account) { diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonApplicationLoadBalancerCachingAgent.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonApplicationLoadBalancerCachingAgent.groovy index 4eebbd748a2..3f16a7c43b6 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonApplicationLoadBalancerCachingAgent.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonApplicationLoadBalancerCachingAgent.groovy @@ -306,7 +306,6 @@ class AmazonApplicationLoadBalancerCachingAgent extends AbstractAmazonLoadBalanc Long start = useEdda ? null : System.currentTimeMillis() - // Get all the load balancers List allLoadBalancers = [] DescribeLoadBalancersRequest describeLoadBalancerRequest = new DescribeLoadBalancersRequest() @@ -378,6 +377,10 @@ class AmazonApplicationLoadBalancerCachingAgent extends AbstractAmazonLoadBalanc Map loadBalancers = CacheHelpers.cache() Map targetGroups = CacheHelpers.cache() + Map targetGroupNameToType = allTargetGroups.collectEntries { + [(it.targetGroupName): it.targetType] + } + for (LoadBalancer lb : allLoadBalancers) { String loadBalancerKey = Keys.getLoadBalancerKey(lb.loadBalancerName, account.name, region, lb.vpcId, lb.type) @@ -423,8 +426,9 @@ class AmazonApplicationLoadBalancerCachingAgent extends AbstractAmazonLoadBalanc String targetGroupName = ArnUtils.extractTargetGroupName(action.targetGroupArn as String).get() action.targetGroupName = targetGroupName action.remove("targetGroupArn") + String type = targetGroupNameToType.get(targetGroupName) - allTargetGroupKeys.add(Keys.getTargetGroupKey(targetGroupName, account.name, region, vpcId)) + allTargetGroupKeys.add(Keys.getTargetGroupKey(targetGroupName, account.name, region, type, vpcId)) } // add the rules to the listener @@ -439,8 +443,9 @@ class AmazonApplicationLoadBalancerCachingAgent extends AbstractAmazonLoadBalanc String targetGroupName = ArnUtils.extractTargetGroupName(action.targetGroupArn).get() action.targetGroupName = targetGroupName action.remove("targetGroupArn") + String type = targetGroupNameToType.get(targetGroupName) - allTargetGroupKeys.add(Keys.getTargetGroupKey(targetGroupName, account.name, region, vpcId)) + allTargetGroupKeys.add(Keys.getTargetGroupKey(targetGroupName, account.name, region, type, vpcId)) } rules.push(ruleAttributes) @@ -461,7 +466,7 @@ class AmazonApplicationLoadBalancerCachingAgent extends AbstractAmazonLoadBalanc List instanceTargetGroupStates = [] for (TargetGroup targetGroup : allTargetGroups) { - String targetGroupId = Keys.getTargetGroupKey(targetGroup.targetGroupName, account.name, region, targetGroup.vpcId) + String targetGroupId = Keys.getTargetGroupKey(targetGroup.targetGroupName, account.name, region, targetGroup.targetType, targetGroup.vpcId) // Get associated load balancer keys Collection loadBalancerIds = targetGroup.loadBalancerArns.collect { String lbName = ArnUtils.extractLoadBalancerName(it).get() diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/ClusterCachingAgent.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/ClusterCachingAgent.groovy index fa6151bdde9..d9479a8e695 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/ClusterCachingAgent.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/ClusterCachingAgent.groovy @@ -30,6 +30,7 @@ import com.amazonaws.services.cloudwatch.model.MetricAlarm import com.amazonaws.services.ec2.AmazonEC2 import com.amazonaws.services.ec2.model.DescribeSubnetsRequest import com.amazonaws.services.ec2.model.Subnet +import com.amazonaws.services.elasticloadbalancingv2.model.TargetTypeEnum import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.core.type.TypeReference @@ -723,7 +724,7 @@ class ClusterCachingAgent implements CachingAgent, OnDemandAgent, AccountAware, } as Set).asImmutable() targetGroupKeys = (targetGroupNames.collect { - Keys.getTargetGroupKey(it, account, region, vpcId) + Keys.getTargetGroupKey(it, account, region, TargetTypeEnum.Instance.toString(), vpcId) } as Set).asImmutable() instanceIds = (asg.instances.instanceId.collect { Keys.getInstanceKey(it, account, region) } as Set).asImmutable() diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonLoadBalancerProvider.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonLoadBalancerProvider.groovy index ad3d83e6426..3efe7d38c14 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonLoadBalancerProvider.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonLoadBalancerProvider.groovy @@ -274,7 +274,15 @@ class AmazonLoadBalancerProvider implements LoadBalancerProvider list() { def searchKey = Keys.getLoadBalancerKey('*', '*', '*', null, null) + '*' Collection identifiers = cacheView.filterIdentifiers(LOAD_BALANCERS.ns, searchKey) - getSummaryForLoadBalancers(identifiers).values() as List + Map> targetGroupKeys = cacheView.getIdentifiers(TARGET_GROUPS.ns).collectEntries { + Map parts = Keys.parse(it) + Map summary = [ + name: parts.targetGroup, + targetType: parts.targetType + ] + return [(it): summary] + } + getSummaryForLoadBalancers(identifiers, targetGroupKeys).values() as List } AmazonLoadBalancerSummary get(String name) { @@ -283,7 +291,7 @@ class AmazonLoadBalancerProvider implements LoadBalancerProvider byAccountAndRegionAndName(String account, @@ -309,11 +317,18 @@ class AmazonLoadBalancerProvider implements LoadBalancerProvider getSummaryForLoadBalancers(Collection loadBalancerKeys) { + private Map> getTargetGroupSummariesForLoadBalancer(Collection loadBalancerData) { + Collection targetGroupData = resolveRelationshipDataForCollection(loadBalancerData, TARGET_GROUPS.ns) + return targetGroupData.collectEntries { + [(it.id): [ name: it.attributes.targetGroupName, targetType: it.attributes.targetType ]] + } + } + + private Map getSummaryForLoadBalancers(Collection loadBalancerKeys, Map> targetGroupMap) { Map map = [:] Collection loadBalancerData = cacheView.getAll(LOAD_BALANCERS.ns, loadBalancerKeys, RelationshipCacheFilter.include(TARGET_GROUPS.ns)) Map loadBalancers = loadBalancerData.collectEntries { [(it.id): it] } - Map targetGroups = resolveRelationshipDataForCollection(loadBalancerData, TARGET_GROUPS.ns).collectEntries { [(it.id): it] } + targetGroupMap = targetGroupMap ?: getTargetGroupSummariesForLoadBalancer(loadBalancerData) for (lb in loadBalancerKeys) { CacheData loadBalancerFromCache = loadBalancers[lb] @@ -345,15 +360,7 @@ class AmazonLoadBalancerProvider implements LoadBalancerProvider findAll() { - String searchKey = Keys.getTargetGroupKey("*", "*", "*", "*") + "*"; + String searchKey = Keys.getTargetGroupKey("*", "*", "*", "*", "*") + "*"; Collection targetGroupKeys = cacheView.filterIdentifiers(TARGET_GROUPS.getNs(), searchKey); Set> targetGroupAttributes = fetchLoadBalancerAttributes(targetGroupKeys); diff --git a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/cache/EcsLoadbalancerCacheClientSpec.groovy b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/cache/EcsLoadbalancerCacheClientSpec.groovy index 2ed7006b90b..68c84cf2526 100644 --- a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/cache/EcsLoadbalancerCacheClientSpec.groovy +++ b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/cache/EcsLoadbalancerCacheClientSpec.groovy @@ -16,6 +16,7 @@ package com.netflix.spinnaker.clouddriver.ecs.cache +import com.amazonaws.services.elasticloadbalancingv2.model.TargetTypeEnum import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.spinnaker.cats.cache.Cache @@ -45,7 +46,7 @@ class EcsLoadbalancerCacheClientSpec extends Specification { def targetGroupName = 'test-target-group' def loadbalancerKey = Keys.getLoadBalancerKey(loadBalancerName, account, region, vpcId, loadBalancerType) - def targetGroupKey = Keys.getTargetGroupKey(targetGroupName, account, region, vpcId) + def targetGroupKey = Keys.getTargetGroupKey(targetGroupName, account, region, TargetTypeEnum.Instance.toString(), vpcId) def givenEcsLoadbalancer = new EcsLoadBalancerCache( account: account, diff --git a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/cache/EcsTargetGroupCacheClientSpec.groovy b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/cache/EcsTargetGroupCacheClientSpec.groovy index bc64c5a3d68..261434f6b1b 100644 --- a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/cache/EcsTargetGroupCacheClientSpec.groovy +++ b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/cache/EcsTargetGroupCacheClientSpec.groovy @@ -16,6 +16,7 @@ package com.netflix.spinnaker.clouddriver.ecs.cache +import com.amazonaws.services.elasticloadbalancingv2.model.TargetTypeEnum import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.spinnaker.cats.cache.Cache @@ -44,7 +45,7 @@ class EcsTargetGroupCacheClientSpec extends Specification { def targetGroupName = 'test-target-group' def loadbalancerKey = Keys.getLoadBalancerKey(loadBalancerName, account, region, vpcId, loadBalancerType) - def targetGroupKey = Keys.getTargetGroupKey(targetGroupName, account, region, vpcId) + def targetGroupKey = Keys.getTargetGroupKey(targetGroupName, account, region, TargetTypeEnum.Instance.toString(), vpcId) def givenEcsTargetGroup = new EcsTargetGroup( loadBalancerNames: [loadBalancerName], diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/agents/TitusClusterCachingAgent.groovy b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/agents/TitusClusterCachingAgent.groovy index 6610f3e4031..cbfba562516 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/agents/TitusClusterCachingAgent.groovy +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/agents/TitusClusterCachingAgent.groovy @@ -16,6 +16,7 @@ package com.netflix.spinnaker.clouddriver.titus.caching.agents +import com.amazonaws.services.elasticloadbalancingv2.model.TargetTypeEnum import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.ObjectMapper @@ -32,6 +33,7 @@ import com.netflix.spinnaker.cats.cache.DefaultCacheData import com.netflix.spinnaker.cats.cache.RelationshipCacheFilter import com.netflix.spinnaker.cats.provider.ProviderCache import com.netflix.spinnaker.clouddriver.aws.data.ArnUtils +import com.netflix.spinnaker.clouddriver.aws.data.Keys as AwsKeys import com.netflix.spinnaker.clouddriver.cache.CustomScheduledAgent import com.netflix.spinnaker.clouddriver.cache.OnDemandAgent import com.netflix.spinnaker.clouddriver.cache.OnDemandMetricsSupport @@ -480,7 +482,7 @@ class TitusClusterCachingAgent implements CachingAgent, CustomScheduledAgent, On } as Set).asImmutable() targetGroupKeys = (targetGroupNames.collect { - com.netflix.spinnaker.clouddriver.aws.data.Keys.getTargetGroupKey(it, getAwsAccountId(account, region), region, getAwsVpcId(account, region)) + AwsKeys.getTargetGroupKey(it, getAwsAccountId(account, region), region, TargetTypeEnum.Ip.toString(), getAwsVpcId(account, region)) } as Set).asImmutable() }