Skip to content

Commit f963d84

Browse files
author
mgajda
committed
Building version of non-breaking changes
1 parent f8bf24d commit f963d84

26 files changed

+496
-387
lines changed

cache/src/main/java/io/envoyproxy/controlplane/cache/DeltaResponse.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
public abstract class DeltaResponse {
1313

1414
public static DeltaResponse create(DeltaXdsRequest request,
15-
Map<String, SnapshotResource<?>> resources,
16-
List<String> removedResources,
17-
String version) {
15+
Map<String, VersionedResource<?>> resources,
16+
List<String> removedResources,
17+
String version) {
1818
return new AutoValue_DeltaResponse(request, resources, removedResources, version);
1919
}
2020

@@ -26,7 +26,7 @@ public static DeltaResponse create(DeltaXdsRequest request,
2626
/**
2727
* Returns the resources to include in the response.
2828
*/
29-
public abstract Map<String, SnapshotResource<? extends Message>> resources();
29+
public abstract Map<String, VersionedResource<? extends Message>> resources();
3030

3131
/**
3232
* Returns the removed resources to include in the response.

cache/src/main/java/io/envoyproxy/controlplane/cache/Resources.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,10 @@ public static String getResourceName(Any anyResource) {
218218
*
219219
* @param resources the resource whose dependencies we are calculating
220220
*/
221-
public static <T extends Message> Set<String> getResourceReferences(Collection<SnapshotResource<T>> resources) {
221+
public static <T extends Message> Set<String> getResourceReferences(Collection<VersionedResource<T>> resources) {
222222
final ImmutableSet.Builder<String> refs = ImmutableSet.builder();
223223

224-
for (SnapshotResource<T> sr : resources) {
224+
for (VersionedResource<T> sr : resources) {
225225
Message r = sr.resource();
226226
if (r instanceof ClusterLoadAssignment || r instanceof RouteConfiguration) {
227227
// Endpoints have no dependencies.

cache/src/main/java/io/envoyproxy/controlplane/cache/SimpleCache.java

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,8 @@ public DeltaWatch createDeltaWatch(
266266
if (!isWildcard && watch.pendingResources().size() != 0) {
267267
// If any of the pending resources are in the snapshot respond immediately. If not we'll fall back to
268268
// version comparisons.
269-
Map<String, SnapshotResource<?>> resources = snapshot.resources(request.getResourceType());
270-
Map<String, SnapshotResource<?>> requestedResources = watch.pendingResources()
269+
Map<String, VersionedResource<?>> resources = snapshot.versionedResources(request.getResourceType());
270+
Map<String, VersionedResource<?>> requestedResources = watch.pendingResources()
271271
.stream()
272272
.filter(resources::containsKey)
273273
.collect(Collectors.toMap(Function.identity(), resources::get));
@@ -280,10 +280,10 @@ public DeltaWatch createDeltaWatch(
280280
return watch;
281281
}
282282
} else if (hasClusterChanged && requestResourceType.equals(ResourceType.ENDPOINT)) {
283-
Map<String, SnapshotResource<?>> snapshotResources = snapshot.resources(request.getResourceType());
283+
Map<String, VersionedResource<?>> snapshotResources = snapshot.versionedResources(request.getResourceType());
284284
List<String> removedResources = findRemovedResources(watch,
285285
snapshotResources);
286-
Map<String, SnapshotResource<?>> changedResources = findChangedResources(watch, snapshotResources);
286+
Map<String, VersionedResource<?>> changedResources = findChangedResources(watch, snapshotResources);
287287
ResponseState responseState = respondDelta(
288288
watch,
289289
changedResources,
@@ -309,10 +309,10 @@ public DeltaWatch createDeltaWatch(
309309
}
310310

311311
// Otherwise, version is different, the watch may be responded immediately
312-
Map<String, SnapshotResource<?>> snapshotResources = snapshot.resources(request.getResourceType());
312+
Map<String, VersionedResource<?>> snapshotResources = snapshot.versionedResources(request.getResourceType());
313313
List<String> removedResources = findRemovedResources(watch,
314314
snapshotResources);
315-
Map<String, SnapshotResource<?>> changedResources = findChangedResources(watch, snapshotResources);
315+
Map<String, VersionedResource<?>> changedResources = findChangedResources(watch, snapshotResources);
316316
ResponseState responseState = respondDelta(watch,
317317
changedResources,
318318
removedResources,
@@ -414,8 +414,8 @@ public StatusInfo statusInfo(T group) {
414414

415415
@VisibleForTesting
416416
protected void respondWithSpecificOrder(T group,
417-
U previousSnapshot, U snapshot,
418-
ConcurrentMap<ResourceType, CacheStatusInfo<T>> statusMap) {
417+
U previousSnapshot, U snapshot,
418+
ConcurrentMap<ResourceType, CacheStatusInfo<T>> statusMap) {
419419
for (ResourceType resourceType : RESOURCE_TYPES_IN_ORDER) {
420420
CacheStatusInfo<T> status = statusMap.get(resourceType);
421421
if (status == null) {
@@ -447,16 +447,17 @@ protected void respondWithSpecificOrder(T group,
447447
return false;
448448
});
449449

450-
Map<String, SnapshotResource<?>> previousResources = previousSnapshot == null
450+
Map<String, VersionedResource<?>> previousResources = previousSnapshot == null
451451
? Collections.emptyMap()
452-
: previousSnapshot.resources(resourceType);
453-
Map<String, SnapshotResource<?>> snapshotResources = snapshot.resources(resourceType);
452+
: previousSnapshot.versionedResources(resourceType);
453+
Map<String, VersionedResource<?>> snapshotResources = snapshot.versionedResources(resourceType);
454454

455-
Map<String, SnapshotResource<?>> snapshotChangedResources = snapshotResources.entrySet()
455+
Map<String, VersionedResource<?>> snapshotChangedResources = snapshotResources.entrySet()
456456
.stream()
457457
.filter(entry -> {
458-
SnapshotResource<?> snapshotResource = previousResources.get(entry.getKey());
459-
return snapshotResource == null || !snapshotResource.version().equals(entry.getValue().version());
458+
VersionedResource<?> versionedResource = previousResources.get(entry.getKey());
459+
return versionedResource == null || !versionedResource
460+
.version().equals(entry.getValue().version());
460461
})
461462
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
462463

@@ -480,7 +481,7 @@ protected void respondWithSpecificOrder(T group,
480481
.filter(s -> watch.trackedResources().get(s) != null)
481482
.collect(Collectors.toList());
482483

483-
Map<String, SnapshotResource<?>> changedResources = findChangedResources(watch, snapshotChangedResources);
484+
Map<String, VersionedResource<?>> changedResources = findChangedResources(watch, snapshotChangedResources);
484485

485486
ResponseState responseState = respondDelta(watch,
486487
changedResources,
@@ -498,23 +499,24 @@ protected void respondWithSpecificOrder(T group,
498499
}
499500
}
500501

501-
private Response createResponse(XdsRequest request, Map<String, SnapshotResource<?>> resources,
502-
String version) {
502+
private Response createResponse(XdsRequest request, Map<String, VersionedResource<?>> resources,
503+
String version) {
503504
Collection<? extends Message> filtered = request.getResourceNamesList().isEmpty()
504505
? resources.values().stream()
505-
.map(SnapshotResource::resource)
506+
.map(VersionedResource::resource)
506507
.collect(Collectors.toList())
507508
: request.getResourceNamesList().stream()
508-
.map(resources::get)
509-
.filter(Objects::nonNull)
510-
.map(SnapshotResource::resource)
511-
.collect(Collectors.toList());
509+
.map(resources::get)
510+
.filter(Objects::nonNull)
511+
.map(VersionedResource::resource)
512+
.collect(Collectors.toList());
512513

513514
return Response.create(request, filtered, version);
514515
}
515516

516517
private boolean respond(Watch watch, U snapshot, T group) {
517-
Map<String, SnapshotResource<?>> snapshotResources = snapshot.resources(watch.request().getResourceType());
518+
Map<String, VersionedResource<?>> snapshotResources =
519+
snapshot.versionedResources(watch.request().getResourceType());
518520

519521
if (!watch.request().getResourceNamesList().isEmpty() && watch.ads()) {
520522
Collection<String> missingNames = watch.request().getResourceNamesList().stream()
@@ -563,16 +565,16 @@ private boolean respond(Watch watch, U snapshot, T group) {
563565
return false;
564566
}
565567

566-
private List<String> findRemovedResources(DeltaWatch watch, Map<String, SnapshotResource<?>> snapshotResources) {
568+
private List<String> findRemovedResources(DeltaWatch watch, Map<String, VersionedResource<?>> snapshotResources) {
567569
// remove resources for which client has a tracked version but do not exist in snapshot
568570
return watch.trackedResources().keySet()
569571
.stream()
570572
.filter(s -> !snapshotResources.containsKey(s))
571573
.collect(Collectors.toList());
572574
}
573575

574-
private Map<String, SnapshotResource<?>> findChangedResources(DeltaWatch watch,
575-
Map<String, SnapshotResource<?>> snapshotResources) {
576+
private Map<String, VersionedResource<?>> findChangedResources(DeltaWatch watch,
577+
Map<String, VersionedResource<?>> snapshotResources) {
576578
return snapshotResources.entrySet()
577579
.stream()
578580
.filter(entry -> {
@@ -590,12 +592,12 @@ private Map<String, SnapshotResource<?>> findChangedResources(DeltaWatch watch,
590592
}
591593

592594
private ResponseState respondDeltaTracked(DeltaWatch watch,
593-
Map<String, SnapshotResource<?>> snapshotResources,
594-
List<String> removedResources,
595-
String version,
596-
T group) {
595+
Map<String, VersionedResource<?>> snapshotResources,
596+
List<String> removedResources,
597+
String version,
598+
T group) {
597599

598-
Map<String, SnapshotResource<?>> resources = snapshotResources.entrySet()
600+
Map<String, VersionedResource<?>> resources = snapshotResources.entrySet()
599601
.stream()
600602
.filter(entry -> {
601603
if (watch.pendingResources().contains(entry.getKey())) {
@@ -614,10 +616,10 @@ private ResponseState respondDeltaTracked(DeltaWatch watch,
614616
}
615617

616618
private ResponseState respondDelta(DeltaWatch watch,
617-
Map<String, SnapshotResource<?>> resources,
618-
List<String> removedResources,
619-
String version,
620-
T group) {
619+
Map<String, VersionedResource<?>> resources,
620+
List<String> removedResources,
621+
String version,
622+
T group) {
621623
if (resources.isEmpty() && removedResources.isEmpty()) {
622624
return ResponseState.UNRESPONDED;
623625
}

cache/src/main/java/io/envoyproxy/controlplane/cache/Snapshot.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22

33
import com.google.protobuf.Message;
44
import io.envoyproxy.controlplane.cache.Resources.ResourceType;
5+
import java.util.Iterator;
56
import java.util.List;
67
import java.util.Map;
78
import java.util.Set;
9+
import java.util.stream.StreamSupport;
810

911
public abstract class Snapshot {
1012

13+
public abstract String version(ResourceType resourceType, List<String> resourceNames);
14+
15+
public abstract Map<String, ? extends Message> resources(ResourceType resourceType);
16+
1117
/**
1218
* Asserts that all of the given resource names have corresponding values in the given resources collection.
1319
*
@@ -21,7 +27,7 @@ protected static <T extends Message> void ensureAllResourceNamesExist(
2127
String parentTypeUrl,
2228
String dependencyTypeUrl,
2329
Set<String> resourceNames,
24-
Map<String, SnapshotResource<T>> resources) throws SnapshotConsistencyException {
30+
Map<String, VersionedResource<T>> resources) throws SnapshotConsistencyException {
2531

2632
if (resourceNames.size() != resources.size()) {
2733
throw new SnapshotConsistencyException(
@@ -46,7 +52,17 @@ protected static <T extends Message> void ensureAllResourceNamesExist(
4652
}
4753
}
4854

49-
public abstract String version(ResourceType resourceType, List<String> resourceNames);
55+
public abstract Map<String, VersionedResource<? extends Message>> versionedResources(ResourceType resourceType);
5056

51-
public abstract Map<String, SnapshotResource<?>> resources(ResourceType resourceType);
57+
private static <T> Iterable<T> getIterableFromIterator(Iterator<T> iterator) {
58+
return () -> iterator;
59+
}
60+
61+
protected static <T extends Message> Iterable<VersionedResource<T>> generateSnapshotResourceIterable(
62+
Iterable<T> resources) {
63+
return getIterableFromIterator(
64+
StreamSupport.stream(resources.spliterator(), false)
65+
.map((r) -> VersionedResource.create(r))
66+
.iterator());
67+
}
5268
}

cache/src/main/java/io/envoyproxy/controlplane/cache/SnapshotResource.java

Lines changed: 0 additions & 32 deletions
This file was deleted.

cache/src/main/java/io/envoyproxy/controlplane/cache/SnapshotResources.java

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package io.envoyproxy.controlplane.cache;
22

33
import com.google.auto.value.AutoValue;
4+
import com.google.common.base.Predicates;
45
import com.google.common.collect.ImmutableMap;
6+
import com.google.common.collect.ImmutableMap.Builder;
57
import com.google.protobuf.Message;
6-
78
import java.util.List;
89
import java.util.Map;
910
import java.util.stream.Collector;
11+
import java.util.stream.Collectors;
1012
import java.util.stream.StreamSupport;
1113

1214
@AutoValue
@@ -16,48 +18,83 @@ public abstract class SnapshotResources<T extends Message> {
1618
* Returns a new {@link SnapshotResources} instance.
1719
*
1820
* @param resources the resources in this collection
19-
* @param version the version associated with the resources in this collection
20-
* @param <T> the type of resources in this collection
21+
* @param version the version associated with the resources in this collection
22+
* @param <T> the type of resources in this collection
2123
*/
2224
public static <T extends Message> SnapshotResources<T> create(
23-
Iterable<SnapshotResource<T>> resources,
25+
Iterable<?> resources,
2426
String version) {
2527
return new AutoValue_SnapshotResources<>(
2628
resourcesMap(resources),
2729
(r) -> version
2830
);
2931
}
3032

33+
3134
/**
3235
* Returns a new {@link SnapshotResources} instance with versions by resource name.
3336
*
34-
* @param resources the resources in this collection
37+
* @param resources the resources in this collection
3538
* @param versionResolver version resolver for the resources in this collection
36-
* @param <T> the type of resources in this collection
39+
* @param <T> the type of resources in this collection
3740
*/
3841
public static <T extends Message> SnapshotResources<T> create(
39-
Iterable<SnapshotResource<T>> resources,
42+
Iterable<VersionedResource<T>> resources,
4043
ResourceVersionResolver versionResolver) {
4144
return new AutoValue_SnapshotResources<>(
4245
resourcesMap(resources),
4346
versionResolver);
4447
}
4548

46-
private static <T extends Message> ImmutableMap<String, SnapshotResource<T>> resourcesMap(
47-
Iterable<SnapshotResource<T>> resources) {
48-
return StreamSupport.stream(resources.spliterator(), false)
49-
.collect(
50-
Collector.of(
51-
ImmutableMap.Builder<String, SnapshotResource<T>>::new,
52-
(b, e) -> b.put(Resources.getResourceName(e.resource()), e),
53-
(b1, b2) -> b1.putAll(b2.build()),
54-
ImmutableMap.Builder::build));
49+
private static <T extends Message> ImmutableMap<String, VersionedResource<T>> resourcesMap(
50+
Iterable<?> resources) {
51+
List<?> resourcesList = StreamSupport.stream(resources.spliterator(), false)
52+
.collect(Collectors.toList());
53+
if (resourcesList.stream().allMatch(Predicates.instanceOf(VersionedResource.class)::apply)) {
54+
ImmutableMap<String, VersionedResource<T>> result = StreamSupport
55+
.stream(resourcesList.spliterator(), false)
56+
.collect(
57+
Collector.of(
58+
Builder<String, VersionedResource<T>>::new,
59+
(b, e) -> {
60+
VersionedResource<T> eCast = (VersionedResource<T>) e;
61+
b.put(Resources.getResourceName(eCast.resource()), eCast);
62+
},
63+
(b1, b2) -> b1.putAll(b2.build()),
64+
Builder::build));
65+
return result;
66+
} else {
67+
return StreamSupport.stream(resources.spliterator(), false)
68+
.collect(
69+
Collector.of(
70+
Builder<String, VersionedResource<T>>::new,
71+
(b, e) -> {
72+
T eCast = (T) e;
73+
b.put(Resources.getResourceName(eCast), VersionedResource.create(eCast));
74+
},
75+
(b1, b2) -> b1.putAll(b2.build()),
76+
Builder::build));
77+
}
5578
}
5679

5780
/**
5881
* Returns a map of the resources in this collection, where the key is the name of the resource.
5982
*/
60-
public abstract Map<String, SnapshotResource<T>> resources();
83+
public abstract Map<String, VersionedResource<T>> versionedResources();
84+
85+
/**
86+
* Returns a map of the resources in this collection, where the key is the name of the resource.
87+
*/
88+
public Map<String, T> resources() {
89+
return versionedResources().values().stream().collect(
90+
Collector.of(
91+
Builder<String, T>::new,
92+
(b, e) -> {
93+
b.put(Resources.getResourceName(e.resource()), e.resource());
94+
},
95+
(b1, b2) -> b1.putAll(b2.build()),
96+
Builder::build));
97+
}
6198

6299
/**
63100
* Returns the version associated with this all resources in this collection.

0 commit comments

Comments
 (0)