11package io .javaoperatorsdk .operator .processing .event .internal ;
22
33import java .io .IOException ;
4- import java .util .List ;
4+ import java .util .Objects ;
5+ import java .util .Set ;
6+ import java .util .function .Function ;
57
68import io .fabric8 .kubernetes .api .model .HasMetadata ;
79import io .fabric8 .kubernetes .client .KubernetesClient ;
810import io .fabric8 .kubernetes .client .informers .ResourceEventHandler ;
911import io .fabric8 .kubernetes .client .informers .SharedInformer ;
12+ import io .fabric8 .kubernetes .client .informers .cache .Cache ;
1013import io .fabric8 .kubernetes .client .informers .cache .Store ;
1114import io .javaoperatorsdk .operator .processing .event .AbstractEventSource ;
1215
1316public class InformerEventSource <T extends HasMetadata > extends AbstractEventSource {
1417
1518 private final SharedInformer <T > sharedInformer ;
16- private final ResourceToRelatedCustomResourceUIDMapper <T > mapper ;
19+ private final Function <T , Set <String >> resourceToUIDs ;
20+ private final Function <HasMetadata , T > associatedWith ;
1721 private final boolean skipUpdateEventPropagationIfNoChange ;
1822
1923 public InformerEventSource (SharedInformer <T > sharedInformer ,
20- ResourceToRelatedCustomResourceUIDMapper < T > mapper ) {
21- this (sharedInformer , mapper , true );
24+ Function < T , Set < String >> resourceToUIDs ) {
25+ this (sharedInformer , resourceToUIDs , null , true );
2226 }
2327
24- InformerEventSource (KubernetesClient client , Class <T > type ,
25- ResourceToRelatedCustomResourceUIDMapper < T > mapper ) {
26- this (client , type , mapper , false );
28+ public InformerEventSource (KubernetesClient client , Class <T > type ,
29+ Function < T , Set < String >> resourceToUIDs ) {
30+ this (client , type , resourceToUIDs , false );
2731 }
2832
2933 InformerEventSource (KubernetesClient client , Class <T > type ,
30- ResourceToRelatedCustomResourceUIDMapper < T > mapper ,
34+ Function < T , Set < String >> resourceToUIDs ,
3135 boolean skipUpdateEventPropagationIfNoChange ) {
32- this (client .informers ().sharedIndexInformerFor (type , 0 ), mapper ,
36+ this (client .informers ().sharedIndexInformerFor (type , 0 ), resourceToUIDs , null ,
3337 skipUpdateEventPropagationIfNoChange );
3438 }
3539
3640 public InformerEventSource (SharedInformer <T > sharedInformer ,
37- ResourceToRelatedCustomResourceUIDMapper <T > mapper ,
41+ Function <T , Set <String >> resourceToUIDs ,
42+ Function <HasMetadata , T > associatedWith ,
3843 boolean skipUpdateEventPropagationIfNoChange ) {
3944 this .sharedInformer = sharedInformer ;
40- this .mapper = mapper ;
45+ this .resourceToUIDs = resourceToUIDs ;
4146 this .skipUpdateEventPropagationIfNoChange = skipUpdateEventPropagationIfNoChange ;
4247
43- sharedInformer .addEventHandler (new ResourceEventHandler <T >() {
48+ this .associatedWith = Objects .requireNonNullElseGet (associatedWith , () -> cr -> {
49+ final var metadata = cr .getMetadata ();
50+ return getStore ().getByKey (Cache .namespaceKeyFunc (metadata .getNamespace (),
51+ metadata .getName ()));
52+ });
53+
54+ sharedInformer .addEventHandler (new ResourceEventHandler <>() {
4455 @ Override
4556 public void onAdd (T t ) {
4657 propagateEvent (InformerEvent .Action .ADD , t , null );
@@ -64,7 +75,7 @@ public void onDelete(T t, boolean b) {
6475 }
6576
6677 private void propagateEvent (InformerEvent .Action action , T object , T oldObject ) {
67- var uids = mapper . map (object );
78+ var uids = resourceToUIDs . apply (object );
6879 if (uids .isEmpty ()) {
6980 return ;
7081 }
@@ -88,12 +99,19 @@ public Store<T> getStore() {
8899 return sharedInformer .getStore ();
89100 }
90101
91- public SharedInformer <T > getSharedInformer () {
92- return sharedInformer ;
102+ /**
103+ * Retrieves the informed resource associated with the specified primary resource as defined by
104+ * the function provided when this InformerEventSource was created
105+ *
106+ * @param resource the primary resource we want to retrieve the associated resource for
107+ * @return the informed resource associated with the specified primary resource
108+ */
109+ public T getAssociated (HasMetadata resource ) {
110+ return associatedWith .apply (resource );
93111 }
94112
95- public interface ResourceToRelatedCustomResourceUIDMapper <T > {
96- List <String > map (T resource );
97- }
98113
114+ public SharedInformer <T > getSharedInformer () {
115+ return sharedInformer ;
116+ }
99117}
0 commit comments