Skip to content

Commit

Permalink
refactor(kubernetes): A few minor refactors and perf fixes (#3813)
Browse files Browse the repository at this point in the history
* perf(kubernetes): Reduce deserialization of kubernetes pods

We're currently deserializing the entire kubernetes pod object
when we actually only need the status. Given that pods are very
common objects, it's worth only deserializing the status to
speed up the server groups endpoint.

* refactor(kubernetes): Remove unused variable isNamespaced

* refactor(kubernetes): Pull some logic from translateClusters

The translateCluster function gets both server groups and load
balancers; it would be more clear to have separate functions to
do each of these.

* refactor(kubernetes): Remove translateCluster function

Now that translateCluster has been split into two smaller functions,
remove it and call the two smaller ones.
  • Loading branch information
ezimanyi committed Jun 24, 2019
1 parent e9c6a58 commit 627d729
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -199,12 +199,7 @@ public static CacheData convertAsResource(
logMalformedManifest(() -> "Converting " + manifest + " to a cached resource", manifest);

KubernetesKind kind = manifest.getKind();
boolean hasClusterRelationship = false;
boolean isNamespaced = true;
if (kind != null) {
hasClusterRelationship = kind.hasClusterRelationship();
isNamespaced = kind.isNamespaced();
}
boolean hasClusterRelationship = kind != null && kind.hasClusterRelationship();

KubernetesApiVersion apiVersion = manifest.getApiVersion();
String name = manifest.getName();
Expand Down Expand Up @@ -274,7 +269,7 @@ public static KubernetesManifest convertToManifest(Object o) {
return mapper.convertValue(o, KubernetesManifest.class);
}

public static <T> T getResource(KubernetesManifest manifest, Class<T> clazz) {
public static <T> T getResource(Object manifest, Class<T> clazz) {
// A little hacky, but the only way to deserialize any timestamps using string constructors
return json.deserialize(json.serialize(manifest), clazz);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import com.netflix.spinnaker.clouddriver.model.HealthState;
import com.netflix.spinnaker.clouddriver.model.Instance;
import com.netflix.spinnaker.clouddriver.model.LoadBalancerInstance;
import io.kubernetes.client.models.V1Pod;
import io.kubernetes.client.models.V1PodStatus;
import java.util.ArrayList;
import java.util.HashMap;
Expand All @@ -51,8 +50,8 @@ private KubernetesV2Instance(KubernetesManifest manifest, String key) {
this.manifest = manifest;
this.key = (Keys.InfrastructureCacheKey) Keys.parseKey(key).get();

V1Pod pod = KubernetesCacheDataConverter.getResource(this.manifest, V1Pod.class);
V1PodStatus status = pod.getStatus();
V1PodStatus status =
KubernetesCacheDataConverter.getResource(this.manifest.getStatus(), V1PodStatus.class);
if (status != null) {
health.add(new KubernetesV2Health(status).toMap());
if (status.getContainerStatuses() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,22 +279,26 @@ private Set<KubernetesV2Cluster> translateClustersWithRelationships(
for (CacheData clusterDatum : clusterData) {
List<CacheData> clusterServerGroups =
clusterToServerGroups.getOrDefault(clusterDatum.getId(), new ArrayList<>());

List<CacheData> clusterLoadBalancers =
clusterServerGroups.stream()
.map(CacheData::getId)
.map(id -> serverGroupToLoadBalancers.getOrDefault(id, new ArrayList<>()))
.flatMap(Collection::stream)
.collect(Collectors.toList());

result.add(
translateCluster(
clusterDatum,
List<KubernetesV2ServerGroup> serverGroups =
getServerGroups(
clusterServerGroups,
clusterLoadBalancers,
serverGroupToInstances,
loadBalancerToServerGroups,
serverGroupToLoadBalancers,
serverGroupToServerGroupManagerKeys));
serverGroupToServerGroupManagerKeys);

List<KubernetesV2LoadBalancer> loadBalancers =
getLoadBalancers(
clusterLoadBalancers, serverGroupToInstances, loadBalancerToServerGroups);

result.add(new KubernetesV2Cluster(clusterDatum.getId(), serverGroups, loadBalancers));
}

return result.stream().filter(Objects::nonNull).collect(Collectors.toSet());
Expand All @@ -308,49 +312,42 @@ private KubernetesV2Cluster translateCluster(CacheData clusterDatum) {
return new KubernetesV2Cluster(clusterDatum.getId());
}

private KubernetesV2Cluster translateCluster(
CacheData clusterDatum,
private List<KubernetesV2ServerGroup> getServerGroups(
List<CacheData> serverGroupData,
List<CacheData> loadBalancerData,
Map<String, List<CacheData>> instanceDataByServerGroup,
Map<String, List<CacheData>> serverGroupDataByLoadBalancer,
Map<String, List<CacheData>> loadBalancerDataByServerGroup,
Map<String, List<InfrastructureCacheKey>> serverGroupToServerGroupManagerKeys) {
if (clusterDatum == null) {
return null;
}

List<KubernetesV2ServerGroup> serverGroups =
serverGroupData.stream()
.map(
cd ->
cacheUtils.<KubernetesV2ServerGroup>resourceModelFromCacheData(
KubernetesV2ServerGroupCacheData.builder()
.serverGroupData(cd)
.instanceData(
instanceDataByServerGroup.getOrDefault(
cd.getId(), new ArrayList<>()))
.loadBalancerData(
loadBalancerDataByServerGroup.getOrDefault(
cd.getId(), new ArrayList<>()))
.serverGroupManagerKeys(
serverGroupToServerGroupManagerKeys.getOrDefault(
cd.getId(), new ArrayList<>()))
.build()))
.filter(Objects::nonNull)
.collect(Collectors.toList());

List<KubernetesV2LoadBalancer> loadBalancers =
loadBalancerData.stream()
.map(
cd ->
KubernetesV2LoadBalancer.fromCacheData(
cd,
serverGroupDataByLoadBalancer.getOrDefault(cd.getId(), new ArrayList<>()),
instanceDataByServerGroup))
.filter(Objects::nonNull)
.collect(Collectors.toList());
return serverGroupData.stream()
.map(
cd ->
cacheUtils.<KubernetesV2ServerGroup>resourceModelFromCacheData(
KubernetesV2ServerGroupCacheData.builder()
.serverGroupData(cd)
.instanceData(
instanceDataByServerGroup.getOrDefault(cd.getId(), new ArrayList<>()))
.loadBalancerData(
loadBalancerDataByServerGroup.getOrDefault(
cd.getId(), new ArrayList<>()))
.serverGroupManagerKeys(
serverGroupToServerGroupManagerKeys.getOrDefault(
cd.getId(), new ArrayList<>()))
.build()))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}

return new KubernetesV2Cluster(clusterDatum.getId(), serverGroups, loadBalancers);
private List<KubernetesV2LoadBalancer> getLoadBalancers(
List<CacheData> loadBalancerData,
Map<String, List<CacheData>> instanceDataByServerGroup,
Map<String, List<CacheData>> serverGroupDataByLoadBalancer) {
return loadBalancerData.stream()
.map(
cd ->
KubernetesV2LoadBalancer.fromCacheData(
cd,
serverGroupDataByLoadBalancer.getOrDefault(cd.getId(), new ArrayList<>()),
instanceDataByServerGroup))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}

0 comments on commit 627d729

Please sign in to comment.