Skip to content

Commit 20b97b7

Browse files
committed
refactor: WebappReconciler doesn't use dependent resources anymore
This is meant to show that you can still write reconcilers without the dependent resource support.
1 parent b2c51cf commit 20b97b7

File tree

3 files changed

+43
-24
lines changed

3 files changed

+43
-24
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ public String descriptionFor(R resource) {
5454
@Override
5555
public EventSource initEventSource(EventSourceContext<P> context) {
5656
this.client = context.getClient();
57-
informer =
58-
new InformerEventSource<>(client.resources(getResourceType()), configuration, context);
57+
informer = new InformerEventSource<>(configuration, context);
5958
return informer;
6059
}
6160

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
import java.util.stream.Stream;
66

77
import io.fabric8.kubernetes.api.model.HasMetadata;
8-
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
9-
import io.fabric8.kubernetes.client.dsl.MixedOperation;
10-
import io.fabric8.kubernetes.client.dsl.Resource;
118
import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
129
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
1310
import io.javaoperatorsdk.operator.processing.event.Event;
@@ -21,22 +18,20 @@ public class InformerEventSource<T extends HasMetadata, P extends HasMetadata>
2118

2219
private final InformerConfiguration<T, P> configuration;
2320

24-
public InformerEventSource(MixedOperation<T, KubernetesResourceList<T>, Resource<T>> client,
25-
InformerConfiguration<T, P> configuration, EventSourceContext<P> context) {
26-
super(client, configuration);
21+
public InformerEventSource(InformerConfiguration<T, P> configuration,
22+
EventSourceContext<P> context) {
23+
super(context.getClient().resources(configuration.getResourceClass()), configuration);
2724
this.configuration = configuration;
2825

2926
// init mappers with context if needed
30-
if (context != null) {
31-
final var primaryResourcesRetriever = configuration.getPrimaryResourcesRetriever();
32-
if (primaryResourcesRetriever instanceof EventSourceContextAware) {
33-
((EventSourceContextAware) primaryResourcesRetriever).initWith(context);
34-
}
27+
final var primaryResourcesRetriever = configuration.getPrimaryResourcesRetriever();
28+
if (primaryResourcesRetriever instanceof EventSourceContextAware) {
29+
((EventSourceContextAware) primaryResourcesRetriever).initWith(context);
30+
}
3531

36-
final var associatedResourceIdentifier = configuration.getAssociatedResourceIdentifier();
37-
if (associatedResourceIdentifier instanceof EventSourceContextAware) {
38-
((EventSourceContextAware) associatedResourceIdentifier).initWith(context);
39-
}
32+
final var associatedResourceIdentifier = configuration.getAssociatedResourceIdentifier();
33+
if (associatedResourceIdentifier instanceof EventSourceContextAware) {
34+
((EventSourceContextAware) associatedResourceIdentifier).initWith(context);
4035
}
4136
}
4237

sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/WebappReconciler.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.concurrent.ExecutionException;
88
import java.util.concurrent.TimeUnit;
99
import java.util.concurrent.TimeoutException;
10+
import java.util.stream.Collectors;
1011

1112
import org.slf4j.Logger;
1213
import org.slf4j.LoggerFactory;
@@ -16,26 +17,50 @@
1617
import io.fabric8.kubernetes.client.KubernetesClient;
1718
import io.fabric8.kubernetes.client.dsl.ExecListener;
1819
import io.fabric8.kubernetes.client.dsl.ExecWatch;
19-
import io.javaoperatorsdk.operator.api.config.Dependent;
2020
import io.javaoperatorsdk.operator.api.reconciler.Context;
2121
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
2222
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
23+
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
24+
import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer;
2325
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
2426
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
27+
import io.javaoperatorsdk.operator.processing.event.ResourceID;
28+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
29+
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerConfiguration;
30+
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
2531

26-
@ControllerConfiguration(
27-
eventFilters = CustomFilter.class,
28-
dependents = @Dependent(resourceType = Tomcat.class, type = TomcatDependentResource.class))
29-
public class WebappReconciler implements Reconciler<Webapp> {
32+
@ControllerConfiguration(eventFilters = {CustomFilter.class})
33+
public class WebappReconciler implements Reconciler<Webapp>, EventSourceInitializer<Webapp> {
3034

31-
private final KubernetesClient kubernetesClient;
35+
private static final Logger log = LoggerFactory.getLogger(WebappReconciler.class);
3236

33-
private final Logger log = LoggerFactory.getLogger(getClass());
37+
private final KubernetesClient kubernetesClient;
3438

3539
public WebappReconciler(KubernetesClient kubernetesClient) {
3640
this.kubernetesClient = kubernetesClient;
3741
}
3842

43+
@Override
44+
public List<EventSource> prepareEventSources(EventSourceContext<Webapp> context) {
45+
return List.of(
46+
new InformerEventSource<>(
47+
new InformerConfiguration<>(context.getConfigurationService(),
48+
null,
49+
Tomcat.class,
50+
// To create an event to a related WebApp resource and trigger the reconciliation
51+
// we need to find which WebApp this Tomcat custom resource is related to.
52+
// To find the related customResourceId of the WebApp resource we traverse the cache
53+
// and identify it based on naming convention.
54+
(Tomcat t) -> context.getPrimaryCache()
55+
.list(webApp -> webApp.getSpec().getTomcat().equals(t.getMetadata().getName()))
56+
.map(ResourceID::fromResource)
57+
.collect(Collectors.toSet()),
58+
(Webapp webapp) -> new ResourceID(webapp.getSpec().getTomcat(),
59+
webapp.getMetadata().getNamespace()),
60+
true),
61+
context));
62+
}
63+
3964
/**
4065
* This method will be called not only on changes to Webapp objects but also when Tomcat objects
4166
* change.

0 commit comments

Comments
 (0)