This is an automated email from the ASF dual-hosted git repository.

gyfora pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/flink-kubernetes-operator.git


The following commit(s) were added to refs/heads/main by this push:
     new d2f1d71  [FLINK-27714] Migrate to java-operator-sdk v3
d2f1d71 is described below

commit d2f1d71c2c28d566c3451f2878a301130ce63807
Author: Matyas Orhidi <[email protected]>
AuthorDate: Mon May 23 22:33:17 2022 +0200

    [FLINK-27714] Migrate to java-operator-sdk v3
---
 .../flink/kubernetes/operator/FlinkOperator.java   |  65 ++++-------
 .../operator/config/FlinkConfigManager.java        |  11 +-
 .../operator/controller/FlinkControllerConfig.java |   5 +-
 .../controller/FlinkDeploymentController.java      |  45 +++----
 .../controller/FlinkSessionJobController.java      | 118 +++----------------
 .../operator/informer/InformerManager.java         |  81 ++++++-------
 .../deployment/AbstractDeploymentObserver.java     |  10 +-
 .../observer/sessionjob/SessionJobObserver.java    |   6 +-
 .../operator/reconciler/ReconciliationUtils.java   |  22 ++--
 .../reconciler/deployment/ReconcilerFactory.java   |   8 +-
 .../reconciler/deployment/SessionReconciler.java   |  16 +--
 .../sessionjob/FlinkSessionJobReconciler.java      |   7 +-
 .../flink/kubernetes/operator/utils/EnvUtils.java  |  16 +++
 .../operator/utils/EventSourceUtils.java           | 116 ++++++++++++++++++
 .../kubernetes/operator/utils/OperatorUtils.java   | 129 ---------------------
 .../kubernetes/operator/FlinkOperatorTest.java     |  26 ++---
 .../flink/kubernetes/operator/TestUtils.java       | 128 ++++++++++++++++----
 .../kubernetes/operator/TestingFlinkService.java   |  21 +++-
 .../controller/DeploymentRecoveryTest.java         |   5 +-
 .../controller/FlinkDeploymentControllerTest.java  |  40 ++-----
 .../operator/informer/InformerManagerTest.java     |  13 +--
 .../observer/deployment/SessionObserverTest.java   |  83 -------------
 .../deployment/SessionReconcilerTest.java          |   6 +-
 pom.xml                                            |   3 +-
 24 files changed, 407 insertions(+), 573 deletions(-)

diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/FlinkOperator.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/FlinkOperator.java
index 6cb961f..4770617 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/FlinkOperator.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/FlinkOperator.java
@@ -31,7 +31,6 @@ import 
org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
 import org.apache.flink.kubernetes.operator.crd.FlinkSessionJob;
 import org.apache.flink.kubernetes.operator.crd.status.FlinkDeploymentStatus;
 import org.apache.flink.kubernetes.operator.crd.status.FlinkSessionJobStatus;
-import org.apache.flink.kubernetes.operator.informer.InformerManager;
 import org.apache.flink.kubernetes.operator.metrics.MetricManager;
 import org.apache.flink.kubernetes.operator.metrics.OperatorMetricUtils;
 import org.apache.flink.kubernetes.operator.observer.Observer;
@@ -50,9 +49,7 @@ import org.apache.flink.metrics.MetricGroup;
 import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.javaoperatorsdk.operator.Operator;
-import io.javaoperatorsdk.operator.api.config.ConfigurationService;
 import io.javaoperatorsdk.operator.api.config.ConfigurationServiceOverrider;
-import io.javaoperatorsdk.operator.config.runtime.DefaultConfigurationService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -60,6 +57,7 @@ import javax.annotation.Nullable;
 
 import java.util.Set;
 import java.util.concurrent.Executors;
+import java.util.function.Consumer;
 
 /** Main Class for Flink native k8s operator. */
 public class FlinkOperator {
@@ -69,34 +67,47 @@ public class FlinkOperator {
 
     private final KubernetesClient client;
     private final FlinkService flinkService;
-    private final ConfigurationService configurationService;
     private final FlinkConfigManager configManager;
     private final Set<FlinkResourceValidator> validators;
     private final MetricGroup metricGroup;
-    private final InformerManager informerManager;
 
     public FlinkOperator(@Nullable Configuration conf) {
         this.client = new DefaultKubernetesClient();
         this.configManager = conf != null ? new FlinkConfigManager(conf) : new 
FlinkConfigManager();
-        this.configurationService =
-                
getConfigurationService(configManager.getOperatorConfiguration());
-        this.operator = new Operator(client, configurationService);
+        this.operator =
+                new Operator(
+                        client,
+                        getConfigurationServiceOverriderConsumer(
+                                configManager.getOperatorConfiguration()));
         this.flinkService = new FlinkService(client, configManager);
         this.validators = ValidatorUtils.discoverValidators(configManager);
         this.metricGroup =
                 
OperatorMetricUtils.initOperatorMetrics(configManager.getDefaultConfig());
-        Set<String> watchedNamespaces =
-                
configManager.getOperatorConfiguration().getWatchedNamespaces();
-        this.informerManager = new InformerManager(watchedNamespaces, client);
         PluginManager pluginManager =
                 
PluginUtils.createPluginManagerFromRootFolder(configManager.getDefaultConfig());
         FileSystem.initialize(configManager.getDefaultConfig(), pluginManager);
     }
 
+    @VisibleForTesting
+    protected static Consumer<ConfigurationServiceOverrider>
+            getConfigurationServiceOverriderConsumer(
+                    FlinkOperatorConfiguration operatorConfiguration) {
+        return overrider -> {
+            int parallelism = 
operatorConfiguration.getReconcilerMaxParallelism();
+            if (parallelism == -1) {
+                LOG.info("Configuring operator with unbounded reconciliation 
thread pool.");
+                overrider.withExecutorService(Executors.newCachedThreadPool());
+            } else {
+                LOG.info("Configuring operator with {} reconciliation 
threads.", parallelism);
+                overrider.withConcurrentReconciliationThreads(parallelism);
+            }
+        };
+    }
+
     private void registerDeploymentController() {
         StatusHelper<FlinkDeploymentStatus> statusHelper = new 
StatusHelper<>(client);
         ReconcilerFactory reconcilerFactory =
-                new ReconcilerFactory(client, flinkService, configManager, 
informerManager);
+                new ReconcilerFactory(client, flinkService, configManager);
         ObserverFactory observerFactory =
                 new ObserverFactory(client, flinkService, configManager, 
statusHelper);
 
@@ -114,7 +125,6 @@ public class FlinkOperator {
                 new FlinkControllerConfig<>(
                         controller,
                         
configManager.getOperatorConfiguration().getWatchedNamespaces());
-        controllerConfig.setConfigurationService(configurationService);
         operator.register(controller, controllerConfig);
     }
 
@@ -127,41 +137,19 @@ public class FlinkOperator {
         FlinkSessionJobController controller =
                 new FlinkSessionJobController(
                         configManager,
-                        client,
                         validators,
                         reconciler,
                         observer,
                         new MetricManager<>(metricGroup),
-                        statusHelper,
-                        informerManager);
+                        statusHelper);
 
         FlinkControllerConfig<FlinkSessionJob> controllerConfig =
                 new FlinkControllerConfig<>(
                         controller,
                         
configManager.getOperatorConfiguration().getWatchedNamespaces());
-
-        controllerConfig.setConfigurationService(configurationService);
         operator.register(controller, controllerConfig);
     }
 
-    private ConfigurationService getConfigurationService(
-            FlinkOperatorConfiguration operatorConfiguration) {
-
-        ConfigurationServiceOverrider configOverrider =
-                new 
ConfigurationServiceOverrider(DefaultConfigurationService.instance())
-                        .checkingCRDAndValidateLocalModel(false);
-
-        int parallelism = operatorConfiguration.getReconcilerMaxParallelism();
-        if (parallelism == -1) {
-            LOG.info("Configuring operator with unbounded reconciliation 
thread pool.");
-            configOverrider = 
configOverrider.withExecutorService(Executors.newCachedThreadPool());
-        } else {
-            LOG.info("Configuring operator with {} reconciliation threads.", 
parallelism);
-            configOverrider = 
configOverrider.withConcurrentReconciliationThreads(parallelism);
-        }
-        return configOverrider.build();
-    }
-
     public void run() {
         registerDeploymentController();
         registerSessionJobController();
@@ -169,11 +157,6 @@ public class FlinkOperator {
         operator.start();
     }
 
-    @VisibleForTesting
-    protected Operator getOperator() {
-        return operator;
-    }
-
     public static void main(String... args) {
         EnvUtils.logEnvironmentInfo(LOG, "Flink Kubernetes Operator", args);
         new FlinkOperator(null).run();
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/config/FlinkConfigManager.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/config/FlinkConfigManager.java
index f4c7a0b..3a7c1c3 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/config/FlinkConfigManager.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/config/FlinkConfigManager.java
@@ -25,7 +25,7 @@ import 
org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
 import org.apache.flink.kubernetes.operator.crd.FlinkSessionJob;
 import org.apache.flink.kubernetes.operator.crd.spec.FlinkDeploymentSpec;
 import org.apache.flink.kubernetes.operator.reconciler.ReconciliationUtils;
-import org.apache.flink.kubernetes.operator.utils.OperatorUtils;
+import org.apache.flink.kubernetes.operator.utils.EnvUtils;
 
 import org.apache.flink.shaded.guava30.com.google.common.cache.Cache;
 import org.apache.flink.shaded.guava30.com.google.common.cache.CacheBuilder;
@@ -63,7 +63,7 @@ public class FlinkConfigManager {
     private final AtomicLong defaultConfigVersion = new AtomicLong(0);
 
     private final LoadingCache<Key, Configuration> cache;
-    private Set<String> namespaces = OperatorUtils.getWatchedNamespaces();
+    private final Set<String> namespaces = EnvUtils.getWatchedNamespaces();
 
     public FlinkConfigManager() {
         this(GlobalConfiguration.loadConfiguration());
@@ -188,13 +188,6 @@ public class FlinkConfigManager {
         LOG.info("Enabled dynamic config updates, checking config changes 
every {}", checkInterval);
     }
 
-    @VisibleForTesting
-    public void setWatchedNamespaces(Set<String> namespaces) {
-        this.namespaces = namespaces;
-        operatorConfiguration =
-                FlinkOperatorConfiguration.fromConfiguration(defaultConfig, 
namespaces);
-    }
-
     @VisibleForTesting
     protected Cache<Key, Configuration> getCache() {
         return cache;
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkControllerConfig.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkControllerConfig.java
index fb370ee..044780b 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkControllerConfig.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkControllerConfig.java
@@ -19,12 +19,13 @@ package org.apache.flink.kubernetes.operator.controller;
 
 import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
-import io.javaoperatorsdk.operator.config.runtime.AnnotationConfiguration;
+import 
io.javaoperatorsdk.operator.config.runtime.AnnotationControllerConfiguration;
 
 import java.util.Set;
 
 /** Custom config for {@link FlinkDeploymentController}. */
-public class FlinkControllerConfig<CR extends HasMetadata> extends 
AnnotationConfiguration<CR> {
+public class FlinkControllerConfig<CR extends HasMetadata>
+        extends AnnotationControllerConfiguration<CR> {
 
     private final Set<String> watchedNamespaces;
 
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkDeploymentController.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkDeploymentController.java
index 432c8c1..439024c 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkDeploymentController.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkDeploymentController.java
@@ -17,7 +17,6 @@
 
 package org.apache.flink.kubernetes.operator.controller;
 
-import org.apache.flink.annotation.VisibleForTesting;
 import org.apache.flink.api.common.JobStatus;
 import org.apache.flink.api.java.tuple.Tuple2;
 import org.apache.flink.kubernetes.operator.config.FlinkConfigManager;
@@ -30,37 +29,38 @@ import 
org.apache.flink.kubernetes.operator.metrics.MetricManager;
 import 
org.apache.flink.kubernetes.operator.observer.deployment.ObserverFactory;
 import org.apache.flink.kubernetes.operator.reconciler.ReconciliationUtils;
 import 
org.apache.flink.kubernetes.operator.reconciler.deployment.ReconcilerFactory;
+import org.apache.flink.kubernetes.operator.utils.EventSourceUtils;
 import org.apache.flink.kubernetes.operator.utils.EventUtils;
-import org.apache.flink.kubernetes.operator.utils.OperatorUtils;
 import org.apache.flink.kubernetes.operator.utils.StatusHelper;
 import org.apache.flink.kubernetes.operator.validation.FlinkResourceValidator;
 
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusHandler;
+import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl;
 import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
 import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
-import io.javaoperatorsdk.operator.api.reconciler.RetryInfo;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
 import io.javaoperatorsdk.operator.processing.event.source.EventSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
 
 /** Controller that runs the main reconcile loop for Flink deployments. */
-@ControllerConfiguration
+@ControllerConfiguration()
 public class FlinkDeploymentController
         implements Reconciler<FlinkDeployment>,
                 ErrorStatusHandler<FlinkDeployment>,
-                EventSourceInitializer<FlinkDeployment> {
+                EventSourceInitializer<FlinkDeployment>,
+                Cleaner<FlinkDeployment> {
     private static final Logger LOG = 
LoggerFactory.getLogger(FlinkDeploymentController.class);
 
     private final FlinkConfigManager configManager;
@@ -71,7 +71,6 @@ public class FlinkDeploymentController
     private final ObserverFactory observerFactory;
     private final MetricManager<FlinkDeployment> metricManager;
     private final StatusHelper<FlinkDeploymentStatus> statusHelper;
-    private Set<String> effectiveNamespaces;
     private final ConcurrentHashMap<Tuple2<String, String>, 
FlinkDeploymentStatus> statusCache =
             new ConcurrentHashMap<>();
 
@@ -90,7 +89,6 @@ public class FlinkDeploymentController
         this.observerFactory = observerFactory;
         this.metricManager = metricManager;
         this.statusHelper = statusHelper;
-        this.effectiveNamespaces = 
configManager.getOperatorConfiguration().getWatchedNamespaces();
     }
 
     @Override
@@ -108,7 +106,8 @@ public class FlinkDeploymentController
     }
 
     @Override
-    public UpdateControl<FlinkDeployment> reconcile(FlinkDeployment flinkApp, 
Context context) {
+    public UpdateControl<FlinkDeployment> reconcile(FlinkDeployment flinkApp, 
Context context)
+            throws Exception {
         LOG.info("Starting reconciliation");
         statusHelper.updateStatusFromCache(flinkApp);
         FlinkDeployment previousDeployment = 
ReconciliationUtils.clone(flinkApp);
@@ -152,26 +151,18 @@ public class FlinkDeploymentController
     }
 
     @Override
-    public List<EventSource> 
prepareEventSources(EventSourceContext<FlinkDeployment> ctx) {
-        if (effectiveNamespaces.isEmpty()) {
-            return 
List.of(OperatorUtils.createJmDepInformerEventSource(kubernetesClient));
-        } else {
-            return effectiveNamespaces.stream()
-                    .map(ns -> 
OperatorUtils.createJmDepInformerEventSource(kubernetesClient, ns))
-                    .collect(Collectors.toList());
-        }
-    }
-
-    @VisibleForTesting
-    public void setEffectiveNamespaces(Set<String> effectiveNamespaces) {
-        this.effectiveNamespaces = effectiveNamespaces;
+    public Map<String, EventSource> prepareEventSources(
+            EventSourceContext<FlinkDeployment> context) {
+        return EventSourceInitializer.nameEventSources(
+                EventSourceUtils.getSessionJobInformerEventSource(context),
+                EventSourceUtils.getDeploymentInformerEventSource(context));
     }
 
     @Override
-    public Optional<FlinkDeployment> updateErrorStatus(
-            FlinkDeployment flinkApp, RetryInfo retryInfo, RuntimeException e) 
{
-        return ReconciliationUtils.updateErrorStatus(
-                flinkApp, retryInfo, e, metricManager, statusHelper);
+    public ErrorStatusUpdateControl<FlinkDeployment> updateErrorStatus(
+            FlinkDeployment flinkDeployment, Context<FlinkDeployment> context, 
Exception e) {
+        return ReconciliationUtils.toErrorStatusUpdateControl(
+                flinkDeployment, context.getRetryInfo(), e, metricManager, 
statusHelper);
     }
 
     private boolean validateDeployment(FlinkDeployment deployment) {
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkSessionJobController.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkSessionJobController.java
index f3d3a52..a4b21f4 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkSessionJobController.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkSessionJobController.java
@@ -22,84 +22,68 @@ import 
org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
 import org.apache.flink.kubernetes.operator.crd.FlinkSessionJob;
 import org.apache.flink.kubernetes.operator.crd.status.FlinkSessionJobStatus;
 import org.apache.flink.kubernetes.operator.exception.ReconciliationException;
-import org.apache.flink.kubernetes.operator.informer.InformerManager;
 import org.apache.flink.kubernetes.operator.metrics.MetricManager;
 import org.apache.flink.kubernetes.operator.observer.Observer;
 import org.apache.flink.kubernetes.operator.reconciler.Reconciler;
 import org.apache.flink.kubernetes.operator.reconciler.ReconciliationUtils;
-import org.apache.flink.kubernetes.operator.utils.OperatorUtils;
+import org.apache.flink.kubernetes.operator.utils.EventSourceUtils;
 import org.apache.flink.kubernetes.operator.utils.StatusHelper;
 import org.apache.flink.kubernetes.operator.validation.FlinkResourceValidator;
 
-import io.fabric8.kubernetes.api.model.KubernetesResourceList;
-import io.fabric8.kubernetes.client.KubernetesClient;
-import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;
+import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusHandler;
+import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl;
 import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
 import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer;
-import io.javaoperatorsdk.operator.api.reconciler.RetryInfo;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
-import io.javaoperatorsdk.operator.processing.event.ResourceID;
 import io.javaoperatorsdk.operator.processing.event.source.EventSource;
-import 
io.javaoperatorsdk.operator.processing.event.source.PrimaryResourcesRetriever;
-import 
io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashSet;
-import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /** Controller that runs the main reconcile loop for {@link FlinkSessionJob}. 
*/
-@ControllerConfiguration
+@ControllerConfiguration()
 public class FlinkSessionJobController
         implements 
io.javaoperatorsdk.operator.api.reconciler.Reconciler<FlinkSessionJob>,
                 ErrorStatusHandler<FlinkSessionJob>,
-                EventSourceInitializer<FlinkSessionJob> {
+                EventSourceInitializer<FlinkSessionJob>,
+                Cleaner<FlinkSessionJob> {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(FlinkSessionJobController.class);
 
     private final FlinkConfigManager configManager;
-    private final KubernetesClient kubernetesClient;
-
     private final Set<FlinkResourceValidator> validators;
     private final Reconciler<FlinkSessionJob> reconciler;
     private final Observer<FlinkSessionJob> observer;
     private final MetricManager<FlinkSessionJob> metricManager;
-    private final InformerManager informerManager;
-    private final Set<String> effectiveNamespaces;
-
     private final StatusHelper<FlinkSessionJobStatus> statusHelper;
 
     public FlinkSessionJobController(
             FlinkConfigManager configManager,
-            KubernetesClient kubernetesClient,
             Set<FlinkResourceValidator> validators,
             Reconciler<FlinkSessionJob> reconciler,
             Observer<FlinkSessionJob> observer,
             MetricManager<FlinkSessionJob> metricManager,
-            StatusHelper<FlinkSessionJobStatus> statusHelper,
-            InformerManager informerManager) {
+            StatusHelper<FlinkSessionJobStatus> statusHelper) {
         this.configManager = configManager;
-        this.kubernetesClient = kubernetesClient;
         this.validators = validators;
         this.reconciler = reconciler;
         this.observer = observer;
         this.metricManager = metricManager;
         this.statusHelper = statusHelper;
-        this.informerManager = informerManager;
-        this.effectiveNamespaces = 
configManager.getOperatorConfiguration().getWatchedNamespaces();
     }
 
     @Override
     public UpdateControl<FlinkSessionJob> reconcile(
             FlinkSessionJob flinkSessionJob, Context context) {
         LOG.info("Starting reconciliation");
+
         statusHelper.updateStatusFromCache(flinkSessionJob);
         FlinkSessionJob previousJob = 
ReconciliationUtils.clone(flinkSessionJob);
 
@@ -131,90 +115,24 @@ public class FlinkSessionJobController
     }
 
     @Override
-    public Optional<FlinkSessionJob> updateErrorStatus(
-            FlinkSessionJob flinkSessionJob, RetryInfo retryInfo, 
RuntimeException e) {
-        return ReconciliationUtils.updateErrorStatus(
-                flinkSessionJob, retryInfo, e, metricManager, statusHelper);
+    public ErrorStatusUpdateControl<FlinkSessionJob> updateErrorStatus(
+            FlinkSessionJob sessionJob, Context<FlinkSessionJob> context, 
Exception e) {
+        return ReconciliationUtils.toErrorStatusUpdateControl(
+                sessionJob, context.getRetryInfo(), e, metricManager, 
statusHelper);
     }
 
     @Override
-    public List<EventSource> prepareEventSources(
-            EventSourceContext<FlinkSessionJob> eventSourceContext) {
-        if (effectiveNamespaces.isEmpty()) {
-            return List.of(
-                    createFlinkDepInformerEventSource(
-                            
kubernetesClient.resources(FlinkDeployment.class).inAnyNamespace(),
-                            OperatorUtils.ALL_NAMESPACE));
-        } else {
-            return effectiveNamespaces.stream()
-                    .map(
-                            name ->
-                                    createFlinkDepInformerEventSource(
-                                            kubernetesClient
-                                                    
.resources(FlinkDeployment.class)
-                                                    .inNamespace(name),
-                                            name))
-                    .collect(Collectors.toList());
-        }
-    }
-
-    private InformerEventSource<FlinkDeployment, FlinkSessionJob> 
createFlinkDepInformerEventSource(
-            FilterWatchListDeletable<FlinkDeployment, 
KubernetesResourceList<FlinkDeployment>>
-                    filteredClient,
-            String name) {
-        return new InformerEventSource<>(
-                filteredClient.runnableInformer(0),
-                primaryResourceRetriever(),
-                sessionJob ->
-                        new ResourceID(
-                                sessionJob.getSpec().getDeploymentName(),
-                                sessionJob.getMetadata().getNamespace()),
-                false) {
-            @Override
-            public String name() {
-                return name;
-            }
-        };
-    }
-
-    /**
-     * Mapping the {@link FlinkDeployment} session cluster to {@link 
FlinkSessionJob}. It leverages
-     * the informer indexer.
-     *
-     * @return The {@link PrimaryResourcesRetriever}.
-     */
-    private PrimaryResourcesRetriever<FlinkDeployment> 
primaryResourceRetriever() {
-        return flinkDeployment -> {
-            var namespace = flinkDeployment.getMetadata().getNamespace();
-            var informer = informerManager.getSessionJobInformer(namespace);
-
-            var sessionJobs =
-                    informer.getIndexer()
-                            .byIndex(
-                                    OperatorUtils.CLUSTER_ID_INDEX,
-                                    flinkDeployment.getMetadata().getName());
-            var resourceIDs = new HashSet<ResourceID>();
-            for (FlinkSessionJob sessionJob : sessionJobs) {
-                resourceIDs.add(
-                        new ResourceID(
-                                sessionJob.getMetadata().getName(),
-                                sessionJob.getMetadata().getNamespace()));
-            }
-            LOG.debug(
-                    "Find the target resource {} for {} ",
-                    resourceIDs,
-                    flinkDeployment.getMetadata().getNamespace());
-            return resourceIDs;
-        };
+    public Map<String, EventSource> prepareEventSources(
+            EventSourceContext<FlinkSessionJob> context) {
+        return EventSourceInitializer.nameEventSources(
+                
EventSourceUtils.getFlinkDeploymentInformerEventSource(context));
     }
 
     private boolean validateSessionJob(FlinkSessionJob sessionJob, Context 
context) {
         for (FlinkResourceValidator validator : validators) {
             Optional<String> validationError =
                     validator.validateSessionJob(
-                            sessionJob,
-                            OperatorUtils.getSecondaryResource(
-                                    sessionJob, context, 
configManager.getOperatorConfiguration()));
+                            sessionJob, 
context.getSecondaryResource(FlinkDeployment.class));
             if (validationError.isPresent()) {
                 return ReconciliationUtils.applyValidationErrorAndResetSpec(
                         sessionJob, validationError.get());
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/informer/InformerManager.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/informer/InformerManager.java
index a7d0aa3..453c41e 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/informer/InformerManager.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/informer/InformerManager.java
@@ -19,22 +19,26 @@ package org.apache.flink.kubernetes.operator.informer;
 
 import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
 import org.apache.flink.kubernetes.operator.crd.FlinkSessionJob;
-import org.apache.flink.kubernetes.operator.utils.OperatorUtils;
 import org.apache.flink.util.Preconditions;
 
+import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.fabric8.kubernetes.client.informers.SharedIndexInformer;
+import io.javaoperatorsdk.operator.api.reconciler.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
+import static 
io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
+
 /** The manager of the informers. */
 public class InformerManager {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(InformerManager.class);
+    public static final String CLUSTER_ID_INDEX = "clusterId_index";
     private final Set<String> watchedNamespaces;
     private final KubernetesClient kubernetesClient;
     private volatile Map<String, SharedIndexInformer<FlinkSessionJob>> 
sessionJobInformers;
@@ -43,67 +47,27 @@ public class InformerManager {
     public InformerManager(Set<String> watchedNamespaces, KubernetesClient 
kubernetesClient) {
         this.watchedNamespaces = watchedNamespaces;
         this.kubernetesClient = kubernetesClient;
-        LOG.info(
-                "Created informer manager with watchedNamespaces: {}",
-                watchedNamespaces.isEmpty()
-                        ? "[" + OperatorUtils.ALL_NAMESPACE + "]"
-                        : watchedNamespaces);
-    }
-
-    public SharedIndexInformer<FlinkSessionJob> getSessionJobInformer(String 
namespace) {
-        initSessionJobInformersWithIndexer();
-        var effectiveNamespace =
-                watchedNamespaces.isEmpty() ? OperatorUtils.ALL_NAMESPACE : 
namespace;
-        var informer = sessionJobInformers.get(effectiveNamespace);
-        Preconditions.checkNotNull(
-                informer, String.format("The informer for %s should not be 
null", namespace));
-        return informer;
+        LOG.info("Created informer manager with watchedNamespaces: {}", 
watchedNamespaces);
     }
 
     public SharedIndexInformer<FlinkDeployment> getFlinkDepInformer(String 
namespace) {
         initFlinkDepInformers();
         var effectiveNamespace =
-                watchedNamespaces.isEmpty() ? OperatorUtils.ALL_NAMESPACE : 
namespace;
+                DEFAULT_NAMESPACES_SET.equals(watchedNamespaces)
+                        ? Constants.WATCH_ALL_NAMESPACES
+                        : namespace;
         var informer = flinkDepInformers.get(effectiveNamespace);
         Preconditions.checkNotNull(
                 informer, String.format("The informer for %s should not be 
null", namespace));
         return informer;
     }
 
-    private void initSessionJobInformersWithIndexer() {
-        if (sessionJobInformers == null) {
-            synchronized (this) {
-                if (sessionJobInformers == null) {
-                    var runnableInformers =
-                            OperatorUtils.createRunnableInformer(
-                                    FlinkSessionJob.class, watchedNamespaces, 
kubernetesClient);
-                    for (Map.Entry<String, 
SharedIndexInformer<FlinkSessionJob>> runnableInformer :
-                            runnableInformers.entrySet()) {
-                        runnableInformer
-                                .getValue()
-                                .addIndexers(
-                                        Map.of(
-                                                OperatorUtils.CLUSTER_ID_INDEX,
-                                                sessionJob ->
-                                                        List.of(
-                                                                sessionJob
-                                                                        
.getSpec()
-                                                                        
.getDeploymentName())));
-                        runnableInformer.getValue().run();
-                    }
-                    this.sessionJobInformers = runnableInformers;
-                    LOG.info("Created session job informers for {}", 
sessionJobInformers.keySet());
-                }
-            }
-        }
-    }
-
     private void initFlinkDepInformers() {
         if (flinkDepInformers == null) {
             synchronized (this) {
                 if (flinkDepInformers == null) {
                     var runnableInformers =
-                            OperatorUtils.createRunnableInformer(
+                            createRunnableInformer(
                                     FlinkDeployment.class, watchedNamespaces, 
kubernetesClient);
                     for (Map.Entry<String, 
SharedIndexInformer<FlinkDeployment>> runnableInformer :
                             runnableInformers.entrySet()) {
@@ -117,4 +81,27 @@ public class InformerManager {
             }
         }
     }
+
+    private static <CR extends HasMetadata>
+            Map<String, SharedIndexInformer<CR>> createRunnableInformer(
+                    Class<CR> resourceClass,
+                    Set<String> effectiveNamespaces,
+                    KubernetesClient kubernetesClient) {
+        if (DEFAULT_NAMESPACES_SET.equals(effectiveNamespaces)) {
+            return Map.of(
+                    Constants.WATCH_ALL_NAMESPACES,
+                    
kubernetesClient.resources(resourceClass).inAnyNamespace().runnableInformer(0));
+        } else {
+            var informers = new HashMap<String, SharedIndexInformer<CR>>();
+            for (String effectiveNamespace : effectiveNamespaces) {
+                informers.put(
+                        effectiveNamespace,
+                        kubernetesClient
+                                .resources(resourceClass)
+                                .inNamespace(effectiveNamespace)
+                                .runnableInformer(0));
+            }
+            return informers;
+        }
+    }
 }
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/observer/deployment/AbstractDeploymentObserver.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/observer/deployment/AbstractDeploymentObserver.java
index e45123c..8590f16 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/observer/deployment/AbstractDeploymentObserver.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/observer/deployment/AbstractDeploymentObserver.java
@@ -153,7 +153,7 @@ public abstract class AbstractDeploymentObserver implements 
Observer<FlinkDeploy
             return;
         }
 
-        Optional<Deployment> deployment = getSecondaryResource(flinkApp, 
context);
+        Optional<Deployment> deployment = 
context.getSecondaryResource(Deployment.class);
         if (deployment.isPresent()) {
             DeploymentStatus status = deployment.get().getStatus();
             DeploymentSpec spec = deployment.get().getSpec();
@@ -199,14 +199,6 @@ public abstract class AbstractDeploymentObserver 
implements Observer<FlinkDeploy
         }
     }
 
-    private Optional<Deployment> getSecondaryResource(FlinkDeployment 
flinkApp, Context context) {
-        return context.getSecondaryResource(
-                Deployment.class,
-                
configManager.getOperatorConfiguration().getWatchedNamespaces().size() > 1
-                        ? flinkApp.getMetadata().getNamespace()
-                        : null);
-    }
-
     private void checkFailedCreate(DeploymentStatus status) {
         List<DeploymentCondition> conditions = status.getConditions();
         for (DeploymentCondition dc : conditions) {
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/observer/sessionjob/SessionJobObserver.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/observer/sessionjob/SessionJobObserver.java
index 7fa1523..d1146e9 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/observer/sessionjob/SessionJobObserver.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/observer/sessionjob/SessionJobObserver.java
@@ -18,6 +18,7 @@
 package org.apache.flink.kubernetes.operator.observer.sessionjob;
 
 import org.apache.flink.kubernetes.operator.config.FlinkConfigManager;
+import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
 import org.apache.flink.kubernetes.operator.crd.FlinkSessionJob;
 import org.apache.flink.kubernetes.operator.crd.status.FlinkSessionJobStatus;
 import org.apache.flink.kubernetes.operator.crd.status.JobStatus;
@@ -27,7 +28,6 @@ import 
org.apache.flink.kubernetes.operator.observer.SavepointObserver;
 import 
org.apache.flink.kubernetes.operator.observer.context.VoidObserverContext;
 import 
org.apache.flink.kubernetes.operator.reconciler.sessionjob.SessionJobHelper;
 import org.apache.flink.kubernetes.operator.service.FlinkService;
-import org.apache.flink.kubernetes.operator.utils.OperatorUtils;
 import org.apache.flink.kubernetes.operator.utils.StatusHelper;
 import org.apache.flink.runtime.client.JobStatusMessage;
 import org.apache.flink.util.Preconditions;
@@ -101,9 +101,7 @@ public class SessionJobObserver implements 
Observer<FlinkSessionJob> {
             return;
         }
 
-        var flinkDepOpt =
-                OperatorUtils.getSecondaryResource(
-                        flinkSessionJob, context, 
configManager.getOperatorConfiguration());
+        Optional<FlinkDeployment> flinkDepOpt = 
context.getSecondaryResource(FlinkDeployment.class);
 
         var helper = new SessionJobHelper(flinkSessionJob, LOG);
 
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/ReconciliationUtils.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/ReconciliationUtils.java
index 9b9d75f..8adfafa 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/ReconciliationUtils.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/ReconciliationUtils.java
@@ -45,6 +45,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.databind.node.TextNode;
 import io.fabric8.kubernetes.client.CustomResource;
+import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl;
 import io.javaoperatorsdk.operator.api.reconciler.RetryInfo;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
 import org.slf4j.Logger;
@@ -349,16 +350,21 @@ public class ReconciliationUtils {
      * @return This always returns Empty optional currently, due to the status 
update logic
      */
     public static <STATUS extends CommonStatus<?>, R extends 
AbstractFlinkResource<?, STATUS>>
-            Optional<R> updateErrorStatus(
+            ErrorStatusUpdateControl<R> toErrorStatusUpdateControl(
                     R resource,
-                    RetryInfo retryInfo,
-                    RuntimeException e,
+                    Optional<RetryInfo> retryInfo,
+                    Exception e,
                     MetricManager<R> metricManager,
                     StatusHelper<STATUS> statusHelper) {
-        LOG.warn(
-                "Attempt count: {}, last attempt: {}",
-                retryInfo.getAttemptCount(),
-                retryInfo.isLastAttempt());
+
+        retryInfo.ifPresent(
+                r -> {
+                    LOG.warn(
+                            "Attempt count: {}, last attempt: {}",
+                            r.getAttemptCount(),
+                            r.isLastAttempt());
+                });
+
         statusHelper.updateStatusFromCache(resource);
         ReconciliationUtils.updateForReconciliationError(
                 resource,
@@ -367,6 +373,6 @@ public class ReconciliationUtils {
         statusHelper.patchAndCacheStatus(resource);
 
         // Status was updated already, no need to return anything
-        return Optional.empty();
+        return ErrorStatusUpdateControl.noStatusUpdate();
     }
 }
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/ReconcilerFactory.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/ReconcilerFactory.java
index c5140eb..7603469 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/ReconcilerFactory.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/ReconcilerFactory.java
@@ -20,7 +20,6 @@ package 
org.apache.flink.kubernetes.operator.reconciler.deployment;
 import org.apache.flink.kubernetes.operator.config.FlinkConfigManager;
 import org.apache.flink.kubernetes.operator.config.Mode;
 import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
-import org.apache.flink.kubernetes.operator.informer.InformerManager;
 import org.apache.flink.kubernetes.operator.reconciler.Reconciler;
 import org.apache.flink.kubernetes.operator.service.FlinkService;
 
@@ -36,18 +35,15 @@ public class ReconcilerFactory {
     private final FlinkService flinkService;
     private final FlinkConfigManager configManager;
     private final Map<Mode, Reconciler<FlinkDeployment>> reconcilerMap;
-    private final InformerManager informerManager;
 
     public ReconcilerFactory(
             KubernetesClient kubernetesClient,
             FlinkService flinkService,
-            FlinkConfigManager configManager,
-            InformerManager informerManager) {
+            FlinkConfigManager configManager) {
         this.kubernetesClient = kubernetesClient;
         this.flinkService = flinkService;
         this.configManager = configManager;
         this.reconcilerMap = new ConcurrentHashMap<>();
-        this.informerManager = informerManager;
     }
 
     public Reconciler<FlinkDeployment> getOrCreate(FlinkDeployment flinkApp) {
@@ -57,7 +53,7 @@ public class ReconcilerFactory {
                     switch (mode) {
                         case SESSION:
                             return new SessionReconciler(
-                                    kubernetesClient, flinkService, 
configManager, informerManager);
+                                    kubernetesClient, flinkService, 
configManager);
                         case APPLICATION:
                             return new ApplicationReconciler(
                                     kubernetesClient, flinkService, 
configManager);
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconciler.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconciler.java
index 246b276..18045bf 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconciler.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconciler.java
@@ -20,18 +20,17 @@ package 
org.apache.flink.kubernetes.operator.reconciler.deployment;
 import org.apache.flink.configuration.Configuration;
 import org.apache.flink.kubernetes.operator.config.FlinkConfigManager;
 import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
+import org.apache.flink.kubernetes.operator.crd.FlinkSessionJob;
 import org.apache.flink.kubernetes.operator.crd.spec.FlinkDeploymentSpec;
 import org.apache.flink.kubernetes.operator.crd.status.FlinkDeploymentStatus;
 import 
org.apache.flink.kubernetes.operator.crd.status.JobManagerDeploymentStatus;
 import org.apache.flink.kubernetes.operator.crd.status.ReconciliationState;
 import org.apache.flink.kubernetes.operator.crd.status.ReconciliationStatus;
-import org.apache.flink.kubernetes.operator.informer.InformerManager;
 import org.apache.flink.kubernetes.operator.reconciler.ReconciliationUtils;
 import org.apache.flink.kubernetes.operator.service.FlinkService;
 import org.apache.flink.kubernetes.operator.utils.EventUtils;
 import org.apache.flink.kubernetes.operator.utils.FlinkUtils;
 import org.apache.flink.kubernetes.operator.utils.IngressUtils;
-import org.apache.flink.kubernetes.operator.utils.OperatorUtils;
 
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
@@ -39,6 +38,7 @@ import 
io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -48,15 +48,12 @@ import java.util.stream.Collectors;
 public class SessionReconciler extends AbstractDeploymentReconciler {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(SessionReconciler.class);
-    private final InformerManager informerManager;
 
     public SessionReconciler(
             KubernetesClient kubernetesClient,
             FlinkService flinkService,
-            FlinkConfigManager configManager,
-            InformerManager informerManager) {
+            FlinkConfigManager configManager) {
         super(kubernetesClient, flinkService, configManager);
-        this.informerManager = informerManager;
     }
 
     @Override
@@ -150,11 +147,8 @@ public class SessionReconciler extends 
AbstractDeploymentReconciler {
 
     @Override
     public DeleteControl cleanup(FlinkDeployment flinkApp, Context context) {
-        var sessionJobs =
-                informerManager
-                        
.getSessionJobInformer(flinkApp.getMetadata().getNamespace())
-                        .getIndexer()
-                        .byIndex(OperatorUtils.CLUSTER_ID_INDEX, 
flinkApp.getMetadata().getName());
+
+        Set<FlinkSessionJob> sessionJobs = 
context.getSecondaryResources(FlinkSessionJob.class);
         if (!sessionJobs.isEmpty()) {
             var error =
                     String.format(
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/sessionjob/FlinkSessionJobReconciler.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/sessionjob/FlinkSessionJobReconciler.java
index 707dfcc..1b1eeb4 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/sessionjob/FlinkSessionJobReconciler.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/sessionjob/FlinkSessionJobReconciler.java
@@ -31,7 +31,6 @@ import 
org.apache.flink.kubernetes.operator.crd.status.Savepoint;
 import org.apache.flink.kubernetes.operator.reconciler.Reconciler;
 import org.apache.flink.kubernetes.operator.reconciler.ReconciliationUtils;
 import org.apache.flink.kubernetes.operator.service.FlinkService;
-import org.apache.flink.kubernetes.operator.utils.OperatorUtils;
 import org.apache.flink.util.Preconditions;
 
 import io.fabric8.kubernetes.client.KubernetesClient;
@@ -73,8 +72,7 @@ public class FlinkSessionJobReconciler implements 
Reconciler<FlinkSessionJob> {
                         .deserializeLastReconciledSpec();
 
         Optional<FlinkDeployment> flinkDepOptional =
-                OperatorUtils.getSecondaryResource(
-                        flinkSessionJob, context, 
configManager.getOperatorConfiguration());
+                context.getSecondaryResource(FlinkDeployment.class);
 
         // if session cluster is not ready, we can't do reconcile for the job.
         if (!helper.sessionClusterReady(flinkDepOptional)) {
@@ -137,8 +135,7 @@ public class FlinkSessionJobReconciler implements 
Reconciler<FlinkSessionJob> {
     @Override
     public DeleteControl cleanup(FlinkSessionJob sessionJob, Context context) {
         Optional<FlinkDeployment> flinkDepOptional =
-                OperatorUtils.getSecondaryResource(
-                        sessionJob, context, 
configManager.getOperatorConfiguration());
+                context.getSecondaryResource(FlinkDeployment.class);
 
         if (flinkDepOptional.isPresent()) {
             String jobID = sessionJob.getStatus().getJobStatus().getJobId();
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/EnvUtils.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/EnvUtils.java
index b82bb43..ed2c86f 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/EnvUtils.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/EnvUtils.java
@@ -30,8 +30,12 @@ import java.time.Instant;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Properties;
+import java.util.Set;
 
+import static 
io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
 import static org.apache.flink.runtime.util.EnvironmentInformation.UNKNOWN;
 import static 
org.apache.flink.runtime.util.EnvironmentInformation.UNKNOWN_COMMIT_ID_ABBREV;
 import static 
org.apache.flink.runtime.util.EnvironmentInformation.getJvmStartupOptionsArray;
@@ -201,4 +205,16 @@ public class EnvUtils {
         }
         return value;
     }
+
+    private static final String NAMESPACES_SPLITTER_KEY = ",";
+
+    public static Set<String> getWatchedNamespaces() {
+        String watchedNamespaces = get(EnvUtils.ENV_WATCHED_NAMESPACES);
+
+        if (StringUtils.isEmpty(watchedNamespaces)) {
+            return DEFAULT_NAMESPACES_SET;
+        } else {
+            return new 
HashSet<>(Arrays.asList(watchedNamespaces.split(NAMESPACES_SPLITTER_KEY)));
+        }
+    }
 }
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/EventSourceUtils.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/EventSourceUtils.java
new file mode 100644
index 0000000..2fc26b1
--- /dev/null
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/EventSourceUtils.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.kubernetes.operator.utils;
+
+import 
org.apache.flink.kubernetes.operator.controller.FlinkDeploymentController;
+import 
org.apache.flink.kubernetes.operator.controller.FlinkSessionJobController;
+import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
+import org.apache.flink.kubernetes.operator.crd.FlinkSessionJob;
+import org.apache.flink.kubernetes.utils.Constants;
+
+import io.fabric8.kubernetes.api.model.apps.Deployment;
+import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
+import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
+import io.javaoperatorsdk.operator.processing.event.ResourceID;
+import 
io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
+import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/** Utility class to locate secondary resources. */
+public class EventSourceUtils {
+
+    private static final String FLINK_DEPLOYMENT_IDX = 
FlinkDeploymentController.class.getName();
+    private static final String FLINK_SESSIONJOB_IDX = 
FlinkSessionJobController.class.getName();
+
+    public static InformerEventSource<Deployment, FlinkDeployment> 
getDeploymentInformerEventSource(
+            EventSourceContext<FlinkDeployment> context) {
+        final String labelSelector =
+                Map.of(
+                                Constants.LABEL_TYPE_KEY,
+                                Constants.LABEL_TYPE_NATIVE_TYPE,
+                                Constants.LABEL_COMPONENT_KEY,
+                                Constants.LABEL_COMPONENT_JOB_MANAGER)
+                        .entrySet().stream()
+                        .map(Object::toString)
+                        .collect(Collectors.joining(","));
+
+        var configuration =
+                InformerConfiguration.from(Deployment.class, context)
+                        .withLabelSelector(labelSelector)
+                        
.withSecondaryToPrimaryMapper(Mappers.fromLabel(Constants.LABEL_APP_KEY))
+                        .withNamespacesInheritedFromController(context)
+                        .followNamespaceChanges(true)
+                        .build();
+
+        return new InformerEventSource<>(configuration, context);
+    }
+
+    public static InformerEventSource<FlinkSessionJob, FlinkDeployment>
+            
getSessionJobInformerEventSource(EventSourceContext<FlinkDeployment> context) {
+
+        context.getPrimaryCache()
+                .addIndexer(
+                        FLINK_DEPLOYMENT_IDX,
+                        flinkDeployment -> 
List.of(flinkDeployment.getMetadata().getName()));
+
+        InformerConfiguration<FlinkSessionJob> configuration =
+                InformerConfiguration.from(FlinkSessionJob.class, context)
+                        .withSecondaryToPrimaryMapper(
+                                sessionJob ->
+                                        context.getPrimaryCache()
+                                                .byIndex(
+                                                        FLINK_DEPLOYMENT_IDX,
+                                                        
sessionJob.getSpec().getDeploymentName())
+                                                .stream()
+                                                .map(ResourceID::fromResource)
+                                                .collect(Collectors.toSet()))
+                        .withNamespacesInheritedFromController(context)
+                        .followNamespaceChanges(true)
+                        .build();
+
+        return new InformerEventSource<>(configuration, context);
+    }
+
+    public static InformerEventSource<FlinkDeployment, FlinkSessionJob>
+            
getFlinkDeploymentInformerEventSource(EventSourceContext<FlinkSessionJob> 
context) {
+        context.getPrimaryCache()
+                .addIndexer(
+                        FLINK_SESSIONJOB_IDX,
+                        sessionJob -> 
List.of(sessionJob.getSpec().getDeploymentName()));
+
+        InformerConfiguration<FlinkDeployment> configuration =
+                InformerConfiguration.from(FlinkDeployment.class, context)
+                        .withSecondaryToPrimaryMapper(
+                                flinkDeployment ->
+                                        context.getPrimaryCache()
+                                                .byIndex(
+                                                        FLINK_SESSIONJOB_IDX,
+                                                        
flinkDeployment.getMetadata().getName())
+                                                .stream()
+                                                .map(ResourceID::fromResource)
+                                                .collect(Collectors.toSet()))
+                        .withNamespacesInheritedFromController(context)
+                        .followNamespaceChanges(true)
+                        .build();
+
+        return new InformerEventSource<>(configuration, context);
+    }
+}
diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/OperatorUtils.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/OperatorUtils.java
deleted file mode 100644
index 457fa98..0000000
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/utils/OperatorUtils.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.flink.kubernetes.operator.utils;
-
-import org.apache.flink.kubernetes.operator.config.FlinkOperatorConfiguration;
-import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
-import org.apache.flink.kubernetes.operator.crd.FlinkSessionJob;
-import org.apache.flink.kubernetes.utils.Constants;
-
-import io.fabric8.kubernetes.api.model.HasMetadata;
-import io.fabric8.kubernetes.api.model.apps.Deployment;
-import io.fabric8.kubernetes.api.model.apps.DeploymentList;
-import io.fabric8.kubernetes.client.KubernetesClient;
-import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;
-import io.fabric8.kubernetes.client.informers.SharedIndexInformer;
-import io.javaoperatorsdk.operator.api.reconciler.Context;
-import 
io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
-import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-/** Operator SDK related utility functions. */
-public class OperatorUtils {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(OperatorUtils.class);
-
-    private static final String NAMESPACES_SPLITTER_KEY = ",";
-    public static final String CLUSTER_ID_INDEX = "clusterId_index";
-    public static final String ALL_NAMESPACE = "allNamespace";
-
-    public static InformerEventSource<Deployment, HasMetadata> 
createJmDepInformerEventSource(
-            KubernetesClient kubernetesClient, String namespace) {
-        return createJmDepInformerEventSource(
-                kubernetesClient.apps().deployments().inNamespace(namespace), 
namespace);
-    }
-
-    public static InformerEventSource<Deployment, HasMetadata> 
createJmDepInformerEventSource(
-            KubernetesClient kubernetesClient) {
-        return createJmDepInformerEventSource(
-                kubernetesClient.apps().deployments().inAnyNamespace(), "all");
-    }
-
-    private static InformerEventSource<Deployment, HasMetadata> 
createJmDepInformerEventSource(
-            FilterWatchListDeletable<Deployment, DeploymentList> 
filteredClient, String name) {
-        SharedIndexInformer<Deployment> informer =
-                filteredClient
-                        .withLabel(Constants.LABEL_TYPE_KEY, 
Constants.LABEL_TYPE_NATIVE_TYPE)
-                        .withLabel(
-                                Constants.LABEL_COMPONENT_KEY,
-                                Constants.LABEL_COMPONENT_JOB_MANAGER)
-                        .runnableInformer(0);
-
-        return new InformerEventSource<>(informer, 
Mappers.fromLabel(Constants.LABEL_APP_KEY)) {
-            @Override
-            public String name() {
-                return name;
-            }
-        };
-    }
-
-    public static Set<String> getWatchedNamespaces() {
-        String watchedNamespaces = 
EnvUtils.get(EnvUtils.ENV_WATCHED_NAMESPACES);
-
-        if (StringUtils.isEmpty(watchedNamespaces)) {
-            return Collections.emptySet();
-        } else {
-            return new 
HashSet<>(Arrays.asList(watchedNamespaces.split(NAMESPACES_SPLITTER_KEY)));
-        }
-    }
-
-    public static Optional<FlinkDeployment> getSecondaryResource(
-            FlinkSessionJob sessionJob,
-            Context context,
-            FlinkOperatorConfiguration operatorConfiguration) {
-        var identifier =
-                operatorConfiguration.getWatchedNamespaces().size() >= 1
-                        ? sessionJob.getMetadata().getNamespace()
-                        : null;
-        return context.getSecondaryResource(FlinkDeployment.class, identifier);
-    }
-
-    public static <CR extends HasMetadata>
-            Map<String, SharedIndexInformer<CR>> createRunnableInformer(
-                    Class<CR> resourceClass,
-                    Set<String> effectiveNamespaces,
-                    KubernetesClient kubernetesClient) {
-        if (effectiveNamespaces.isEmpty()) {
-            return Map.of(
-                    ALL_NAMESPACE,
-                    
kubernetesClient.resources(resourceClass).inAnyNamespace().runnableInformer(0));
-        } else {
-            var informers = new HashMap<String, SharedIndexInformer<CR>>();
-            for (String effectiveNamespace : effectiveNamespaces) {
-                informers.put(
-                        effectiveNamespace,
-                        kubernetesClient
-                                .resources(resourceClass)
-                                .inNamespace(effectiveNamespace)
-                                .runnableInformer(0));
-            }
-            return informers;
-        }
-    }
-}
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/FlinkOperatorTest.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/FlinkOperatorTest.java
index 7e5147a..d3c2a8e 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/FlinkOperatorTest.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/FlinkOperatorTest.java
@@ -20,7 +20,7 @@ package org.apache.flink.kubernetes.operator;
 import org.apache.flink.configuration.Configuration;
 import 
org.apache.flink.kubernetes.operator.config.KubernetesOperatorConfigOptions;
 
-import io.javaoperatorsdk.operator.api.config.ConfigurationService;
+import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -28,33 +28,22 @@ import java.util.Optional;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ThreadPoolExecutor;
 
-import static java.util.Optional.empty;
-
 /** @link FlinkOperator unit tests. */
 public class FlinkOperatorTest {
 
-    @Test
-    public void testExecutorServiceDefaultsToMaxParallelism() {
-        checkExecutorServiceThreadCount(
-                empty(), 
ConfigurationService.DEFAULT_RECONCILIATION_THREADS_NUMBER);
-    }
-
     @Test
     public void 
testExecutorServiceUsesReconciliationMaxParallelismFromConfig() {
         checkExecutorServiceThreadCount(Optional.of(42), 42);
-    }
-
-    @Test
-    public void 
testExecutorServiceUsesMaxParallelismForMinusOneReconciliationMaxParallelism() {
-        checkExecutorServiceThreadCount(Optional.of(-1), Integer.MAX_VALUE);
+        // TODO: cannot override the operator configs twice in 
java-operator-sdk v3
+        Assertions.assertThrows(
+                IllegalStateException.class,
+                () -> checkExecutorServiceThreadCount(Optional.of(-1), 1));
     }
 
     private void checkExecutorServiceThreadCount(
             Optional<Integer> parallelism, int expectedThreadCount) {
         var es = getExecutorForParallelismConfig(parallelism);
-
         Assertions.assertInstanceOf(ThreadPoolExecutor.class, es);
-
         ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) es;
         Assertions.assertEquals(expectedThreadCount, 
threadPoolExecutor.getMaximumPoolSize());
     }
@@ -66,8 +55,7 @@ public class FlinkOperatorTest {
                         operatorConfig.setInteger(
                                 
KubernetesOperatorConfigOptions.OPERATOR_RECONCILER_MAX_PARALLELISM,
                                 p));
-
-        FlinkOperator flinkOperator = new FlinkOperator(operatorConfig);
-        return 
flinkOperator.getOperator().getConfigurationService().getExecutorService();
+        new FlinkOperator(operatorConfig);
+        return ConfigurationServiceProvider.instance().getExecutorService();
     }
 }
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestUtils.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestUtils.java
index 38ea772..846d641 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestUtils.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestUtils.java
@@ -38,7 +38,6 @@ import 
org.apache.flink.kubernetes.operator.crd.status.FlinkDeploymentStatus;
 import org.apache.flink.kubernetes.operator.crd.status.FlinkSessionJobStatus;
 import 
org.apache.flink.kubernetes.operator.crd.status.JobManagerDeploymentStatus;
 import 
org.apache.flink.kubernetes.operator.exception.DeploymentFailedException;
-import org.apache.flink.kubernetes.operator.informer.InformerManager;
 import org.apache.flink.kubernetes.operator.metrics.MetricManager;
 import 
org.apache.flink.kubernetes.operator.observer.deployment.ObserverFactory;
 import 
org.apache.flink.kubernetes.operator.reconciler.deployment.ReconcilerFactory;
@@ -61,8 +60,10 @@ import io.fabric8.kubernetes.api.model.apps.DeploymentSpec;
 import io.fabric8.kubernetes.api.model.apps.DeploymentStatus;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.fabric8.mockwebserver.utils.ResponseProvider;
+import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.RetryInfo;
+import 
io.javaoperatorsdk.operator.api.reconciler.dependent.managed.ManagedDependentResourceContext;
 import okhttp3.Headers;
 import okhttp3.mockwebserver.RecordedRequest;
 import org.junit.jupiter.api.Assertions;
@@ -71,10 +72,10 @@ import java.lang.reflect.Field;
 import java.net.HttpURLConnection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
 
@@ -204,9 +205,24 @@ public class TestUtils {
             }
 
             @Override
-            public <T> Optional<T> getSecondaryResource(Class<T> aClass, 
String s) {
+            public Optional getSecondaryResource(Class aClass, String s) {
                 return Optional.empty();
             }
+
+            @Override
+            public Set getSecondaryResources(Class expectedType) {
+                return null;
+            }
+
+            @Override
+            public ControllerConfiguration getControllerConfiguration() {
+                return null;
+            }
+
+            @Override
+            public ManagedDependentResourceContext 
managedDependentResourceContext() {
+                return null;
+            }
         };
     }
 
@@ -230,9 +246,23 @@ public class TestUtils {
             }
 
             @Override
-            public <T> Optional<T> getSecondaryResource(
-                    Class<T> expectedType, String eventSourceName) {
-                return Optional.of((T) createDeployment(true));
+            public Optional getSecondaryResource(Class expectedType, String 
eventSourceName) {
+                return Optional.of(createDeployment(true));
+            }
+
+            @Override
+            public Set getSecondaryResources(Class expectedType) {
+                return null;
+            }
+
+            @Override
+            public ControllerConfiguration getControllerConfiguration() {
+                return null;
+            }
+
+            @Override
+            public ManagedDependentResourceContext 
managedDependentResourceContext() {
+                return null;
             }
         };
     }
@@ -245,9 +275,23 @@ public class TestUtils {
             }
 
             @Override
-            public <T> Optional<T> getSecondaryResource(
-                    Class<T> expectedType, String eventSourceName) {
-                return Optional.of((T) createDeployment(false));
+            public Optional getSecondaryResource(Class expectedType, String 
eventSourceName) {
+                return Optional.of(createDeployment(false));
+            }
+
+            @Override
+            public Set getSecondaryResources(Class expectedType) {
+                return null;
+            }
+
+            @Override
+            public ControllerConfiguration getControllerConfiguration() {
+                return null;
+            }
+
+            @Override
+            public ManagedDependentResourceContext 
managedDependentResourceContext() {
+                return null;
             }
         };
     }
@@ -265,15 +309,29 @@ public class TestUtils {
             }
 
             @Override
-            public <T> Optional<T> getSecondaryResource(
-                    Class<T> expectedType, String eventSourceName) {
+            public Optional getSecondaryResource(Class expectedType, String 
eventSourceName) {
                 var session = buildSessionCluster();
                 
session.getStatus().setJobManagerDeploymentStatus(JobManagerDeploymentStatus.READY);
                 
session.getSpec().getFlinkConfiguration().putAll(flinkDepConfig);
                 session.getStatus()
                         .getReconciliationStatus()
                         .serializeAndSetLastReconciledSpec(session.getSpec());
-                return Optional.of((T) session);
+                return Optional.of(session);
+            }
+
+            @Override
+            public Set getSecondaryResources(Class expectedType) {
+                return null;
+            }
+
+            @Override
+            public ControllerConfiguration getControllerConfiguration() {
+                return null;
+            }
+
+            @Override
+            public ManagedDependentResourceContext 
managedDependentResourceContext() {
+                return null;
             }
         };
     }
@@ -286,12 +344,26 @@ public class TestUtils {
             }
 
             @Override
-            public <T> Optional<T> getSecondaryResource(
-                    Class<T> expectedType, String eventSourceName) {
+            public Optional getSecondaryResource(Class expectedType, String 
eventSourceName) {
                 var session = buildSessionCluster();
                 session.getStatus()
                         
.setJobManagerDeploymentStatus(JobManagerDeploymentStatus.MISSING);
-                return Optional.of((T) session);
+                return Optional.of(session);
+            }
+
+            @Override
+            public Set getSecondaryResources(Class expectedType) {
+                return null;
+            }
+
+            @Override
+            public ControllerConfiguration getControllerConfiguration() {
+                return null;
+            }
+
+            @Override
+            public ManagedDependentResourceContext 
managedDependentResourceContext() {
+                return null;
             }
         };
     }
@@ -306,8 +378,7 @@ public class TestUtils {
             }
 
             @Override
-            public <T> Optional<T> getSecondaryResource(
-                    Class<T> expectedType, String eventSourceName) {
+            public Optional getSecondaryResource(Class expectedType, String 
eventSourceName) {
                 DeploymentStatus status = new DeploymentStatus();
                 status.setAvailableReplicas(0);
                 status.setReplicas(1);
@@ -326,7 +397,22 @@ public class TestUtils {
                 Deployment deployment = new Deployment();
                 deployment.setSpec(spec);
                 deployment.setStatus(status);
-                return Optional.of((T) deployment);
+                return Optional.of(deployment);
+            }
+
+            @Override
+            public Set getSecondaryResources(Class expectedType) {
+                return null;
+            }
+
+            @Override
+            public ControllerConfiguration getControllerConfiguration() {
+                return null;
+            }
+
+            @Override
+            public ManagedDependentResourceContext 
managedDependentResourceContext() {
+                return null;
             }
         };
     }
@@ -371,11 +457,7 @@ public class TestUtils {
                 configManager,
                 kubernetesClient,
                 ValidatorUtils.discoverValidators(configManager),
-                new ReconcilerFactory(
-                        kubernetesClient,
-                        flinkService,
-                        configManager,
-                        new InformerManager(new HashSet<>(), 
kubernetesClient)),
+                new ReconcilerFactory(kubernetesClient, flinkService, 
configManager),
                 new ObserverFactory(kubernetesClient, flinkService, 
configManager, statusHelper),
                 new MetricManager<>(new MetricListener().getMetricGroup()),
                 statusHelper);
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestingFlinkService.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestingFlinkService.java
index 2659655..27904f4 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestingFlinkService.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestingFlinkService.java
@@ -46,8 +46,10 @@ import 
org.apache.flink.runtime.rest.messages.DashboardConfiguration;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.PodList;
 import io.fabric8.kubernetes.client.KubernetesClient;
+import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.RetryInfo;
+import 
io.javaoperatorsdk.operator.api.reconciler.dependent.managed.ManagedDependentResourceContext;
 
 import javax.annotation.Nullable;
 
@@ -104,11 +106,26 @@ public class TestingFlinkService extends FlinkService {
             }
 
             @Override
-            public <T> Optional<T> getSecondaryResource(Class<T> aClass, 
String s) {
+            public Optional getSecondaryResource(Class aClass, String s) {
                 if (jobs.isEmpty() && sessions.isEmpty()) {
                     return Optional.empty();
                 }
-                return Optional.of((T) TestUtils.createDeployment(true));
+                return Optional.of(TestUtils.createDeployment(true));
+            }
+
+            @Override
+            public Set getSecondaryResources(Class expectedType) {
+                return null;
+            }
+
+            @Override
+            public ControllerConfiguration getControllerConfiguration() {
+                return null;
+            }
+
+            @Override
+            public ManagedDependentResourceContext 
managedDependentResourceContext() {
+                return null;
             }
         };
     }
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/controller/DeploymentRecoveryTest.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/controller/DeploymentRecoveryTest.java
index 60c6fa3..372aa75 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/controller/DeploymentRecoveryTest.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/controller/DeploymentRecoveryTest.java
@@ -66,7 +66,8 @@ public class DeploymentRecoveryTest {
 
     @ParameterizedTest
     @MethodSource("applicationTestParams")
-    public void verifyApplicationJmRecovery(FlinkVersion flinkVersion, 
UpgradeMode upgradeMode) {
+    public void verifyApplicationJmRecovery(FlinkVersion flinkVersion, 
UpgradeMode upgradeMode)
+            throws Exception {
         FlinkDeployment appCluster = 
TestUtils.buildApplicationCluster(flinkVersion);
         appCluster.getSpec().getJob().setUpgradeMode(upgradeMode);
 
@@ -140,7 +141,7 @@ public class DeploymentRecoveryTest {
 
     @ParameterizedTest
     @EnumSource(FlinkVersion.class)
-    public void verifySessionJmRecovery(FlinkVersion flinkVersion) {
+    public void verifySessionJmRecovery(FlinkVersion flinkVersion) throws 
Exception {
         FlinkDeployment appCluster = 
TestUtils.buildSessionCluster(flinkVersion);
         testController.reconcile(appCluster, context);
         testController.reconcile(appCluster, context);
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/controller/FlinkDeploymentControllerTest.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/controller/FlinkDeploymentControllerTest.java
index 98c4337..cab534a 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/controller/FlinkDeploymentControllerTest.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/controller/FlinkDeploymentControllerTest.java
@@ -42,7 +42,6 @@ import 
io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
 import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
-import io.javaoperatorsdk.operator.processing.event.source.EventSource;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -51,12 +50,9 @@ import org.junit.jupiter.params.provider.EnumSource;
 import org.junit.jupiter.params.provider.MethodSource;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -91,7 +87,7 @@ public class FlinkDeploymentControllerTest {
 
     @ParameterizedTest
     @EnumSource(FlinkVersion.class)
-    public void verifyBasicReconcileLoop(FlinkVersion flinkVersion) {
+    public void verifyBasicReconcileLoop(FlinkVersion flinkVersion) throws 
Exception {
         FlinkDeployment appCluster = 
TestUtils.buildApplicationCluster(flinkVersion);
 
         UpdateControl<FlinkDeployment> updateControl;
@@ -276,7 +272,7 @@ public class FlinkDeploymentControllerTest {
 
     @ParameterizedTest
     @EnumSource(FlinkVersion.class)
-    public void verifyUpgradeFromSavepoint(FlinkVersion flinkVersion) {
+    public void verifyUpgradeFromSavepoint(FlinkVersion flinkVersion) throws 
Exception {
         FlinkDeployment appCluster = 
TestUtils.buildApplicationCluster(flinkVersion);
         appCluster.getSpec().getJob().setUpgradeMode(UpgradeMode.SAVEPOINT);
         appCluster.getSpec().getJob().setInitialSavepointPath("s0");
@@ -365,7 +361,7 @@ public class FlinkDeploymentControllerTest {
 
     @ParameterizedTest
     @EnumSource(FlinkVersion.class)
-    public void verifyStatelessUpgrade(FlinkVersion flinkVersion) {
+    public void verifyStatelessUpgrade(FlinkVersion flinkVersion) throws 
Exception {
         FlinkDeployment appCluster = 
TestUtils.buildApplicationCluster(flinkVersion);
         appCluster.getSpec().getJob().setUpgradeMode(UpgradeMode.STATELESS);
         appCluster.getSpec().getJob().setInitialSavepointPath("s0");
@@ -453,21 +449,21 @@ public class FlinkDeploymentControllerTest {
 
     @ParameterizedTest
     @EnumSource(FlinkVersion.class)
-    public void testUpgradeNotReadyClusterSession(FlinkVersion flinkVersion) {
+    public void testUpgradeNotReadyClusterSession(FlinkVersion flinkVersion) 
throws Exception {
         
testUpgradeNotReadyCluster(TestUtils.buildSessionCluster(flinkVersion));
     }
 
     @ParameterizedTest
     @MethodSource("applicationTestParams")
     public void testUpgradeNotReadyClusterApplication(
-            FlinkVersion flinkVersion, UpgradeMode upgradeMode) {
+            FlinkVersion flinkVersion, UpgradeMode upgradeMode) throws 
Exception {
         var appCluster = TestUtils.buildApplicationCluster(flinkVersion);
         appCluster.getSpec().getJob().setUpgradeMode(upgradeMode);
         testUpgradeNotReadyCluster(appCluster);
     }
 
     @Test
-    public void verifyReconcileWithBadConfig() {
+    public void verifyReconcileWithBadConfig() throws Exception {
 
         FlinkDeployment appCluster = TestUtils.buildApplicationCluster();
         UpdateControl<FlinkDeployment> updateControl;
@@ -507,7 +503,7 @@ public class FlinkDeploymentControllerTest {
     }
 
     @Test
-    public void verifyReconcileWithAChangedOperatorMode() {
+    public void verifyReconcileWithAChangedOperatorMode() throws Exception {
 
         FlinkDeployment appCluster = TestUtils.buildApplicationCluster();
         UpdateControl<FlinkDeployment> updateControl;
@@ -545,7 +541,7 @@ public class FlinkDeploymentControllerTest {
         assertEquals(expectedJobStatus.getJobState().toString(), 
jobStatus.getState());
     }
 
-    private void testUpgradeNotReadyCluster(FlinkDeployment appCluster) {
+    private void testUpgradeNotReadyCluster(FlinkDeployment appCluster) throws 
Exception {
         flinkService.clear();
         testController.reconcile(appCluster, context);
         assertEquals(
@@ -652,25 +648,7 @@ public class FlinkDeploymentControllerTest {
     }
 
     @Test
-    public void testPrepareEventSource() {
-        // Test watch all
-        testController.setEffectiveNamespaces(Collections.emptySet());
-        List<EventSource> eventSources = 
testController.prepareEventSources(null);
-        assertEquals(1, eventSources.size());
-        assertEquals("all", eventSources.get(0).name());
-
-        // Test watch namespaces
-        Set<String> namespaces = Set.of("ns1", "ns2", "ns3");
-        testController.setEffectiveNamespaces(namespaces);
-        eventSources = testController.prepareEventSources(null);
-        assertEquals(3, eventSources.size());
-        assertEquals(
-                namespaces,
-                
eventSources.stream().map(EventSource::name).collect(Collectors.toSet()));
-    }
-
-    @Test
-    public void testSuccessfulObservationShouldClearErrors() {
+    public void testSuccessfulObservationShouldClearErrors() throws Exception {
         final String crashLoopMessage = "deploy errors";
         
flinkService.setJmPodList(TestUtils.createFailedPodList(crashLoopMessage));
 
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/informer/InformerManagerTest.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/informer/InformerManagerTest.java
index 09715f1..08fcddd 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/informer/InformerManagerTest.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/informer/InformerManagerTest.java
@@ -17,17 +17,16 @@
 
 package org.apache.flink.kubernetes.operator.informer;
 
-import org.apache.flink.kubernetes.operator.utils.OperatorUtils;
-
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
 import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import java.util.HashSet;
 import java.util.Set;
 
+import static 
io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
+
 /** Test for {@link InformerManager}. */
 @EnableKubernetesMockClient(crud = true)
 public class InformerManagerTest {
@@ -37,14 +36,10 @@ public class InformerManagerTest {
 
     @Test
     public void testNamespacedInformerCreated() {
-        var informerManager = new InformerManager(new HashSet<>(), 
kubernetesClient);
-        Assertions.assertNotNull(
-                
informerManager.getSessionJobInformer(OperatorUtils.ALL_NAMESPACE));
-        
Assertions.assertNotNull(informerManager.getFlinkDepInformer(OperatorUtils.ALL_NAMESPACE));
+        var informerManager = new InformerManager(DEFAULT_NAMESPACES_SET, 
kubernetesClient);
+        Assertions.assertNotNull(informerManager.getFlinkDepInformer("ns1"));
 
         informerManager = new InformerManager(Set.of("ns1", "ns2"), 
kubernetesClient);
-        Assertions.assertNotNull(informerManager.getSessionJobInformer("ns1"));
-        Assertions.assertNotNull(informerManager.getSessionJobInformer("ns2"));
         Assertions.assertNotNull(informerManager.getFlinkDepInformer("ns1"));
         Assertions.assertNotNull(informerManager.getFlinkDepInformer("ns2"));
     }
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/observer/deployment/SessionObserverTest.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/observer/deployment/SessionObserverTest.java
index 1f73ab8..3d96fc2 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/observer/deployment/SessionObserverTest.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/observer/deployment/SessionObserverTest.java
@@ -23,20 +23,10 @@ import 
org.apache.flink.kubernetes.operator.TestingFlinkService;
 import org.apache.flink.kubernetes.operator.config.FlinkConfigManager;
 import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
 import 
org.apache.flink.kubernetes.operator.crd.status.JobManagerDeploymentStatus;
-import org.apache.flink.kubernetes.operator.observer.Observer;
-import org.apache.flink.kubernetes.operator.service.FlinkService;
 
-import io.fabric8.kubernetes.api.model.apps.Deployment;
-import io.fabric8.kubernetes.api.model.apps.DeploymentSpec;
-import io.fabric8.kubernetes.api.model.apps.DeploymentStatus;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
-import io.javaoperatorsdk.operator.api.reconciler.RetryInfo;
 import org.junit.jupiter.api.Test;
 
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
@@ -96,77 +86,4 @@ public class SessionObserverTest {
                 JobManagerDeploymentStatus.READY,
                 deployment.getStatus().getJobManagerDeploymentStatus());
     }
-
-    @Test
-    public void testWatchMultipleNamespaces() {
-        FlinkService flinkService = new TestingFlinkService();
-        FlinkDeployment deployment = TestUtils.buildSessionCluster();
-        deployment
-                .getStatus()
-                .getReconciliationStatus()
-                .serializeAndSetLastReconciledSpec(deployment.getSpec());
-
-        Deployment k8sDeployment = new Deployment();
-        k8sDeployment.setSpec(new DeploymentSpec());
-        k8sDeployment.setStatus(new DeploymentStatus());
-
-        AtomicInteger secondaryResourceAccessed = new AtomicInteger(0);
-        Observer observer = new SessionObserver(null, flinkService, 
configManager);
-        observer.observe(
-                deployment,
-                new Context() {
-                    @Override
-                    public Optional<RetryInfo> getRetryInfo() {
-                        return Optional.empty();
-                    }
-
-                    @Override
-                    public <T> Optional<T> getSecondaryResource(Class<T> 
aClass, String s) {
-                        assertNull(s);
-                        secondaryResourceAccessed.addAndGet(1);
-                        return Optional.of((T) k8sDeployment);
-                    }
-                });
-
-        assertEquals(1, secondaryResourceAccessed.get());
-
-        
configManager.setWatchedNamespaces(Set.of(deployment.getMetadata().getNamespace()));
-        observer.observe(
-                deployment,
-                new Context() {
-                    @Override
-                    public Optional<RetryInfo> getRetryInfo() {
-                        return Optional.empty();
-                    }
-
-                    @Override
-                    public <T> Optional<T> getSecondaryResource(Class<T> 
aClass, String s) {
-                        assertNull(s);
-                        secondaryResourceAccessed.addAndGet(1);
-                        return Optional.of((T) k8sDeployment);
-                    }
-                });
-
-        assertEquals(2, secondaryResourceAccessed.get());
-
-        
configManager.setWatchedNamespaces(Set.of(deployment.getMetadata().getNamespace(),
 "ns"));
-        observer.observe(
-                deployment,
-                new Context() {
-                    @Override
-                    public Optional<RetryInfo> getRetryInfo() {
-                        return Optional.empty();
-                    }
-
-                    @Override
-                    public <T> Optional<T> getSecondaryResource(Class<T> 
aClass, String s) {
-                        assertEquals(deployment.getMetadata().getNamespace(), 
s);
-                        secondaryResourceAccessed.addAndGet(1);
-                        return Optional.of((T) k8sDeployment);
-                    }
-                });
-
-        configManager.setWatchedNamespaces(null);
-        assertEquals(3, secondaryResourceAccessed.get());
-    }
 }
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconcilerTest.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconcilerTest.java
index 1c5ea67..0f7cfbf 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconcilerTest.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconcilerTest.java
@@ -22,12 +22,10 @@ import org.apache.flink.kubernetes.operator.TestUtils;
 import org.apache.flink.kubernetes.operator.TestingFlinkService;
 import org.apache.flink.kubernetes.operator.config.FlinkConfigManager;
 import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
-import org.apache.flink.kubernetes.operator.informer.InformerManager;
 
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import org.junit.jupiter.api.Test;
 
-import java.util.HashSet;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -38,7 +36,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 public class SessionReconcilerTest {
 
     private final FlinkConfigManager configManager = new 
FlinkConfigManager(new Configuration());
-    private final InformerManager informerManager = new InformerManager(new 
HashSet<>(), null);
 
     @Test
     public void testStartSession() throws Exception {
@@ -53,8 +50,7 @@ public class SessionReconcilerTest {
                     }
                 };
 
-        SessionReconciler reconciler =
-                new SessionReconciler(null, flinkService, configManager, 
informerManager);
+        SessionReconciler reconciler = new SessionReconciler(null, 
flinkService, configManager);
         FlinkDeployment deployment = TestUtils.buildSessionCluster();
         reconciler.reconcile(deployment, context);
         assertEquals(1, count.get());
diff --git a/pom.xml b/pom.xml
index db2f344..052074e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,8 +66,9 @@ under the License.
         <maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
         
<git-commit-id-maven-plugin.version>5.0.0</git-commit-id-maven-plugin.version>
 
-        <operator.sdk.version>2.1.4</operator.sdk.version>
+        <operator.sdk.version>3.0.2</operator.sdk.version>
         
<operator.sdk.admission-controller.version>0.2.0</operator.sdk.admission-controller.version>
+
         <fabric8.version>5.12.2</fabric8.version>
         <lombok.version>1.18.22</lombok.version>
 

Reply via email to