Skip to content

Commit 1c28955

Browse files
committed
wip
1 parent 76fc545 commit 1c28955

File tree

7 files changed

+147
-34
lines changed

7 files changed

+147
-34
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ObjectTransformingItemStore.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,14 @@ public String getKey(R obj) {
3131

3232
@Override
3333
public R put(String key, R obj) {
34+
var originalName = obj.getMetadata().getName();
35+
var originalNamespace = obj.getMetadata().getNamespace();
3436
var originalResourceVersion = obj.getMetadata().getResourceVersion();
37+
3538
var transformed = transformationFunction.apply(obj);
36-
// resourceVersion must be always stored.
39+
40+
transformed.getMetadata().setName(originalName);
41+
transformed.getMetadata().setNamespace(originalNamespace);
3742
transformed.getMetadata().setResourceVersion(originalResourceVersion);
3843
return store.put(key, transformed);
3944
}
Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,68 @@
11
package io.javaoperatorsdk.operator;
22

3-
public class CachePruneIT {
3+
import java.util.Map;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.fabric8.kubernetes.api.model.ConfigMap;
9+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
10+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
11+
import io.javaoperatorsdk.operator.sample.cacheprune.CachePruneCustomResource;
12+
import io.javaoperatorsdk.operator.sample.cacheprune.CachePruneReconciler;
13+
import io.javaoperatorsdk.operator.sample.cacheprune.CachePruneSpec;
14+
15+
import static io.javaoperatorsdk.operator.sample.cacheprune.CachePruneReconciler.DATA_KEY;
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.awaitility.Awaitility.await;
18+
19+
class CachePruneIT {
20+
// todo temp cache item store?
21+
22+
public static final String DEFAULT_DATA = "default_data";
23+
public static final String TEST_RESOURCE_NAME = "test1";
24+
public static final String UPDATED_DATA = "updated_data";
25+
@RegisterExtension
26+
LocallyRunOperatorExtension operator =
27+
LocallyRunOperatorExtension.builder()
28+
.withReconciler(new CachePruneReconciler()).build();
29+
30+
@Test
31+
void pruningRelatedBehavior() {
32+
var res = operator.create(testResource());
33+
await().untilAsserted(() -> {
34+
var actual = operator.get(CachePruneCustomResource.class, TEST_RESOURCE_NAME);
35+
assertThat(actual.getMetadata()).isNotNull();
36+
assertThat(actual.getMetadata().getFinalizers()).isNotEmpty();
37+
assertThat(actual.getStatus().getCreated()).isTrue();
38+
assertThat(actual.getMetadata().getLabels()).isNotEmpty();
39+
var configMap = operator.get(ConfigMap.class, TEST_RESOURCE_NAME);
40+
assertThat(configMap.getData()).containsEntry(DATA_KEY, DEFAULT_DATA);
41+
assertThat(configMap.getMetadata().getLabels()).isNotEmpty();
42+
});
43+
44+
res.getSpec().setData(UPDATED_DATA);
45+
var updated = operator.replace(res);
46+
47+
await().untilAsserted(() -> {
48+
var actual = operator.get(CachePruneCustomResource.class, TEST_RESOURCE_NAME);
49+
var configMap = operator.get(ConfigMap.class, TEST_RESOURCE_NAME);
50+
assertThat(actual.getStatus().getCreated()).isTrue();
51+
assertThat(actual.getMetadata().getLabels()).isNotEmpty();
52+
assertThat(configMap.getData()).containsEntry(DATA_KEY, UPDATED_DATA);
53+
assertThat(configMap.getMetadata().getLabels()).isNotEmpty();
54+
});
55+
}
56+
57+
CachePruneCustomResource testResource() {
58+
var res = new CachePruneCustomResource();
59+
res.setMetadata(new ObjectMetaBuilder()
60+
.withName(TEST_RESOURCE_NAME)
61+
.withLabels(Map.of("sampleLabel", "val"))
62+
.build());
63+
res.setSpec(new CachePruneSpec());
64+
res.getSpec().setData(DEFAULT_DATA);
65+
return res;
66+
}
67+
468
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/cacheprune/CachePruneCustomResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
@Version("v1")
1111
@ShortNames("cpr")
1212
public class CachePruneCustomResource
13-
extends CustomResource<Void, CachePruneStatus>
13+
extends CustomResource<CachePruneSpec, CachePruneStatus>
1414
implements Namespaced {
1515
}
Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
package io.javaoperatorsdk.operator.sample.cacheprune;
22

3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.concurrent.atomic.AtomicInteger;
6+
37
import io.fabric8.kubernetes.api.model.ConfigMap;
48
import io.fabric8.kubernetes.api.model.ObjectMeta;
59
import io.fabric8.kubernetes.client.KubernetesClient;
10+
import io.fabric8.kubernetes.client.dsl.base.PatchContext;
11+
import io.fabric8.kubernetes.client.dsl.base.PatchType;
12+
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
613
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
714
import io.javaoperatorsdk.operator.api.reconciler.*;
815
import io.javaoperatorsdk.operator.junit.KubernetesClientAware;
9-
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1016
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
1117
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
12-
import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider;
13-
14-
import java.util.HashMap;
15-
import java.util.Map;
16-
import java.util.Set;
17-
import java.util.concurrent.atomic.AtomicInteger;
1818

1919
@ControllerConfiguration
20+
// @ControllerConfiguration(itemStore = LabelRemovingItemStore.class)
2021
public class CachePruneReconciler
21-
implements Reconciler<CachePruneCustomResource>, EventSourceInitializer<CachePruneCustomResource>,
22-
Cleaner<CachePruneCustomResource>, KubernetesClientAware {
22+
implements Reconciler<CachePruneCustomResource>,
23+
EventSourceInitializer<CachePruneCustomResource>,
24+
Cleaner<CachePruneCustomResource>, KubernetesClientAware {
2325

26+
public static final String DATA_KEY = "data";
2427
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
2528
private KubernetesClient client;
2629

@@ -30,10 +33,21 @@ public UpdateControl<CachePruneCustomResource> reconcile(
3033
Context<CachePruneCustomResource> context) {
3134
numberOfExecutions.addAndGet(1);
3235

33-
34-
35-
36-
return UpdateControl.noUpdate();
36+
var configMap = context.getSecondaryResource(ConfigMap.class);
37+
configMap.ifPresentOrElse(cm -> {
38+
if (!cm.getData().get(DATA_KEY)
39+
.equals(resource.getSpec().getData())) {
40+
var cloned = ConfigurationServiceProvider.instance().getResourceCloner().clone(cm);
41+
cloned.getData().put(DATA_KEY, resource.getSpec().getData());
42+
var res = client.configMaps().resource(cm)
43+
.patch(PatchContext.of(PatchType.SERVER_SIDE_APPLY), cloned);
44+
System.out.println(res);
45+
}
46+
}, () -> client.configMaps().resource(configMap(resource)).create());
47+
48+
resource.setStatus(new CachePruneStatus());
49+
resource.getStatus().setCreated(true);
50+
return UpdateControl.patchStatus(resource);
3751
}
3852

3953

@@ -44,22 +58,22 @@ public int getNumberOfExecutions() {
4458
@Override
4559
public Map<String, EventSource> prepareEventSources(
4660
EventSourceContext<CachePruneCustomResource> context) {
47-
4861
InformerEventSource<ConfigMap, CachePruneCustomResource> configMapEventSource =
49-
new InformerEventSource<ConfigMap, CachePruneCustomResource>(InformerConfiguration.from(ConfigMap.class,context).build(),
50-
context);
62+
new InformerEventSource<>(InformerConfiguration.from(ConfigMap.class, context)
63+
// .withItemStore(new LabelRemovingItemStore<>())
64+
.build(),
65+
context);
5166
return EventSourceInitializer.nameEventSources(configMapEventSource);
5267
}
5368

54-
ConfigMap configMap(String name, CachePruneCustomResource resource) {
69+
ConfigMap configMap(CachePruneCustomResource resource) {
5570
ConfigMap configMap = new ConfigMap();
5671
configMap.setMetadata(new ObjectMeta());
57-
configMap.getMetadata().setName(name);
72+
configMap.getMetadata().setName(resource.getMetadata().getName());
5873
configMap.getMetadata().setNamespace(resource.getMetadata().getNamespace());
59-
configMap.setData(new HashMap<>());
60-
configMap.getData().put(name, name);
74+
configMap.setData(Map.of(DATA_KEY, resource.getSpec().getData()));
6175
HashMap<String, String> labels = new HashMap<>();
62-
labels.put("multisecondary", "true");
76+
labels.put("mylabel", "val");
6377
configMap.getMetadata().setLabels(labels);
6478
configMap.addOwnerReference(resource);
6579
return configMap;
@@ -76,7 +90,8 @@ public void setKubernetesClient(KubernetesClient kubernetesClient) {
7690
}
7791

7892
@Override
79-
public DeleteControl cleanup(CachePruneCustomResource resource, Context<CachePruneCustomResource> context) {
80-
return null;
93+
public DeleteControl cleanup(CachePruneCustomResource resource,
94+
Context<CachePruneCustomResource> context) {
95+
return DeleteControl.defaultDelete();
8196
}
8297
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.javaoperatorsdk.operator.sample.cacheprune;
2+
3+
public class CachePruneSpec {
4+
5+
private String data;
6+
7+
public String getData() {
8+
return data;
9+
}
10+
11+
public CachePruneSpec setData(String data) {
12+
this.data = data;
13+
return this;
14+
}
15+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/cacheprune/CachePruneStatus.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
public class CachePruneStatus {
44

5-
private Boolean created;
5+
private Boolean created;
66

7-
public Boolean getCreated() {
8-
return created;
9-
}
7+
public Boolean getCreated() {
8+
return created;
9+
}
1010

11-
public CachePruneStatus setCreated(Boolean created) {
12-
this.created = created;
13-
return this;
14-
}
11+
public CachePruneStatus setCreated(Boolean created) {
12+
this.created = created;
13+
return this;
14+
}
1515
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.sample.cacheprune;
2+
3+
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
import io.javaoperatorsdk.operator.processing.event.source.informer.ObjectTransformingItemStore;
5+
6+
public class LabelRemovingItemStore<R extends HasMetadata> extends ObjectTransformingItemStore<R> {
7+
8+
public LabelRemovingItemStore() {
9+
super(r -> {
10+
r.getMetadata().setLabels(null);
11+
return r;
12+
});
13+
}
14+
}

0 commit comments

Comments
 (0)