Skip to content

Commit d8013e8

Browse files
committed
feat: record primary resource type in EventSource
1 parent 59c4d3d commit d8013e8

File tree

19 files changed

+68
-60
lines changed

19 files changed

+68
-60
lines changed

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

+9-9
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,21 @@
88
import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryRetriever;
99
import io.javaoperatorsdk.operator.processing.event.source.PrimaryResourcesRetriever;
1010

11-
public class DefaultDependentResourceConfiguration<R extends HasMetadata>
12-
extends DefaultResourceConfiguration<R, DependentResourceConfiguration<R>>
13-
implements DependentResourceConfiguration<R> {
11+
public class DefaultDependentResourceConfiguration<R extends HasMetadata, P extends HasMetadata>
12+
extends DefaultResourceConfiguration<R, DependentResourceConfiguration<R, P>>
13+
implements DependentResourceConfiguration<R, P> {
1414
private final boolean creatable;
1515
private final boolean updatable;
1616
private final boolean owned;
17-
private final PrimaryResourcesRetriever<R> associatedPrimaries;
18-
private final AssociatedSecondaryRetriever<R> associatedSecondary;
17+
private final PrimaryResourcesRetriever<R, P> associatedPrimaries;
18+
private final AssociatedSecondaryRetriever<R, P> associatedSecondary;
1919
private final boolean skipUpdateIfUnchanged;
2020

2121
public DefaultDependentResourceConfiguration(String crdName, Class<R> resourceClass,
2222
Set<String> namespaces, String labelSelector,
2323
ConfigurationService service, boolean creatable, boolean updatable, boolean owned,
24-
PrimaryResourcesRetriever<R> associatedPrimaries,
25-
AssociatedSecondaryRetriever<R> associatedSecondary, boolean skipUpdateIfUnchanged) {
24+
PrimaryResourcesRetriever<R, P> associatedPrimaries,
25+
AssociatedSecondaryRetriever<R, P> associatedSecondary, boolean skipUpdateIfUnchanged) {
2626
super(crdName, resourceClass, namespaces, labelSelector, service);
2727
this.creatable = creatable;
2828
this.updatable = updatable;
@@ -48,12 +48,12 @@ public boolean owned() {
4848
}
4949

5050
@Override
51-
public PrimaryResourcesRetriever<R> getPrimaryResourcesRetriever() {
51+
public PrimaryResourcesRetriever<R, P> getPrimaryResourcesRetriever() {
5252
return associatedPrimaries;
5353
}
5454

5555
@Override
56-
public AssociatedSecondaryRetriever<R> getAssociatedResourceRetriever() {
56+
public AssociatedSecondaryRetriever<R, P> getAssociatedResourceRetriever() {
5757
return associatedSecondary;
5858
}
5959

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import static io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfiguration.OWNED_DEFAULT;
1111
import static io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfiguration.UPDATABLE_DEFAULT;
1212

13-
public interface DependentResourceConfiguration<R extends HasMetadata>
14-
extends ResourceConfiguration<R, DependentResourceConfiguration<R>> {
13+
public interface DependentResourceConfiguration<R extends HasMetadata, P extends HasMetadata>
14+
extends ResourceConfiguration<R, DependentResourceConfiguration<R, P>> {
1515

1616
default boolean creatable() {
1717
return CREATABLE_DEFAULT;
@@ -25,11 +25,11 @@ default boolean owned() {
2525
return OWNED_DEFAULT;
2626
}
2727

28-
default PrimaryResourcesRetriever<R> getPrimaryResourcesRetriever() {
28+
default PrimaryResourcesRetriever<R, P> getPrimaryResourcesRetriever() {
2929
return Mappers.fromOwnerReference();
3030
}
3131

32-
AssociatedSecondaryRetriever<R> getAssociatedResourceRetriever();
32+
AssociatedSecondaryRetriever<R, P> getAssociatedResourceRetriever();
3333

3434
default boolean skipUpdateIfUnchanged() {
3535
return true;

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77
import io.javaoperatorsdk.operator.processing.event.source.ResourceCache;
88
import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource;
99

10-
public class DependentResource<R extends HasMetadata> {
10+
public class DependentResource<R extends HasMetadata, P extends HasMetadata> {
1111

12-
private final DefaultDependentResourceConfiguration<R> configuration;
12+
private final DefaultDependentResourceConfiguration<R, P> configuration;
1313
private final Builder<R> builder;
1414
private final Updater<R> updater;
1515
private final Fetcher<R> fetcher;
16-
private ResourceEventSource<R> source;
16+
private ResourceEventSource<R, P> source;
1717

18-
public DependentResource(DefaultDependentResourceConfiguration<R> configuration,
18+
public DependentResource(DefaultDependentResourceConfiguration<R, P> configuration,
1919
Builder<R> builder, Updater<R> updater, Fetcher<R> fetcher) {
2020
this.configuration = configuration;
2121
this.builder = builder;
@@ -39,7 +39,7 @@ public R fetchFor(HasMetadata owner) {
3939
return getCache().get(ResourceID.fromResource(owner)).orElse(null);
4040
}
4141

42-
public DependentResourceConfiguration<R> getConfiguration() {
42+
public DependentResourceConfiguration<R, P> getConfiguration() {
4343
return configuration;
4444
}
4545

@@ -51,7 +51,7 @@ public R update(R fetched) {
5151
throw new IllegalStateException("Should not be called if DependentResource is not updatable");
5252
}
5353

54-
public void setSource(ResourceEventSource<R> source) {
54+
public void setSource(ResourceEventSource<R, P> source) {
5555
this.source = source;
5656
}
5757
}

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ public HasMetadata fetchFor(HasMetadata owner, ResourceCache cache) {
8989
}
9090
}
9191

92-
final class DEFAULT_PRIMARIES_RETRIEVER implements PrimaryResourcesRetriever<HasMetadata> {
92+
final class DEFAULT_PRIMARIES_RETRIEVER
93+
implements PrimaryResourcesRetriever<HasMetadata, HasMetadata> {
9394

9495
@Override
9596
public Set<ResourceID> associatedPrimaryResources(HasMetadata dependentResource,
@@ -98,7 +99,8 @@ public Set<ResourceID> associatedPrimaryResources(HasMetadata dependentResource,
9899
}
99100
}
100101

101-
final class DEFAULT_SECONDARY_RETRIEVER implements AssociatedSecondaryRetriever<HasMetadata> {
102+
final class DEFAULT_SECONDARY_RETRIEVER
103+
implements AssociatedSecondaryRetriever<HasMetadata, HasMetadata> {
102104

103105
@Override
104106
public HasMetadata associatedSecondary(HasMetadata primary, EventSourceRegistry registry) {
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
package io.javaoperatorsdk.operator.processing.event.source;
22

3+
import io.fabric8.kubernetes.api.model.HasMetadata;
34
import io.javaoperatorsdk.operator.processing.event.EventHandler;
45

5-
public abstract class AbstractEventSource implements EventSource {
6+
public abstract class AbstractEventSource<P extends HasMetadata> implements EventSource<P> {
67

78
protected volatile EventHandler eventHandler;
8-
protected volatile EventSourceRegistry eventSourceRegistry;
9+
protected volatile EventSourceRegistry<P> eventSourceRegistry;
910

1011
@Override
1112
public void setEventHandler(EventHandler eventHandler) {
1213
this.eventHandler = eventHandler;
1314
}
1415

1516
@Override
16-
public void setEventRegistry(EventSourceRegistry registry) {
17+
public void setEventRegistry(EventSourceRegistry<P> registry) {
1718
this.eventSourceRegistry = registry;
1819
}
1920

2021
@Override
21-
public EventSourceRegistry getEventRegistry() {
22+
public EventSourceRegistry<P> getEventRegistry() {
2223
return eventSourceRegistry;
2324
}
2425
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID;
2323
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getVersion;
2424

25-
public abstract class AbstractResourceEventSource<T extends HasMetadata, U extends ResourceConfiguration<T, U>, V extends EventSourceWrapper<T>>
26-
extends AbstractEventSource implements ResourceEventHandler<T>, ResourceEventSource<T> {
25+
public abstract class AbstractResourceEventSource<T extends HasMetadata, U extends ResourceConfiguration<T, U>, V extends EventSourceWrapper<T>, P extends HasMetadata>
26+
extends AbstractEventSource<P> implements ResourceEventHandler<T>, ResourceEventSource<T, P> {
2727

2828
private static final String ANY_NAMESPACE_MAP_KEY = "anyNamespace";
2929
private static final Logger log = LoggerFactory.getLogger(AbstractResourceEventSource.class);

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
import io.fabric8.kubernetes.api.model.HasMetadata;
44

55
@FunctionalInterface
6-
public interface AssociatedSecondaryRetriever<T extends HasMetadata> {
7-
T associatedSecondary(HasMetadata primary, EventSourceRegistry registry);
6+
public interface AssociatedSecondaryRetriever<T extends HasMetadata, P extends HasMetadata> {
7+
T associatedSecondary(P primary, EventSourceRegistry<P> registry);
88
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717
public class ControllerResourceEventSource<T extends HasMetadata>
1818
extends
19-
AbstractResourceEventSource<T, ControllerConfiguration<T>, InformerEventSourceWrapper<T>> {
19+
AbstractResourceEventSource<T, ControllerConfiguration<T>, InformerEventSourceWrapper<T>, T> {
2020

2121
public static final String ANY_NAMESPACE_MAP_KEY = "anyNamespace";
2222

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package io.javaoperatorsdk.operator.processing.event.source;
22

3+
import io.fabric8.kubernetes.api.model.HasMetadata;
34
import io.javaoperatorsdk.operator.processing.LifecycleAware;
45
import io.javaoperatorsdk.operator.processing.event.EventHandler;
56
import io.javaoperatorsdk.operator.processing.event.ResourceID;
67

7-
public interface EventSource extends LifecycleAware {
8+
public interface EventSource<P extends HasMetadata> extends LifecycleAware {
89

910
void setEventHandler(EventHandler eventHandler);
1011

11-
void setEventRegistry(EventSourceRegistry registry);
12+
void setEventRegistry(EventSourceRegistry<P> registry);
1213

13-
EventSourceRegistry getEventRegistry();
14+
EventSourceRegistry<P> getEventRegistry();
1415

1516
/**
1617
* Automatically called when a custom resource is deleted from the cluster.

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface EventSourceRegistry<T extends HasMetadata> {
1515
* registered.
1616
* @throws OperatorException if an error occurred during the registration process
1717
*/
18-
void registerEventSource(EventSource eventSource)
18+
void registerEventSource(EventSource<? extends HasMetadata> eventSource)
1919
throws IllegalStateException, OperatorException;
2020

2121
Set<EventSource> getRegisteredEventSources();

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

+10-9
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,37 @@
1313
import io.javaoperatorsdk.operator.processing.event.Event;
1414
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1515

16-
public class InformerEventSource<T extends HasMetadata> extends AbstractEventSource {
16+
public class InformerEventSource<T extends HasMetadata, P extends HasMetadata>
17+
extends AbstractEventSource<P> {
1718

1819
private static final Logger log = LoggerFactory.getLogger(InformerEventSource.class);
1920

2021
private final SharedInformer<T> sharedInformer;
21-
private final PrimaryResourcesRetriever<T> associatedPrimaries;
22-
private final AssociatedSecondaryRetriever<T> associatedWith;
22+
private final PrimaryResourcesRetriever<T, P> associatedPrimaries;
23+
private final AssociatedSecondaryRetriever<T, P> associatedWith;
2324
private final boolean skipUpdateEventPropagationIfNoChange;
2425
private final ResourceCache<T> cache;
2526

2627
public InformerEventSource(SharedInformer<T> sharedInformer,
27-
PrimaryResourcesRetriever<T> associatedPrimaries, Cloner cloner) {
28+
PrimaryResourcesRetriever<T, P> associatedPrimaries, Cloner cloner) {
2829
this(sharedInformer, associatedPrimaries, null, true, cloner);
2930
}
3031

3132
public InformerEventSource(KubernetesClient client, Class<T> type,
32-
PrimaryResourcesRetriever<T> associatedPrimaries, Cloner cloner) {
33+
PrimaryResourcesRetriever<T, P> associatedPrimaries, Cloner cloner) {
3334
this(client, type, associatedPrimaries, false, cloner);
3435
}
3536

3637
InformerEventSource(KubernetesClient client, Class<T> type,
37-
PrimaryResourcesRetriever<T> associatedPrimaries,
38+
PrimaryResourcesRetriever<T, P> associatedPrimaries,
3839
boolean skipUpdateEventPropagationIfNoChange, Cloner cloner) {
3940
this(client.informers().sharedIndexInformerFor(type, 0), associatedPrimaries, null,
4041
skipUpdateEventPropagationIfNoChange, cloner);
4142
}
4243

4344
public InformerEventSource(SharedInformer<T> sharedInformer,
44-
PrimaryResourcesRetriever<T> associatedPrimaries,
45-
AssociatedSecondaryRetriever<T> associatedWith,
45+
PrimaryResourcesRetriever<T, P> associatedPrimaries,
46+
AssociatedSecondaryRetriever<T, P> associatedWith,
4647
boolean skipUpdateEventPropagationIfNoChange,
4748
Cloner cloner) {
4849
this.sharedInformer = sharedInformer;
@@ -121,7 +122,7 @@ public ResourceCache<T> getCache() {
121122
* @param resource the primary resource we want to retrieve the associated resource for
122123
* @return the informed resource associated with the specified primary resource
123124
*/
124-
public T getAssociated(HasMetadata resource) {
125+
public T getAssociated(P resource) {
125126
return associatedWith.associatedSecondary(resource, eventSourceRegistry);
126127
}
127128

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

+5-4
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@
1111
import io.javaoperatorsdk.operator.api.config.Cloner;
1212
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1313

14-
public class InformerEventSourceEventSourceWrapper<T extends HasMetadata> implements
14+
public class InformerEventSourceEventSourceWrapper<T extends HasMetadata, P extends HasMetadata>
15+
implements
1516
EventSourceWrapper<T> {
1617

17-
private final InformerEventSource<T> source;
18+
private final InformerEventSource<T, P> source;
1819
private final InformerResourceCache<T> cache;
1920

2021
public InformerEventSourceEventSourceWrapper(
2122
FilterWatchListDeletable<T, KubernetesResourceList<T>> client, Cloner cloner,
22-
PrimaryResourcesRetriever<T> secondaryToPrimaryResourcesIdSet,
23-
AssociatedSecondaryRetriever<T> associatedWith,
23+
PrimaryResourcesRetriever<T, P> secondaryToPrimaryResourcesIdSet,
24+
AssociatedSecondaryRetriever<T, P> associatedWith,
2425
boolean skipUpdateEventPropagationIfNoChange) {
2526
final var informer = client.runnableInformer(0);
2627
source = new InformerEventSource<>(informer,

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,27 @@
88

99
public class Mappers {
1010

11-
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromAnnotation(
11+
public static <T extends HasMetadata, P extends HasMetadata> PrimaryResourcesRetriever<T, P> fromAnnotation(
1212
String nameKey) {
1313
return fromMetadata(nameKey, null, false);
1414
}
1515

16-
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromAnnotation(
16+
public static <T extends HasMetadata, P extends HasMetadata> PrimaryResourcesRetriever<T, P> fromAnnotation(
1717
String nameKey, String namespaceKey) {
1818
return fromMetadata(nameKey, namespaceKey, false);
1919
}
2020

21-
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromLabel(
21+
public static <T extends HasMetadata, P extends HasMetadata> PrimaryResourcesRetriever<T, P> fromLabel(
2222
String nameKey) {
2323
return fromMetadata(nameKey, null, true);
2424
}
2525

26-
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromLabel(
26+
public static <T extends HasMetadata, P extends HasMetadata> PrimaryResourcesRetriever<T, P> fromLabel(
2727
String nameKey, String namespaceKey) {
2828
return fromMetadata(nameKey, namespaceKey, true);
2929
}
3030

31-
private static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromMetadata(
31+
private static <T extends HasMetadata, P extends HasMetadata> PrimaryResourcesRetriever<T, P> fromMetadata(
3232
String nameKey, String namespaceKey, boolean isLabel) {
3333
return (resource, registry) -> {
3434
final var metadata = resource.getMetadata();
@@ -44,7 +44,7 @@ private static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromMetadata
4444
};
4545
}
4646

47-
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromOwnerReference() {
47+
public static <T extends HasMetadata, P extends HasMetadata> PrimaryResourcesRetriever<T, P> fromOwnerReference() {
4848
return (resource, registry) -> {
4949
var ownerReferences = resource.getMetadata().getOwnerReferences();
5050
if (!ownerReferences.isEmpty()) {

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.javaoperatorsdk.operator.processing.event.ResourceID;
77

88
@FunctionalInterface
9-
public interface PrimaryResourcesRetriever<T extends HasMetadata> {
10-
Set<ResourceID> associatedPrimaryResources(T dependentResource, EventSourceRegistry registry);
9+
public interface PrimaryResourcesRetriever<T extends HasMetadata, P extends HasMetadata> {
10+
Set<ResourceID> associatedPrimaryResources(T dependentResource,
11+
EventSourceRegistry<P> registry);
1112
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.fabric8.kubernetes.api.model.HasMetadata;
44

5-
public interface ResourceEventSource<T extends HasMetadata> extends EventSource {
5+
public interface ResourceEventSource<T extends HasMetadata, P extends HasMetadata>
6+
extends EventSource<P> {
67
ResourceCache<T> getResourceCache();
78
}

operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/AnnotationConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public List<? extends DependentResource> getDependentResources() {
142142
DEFAULT_SECONDARY_RETRIEVER.class);
143143

144144

145-
final DefaultDependentResourceConfiguration<? extends HasMetadata> configuration =
145+
final DefaultDependentResourceConfiguration configuration =
146146
new DefaultDependentResourceConfiguration(
147147
crdName, resourceType, namespaces, labelSelector, service, creatable, updatable,
148148
owned, primariesMapper, secondaryMapper,

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomReconciler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class InformerEventSourceTestCustomReconciler implements
3434
public static final String TARGET_CONFIG_MAP_KEY = "targetStatus";
3535

3636
private KubernetesClient kubernetesClient;
37-
private InformerEventSource<ConfigMap> eventSource;
37+
private InformerEventSource<ConfigMap, InformerEventSourceTestCustomResource> eventSource;
3838

3939
@Override
4040
public void prepareEventSources(EventSourceRegistry eventSourceRegistry, Cloner cloner) {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class TomcatReconciler implements Reconciler<Tomcat>, EventSourceInitiali
3838

3939
private final KubernetesClient kubernetesClient;
4040

41-
private volatile InformerEventSource<Deployment> informerEventSource;
41+
private volatile InformerEventSource<Deployment, Tomcat> informerEventSource;
4242

4343
public TomcatReconciler(KubernetesClient client) {
4444
this.kubernetesClient = client;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public WebappReconciler(KubernetesClient kubernetesClient) {
4343

4444
@Override
4545
public void prepareEventSources(EventSourceRegistry<Webapp> eventSourceRegistry, Cloner cloner) {
46-
InformerEventSource<Tomcat> tomcatEventSource =
46+
InformerEventSource<Tomcat, Webapp> tomcatEventSource =
4747
new InformerEventSource<>(kubernetesClient, Tomcat.class, (t, registry) -> {
4848
// To create an event to a related WebApp resource and trigger the reconciliation
4949
// we need to find which WebApp this Tomcat custom resource is related to.

0 commit comments

Comments
 (0)