Skip to content

Commit 6c9f41e

Browse files
committed
wip
1 parent e2a2837 commit 6c9f41e

File tree

4 files changed

+81
-2
lines changed

4 files changed

+81
-2
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/cache/BoundedCache.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java.util.Set;
44

5-
// todo: rename to cache?
5+
// todo: rename to cache? (replace the old one)
66
public interface BoundedCache<K, R> {
77

88
R get(K key);

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/cache/BoundedItemStore.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,20 @@
55
import java.util.stream.Stream;
66

77
import io.fabric8.kubernetes.api.model.HasMetadata;
8+
import io.fabric8.kubernetes.client.KubernetesClient;
9+
import io.fabric8.kubernetes.client.informers.cache.Cache;
810
import io.fabric8.kubernetes.client.informers.cache.ItemStore;
911

1012
public class BoundedItemStore<R extends HasMetadata> extends BoundedStore<String, R>
1113
implements ItemStore<R> {
1214

1315
private final Function<R, String> keyFunction;
1416

17+
public BoundedItemStore(KubernetesClient client, Class<R> resourceClass,
18+
BoundedCache<String, R> cache) {
19+
this(new KubernetesResourceFetcher<>(resourceClass, client), cache, namespaceKeyFunc());
20+
}
21+
1522
public BoundedItemStore(KubernetesResourceFetcher<R> resourceFetcher,
1623
BoundedCache<String, R> cache, Function<R, String> keyFunction) {
1724
super(resourceFetcher, cache);
@@ -28,7 +35,9 @@ public Stream<String> keySet() {
2835
return super.keys();
2936
}
3037

31-
/** This is very inefficient but should not be called by the Informer or just */
38+
/**
39+
* This is very inefficient but should not be called by the Informer or just before it's started
40+
*/
3241
@Override
3342
public Stream<R> values() {
3443
var keys = cache.keys();
@@ -43,4 +52,8 @@ public Stream<R> values() {
4352
public int size() {
4453
return existingResources.size();
4554
}
55+
56+
public static <R extends HasMetadata> Function<R, String> namespaceKeyFunc() {
57+
return r -> Cache.namespaceKeyFunc(r.getMetadata().getNamespace(), r.getMetadata().getName());
58+
}
4659
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/cache/KubernetesResourceFetcher.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ public class KubernetesResourceFetcher<R extends HasMetadata>
1313
private final KubernetesClient client;
1414
private final Function<String, ResourceID> resourceIDFunction;
1515

16+
public KubernetesResourceFetcher(Class<R> rClass, KubernetesClient client) {
17+
this(rClass, client, inverseNamespaceKeyFunction());
18+
}
19+
1620
public KubernetesResourceFetcher(Class<R> rClass,
1721
KubernetesClient client,
1822
Function<String, ResourceID> resourceIDFunction) {
@@ -27,6 +31,20 @@ public R fetchResource(String key) {
2731
return resourceId.getNamespace().map(ns -> client.resources(rClass).inNamespace(ns)
2832
.withName(resourceId.getName()).get())
2933
.orElse(client.resources(rClass).withName(resourceId.getName()).get());
34+
}
3035

36+
/**
37+
* This would not be needed
38+
**/
39+
public static Function<String, ResourceID> inverseNamespaceKeyFunction() {
40+
return s -> {
41+
int delimiterIndex = s.indexOf("/");
42+
if (delimiterIndex == -1) {
43+
return new ResourceID(s);
44+
} else {
45+
return new ResourceID(s.substring(delimiterIndex + 1), s.substring(0, delimiterIndex));
46+
}
47+
};
3148
}
49+
3250
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.javaoperatorsdk.operator.processing.event.source.cache;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import io.fabric8.kubernetes.api.model.ConfigMap;
6+
import io.fabric8.kubernetes.api.model.HasMetadata;
7+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
8+
import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition;
9+
10+
import static org.assertj.core.api.Assertions.assertThat;
11+
12+
class KubernetesResourceFetcherTest {
13+
14+
public static final String DEFAULT_NAMESPACE = "default";
15+
public static final String TEST_RESOURCE_NAME = "test1";
16+
17+
@Test
18+
void inverseKeyFunction() {
19+
String key = BoundedItemStore.namespaceKeyFunc().apply(namespacedResource());
20+
var resourceID = KubernetesResourceFetcher.inverseNamespaceKeyFunction().apply(key);
21+
22+
assertThat(resourceID.getNamespace()).isPresent().get().isEqualTo(DEFAULT_NAMESPACE);
23+
assertThat(resourceID.getName()).isEqualTo(TEST_RESOURCE_NAME);
24+
25+
key = BoundedItemStore.namespaceKeyFunc().apply(clusterScopedResource());
26+
resourceID = KubernetesResourceFetcher.inverseNamespaceKeyFunction().apply(key);
27+
28+
assertThat(resourceID.getNamespace()).isEmpty();
29+
assertThat(resourceID.getName()).isEqualTo(TEST_RESOURCE_NAME);
30+
}
31+
32+
private HasMetadata namespacedResource() {
33+
var cm = new ConfigMap();
34+
cm.setMetadata(new ObjectMetaBuilder()
35+
.withName(TEST_RESOURCE_NAME)
36+
.withNamespace(DEFAULT_NAMESPACE)
37+
.build());
38+
return cm;
39+
}
40+
41+
private HasMetadata clusterScopedResource() {
42+
var cm = new CustomResourceDefinition();
43+
cm.setMetadata(new ObjectMetaBuilder()
44+
.withName(TEST_RESOURCE_NAME)
45+
.build());
46+
return cm;
47+
}
48+
}

0 commit comments

Comments
 (0)