Skip to content

Commit 73dc445

Browse files
authored
feat: extract interfaces for optional behavior of DependentResource (#949)
* feat: extract EventSourceProvider interface to clean up common use case * feat: extract DependentResourceConfigurator interface * feat: showcase configuration change
1 parent ae284ed commit 73dc445

File tree

13 files changed

+61
-37
lines changed

13 files changed

+61
-37
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public <R extends HasMetadata> void register(Reconciler<R> reconciler,
157157
* @param <R> the {@code HasMetadata} type associated with the reconciler
158158
*/
159159
public <R extends HasMetadata> void register(Reconciler<R> reconciler,
160-
Consumer<ControllerConfigurationOverrider> configOverrider) {
160+
Consumer<ControllerConfigurationOverrider<R>> configOverrider) {
161161
final var controllerConfiguration = configurationService.getConfigurationFor(reconciler);
162162
var configToOverride = ControllerConfigurationOverrider.override(controllerConfiguration);
163163
configOverrider.accept(configToOverride);
@@ -195,7 +195,8 @@ public synchronized void stop() {
195195
started = false;
196196
}
197197

198-
public synchronized void add(Controller controller) {
198+
@SuppressWarnings("unchecked")
199+
synchronized void add(Controller controller) {
199200
final var configuration = controller.getConfiguration();
200201
final var resourceTypeName = ReconcilerUtils
201202
.getResourceTypeNameWithVersion(configuration.getResourceClass());

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
1212
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1313

14+
@SuppressWarnings({"rawtypes", "unchecked", "unused"})
1415
public class ControllerConfigurationOverrider<R extends HasMetadata> {
1516

1617
private String finalizer;
@@ -21,7 +22,7 @@ public class ControllerConfigurationOverrider<R extends HasMetadata> {
2122
private ResourceEventFilter<R> customResourcePredicate;
2223
private final ControllerConfiguration<R> original;
2324
private Duration reconciliationMaxInterval;
24-
private List<DependentResourceSpec> dependentResourceSpecs;
25+
private final List<DependentResourceSpec> dependentResourceSpecs;
2526

2627
private ControllerConfigurationOverrider(ControllerConfiguration<R> original) {
2728
finalizer = original.getFinalizer();
@@ -89,7 +90,7 @@ public ControllerConfigurationOverrider<R> withReconciliationMaxInterval(
8990
}
9091

9192
public void replaceDependentResourceConfig(
92-
Class<? extends DependentResource<?, R, ?>> dependentResourceClass,
93+
Class<? extends DependentResource<?, R>> dependentResourceClass,
9394
Object dependentResourceConfig) {
9495

9596
var currentConfig =

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
66

7-
public class DependentResourceSpec<T extends DependentResource<?, ?, C>, C> {
7+
public class DependentResourceSpec<T extends DependentResource<?, ?>, C> {
88

99
private final Class<T> dependentResourceClass;
1010

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import io.javaoperatorsdk.operator.api.reconciler.Context;
55

66
public abstract class AbstractDependentResource<R, P extends HasMetadata, C>
7-
implements DependentResource<R, P, C> {
7+
implements DependentResource<R, P> {
88

99
@Override
1010
public void reconcile(P primary, Context context) {

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,11 @@
44

55
import io.fabric8.kubernetes.api.model.HasMetadata;
66
import io.javaoperatorsdk.operator.api.reconciler.Context;
7-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
8-
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
9-
10-
public interface DependentResource<R, P extends HasMetadata, C> {
11-
12-
Optional<EventSource> eventSource(EventSourceContext<P> context);
137

8+
public interface DependentResource<R, P extends HasMetadata> {
149
void reconcile(P primary, Context context);
1510

1611
void delete(P primary, Context context);
1712

1813
Optional<R> getResource(P primaryResource);
19-
20-
default void configureWith(C config) {}
2114
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.javaoperatorsdk.operator.api.reconciler.dependent;
2+
3+
public interface DependentResourceConfigurator<C> {
4+
void configureWith(C config);
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.javaoperatorsdk.operator.api.reconciler.dependent;
2+
3+
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
5+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
6+
7+
public interface EventSourceProvider<P extends HasMetadata> {
8+
9+
EventSource eventSource(EventSourceContext<P> context);
10+
}

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
2222
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
2323
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
24+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfigurator;
25+
import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider;
2426
import io.javaoperatorsdk.operator.api.reconciler.dependent.KubernetesClientAware;
2527
import io.javaoperatorsdk.operator.processing.Controller;
2628
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
@@ -49,11 +51,11 @@ public List<EventSource> prepareEventSources(EventSourceContext<P> context) {
4951
dependentResources.stream()
5052
.map(
5153
drc -> {
52-
final var dependentResource =
53-
createAndConfigureFrom(drc, context.getClient());
54-
dependentResource
55-
.eventSource(context)
56-
.ifPresent(es -> sources.add((EventSource) es));
54+
final var dependentResource = createAndConfigureFrom(drc, context.getClient());
55+
if (dependentResource instanceof EventSourceProvider) {
56+
EventSourceProvider provider = (EventSourceProvider) dependentResource;
57+
sources.add(provider.eventSource(context));
58+
}
5759
return dependentResource;
5860
})
5961
.collect(Collectors.toList());
@@ -87,11 +89,16 @@ private DependentResource createAndConfigureFrom(DependentResourceSpec dependent
8789
DependentResource dependentResource =
8890
(DependentResource) dependentResourceSpec.getDependentResourceClass()
8991
.getConstructor().newInstance();
92+
9093
if (dependentResource instanceof KubernetesClientAware) {
9194
((KubernetesClientAware) dependentResource).setKubernetesClient(client);
9295
}
93-
dependentResourceSpec.getDependentResourceConfiguration()
94-
.ifPresent(dependentResource::configureWith);
96+
97+
if (dependentResource instanceof DependentResourceConfigurator) {
98+
final var configurator = (DependentResourceConfigurator) dependentResource;
99+
dependentResourceSpec.getDependentResourceConfiguration()
100+
.ifPresent(configurator::configureWith);
101+
}
95102
return dependentResource;
96103
} catch (InstantiationException | NoSuchMethodException | IllegalAccessException
97104
| InvocationTargetException e) {

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import io.javaoperatorsdk.operator.api.reconciler.Context;
1515
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
1616
import io.javaoperatorsdk.operator.api.reconciler.dependent.AbstractDependentResource;
17+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfigurator;
18+
import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider;
1719
import io.javaoperatorsdk.operator.api.reconciler.dependent.KubernetesClientAware;
1820
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1921
import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryResourceIdentifier;
@@ -24,7 +26,8 @@
2426

2527
public abstract class KubernetesDependentResource<R extends HasMetadata, P extends HasMetadata>
2628
extends AbstractDependentResource<R, P, KubernetesDependentResourceConfig>
27-
implements KubernetesClientAware {
29+
implements KubernetesClientAware, EventSourceProvider<P>,
30+
DependentResourceConfigurator<KubernetesDependentResourceConfig> {
2831

2932
private static final Logger log = LoggerFactory.getLogger(KubernetesDependentResource.class);
3033

@@ -61,7 +64,7 @@ private void configureWith(ConfigurationService configService, String labelSelec
6164

6265
/**
6366
* Use to share informers between event more resources.
64-
*
67+
*
6568
* @param configurationService get configs
6669
* @param informerEventSource informer to use
6770
* @param addOwnerReference to the created resource
@@ -108,15 +111,15 @@ protected R update(R actual, R target, P primary, Context context) {
108111
}
109112

110113
@Override
111-
public Optional<EventSource> eventSource(EventSourceContext<P> context) {
114+
public EventSource eventSource(EventSourceContext<P> context) {
112115
initResourceMatcherIfNotSet(context.getConfigurationService());
113116
if (informerEventSource == null) {
114117
configureWith(context.getConfigurationService(), null, null,
115118
KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT);
116119
log.warn("Using default configuration for " + resourceType().getSimpleName()
117120
+ " KubernetesDependentResource, call configureWith to provide configuration");
118121
}
119-
return Optional.of(informerEventSource);
122+
return informerEventSource;
120123
}
121124

122125
public KubernetesDependentResource<R, P> setInformerEventSource(

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/standalonedependent/StandaloneDependentTestReconciler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public StandaloneDependentTestReconciler() {
2929
@Override
3030
public List<EventSource> prepareEventSources(
3131
EventSourceContext<StandaloneDependentTestCustomResource> context) {
32-
return List.of(configMapDependent.eventSource(context).get());
32+
return List.of(configMapDependent.eventSource(context));
3333
}
3434

3535
@Override

sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/MySQLSchemaOperator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ public static void main(String[] args) throws IOException {
3535

3636
MySQLSchemaReconciler schemaReconciler = new MySQLSchemaReconciler();
3737

38+
// override the default configuration
3839
operator.register(schemaReconciler,
3940
configOverrider -> configOverrider.replaceDependentResourceConfig(
4041
SchemaDependentResource.class,
41-
new ResourcePollerConfig(500, MySQLDbConfig.loadFromEnvironmentVars())));
42+
new ResourcePollerConfig(300, MySQLDbConfig.loadFromEnvironmentVars())));
4243
operator.installShutdownHook();
4344
operator.start();
4445

sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/SchemaDependentResource.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@
88
import io.javaoperatorsdk.operator.api.reconciler.Context;
99
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
1010
import io.javaoperatorsdk.operator.api.reconciler.dependent.AbstractDependentResource;
11+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfigurator;
12+
import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider;
1113
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
1214
import io.javaoperatorsdk.operator.processing.event.source.polling.PerResourcePollingEventSource;
1315
import io.javaoperatorsdk.operator.sample.schema.Schema;
1416
import io.javaoperatorsdk.operator.sample.schema.SchemaService;
1517

1618
import static java.lang.String.format;
1719

18-
public class SchemaDependentResource extends
19-
AbstractDependentResource<Schema, MySQLSchema, ResourcePollerConfig> {
20+
public class SchemaDependentResource
21+
extends AbstractDependentResource<Schema, MySQLSchema, ResourcePollerConfig>
22+
implements EventSourceProvider<MySQLSchema>,
23+
DependentResourceConfigurator<ResourcePollerConfig> {
2024

2125
private MySQLDbConfig dbConfig;
2226
private int pollPeriod = 500;
@@ -28,13 +32,13 @@ public void configureWith(ResourcePollerConfig config) {
2832
}
2933

3034
@Override
31-
public Optional<EventSource> eventSource(EventSourceContext<MySQLSchema> context) {
35+
public EventSource eventSource(EventSourceContext<MySQLSchema> context) {
3236
if (dbConfig == null) {
3337
dbConfig = MySQLDbConfig.loadFromEnvironmentVars();
3438
}
35-
return Optional.of(new PerResourcePollingEventSource<>(
39+
return new PerResourcePollingEventSource<>(
3640
new SchemaPollingResourceSupplier(dbConfig), context.getPrimaryCache(), pollPeriod,
37-
Schema.class));
41+
Schema.class);
3842
}
3943

4044
@Override

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,10 @@ public WebPageReconciler(KubernetesClient kubernetesClient) {
4040

4141
@Override
4242
public List<EventSource> prepareEventSources(EventSourceContext<WebPage> context) {
43-
List<EventSource> eventSources = new ArrayList<>(3);
44-
configMapDR.eventSource(context).ifPresent(eventSources::add);
45-
deploymentDR.eventSource(context).ifPresent(eventSources::add);
46-
serviceDR.eventSource(context).ifPresent(eventSources::add);
47-
return eventSources;
43+
return List.of(
44+
configMapDR.eventSource(context),
45+
deploymentDR.eventSource(context),
46+
serviceDR.eventSource(context));
4847
}
4948

5049
@Override

0 commit comments

Comments
 (0)