Skip to content

Commit 3a9e400

Browse files
committed
feat: garbage collected interface
1 parent e971c4d commit 3a9e400

File tree

12 files changed

+32
-34
lines changed

12 files changed

+32
-34
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.javaoperatorsdk.operator.api.reconciler.dependent;
2+
3+
/**
4+
* Marker interface, that can be added in additionally to a {@link Deleter} Dependent Resource. It
5+
* is used to model a situation when a resource is makes sure to delete during reconciliation, but
6+
* not during cleanup, since that is handled by the Kubernetes garbage collector. See also:
7+
* https://github.com/java-operator-sdk/java-operator-sdk/issues/1127
8+
*/
9+
public interface GarbageCollected {
10+
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
3838
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
3939
import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider;
40+
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
4041
import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DependentResourceConfigurator;
4142
import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.KubernetesClientAware;
4243
import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.ManagedDependentResourceException;
@@ -82,7 +83,8 @@ public Controller(Reconciler<P> reconciler,
8283
specs.forEach(drs -> {
8384
final var dependent = createAndConfigureFrom(drs, kubernetesClient);
8485
// check if dependent implements Deleter to record that fact
85-
if (!hasDeleterHolder[0] && dependent instanceof Deleter) {
86+
if (!hasDeleterHolder[0] && dependent instanceof Deleter
87+
&& !(dependent instanceof GarbageCollected)) {
8688
hasDeleterHolder[0] = true;
8789
}
8890
dependentsHolder.put(drs.getName(), dependent);
@@ -143,7 +145,7 @@ public DeleteControl execute() {
143145
initContextIfNeeded(resource, context);
144146
if (hasDeleterDependents) {
145147
dependents.values().stream()
146-
.filter(d -> d instanceof Deleter)
148+
.filter(d -> d instanceof Deleter && !(d instanceof GarbageCollected))
147149
.map(Deleter.class::cast)
148150
.forEach(deleter -> deleter.delete(resource, context));
149151
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.javaoperatorsdk.operator.api.reconciler.Context;
88
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
99
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
10+
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
1011
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
1112
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1213

@@ -17,6 +18,7 @@ public abstract class AbstractDependentResource<R, P extends HasMetadata>
1718
protected final boolean creatable = this instanceof Creator;
1819
protected final boolean updatable = this instanceof Updater;
1920
protected final boolean deletable = this instanceof Deleter;
21+
protected final boolean garbageCollected = this instanceof GarbageCollected;
2022
protected Creator<R, P> creator;
2123
protected Updater<R, P> updater;
2224

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/CRUDKubernetesDependentResource.java

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

33
import io.fabric8.kubernetes.api.model.HasMetadata;
44
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
5+
import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
56
import io.javaoperatorsdk.operator.processing.dependent.Creator;
67
import io.javaoperatorsdk.operator.processing.dependent.Updater;
78

@@ -13,7 +14,8 @@
1314
*/
1415
public abstract class CRUDKubernetesDependentResource<R extends HasMetadata, P extends HasMetadata>
1516
extends
16-
KubernetesDependentResource<R, P> implements Creator<R, P>, Updater<R, P>, Deleter<P> {
17+
KubernetesDependentResource<R, P>
18+
implements Creator<R, P>, Updater<R, P>, Deleter<P>, GarbageCollected {
1719

1820
public CRUDKubernetesDependentResource(Class<R> resourceType) {
1921
super(resourceType);

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/CRUKubernetesDependentResource.java

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

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ protected InformerEventSource<R, P> createEventSource(EventSourceContext<P> cont
146146
}
147147

148148
protected boolean addOwnerReference() {
149-
return creatable && !deletable;
149+
return creatable && deletable && garbageCollected;
150150
}
151151

152152
@Override

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentoperationeventfiltering/ConfigMapDependentResource.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
import io.fabric8.kubernetes.api.model.ConfigMap;
66
import io.fabric8.kubernetes.api.model.ObjectMeta;
77
import io.javaoperatorsdk.operator.api.reconciler.Context;
8-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
98

109
public class ConfigMapDependentResource extends
11-
CRUKubernetesDependentResource<ConfigMap, DependentOperationEventFilterCustomResource> {
10+
io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource<ConfigMap, DependentOperationEventFilterCustomResource>
11+
implements
12+
io.javaoperatorsdk.operator.processing.dependent.Creator<ConfigMap, DependentOperationEventFilterCustomResource>,
13+
io.javaoperatorsdk.operator.processing.dependent.Updater<ConfigMap, DependentOperationEventFilterCustomResource> {
1214

1315
public static final String KEY = "key1";
1416

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/orderedmanageddependent/ConfigMapDependentResource1.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import io.fabric8.kubernetes.api.model.ObjectMeta;
88
import io.javaoperatorsdk.operator.api.reconciler.Context;
99
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
10-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
1110
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
1211

1312
@KubernetesDependent(labelSelector = "dependent = cm1")

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/orderedmanageddependent/ConfigMapDependentResource2.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import io.fabric8.kubernetes.api.model.ObjectMeta;
88
import io.javaoperatorsdk.operator.api.reconciler.Context;
99
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
10-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
1110
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
1211

1312
@KubernetesDependent(labelSelector = "dependent = cm2")

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/ConfigMapDependentResource.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
1111
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
1212
import io.javaoperatorsdk.operator.api.reconciler.Context;
13-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
1413
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
1514

1615
import static io.javaoperatorsdk.operator.sample.Utils.configMapName;

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/DeploymentDependentResource.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import io.fabric8.kubernetes.api.model.ConfigMapVolumeSourceBuilder;
77
import io.fabric8.kubernetes.api.model.apps.Deployment;
88
import io.javaoperatorsdk.operator.api.reconciler.Context;
9-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
109
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
1110

1211
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
@@ -16,7 +15,10 @@
1615

1716
// this annotation only activates when using managed dependents and is not otherwise needed
1817
@KubernetesDependent(labelSelector = WebPageManagedDependentsReconciler.SELECTOR)
19-
class DeploymentDependentResource extends CRUKubernetesDependentResource<Deployment, WebPage> {
18+
class DeploymentDependentResource extends
19+
io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource<Deployment, WebPage>
20+
implements io.javaoperatorsdk.operator.processing.dependent.Creator<Deployment, WebPage>,
21+
io.javaoperatorsdk.operator.processing.dependent.Updater<Deployment, WebPage> {
2022

2123
public DeploymentDependentResource() {
2224
super(Deployment.class);

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/ServiceDependentResource.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import io.fabric8.kubernetes.api.model.Service;
77
import io.javaoperatorsdk.operator.api.reconciler.Context;
8-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
98
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
109

1110
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
@@ -15,7 +14,10 @@
1514

1615
// this annotation only activates when using managed dependents and is not otherwise needed
1716
@KubernetesDependent(labelSelector = WebPageManagedDependentsReconciler.SELECTOR)
18-
class ServiceDependentResource extends CRUKubernetesDependentResource<Service, WebPage> {
17+
class ServiceDependentResource extends
18+
io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource<Service, WebPage>
19+
implements io.javaoperatorsdk.operator.processing.dependent.Creator<Service, WebPage>,
20+
io.javaoperatorsdk.operator.processing.dependent.Updater<Service, WebPage> {
1921

2022
public ServiceDependentResource() {
2123
super(Service.class);

0 commit comments

Comments
 (0)