Skip to content

Commit d8c81b8

Browse files
committed
feat: garbage collected interface
1 parent 71086d6 commit d8c81b8

File tree

13 files changed

+49
-42
lines changed

13 files changed

+49
-42
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
@@ -152,7 +152,7 @@ protected InformerEventSource<R, P> createEventSource(EventSourceContext<P> cont
152152
}
153153

154154
protected boolean addOwnerReference() {
155-
return creatable && !deletable;
155+
return creatable && deletable && garbageCollected;
156156
}
157157

158158
@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: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
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
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1312
import io.javaoperatorsdk.operator.processing.event.source.PrimaryToSecondaryMapper;
1413

1514
@KubernetesDependent(labelSelector = "dependent = cm1")
1615
public class ConfigMapDependentResource1 extends
17-
CRUKubernetesDependentResource<ConfigMap, OrderedManagedDependentCustomResource>
18-
implements PrimaryToSecondaryMapper<OrderedManagedDependentCustomResource> {
16+
io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource<ConfigMap, OrderedManagedDependentCustomResource>
17+
implements PrimaryToSecondaryMapper<OrderedManagedDependentCustomResource>,
18+
io.javaoperatorsdk.operator.processing.dependent.Creator<ConfigMap, OrderedManagedDependentCustomResource>,
19+
io.javaoperatorsdk.operator.processing.dependent.Updater<ConfigMap, OrderedManagedDependentCustomResource> {
1920

2021
public ConfigMapDependentResource1() {
2122
super(ConfigMap.class);

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
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
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1312
import io.javaoperatorsdk.operator.processing.event.source.PrimaryToSecondaryMapper;
1413

1514
@KubernetesDependent(labelSelector = "dependent = cm2")
1615
public class ConfigMapDependentResource2 extends
17-
CRUKubernetesDependentResource<ConfigMap, OrderedManagedDependentCustomResource>
18-
implements PrimaryToSecondaryMapper<OrderedManagedDependentCustomResource> {
16+
io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource<ConfigMap, OrderedManagedDependentCustomResource>
17+
implements PrimaryToSecondaryMapper<OrderedManagedDependentCustomResource>,
18+
io.javaoperatorsdk.operator.processing.dependent.Creator<ConfigMap, OrderedManagedDependentCustomResource>,
19+
io.javaoperatorsdk.operator.processing.dependent.Updater<ConfigMap, OrderedManagedDependentCustomResource> {
1920

2021
public ConfigMapDependentResource2() {
2122
super(ConfigMap.class);

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

Lines changed: 5 additions & 3 deletions
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
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1615
import io.javaoperatorsdk.operator.processing.event.source.PrimaryToSecondaryMapper;
@@ -20,8 +19,11 @@
2019

2120
// this annotation only activates when using managed dependents and is not otherwise needed
2221
@KubernetesDependent(labelSelector = WebPageManagedDependentsReconciler.SELECTOR)
23-
class ConfigMapDependentResource extends CRUKubernetesDependentResource<ConfigMap, WebPage>
24-
implements PrimaryToSecondaryMapper<WebPage> {
22+
class ConfigMapDependentResource extends
23+
io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource<ConfigMap, WebPage>
24+
implements PrimaryToSecondaryMapper<WebPage>,
25+
io.javaoperatorsdk.operator.processing.dependent.Creator<ConfigMap, WebPage>,
26+
io.javaoperatorsdk.operator.processing.dependent.Updater<ConfigMap, WebPage> {
2527

2628
private static final Logger log = LoggerFactory.getLogger(ConfigMapDependentResource.class);
2729

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
@@ -3,7 +3,6 @@
33
import io.fabric8.kubernetes.api.model.ConfigMapVolumeSourceBuilder;
44
import io.fabric8.kubernetes.api.model.apps.Deployment;
55
import io.javaoperatorsdk.operator.api.reconciler.Context;
6-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
76
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
87

98
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
@@ -12,7 +11,10 @@
1211

1312
// this annotation only activates when using managed dependents and is not otherwise needed
1413
@KubernetesDependent(labelSelector = WebPageManagedDependentsReconciler.SELECTOR)
15-
class DeploymentDependentResource extends CRUKubernetesDependentResource<Deployment, WebPage> {
14+
class DeploymentDependentResource extends
15+
io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource<Deployment, WebPage>
16+
implements io.javaoperatorsdk.operator.processing.dependent.Creator<Deployment, WebPage>,
17+
io.javaoperatorsdk.operator.processing.dependent.Updater<Deployment, WebPage> {
1618

1719
public DeploymentDependentResource() {
1820
super(Deployment.class);

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
44
import io.javaoperatorsdk.operator.api.reconciler.Context;
5-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
65

76
import static io.javaoperatorsdk.operator.sample.Utils.*;
87

9-
public class IngressDependentResource extends CRUKubernetesDependentResource<Ingress, WebPage> {
8+
public class IngressDependentResource extends
9+
io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource<Ingress, WebPage>
10+
implements io.javaoperatorsdk.operator.processing.dependent.Creator<Ingress, WebPage>,
11+
io.javaoperatorsdk.operator.processing.dependent.Updater<Ingress, WebPage> {
1012

1113
public IngressDependentResource() {
1214
super(Ingress.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;
@@ -14,7 +13,10 @@
1413

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

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

0 commit comments

Comments
 (0)