Skip to content

Commit f42bbba

Browse files
committed
docs
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent 20a42e0 commit f42bbba

File tree

6 files changed

+154
-1
lines changed

6 files changed

+154
-1
lines changed

docs/documentation/v5-0-migration.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,5 @@ permalink: /docs/v5-0-migration
5454
9. `Operator.installShutdownHook()` has been removed, use `Operator.installShutdownHook(Duration)` instead
5555
10. Automated observed generation handling feature was removed, since it is trivial to do manually and
5656
since it cannot be done automatically in all cases with SSA, having different behavior for SSA and non-SSA
57-
usage would be confusing.
57+
usage would be confusing. See sample how to do observed generation handling manually
58+
[here](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/manualobservedgeneration/ManualObservedGenerationReconciler.java).
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package io.javaoperatorsdk.operator;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.extension.RegisterExtension;
5+
6+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
7+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
8+
import io.javaoperatorsdk.operator.sample.manualobservedgeneration.ManualObservedGenerationCustomResource;
9+
import io.javaoperatorsdk.operator.sample.manualobservedgeneration.ManualObservedGenerationReconciler;
10+
import io.javaoperatorsdk.operator.sample.manualobservedgeneration.ManualObservedGenerationSpec;
11+
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
import static org.awaitility.Awaitility.await;
14+
15+
public class ManualObservedGenerationIT {
16+
17+
public static final String RESOURCE_NAME = "test1";
18+
@RegisterExtension
19+
LocallyRunOperatorExtension extension =
20+
LocallyRunOperatorExtension.builder().withReconciler(new ManualObservedGenerationReconciler())
21+
.build();
22+
23+
24+
25+
@Test
26+
void observedGenerationUpdated() {
27+
extension.create(testResource());
28+
29+
await().untilAsserted(() -> {
30+
var r = extension.get(ManualObservedGenerationCustomResource.class, RESOURCE_NAME);
31+
assertThat(r).isNotNull();
32+
assertThat(r.getStatus().getObservedGeneration()).isEqualTo(1);
33+
assertThat(r.getStatus().getObservedGeneration()).isEqualTo(r.getMetadata().getGeneration());
34+
});
35+
36+
var changed = testResource();
37+
changed.getSpec().setValue("changed value");
38+
extension.replace(changed);
39+
40+
await().untilAsserted(() -> {
41+
var r = extension.get(ManualObservedGenerationCustomResource.class, RESOURCE_NAME);
42+
assertThat(r).isNotNull();
43+
assertThat(r.getStatus().getObservedGeneration()).isEqualTo(2);
44+
assertThat(r.getStatus().getObservedGeneration()).isEqualTo(r.getMetadata().getGeneration());
45+
});
46+
47+
}
48+
49+
50+
ManualObservedGenerationCustomResource testResource() {
51+
var res = new ManualObservedGenerationCustomResource();
52+
res.setMetadata(new ObjectMetaBuilder()
53+
.withName(RESOURCE_NAME)
54+
.build());
55+
res.setSpec(new ManualObservedGenerationSpec());
56+
res.getSpec().setValue("Initial Value");
57+
return res;
58+
}
59+
60+
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.javaoperatorsdk.operator.sample.manualobservedgeneration;
2+
3+
import io.fabric8.kubernetes.api.model.Namespaced;
4+
import io.fabric8.kubernetes.client.CustomResource;
5+
import io.fabric8.kubernetes.model.annotation.Group;
6+
import io.fabric8.kubernetes.model.annotation.ShortNames;
7+
import io.fabric8.kubernetes.model.annotation.Version;
8+
9+
@Group("sample.javaoperatorsdk")
10+
@Version("v1")
11+
@ShortNames("mog")
12+
public class ManualObservedGenerationCustomResource
13+
extends CustomResource<ManualObservedGenerationSpec, ManualObservedGenerationStatus>
14+
implements Namespaced {
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.javaoperatorsdk.operator.sample.manualobservedgeneration;
2+
3+
import java.util.Objects;
4+
import java.util.concurrent.atomic.AtomicInteger;
5+
6+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
7+
import io.javaoperatorsdk.operator.api.reconciler.*;
8+
9+
@ControllerConfiguration
10+
public class ManualObservedGenerationReconciler
11+
implements Reconciler<ManualObservedGenerationCustomResource> {
12+
13+
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
14+
15+
@Override
16+
public UpdateControl<ManualObservedGenerationCustomResource> reconcile(
17+
ManualObservedGenerationCustomResource resource,
18+
Context<ManualObservedGenerationCustomResource> context) {
19+
numberOfExecutions.addAndGet(1);
20+
var resourceForStatusPatch = resourceForStatusPatch(resource);
21+
if (!Objects.equals(resource.getMetadata().getGeneration(),
22+
resourceForStatusPatch.getStatus().getObservedGeneration())) {
23+
resourceForStatusPatch.getStatus()
24+
.setObservedGeneration(resource.getMetadata().getGeneration());
25+
return UpdateControl.patchStatus(resourceForStatusPatch);
26+
} else {
27+
return UpdateControl.noUpdate();
28+
}
29+
}
30+
31+
private ManualObservedGenerationCustomResource resourceForStatusPatch(
32+
ManualObservedGenerationCustomResource original) {
33+
var res = new ManualObservedGenerationCustomResource();
34+
res.setMetadata(new ObjectMetaBuilder()
35+
.withName(original.getMetadata().getName())
36+
.withNamespace(original.getMetadata().getNamespace())
37+
.build());
38+
res.setStatus(original.getStatus());
39+
if (res.getStatus() == null) {
40+
res.setStatus(new ManualObservedGenerationStatus());
41+
}
42+
return res;
43+
}
44+
45+
public int getNumberOfExecutions() {
46+
return numberOfExecutions.get();
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.sample.manualobservedgeneration;
2+
3+
public class ManualObservedGenerationSpec {
4+
5+
private String value;
6+
7+
public String getValue() {
8+
return value;
9+
}
10+
11+
public void setValue(String value) {
12+
this.value = value;
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.sample.manualobservedgeneration;
2+
3+
public class ManualObservedGenerationStatus {
4+
5+
private long observedGeneration;
6+
7+
public long getObservedGeneration() {
8+
return observedGeneration;
9+
}
10+
11+
public void setObservedGeneration(long observedGeneration) {
12+
this.observedGeneration = observedGeneration;
13+
}
14+
}

0 commit comments

Comments
 (0)