Skip to content

Commit 91c4646

Browse files
committed
refactor: put the reconciling logic in DependentResourceController
1 parent 94f546a commit 91c4646

File tree

3 files changed

+76
-68
lines changed

3 files changed

+76
-68
lines changed

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

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
package io.javaoperatorsdk.operator.processing.dependent;
22

3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
36
import io.fabric8.kubernetes.api.model.HasMetadata;
47
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfiguration;
58
import io.javaoperatorsdk.operator.api.reconciler.Context;
9+
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
610
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
11+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
12+
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
713
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
814
import io.javaoperatorsdk.operator.api.reconciler.dependent.Persister;
915
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
1016

1117
public class DependentResourceController<R, P extends HasMetadata, C extends DependentResourceConfiguration<R, P>>
12-
implements DependentResource<R, P>, Persister<R, P> {
18+
implements DependentResource<R, P>, Persister<R, P>, Reconciler<P> {
19+
20+
private static final Logger log = LoggerFactory.getLogger(DependentResourceController.class);
1321

1422
private final Persister<R, P> persister;
1523
private final DependentResource<R, P> delegate;
1624
private final C configuration;
17-
25+
1826
public DependentResourceController(DependentResource<R, P> delegate, C configuration) {
1927
this.delegate = delegate;
2028
persister = initPersister(delegate);
@@ -77,4 +85,48 @@ public R getFor(P primary, Context context) {
7785
public C getConfiguration() {
7886
return configuration;
7987
}
88+
89+
@Override
90+
public UpdateControl<P> reconcile(P resource, Context context) {
91+
var actual = getFor(resource, context);
92+
if (actual == null || !match(actual, resource, context)) {
93+
final var desired = desired(resource, context);
94+
if (desired != null) {
95+
createOrReplaceDependent(resource, desired, context);
96+
}
97+
}
98+
return UpdateControl.noUpdate();
99+
}
100+
101+
@Override
102+
public DeleteControl cleanup(P primary, Context context) {
103+
var dependent = getFor(primary, context);
104+
if (dependent != null) {
105+
delete(dependent, primary, context);
106+
logOperationInfo(primary, dependent, "Deleting");
107+
} else {
108+
log.info("Ignoring already deleted {} for '{}' {}",
109+
getResourceType().getName(),
110+
primary.getMetadata().getName(),
111+
primary.getKind());
112+
}
113+
return Reconciler.super.cleanup(primary, context);
114+
}
115+
116+
protected void createOrReplaceDependent(P primary, R dependent, Context context) {
117+
logOperationInfo(primary, dependent, "Reconciling");
118+
119+
// commit the changes
120+
// todo: add metrics timing for dependent resource
121+
createOrReplace(dependent, context);
122+
}
123+
124+
private void logOperationInfo(P resource, R dependentResource, String operationDescription) {
125+
if (log.isInfoEnabled()) {
126+
log.info("{} {} for '{}' {}", operationDescription,
127+
descriptionFor(dependentResource),
128+
resource.getMetadata().getName(),
129+
resource.getKind());
130+
}
131+
}
80132
}

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

Lines changed: 12 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
import java.util.ArrayList;
55
import java.util.List;
66

7-
import org.slf4j.Logger;
8-
import org.slf4j.LoggerFactory;
9-
107
import io.fabric8.kubernetes.api.model.HasMetadata;
118
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
129
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfiguration;
@@ -26,23 +23,20 @@
2623

2724
@SuppressWarnings({"rawtypes", "unchecked"})
2825
@Ignore
29-
public class DependentResourceManager<R extends HasMetadata> implements EventSourceInitializer<R>,
30-
EventSourceContextInjector, Reconciler<R> {
31-
32-
private static final Logger log = LoggerFactory.getLogger(DependentResourceManager.class);
33-
34-
private final Reconciler<R> reconciler;
35-
private final ControllerConfiguration<R> configuration;
26+
public class DependentResourceManager<P extends HasMetadata> implements EventSourceInitializer<P>,
27+
EventSourceContextInjector, Reconciler<P> {
28+
private final Reconciler<P> reconciler;
29+
private final ControllerConfiguration<P> configuration;
3630
private List<DependentResourceController> dependents;
3731

3832

39-
public DependentResourceManager(Controller<R> controller) {
33+
public DependentResourceManager(Controller<P> controller) {
4034
this.reconciler = controller.getReconciler();
4135
this.configuration = controller.getConfiguration();
4236
}
4337

4438
@Override
45-
public List<EventSource> prepareEventSources(EventSourceContext<R> context) {
39+
public List<EventSource> prepareEventSources(EventSourceContext<P> context) {
4640
final List<DependentResourceConfiguration> configured = configuration.getDependentResources();
4741
dependents = new ArrayList<>(configured.size());
4842

@@ -65,71 +59,23 @@ public void injectInto(EventSourceContext context) {
6559
}
6660

6761
@Override
68-
public UpdateControl<R> reconcile(R resource, Context context) {
62+
public UpdateControl<P> reconcile(P resource, Context context) {
6963
initContextIfNeeded(resource, context);
70-
71-
dependents.forEach(dependent -> {
72-
var actual = dependent.getFor(resource, context);
73-
if (actual == null || !dependent.match(actual, resource, context)) {
74-
final var desired = dependent.desired(resource, context);
75-
if (desired != null) {
76-
createOrReplaceDependent(resource, context, dependent, desired);
77-
}
78-
}
79-
});
80-
64+
dependents.forEach(dependent -> dependent.reconcile(resource, context));
8165
return UpdateControl.noUpdate();
8266
}
8367

8468
@Override
85-
public DeleteControl cleanup(R resource, Context context) {
69+
public DeleteControl cleanup(P resource, Context context) {
8670
initContextIfNeeded(resource, context);
87-
88-
dependents.forEach(dependent -> {
89-
var dependentResource = dependent.getFor(resource, context);
90-
if (dependentResource != null) {
91-
dependent.delete(dependentResource, resource, context);
92-
logOperationInfo(resource, dependent, dependentResource, "Deleting");
93-
} else {
94-
log.info("Ignoring already deleted {} for '{}' {}",
95-
dependent.getResourceType().getName(),
96-
resource.getMetadata().getName(),
97-
configuration.getResourceTypeName());
98-
}
99-
});
100-
71+
dependents.forEach(dependent -> dependent.cleanup(resource, context));
10172
return Reconciler.super.cleanup(resource, context);
10273
}
10374

104-
private void createOrReplaceDependent(R primaryResource,
105-
Context context, DependentResourceController dependentController,
106-
Object dependentResource) {
107-
// add owner reference if needed
108-
if (dependentResource instanceof HasMetadata
109-
&& ((KubernetesDependentResourceController) dependentController).owned()) {
110-
((HasMetadata) dependentResource).addOwnerReference(primaryResource);
111-
}
112-
113-
logOperationInfo(primaryResource, dependentController, dependentResource, "Reconciling");
114-
115-
// commit the changes
116-
// todo: add metrics timing for dependent resource
117-
dependentController.createOrReplace(dependentResource, context);
118-
}
119-
120-
private void logOperationInfo(R resource, DependentResourceController dependent,
121-
Object dependentResource, String operationDescription) {
122-
if (log.isInfoEnabled()) {
123-
log.info("{} {} for '{}' {}", operationDescription,
124-
dependent.descriptionFor(dependentResource),
125-
resource.getMetadata().getName(),
126-
configuration.getResourceTypeName());
127-
}
128-
}
12975

130-
private void initContextIfNeeded(R resource, Context context) {
76+
private void initContextIfNeeded(P resource, Context context) {
13177
if (reconciler instanceof ContextInitializer) {
132-
final var initializer = (ContextInitializer<R>) reconciler;
78+
final var initializer = (ContextInitializer<P>) reconciler;
13379
initializer.initContext(resource, context);
13480
}
13581
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class KubernetesDependentResourceController<R extends HasMetadata, P exte
2121
private InformerEventSource<R, P> informer;
2222

2323

24+
@SuppressWarnings("unchecked")
2425
public KubernetesDependentResourceController(DependentResource<R, P> delegate,
2526
KubernetesDependentResourceConfiguration<R, P> configuration) {
2627
super(delegate, configuration);
@@ -43,6 +44,7 @@ public KubernetesDependentResourceController(DependentResource<R, P> delegate,
4344
configuration.getDependentResourceClass());
4445
}
4546

47+
@SuppressWarnings("unchecked")
4648
@Override
4749
protected Persister<R, P> initPersister(DependentResource<R, P> delegate) {
4850
return (delegate instanceof Persister) ? (Persister<R, P>) delegate : this;
@@ -75,4 +77,12 @@ public R getFor(P primary, Context context) {
7577
public boolean owned() {
7678
return getConfiguration().isOwned();
7779
}
80+
81+
@Override
82+
protected void createOrReplaceDependent(P primary, R dependent, Context context) {
83+
if (owned()) {
84+
dependent.addOwnerReference(primary);
85+
}
86+
super.createOrReplaceDependent(primary, dependent, context);
87+
}
7888
}

0 commit comments

Comments
 (0)