Skip to content

Commit 4e350ec

Browse files
authored
feat: add owner reference automatic config (#1083)
1 parent a5e55b0 commit 4e350ec

File tree

8 files changed

+30
-59
lines changed

8 files changed

+30
-59
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,8 @@ public static <T> T valueOrDefault(
156156
this.getNamespaces().toArray(new String[0]));
157157
final var labelSelector =
158158
Utils.valueOrDefault(kubeDependent, KubernetesDependent::labelSelector, null);
159-
final var addOwnerReference =
160-
Utils.valueOrDefault(
161-
kubeDependent,
162-
KubernetesDependent::addOwnerReference,
163-
KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT);
164159
config =
165-
new KubernetesDependentResourceConfig(addOwnerReference, namespaces, labelSelector);
160+
new KubernetesDependentResourceConfig(namespaces, labelSelector);
166161
}
167162
specs.add(new DependentResourceSpec(dependentType, config));
168163
}

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

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ public abstract class AbstractDependentResource<R, P extends HasMetadata>
1212
implements DependentResource<R, P> {
1313
private static final Logger log = LoggerFactory.getLogger(AbstractDependentResource.class);
1414

15-
private final boolean creatable = this instanceof Creator;
16-
private final boolean updatable = this instanceof Updater;
15+
protected final boolean creatable = this instanceof Creator;
16+
protected final boolean updatable = this instanceof Updater;
17+
protected final boolean deletable = this instanceof Deleter;
1718
protected Creator<R, P> creator;
1819
protected Updater<R, P> updater;
1920

@@ -25,20 +26,18 @@ public AbstractDependentResource() {
2526

2627
@Override
2728
public ReconcileResult<R> reconcile(P primary, Context<P> context) {
28-
final var isCreatable = isCreatable(primary, context);
29-
final var isUpdatable = isUpdatable(primary, context);
3029
var maybeActual = getResource(primary);
31-
if (isCreatable || isUpdatable) {
30+
if (creatable || updatable) {
3231
if (maybeActual.isEmpty()) {
33-
if (isCreatable) {
32+
if (creatable) {
3433
var desired = desired(primary, context);
3534
log.debug("Creating dependent {} for primary {}", desired, primary);
3635
var createdResource = handleCreate(desired, primary, context);
3736
return ReconcileResult.resourceCreated(createdResource);
3837
}
3938
} else {
4039
final var actual = maybeActual.get();
41-
if (isUpdatable) {
40+
if (updatable) {
4241
final var match = updater.match(actual, primary, context);
4342
if (!match.matched()) {
4443
final var desired = match.computedDesired().orElse(desired(primary, context));
@@ -149,15 +148,4 @@ protected R desired(P primary, Context<P> context) {
149148
throw new IllegalStateException(
150149
"desired method must be implemented if this DependentResource can be created and/or updated");
151150
}
152-
153-
@SuppressWarnings("unused")
154-
protected boolean isCreatable(P primary, Context<P> context) {
155-
return creatable;
156-
}
157-
158-
@SuppressWarnings("unused")
159-
protected boolean isUpdatable(P primary, Context<P> context) {
160-
return updatable;
161-
}
162-
163151
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@
1111
@Target({ElementType.TYPE})
1212
public @interface KubernetesDependent {
1313

14-
boolean ADD_OWNER_REFERENCE_DEFAULT = true;
15-
16-
boolean addOwnerReference() default ADD_OWNER_REFERENCE_DEFAULT;
17-
1814
/**
1915
* Specified which namespaces this Controller monitors for custom resources events. If no
2016
* namespace is specified then the controller will monitor the namespaces configured for the

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public abstract class KubernetesDependentResource<R extends HasMetadata, P exten
3737

3838
protected KubernetesClient client;
3939
private InformerEventSource<R, P> informerEventSource;
40-
private boolean addOwnerReference;
4140
private final Matcher<R, P> matcher;
4241
private final ResourceUpdatePreProcessor<R> processor;
4342
private final Class<R> resourceType;
@@ -55,12 +54,11 @@ public KubernetesDependentResource(Class<R> resourceType) {
5554

5655
@Override
5756
public void configureWith(KubernetesDependentResourceConfig config) {
58-
configureWith(config.labelSelector(), Set.of(config.namespaces()), config.addOwnerReference());
57+
configureWith(config.labelSelector(), Set.of(config.namespaces()));
5958
}
6059

6160
@SuppressWarnings("unchecked")
62-
private void configureWith(String labelSelector, Set<String> namespaces,
63-
boolean addOwnerReference) {
61+
private void configureWith(String labelSelector, Set<String> namespaces) {
6462
final var primaryResourcesRetriever =
6563
(this instanceof SecondaryToPrimaryMapper) ? (SecondaryToPrimaryMapper<R>) this
6664
: Mappers.fromOwnerReference();
@@ -75,20 +73,18 @@ private void configureWith(String labelSelector, Set<String> namespaces,
7573
.withPrimaryResourcesRetriever(primaryResourcesRetriever)
7674
.withAssociatedSecondaryResourceIdentifier(secondaryResourceIdentifier)
7775
.build();
78-
configureWith(new InformerEventSource<>(ic, client), addOwnerReference);
76+
configureWith(new InformerEventSource<>(ic, client));
7977
}
8078

8179
/**
8280
* Use to share informers between event more resources.
8381
*
84-
* @param informerEventSource informer to use
85-
* @param addOwnerReference to the created resource
82+
* @param informerEventSource informer to use*
8683
*/
8784
public void configureWith(
88-
InformerEventSource<R, P> informerEventSource,
89-
boolean addOwnerReference) {
85+
InformerEventSource<R, P> informerEventSource) {
9086
this.informerEventSource = informerEventSource;
91-
this.addOwnerReference = addOwnerReference;
87+
9288
}
9389

9490
public R create(R target, P primary, Context<P> context) {
@@ -105,7 +101,7 @@ public Result<R> match(R actualResource, P primary, Context<P> context) {
105101
}
106102

107103
public void delete(P primary, Context<P> context) {
108-
if (!addOwnerReference) {
104+
if (!addOwnerReference()) {
109105
var resource = getResource(primary);
110106
resource.ifPresent(r -> client.resource(r).delete());
111107
}
@@ -118,7 +114,7 @@ protected NonNamespaceOperation<R, KubernetesResourceList<R>, Resource<R>> prepa
118114
actionName,
119115
desired.getClass(),
120116
ResourceID.fromResource(desired));
121-
if (addOwnerReference) {
117+
if (addOwnerReference()) {
122118
desired.addOwnerReference(primary);
123119
}
124120
Class<R> targetClass = (Class<R>) desired.getClass();
@@ -128,7 +124,7 @@ protected NonNamespaceOperation<R, KubernetesResourceList<R>, Resource<R>> prepa
128124
@Override
129125
public EventSource initEventSource(EventSourceContext<P> context) {
130126
if (informerEventSource == null) {
131-
configureWith(null, null, KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT);
127+
configureWith(null, null);
132128
log.warn("Using default configuration for " + resourceType().getSimpleName()
133129
+ " KubernetesDependentResource, call configureWith to provide configuration");
134130
}
@@ -141,6 +137,10 @@ public KubernetesDependentResource<R, P> setInformerEventSource(
141137
return this;
142138
}
143139

140+
protected boolean addOwnerReference() {
141+
return creatable && !deletable;
142+
}
143+
144144
@Override
145145
public Class<R> resourceType() {
146146
return resourceType;

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

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,20 @@
11
package io.javaoperatorsdk.operator.processing.dependent.kubernetes;
22

33
import static io.javaoperatorsdk.operator.api.reconciler.Constants.EMPTY_STRING;
4-
import static io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT;
54

65
public class KubernetesDependentResourceConfig {
76

8-
private boolean addOwnerReference = ADD_OWNER_REFERENCE_DEFAULT;
97
private String[] namespaces = new String[0];
108
private String labelSelector = EMPTY_STRING;
119

1210
public KubernetesDependentResourceConfig() {}
1311

14-
public KubernetesDependentResourceConfig(boolean addOwnerReference, String[] namespaces,
12+
public KubernetesDependentResourceConfig(String[] namespaces,
1513
String labelSelector) {
16-
this.addOwnerReference = addOwnerReference;
1714
this.namespaces = namespaces;
1815
this.labelSelector = labelSelector;
1916
}
2017

21-
public KubernetesDependentResourceConfig setAddOwnerReference(
22-
boolean addOwnerReference) {
23-
this.addOwnerReference = addOwnerReference;
24-
return this;
25-
}
26-
2718
public KubernetesDependentResourceConfig setNamespaces(String[] namespaces) {
2819
this.namespaces = namespaces;
2920
return this;
@@ -34,10 +25,6 @@ public KubernetesDependentResourceConfig setLabelSelector(String labelSelector)
3425
return this;
3526
}
3627

37-
public boolean addOwnerReference() {
38-
return addOwnerReference;
39-
}
40-
4128
public String[] namespaces() {
4229
return namespaces;
4330
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public void delete(CleanerForManagedDependentCustomResource primary,
3838
numberOfCleanupExecutions.incrementAndGet();
3939
}
4040

41+
@Override
42+
protected boolean addOwnerReference() {
43+
return true;
44+
}
45+
4146
public static int getNumberOfCleanupExecutions() {
4247
return numberOfCleanupExecutions.get();
4348
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
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.CRUDKubernetesDependentResource;
6+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
77
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
88

99
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
@@ -12,7 +12,7 @@
1212

1313
// this annotation only activates when using managed dependents and is not otherwise needed
1414
@KubernetesDependent(labelSelector = WebPageManagedDependentsReconciler.SELECTOR)
15-
class DeploymentDependentResource extends CRUDKubernetesDependentResource<Deployment, WebPage> {
15+
class DeploymentDependentResource extends CRUKubernetesDependentResource<Deployment, WebPage> {
1616

1717
public DeploymentDependentResource() {
1818
super(Deployment.class);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
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.CRUDKubernetesDependentResource;
8+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
99
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
1010

1111
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
@@ -14,7 +14,7 @@
1414

1515
// this annotation only activates when using managed dependents and is not otherwise needed
1616
@KubernetesDependent(labelSelector = WebPageManagedDependentsReconciler.SELECTOR)
17-
class ServiceDependentResource extends CRUDKubernetesDependentResource<Service, WebPage> {
17+
class ServiceDependentResource extends CRUKubernetesDependentResource<Service, WebPage> {
1818

1919
public ServiceDependentResource() {
2020
super(Service.class);

0 commit comments

Comments
 (0)