66import io .fabric8 .kubernetes .api .model .ConfigMapBuilder ;
77import io .fabric8 .kubernetes .api .model .ObjectMetaBuilder ;
88import io .fabric8 .kubernetes .client .KubernetesClient ;
9+ import io .javaoperatorsdk .operator .api .config .informer .InformerConfiguration ;
910import io .javaoperatorsdk .operator .api .reconciler .*;
1011import io .javaoperatorsdk .operator .junit .KubernetesClientAware ;
12+ import io .javaoperatorsdk .operator .processing .event .source .EventSource ;
13+ import io .javaoperatorsdk .operator .processing .event .source .informer .InformerEventSource ;
14+ import io .javaoperatorsdk .operator .processing .event .source .informer .Mappers ;
1115
1216@ ControllerConfiguration
1317public class ClusterScopedCustomResourceReconciler
14- implements Reconciler <ClusterScopedCustomResource >, Cleaner < ClusterScopedCustomResource >,
15- KubernetesClientAware {
18+ implements Reconciler <ClusterScopedCustomResource >,
19+ KubernetesClientAware , EventSourceInitializer < ClusterScopedCustomResource > {
1620
1721 public static final String DATA_KEY = "data-key" ;
1822
23+ public static final String TEST_LABEL_VALUE = "clusterscopecrtest" ;
24+ public static final String TEST_LABEL_KEY = "test" ;
25+
1926 private KubernetesClient client ;
2027
2128 @ Override
2229 public UpdateControl <ClusterScopedCustomResource > reconcile (
2330 ClusterScopedCustomResource resource , Context <ClusterScopedCustomResource > context ) {
2431
25- client .configMaps ().resource (desired (resource )).createOrReplace ();
32+ var optionalConfigMap = context .getSecondaryResource (ConfigMap .class );
33+
34+ optionalConfigMap .ifPresentOrElse (cm -> {
35+ if (!resource .getSpec ().getData ().equals (cm .getData ().get (DATA_KEY ))) {
36+ client .configMaps ().resource (desired (resource )).replace ();
37+ }
38+ }, () -> client .configMaps ().resource (desired (resource )).create ());
2639
2740 resource .setStatus (new ClusterScopedCustomResourceStatus ());
2841 resource .getStatus ().setCreated (true );
2942 return UpdateControl .patchStatus (resource );
3043 }
3144
3245 private ConfigMap desired (ClusterScopedCustomResource resource ) {
33- return new ConfigMapBuilder ()
46+ var cm = new ConfigMapBuilder ()
3447 .withMetadata (new ObjectMetaBuilder ()
3548 .withName (resource .getMetadata ().getName ())
3649 .withNamespace (resource .getSpec ().getTargetNamespace ())
50+ .withLabels (Map .of (TEST_LABEL_KEY , TEST_LABEL_VALUE ))
3751 .build ())
3852 .withData (Map .of (DATA_KEY , resource .getSpec ().getData ()))
3953 .build ();
54+ cm .addOwnerReference (resource );
55+ return cm ;
4056 }
4157
4258 @ Override
@@ -50,9 +66,12 @@ public void setKubernetesClient(KubernetesClient kubernetesClient) {
5066 }
5167
5268 @ Override
53- public DeleteControl cleanup (ClusterScopedCustomResource resource ,
54- Context <ClusterScopedCustomResource > context ) {
55- client .configMaps ().resource (desired (resource )).delete ();
56- return DeleteControl .defaultDelete ();
69+ public Map <String , EventSource > prepareEventSources (
70+ EventSourceContext <ClusterScopedCustomResource > context ) {
71+ var ies = new InformerEventSource <>(InformerConfiguration .from (ConfigMap .class , context )
72+ .withSecondaryToPrimaryMapper (Mappers .fromOwnerReference (true ))
73+ .withLabelSelector (TEST_LABEL_KEY + "=" + TEST_LABEL_VALUE )
74+ .build (), context );
75+ return EventSourceInitializer .nameEventSources (ies );
5776 }
5877}
0 commit comments