diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/caching/KubernetesCachingAgent.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/caching/KubernetesCachingAgent.java index 95861dc6a37..d0ce34c90f5 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/caching/KubernetesCachingAgent.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/caching/KubernetesCachingAgent.java @@ -23,8 +23,6 @@ import com.netflix.spinnaker.cats.agent.CachingAgent; import com.netflix.spinnaker.clouddriver.kubernetes.security.KubernetesCredentials; import com.netflix.spinnaker.clouddriver.kubernetes.security.KubernetesNamedAccountCredentials; -import java.util.List; -import java.util.stream.Collectors; import lombok.Getter; public abstract class KubernetesCachingAgent @@ -37,12 +35,6 @@ public abstract class KubernetesCachingAgent protected final int agentIndex; protected final int agentCount; - protected List namespaces; - - public List getNamespaces() { - return namespaces; - } - protected KubernetesCachingAgent( KubernetesNamedAccountCredentials namedAccountCredentials, ObjectMapper objectMapper, @@ -56,8 +48,6 @@ protected KubernetesCachingAgent( this.agentIndex = agentIndex; this.agentCount = agentCount; - - reloadNamespaces(); } @Override @@ -65,11 +55,4 @@ public String getAgentType() { return String.format( "%s/%s[%d/%d]", accountName, this.getClass().getSimpleName(), agentIndex + 1, agentCount); } - - protected void reloadNamespaces() { - namespaces = - credentials.getDeclaredNamespaces().stream() - .filter(n -> agentCount == 1 || Math.abs(n.hashCode() % agentCount) == agentIndex) - .collect(Collectors.toList()); - } } diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/provider/agent/KubernetesV1CachingAgent.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/provider/agent/KubernetesV1CachingAgent.java index 9ca923ab38e..a4c9cbcf999 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/provider/agent/KubernetesV1CachingAgent.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/provider/agent/KubernetesV1CachingAgent.java @@ -23,11 +23,14 @@ import com.netflix.spinnaker.clouddriver.kubernetes.security.KubernetesNamedAccountCredentials; import com.netflix.spinnaker.clouddriver.kubernetes.v1.provider.KubernetesV1Provider; import com.netflix.spinnaker.clouddriver.kubernetes.v1.security.KubernetesV1Credentials; +import java.util.List; +import java.util.stream.Collectors; import lombok.Getter; public abstract class KubernetesV1CachingAgent extends KubernetesCachingAgent { @Getter protected final String providerName = KubernetesV1Provider.PROVIDER_NAME; + protected List namespaces; protected KubernetesV1CachingAgent( KubernetesNamedAccountCredentials namedAccountCredentials, @@ -36,5 +39,17 @@ protected KubernetesV1CachingAgent( int agentIndex, int agentCount) { super(namedAccountCredentials, objectMapper, registry, agentIndex, agentCount); + reloadNamespaces(); + } + + public List getNamespaces() { + return namespaces; + } + + protected void reloadNamespaces() { + namespaces = + credentials.getDeclaredNamespaces().stream() + .filter(n -> agentCount == 1 || Math.abs(n.hashCode() % agentCount) == agentIndex) + .collect(Collectors.toList()); } } diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesMetricCachingAgent.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesMetricCachingAgent.java index 275a39d5934..08a0375b1cd 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesMetricCachingAgent.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesMetricCachingAgent.java @@ -28,9 +28,9 @@ import com.netflix.spinnaker.cats.cache.CacheData; import com.netflix.spinnaker.cats.provider.ProviderCache; import com.netflix.spinnaker.clouddriver.kubernetes.KubernetesCloudProvider; -import com.netflix.spinnaker.clouddriver.kubernetes.caching.KubernetesCachingAgent; import com.netflix.spinnaker.clouddriver.kubernetes.security.KubernetesNamedAccountCredentials; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesPodMetric; +import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesKind; import com.netflix.spinnaker.clouddriver.kubernetes.v2.op.job.KubectlJobExecutor; import com.netflix.spinnaker.clouddriver.kubernetes.v2.security.KubernetesV2Credentials; import java.util.Collection; @@ -43,12 +43,10 @@ import lombok.extern.slf4j.Slf4j; @Slf4j -public class KubernetesMetricCachingAgent extends KubernetesCachingAgent +public class KubernetesMetricCachingAgent extends KubernetesV2CachingAgent implements AgentIntervalAware { @Getter protected String providerName = KubernetesCloudProvider.ID; - @Getter private final Long agentInterval; - @Getter protected Collection providedDataTypes = Collections.unmodifiableCollection( @@ -61,17 +59,19 @@ protected KubernetesMetricCachingAgent( int agentIndex, int agentCount, Long agentInterval) { - super(namedAccountCredentials, objectMapper, registry, agentIndex, agentCount); - this.agentInterval = agentInterval; + super(namedAccountCredentials, objectMapper, registry, agentIndex, agentCount, agentInterval); + } + + @Override + protected List primaryKinds() { + return Collections.emptyList(); } @Override public CacheResult loadData(ProviderCache providerCache) { log.info(getAgentType() + ": agent is starting"); - reloadNamespaces(); - List podMetrics = - namespaces + getNamespaces() .parallelStream() .map( n -> { diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesNamespaceCachingAgent.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesNamespaceCachingAgent.java index c46aa02566f..a9aad063bbc 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesNamespaceCachingAgent.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesNamespaceCachingAgent.java @@ -53,10 +53,8 @@ public KubernetesNamespaceCachingAgent( @Override protected Map> loadPrimaryResourceList() { - reloadNamespaces(); - // TODO perf: Only load desired namespaces rather than filter all. - Set desired = new HashSet<>(this.namespaces); + Set desired = new HashSet<>(this.getNamespaces()); return Collections.singletonMap( KubernetesKind.NAMESPACE, credentials.list(KubernetesKind.NAMESPACE, "").stream() diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesV2CachingAgent.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesV2CachingAgent.java index 7adba8e4f88..8221e6f0d13 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesV2CachingAgent.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesV2CachingAgent.java @@ -18,6 +18,7 @@ package com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.agent; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableList; import com.netflix.spectator.api.Registry; import com.netflix.spinnaker.cats.agent.AgentIntervalAware; import com.netflix.spinnaker.cats.agent.CacheResult; @@ -66,7 +67,7 @@ protected KubernetesV2CachingAgent( protected Map defaultIntrospectionDetails() { Map result = new HashMap<>(); - result.put("namespaces", namespaces); + result.put("namespaces", getNamespaces()); result.put("kinds", primaryKinds()); return result; } @@ -75,7 +76,7 @@ protected Map defaultIntrospectionDetails() { protected Map> loadPrimaryResourceList() { Map> result = - namespaces + getNamespaces() .parallelStream() .map( n -> { @@ -128,7 +129,6 @@ protected KubernetesManifest loadPrimaryResource( @Override public CacheResult loadData(ProviderCache providerCache) { log.info(getAgentType() + ": agent is starting"); - reloadNamespaces(); Map details = defaultIntrospectionDetails(); try { @@ -193,4 +193,10 @@ protected Map> loadSecondaryResourc }); return result; } + + protected ImmutableList getNamespaces() { + return credentials.getDeclaredNamespaces().stream() + .filter(n -> agentCount == 1 || Math.abs(n.hashCode() % agentCount) == agentIndex) + .collect(ImmutableList.toImmutableList()); + } } diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesV2OnDemandCachingAgent.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesV2OnDemandCachingAgent.java index 9b811d014fc..15b25bc3f55 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesV2OnDemandCachingAgent.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesV2OnDemandCachingAgent.java @@ -83,7 +83,6 @@ protected KubernetesV2OnDemandCachingAgent( @Override public CacheResult loadData(ProviderCache providerCache) { log.info(getAgentType() + ": agent is starting"); - reloadNamespaces(); Map details = defaultIntrospectionDetails(); Long start = System.currentTimeMillis(); @@ -312,8 +311,7 @@ public OnDemandAgent.OnDemandResult handle(ProviderCache providerCache, Map