Skip to content

Commit 6ee3173

Browse files
authored
refactor: clean-up dependent implementation (#906)
* feat: add desired and matches methods on DependentResource This removes the need for Builder and Updater interfaces. * refactor: move classes to more coherent locations * refactor: remove DependentResourceControllerFactory * refactor: remove Cleaner interface * refactor: put the reconciling logic in DependentResourceController * refactor: return DependentResource.desired now returns Optional * chore: add @ignore to mark internal Reconciler implementations
1 parent b5098c4 commit 6ee3173

File tree

29 files changed

+327
-325
lines changed

29 files changed

+327
-325
lines changed

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import io.fabric8.kubernetes.api.model.HasMetadata;
99
import io.javaoperatorsdk.operator.ReconcilerUtils;
10+
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfiguration;
1011
import io.javaoperatorsdk.operator.api.reconciler.Constants;
11-
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceControllerFactory;
1212
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1313
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilters;
1414

@@ -54,10 +54,6 @@ default List<DependentResourceConfiguration> getDependentResources() {
5454
return Collections.emptyList();
5555
}
5656

57-
default DependentResourceControllerFactory<R> dependentFactory() {
58-
return new DependentResourceControllerFactory<>() {};
59-
}
60-
6157
default Optional<Duration> reconciliationMaxInterval() {
6258
return Optional.of(Duration.ofHours(10L));
6359
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.Set;
88

99
import io.fabric8.kubernetes.api.model.HasMetadata;
10+
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfiguration;
1011
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1112

1213
public class DefaultControllerConfiguration<R extends HasMetadata>

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

Lines changed: 0 additions & 8 deletions
This file was deleted.

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

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.javaoperatorsdk.operator.api.config.dependent;
2+
3+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
4+
5+
public @interface Dependent {
6+
7+
Class<?> resourceType();
8+
9+
Class<? extends DependentResource> type();
10+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
package io.javaoperatorsdk.operator.api.config;
1+
package io.javaoperatorsdk.operator.api.config.dependent;
22

33
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
45

56
public interface DependentResourceConfiguration<R, P extends HasMetadata> {
67

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/KubernetesDependent.java renamed to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/KubernetesDependent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator.api.config;
1+
package io.javaoperatorsdk.operator.api.config.dependent;
22

33
import java.lang.annotation.ElementType;
44
import java.lang.annotation.Retention;
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
package io.javaoperatorsdk.operator.api.reconciler.dependent;
1+
package io.javaoperatorsdk.operator.api.config.dependent;
22

33
import java.util.Set;
44

55
import io.fabric8.kubernetes.api.model.HasMetadata;
66
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
7-
import io.javaoperatorsdk.operator.api.config.DependentResource;
8-
import io.javaoperatorsdk.operator.api.config.DependentResourceConfiguration;
7+
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
8+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
99
import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryResourceIdentifier;
1010
import io.javaoperatorsdk.operator.processing.event.source.PrimaryResourcesRetriever;
11-
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerConfiguration;
1211

1312
public interface KubernetesDependentResourceConfiguration<R extends HasMetadata, P extends HasMetadata>
1413
extends InformerConfiguration<R, P>, DependentResourceConfiguration<R, P> {
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator.processing.event.source.informer;
1+
package io.javaoperatorsdk.operator.api.config.informer;
22

33
import java.util.Collections;
44
import java.util.Objects;
@@ -12,6 +12,7 @@
1212
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1313
import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryResourceIdentifier;
1414
import io.javaoperatorsdk.operator.processing.event.source.PrimaryResourcesRetriever;
15+
import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers;
1516

1617
public interface InformerConfiguration<R extends HasMetadata, P extends HasMetadata>
1718
extends ResourceConfiguration<R> {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import java.lang.annotation.Target;
77
import java.util.concurrent.TimeUnit;
88

9-
import io.javaoperatorsdk.operator.api.config.Dependent;
10-
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceController;
9+
import io.javaoperatorsdk.operator.api.config.dependent.Dependent;
10+
import io.javaoperatorsdk.operator.processing.dependent.DependentResourceController;
1111
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1212

1313
@Retention(RetentionPolicy.RUNTIME)

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

Lines changed: 0 additions & 9 deletions
This file was deleted.

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

Lines changed: 0 additions & 9 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.javaoperatorsdk.operator.api.reconciler.dependent;
2+
3+
import java.util.Optional;
4+
5+
import io.fabric8.kubernetes.api.model.HasMetadata;
6+
import io.javaoperatorsdk.operator.api.config.Utils;
7+
import io.javaoperatorsdk.operator.api.reconciler.Context;
8+
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
9+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
10+
11+
public interface DependentResource<R, P extends HasMetadata> {
12+
default EventSource initEventSource(EventSourceContext<P> context) {
13+
throw new IllegalStateException("Must be implemented if not automatically provided by the SDK");
14+
}
15+
16+
@SuppressWarnings("unchecked")
17+
default Class<R> resourceType() {
18+
return (Class<R>) Utils.getFirstTypeArgumentFromInterface(getClass());
19+
}
20+
21+
default void delete(R fetched, P primary, Context context) {}
22+
23+
/**
24+
* Computes the desired state of the dependent based on the state provided by the specified
25+
* primary resource.
26+
*
27+
* The default implementation returns {@code empty} which corresponds to the case where the
28+
* associated dependent should never be created by the associated reconciler or that the global
29+
* state of the cluster doesn't allow for the resource to be created at this point.
30+
*
31+
* @param primary the primary resource associated with the reconciliation process
32+
* @param context the {@link Context} associated with the reconciliation process
33+
* @return an instance of the dependent resource matching the desired state specified by the
34+
* primary resource or {@code empty} if the dependent shouldn't be created at this point
35+
* (or ever)
36+
*/
37+
default Optional<R> desired(P primary, Context context) {
38+
return Optional.empty();
39+
}
40+
41+
/**
42+
* Checks whether the actual resource as fetched from the cluster matches the desired state
43+
* expressed by the specified primary resource.
44+
*
45+
* The default implementation always return {@code true}, which corresponds to the behavior where
46+
* the dependent never needs to be updated after it's been created.
47+
*
48+
* Note that failure to properly implement this method will lead to infinite loops. In particular,
49+
* for typical Kubernetes resource implementations, simply calling
50+
* {@code desired(primary, context).equals(actual)} is not enough because metadata will usually be
51+
* different.
52+
*
53+
* @param actual the current state of the resource as fetched from the cluster
54+
* @param primary the primary resource associated with the reconciliation request
55+
* @param context the {@link Context} associated with the reconciliation request
56+
* @return {@code true} if the actual state of the resource matches the desired state expressed by
57+
* the specified primary resource, {@code false} otherwise
58+
*/
59+
default boolean match(R actual, P primary, Context context) {
60+
return true;
61+
}
62+
}

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

Lines changed: 0 additions & 94 deletions
This file was deleted.

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

Lines changed: 0 additions & 26 deletions
This file was deleted.

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

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)