Issue #312 - Create a new controllers config package for handling global configuration options for admins (#416)

diff --git a/api/const.go b/api/const.go
deleted file mode 100644
index 519456b..0000000
--- a/api/const.go
+++ /dev/null
@@ -1,25 +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 api
-
-const (
-	// ComponentName just a name to identify this package/component/application
-	ComponentName = "sonataflow"
-)
diff --git a/bundle.osl/manifests/logic-operator-rhel8-builder-config_v1_configmap.yaml b/bundle.osl/manifests/logic-operator-rhel8-builder-config_v1_configmap.yaml
index 7640597..2e7edce 100644
--- a/bundle.osl/manifests/logic-operator-rhel8-builder-config_v1_configmap.yaml
+++ b/bundle.osl/manifests/logic-operator-rhel8-builder-config_v1_configmap.yaml
@@ -1,6 +1,5 @@
 apiVersion: v1
 data:
-  DEFAULT_BUILDER_RESOURCE_NAME: Dockerfile
   DEFAULT_WORKFLOW_EXTENSION: .sw.json
   Dockerfile: "FROM registry.redhat.io/openshift-serverless-1-tech-preview/logic-swf-builder-rhel8:latest
     AS builder\n\n# variables that can be overridden by the builder\n# To add a Quarkus
diff --git a/bundle/manifests/sonataflow-operator-builder-config_v1_configmap.yaml b/bundle/manifests/sonataflow-operator-builder-config_v1_configmap.yaml
index 2d787ee..d04b6b6 100644
--- a/bundle/manifests/sonataflow-operator-builder-config_v1_configmap.yaml
+++ b/bundle/manifests/sonataflow-operator-builder-config_v1_configmap.yaml
@@ -1,6 +1,5 @@
 apiVersion: v1
 data:
-  DEFAULT_BUILDER_RESOURCE_NAME: Dockerfile
   DEFAULT_WORKFLOW_EXTENSION: .sw.json
   Dockerfile: "FROM quay.io/kiegroup/kogito-swf-builder-nightly:latest AS builder\n\n#
     variables that can be overridden by the builder\n# To add a Quarkus extension
diff --git a/bundle/manifests/sonataflow-operator-controllers-config_v1_configmap.yaml b/bundle/manifests/sonataflow-operator-controllers-config_v1_configmap.yaml
new file mode 100644
index 0000000..a16e6be
--- /dev/null
+++ b/bundle/manifests/sonataflow-operator-controllers-config_v1_configmap.yaml
@@ -0,0 +1,34 @@
+apiVersion: v1
+data:
+  controllers_cfg.yaml: |
+    # The default size of Kaniko PVC when using the internal operator builder manager
+    defaultPvcKanikoSize: 1Gi
+    # How much time (in seconds) to wait for a devmode workflow to start.
+    # This information is used for the controller manager to create new devmode containers and setup the healthcheck probes.
+    healthFailureThresholdDevMode: 50
+    # Default image used internally by the Operator Managed Kaniko builder to create the warmup pods
+    kanikoDefaultWarmerImageTag: gcr.io/kaniko-project/warmer:v1.9.0
+    # Default image used internally by the Operator Managed Kaniko builder to create the executor pods
+    kanikoExecutorImageTag: gcr.io/kaniko-project/executor:v1.9.0
+    # The Jobs Service image to use, if empty the operator will use the default Apache Community one based on the current operator's version
+    jobsServicePostgreSQLImageTag: ""
+    jobsServiceEphemeralImageTag: ""
+    # The Data Index image to use, if empty the operator will use the default Apache Community one based on the current operator's version
+    dataIndexPostgreSQLImageTag: ""
+    dataIndexEphemeralTag: ""
+    # SonataFlow base builder image used in the internal Dockerfile to build workflow applications in preview profile
+    # Order of precedence is:
+    # 1. SonataFlowPlatform in the given namespace
+    # 2. This configuration
+    # 3. The FROM in the Dockerfile in the operator's namespace "sonataflow-operator-builder-config" configMap.
+    # If 1 or 2, the FROM tag will be replaced by the tag se there.
+    # If empty the operator will use the default Apache Community one based on the current operator's version.
+    sonataFlowBaseBuilderImageTag: ""
+    # The image to use to deploy SonataFlow workflow images in devmode profile.
+    # If empty the operator will use the default Apache Community one based on the current operator's version.
+    sonataFlowDevModeImageTag: ""
+    # The default name of the builder configMap in the operator's namespace
+    builderConfigMapName: "sonataflow-operator-builder-config"
+kind: ConfigMap
+metadata:
+  name: sonataflow-operator-controllers-config
diff --git a/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml b/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
index a4ce43c..b71c508 100644
--- a/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
+++ b/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
@@ -728,31 +728,6 @@
             spec:
               containers:
               - args:
-                - --secure-listen-address=0.0.0.0:8443
-                - --upstream=http://127.0.0.1:8080/
-                - --logtostderr=true
-                - --v=0
-                image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0
-                name: kube-rbac-proxy
-                ports:
-                - containerPort: 8443
-                  name: https
-                  protocol: TCP
-                resources:
-                  limits:
-                    cpu: 500m
-                    memory: 128Mi
-                  requests:
-                    cpu: 5m
-                    memory: 64Mi
-                securityContext:
-                  allowPrivilegeEscalation: false
-                  capabilities:
-                    drop:
-                    - ALL
-                  seccompProfile:
-                    type: RuntimeDefault
-              - args:
                 - --health-probe-bind-address=:8081
                 - --metrics-bind-address=127.0.0.1:8080
                 - --leader-elect
@@ -790,10 +765,43 @@
                   capabilities:
                     drop:
                     - ALL
+                volumeMounts:
+                - mountPath: /config/controllers_cfg.yaml
+                  name: controllers-config
+                  subPath: controllers_cfg.yaml
+              - args:
+                - --secure-listen-address=0.0.0.0:8443
+                - --upstream=http://127.0.0.1:8080/
+                - --logtostderr=true
+                - --v=0
+                image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0
+                name: kube-rbac-proxy
+                ports:
+                - containerPort: 8443
+                  name: https
+                  protocol: TCP
+                resources:
+                  limits:
+                    cpu: 500m
+                    memory: 128Mi
+                  requests:
+                    cpu: 5m
+                    memory: 64Mi
+                securityContext:
+                  allowPrivilegeEscalation: false
+                  capabilities:
+                    drop:
+                    - ALL
+                  seccompProfile:
+                    type: RuntimeDefault
               securityContext:
                 runAsNonRoot: true
               serviceAccountName: sonataflow-operator-controller-manager
               terminationGracePeriodSeconds: 10
+              volumes:
+              - configMap:
+                  name: sonataflow-operator-controllers-config
+                name: controllers-config
       permissions:
       - rules:
         - apiGroups:
diff --git a/config/default/controllers_config_patch.yaml b/config/default/controllers_config_patch.yaml
new file mode 100644
index 0000000..5394767
--- /dev/null
+++ b/config/default/controllers_config_patch.yaml
@@ -0,0 +1,18 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: controller-manager
+  namespace: system
+spec:
+  template:
+    spec:
+      containers:
+      - name: manager
+        volumeMounts:
+        - name: controllers-config
+          mountPath: /config/controllers_cfg.yaml
+          subPath: controllers_cfg.yaml
+      volumes:
+      - name: controllers-config
+        configMap:
+          name: controllers-config
diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml
index 613c7e3..19bd8db 100644
--- a/config/default/kustomization.yaml
+++ b/config/default/kustomization.yaml
@@ -34,6 +34,9 @@
 # through a ComponentConfig type
 #- manager_config_patch.yaml
 
+# Mount the custom controllers config
+- controllers_config_patch.yaml
+
 # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
 # crd/kustomization.yaml
 #- manager_webhook_patch.yaml
diff --git a/config/manager/sonataflow_builder_dockerfile.yaml b/config/manager/SonataFlow-Builder.containerfile
similarity index 100%
rename from config/manager/sonataflow_builder_dockerfile.yaml
rename to config/manager/SonataFlow-Builder.containerfile
diff --git a/config/manager/controllers_cfg.yaml b/config/manager/controllers_cfg.yaml
new file mode 100644
index 0000000..41f2f86
--- /dev/null
+++ b/config/manager/controllers_cfg.yaml
@@ -0,0 +1,28 @@
+# The default size of Kaniko PVC when using the internal operator builder manager
+defaultPvcKanikoSize: 1Gi
+# How much time (in seconds) to wait for a devmode workflow to start.
+# This information is used for the controller manager to create new devmode containers and setup the healthcheck probes.
+healthFailureThresholdDevMode: 50
+# Default image used internally by the Operator Managed Kaniko builder to create the warmup pods
+kanikoDefaultWarmerImageTag: gcr.io/kaniko-project/warmer:v1.9.0
+# Default image used internally by the Operator Managed Kaniko builder to create the executor pods
+kanikoExecutorImageTag: gcr.io/kaniko-project/executor:v1.9.0
+# The Jobs Service image to use, if empty the operator will use the default Apache Community one based on the current operator's version
+jobsServicePostgreSQLImageTag: ""
+jobsServiceEphemeralImageTag: ""
+# The Data Index image to use, if empty the operator will use the default Apache Community one based on the current operator's version
+dataIndexPostgreSQLImageTag: ""
+dataIndexEphemeralTag: ""
+# SonataFlow base builder image used in the internal Dockerfile to build workflow applications in preview profile
+# Order of precedence is:
+# 1. SonataFlowPlatform in the given namespace
+# 2. This configuration
+# 3. The FROM in the Dockerfile in the operator's namespace "sonataflow-operator-builder-config" configMap.
+# If 1 or 2, the FROM tag will be replaced by the tag se there.
+# If empty the operator will use the default Apache Community one based on the current operator's version.
+sonataFlowBaseBuilderImageTag: ""
+# The image to use to deploy SonataFlow workflow images in devmode profile.
+# If empty the operator will use the default Apache Community one based on the current operator's version.
+sonataFlowDevModeImageTag: ""
+# The default name of the builder configMap in the operator's namespace
+builderConfigMapName: "sonataflow-operator-builder-config"
diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml
index bc6245f..3cc8cc8 100644
--- a/config/manager/kustomization.yaml
+++ b/config/manager/kustomization.yaml
@@ -2,16 +2,21 @@
 - manager.yaml
 generatorOptions:
   disableNameSuffixHash: true
+# No need to generate this CM since we are not using it.
+# Must also uncomment config/manager/kustomization.yaml to mount it in the controller
+
+#- files:
+#  - controller_manager_config.yaml
+#  name: manager-config
 configMapGenerator:
 - files:
-  - controller_manager_config.yaml
-  name: manager-config
-- files:
-  - Dockerfile=sonataflow_builder_dockerfile.yaml
+  - Dockerfile=SonataFlow-Builder.containerfile
   literals:
-  - DEFAULT_BUILDER_RESOURCE_NAME=Dockerfile
   - DEFAULT_WORKFLOW_EXTENSION=.sw.json
   name: builder-config
+- files:
+  - controllers_cfg.yaml
+  name: controllers-config
 apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 images:
diff --git a/config/manager/osl/sonataflow_builder_dockerfile.yaml b/config/manager/osl/SonataFlow-Builder.containerfile
similarity index 100%
rename from config/manager/osl/sonataflow_builder_dockerfile.yaml
rename to config/manager/osl/SonataFlow-Builder.containerfile
diff --git a/config/manager/osl/kustomization.yaml b/config/manager/osl/kustomization.yaml
index 52178c0..8136aef 100644
--- a/config/manager/osl/kustomization.yaml
+++ b/config/manager/osl/kustomization.yaml
@@ -9,9 +9,8 @@
   - controller_manager_config.yaml
   name: manager-config
 - files:
-  - Dockerfile=sonataflow_builder_dockerfile.yaml
+  - Dockerfile=SonataFlow-Builder.containerfile
   literals:
-  - DEFAULT_BUILDER_RESOURCE_NAME=Dockerfile
   - DEFAULT_WORKFLOW_EXTENSION=.sw.json
   name: builder-config
 
diff --git a/container-builder/api/build_types.go b/container-builder/api/build_types.go
index d631385..a90b182 100644
--- a/container-builder/api/build_types.go
+++ b/container-builder/api/build_types.go
@@ -125,6 +125,8 @@
 	Cache KanikoTaskCache `json:"cache,omitempty"`
 	// AdditionalFlags -- List of additional flags for  the Kaniko process (see https://github.com/GoogleContainerTools/kaniko/blob/main/README.md#additional-flags)
 	AdditionalFlags []string `json:"additionalFlags,omitempty"`
+	// Image used by the created Kaniko pod executor
+	KanikoExecutorImage string `json:"kanikoExecutorImage,omitempty"`
 }
 
 // KanikoTaskCache is used to configure Kaniko cache
diff --git a/container-builder/api/const.go b/container-builder/api/const.go
deleted file mode 100644
index b24b5d8..0000000
--- a/container-builder/api/const.go
+++ /dev/null
@@ -1,25 +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 api
-
-const (
-	// ComponentName just a name to identify this package/component/application
-	ComponentName = "sonataflow-builder"
-)
diff --git a/container-builder/builder/kaniko_vanilla.go b/container-builder/builder/kaniko_vanilla.go
index 5a72921..bad057f 100644
--- a/container-builder/builder/kaniko_vanilla.go
+++ b/container-builder/builder/kaniko_vanilla.go
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package builder
 
 import (
diff --git a/container-builder/builder/kubernetes/builder.go b/container-builder/builder/kubernetes/builder.go
index f5d5047..a2c78bb 100644
--- a/container-builder/builder/kubernetes/builder.go
+++ b/container-builder/builder/kubernetes/builder.go
@@ -40,6 +40,8 @@
 	FinalImageName  string
 	BuildUniqueName string
 	Platform        api.PlatformContainerBuild
+	// ContainerBuilderImageTag the image tag used internally to create the pod builder (e.g. Kaniko Executor Builder image)
+	ContainerBuilderImageTag string
 }
 
 type resource struct {
diff --git a/container-builder/builder/kubernetes/builder_kaniko.go b/container-builder/builder/kubernetes/builder_kaniko.go
index 3541668..0ab6c9b 100644
--- a/container-builder/builder/kubernetes/builder_kaniko.go
+++ b/container-builder/builder/kubernetes/builder_kaniko.go
@@ -50,7 +50,8 @@
 			Image:      info.FinalImageName,
 			Registry:   info.Platform.Spec.Registry,
 		},
-		Cache: api.KanikoTaskCache{},
+		Cache:               api.KanikoTaskCache{},
+		KanikoExecutorImage: info.ContainerBuilderImageTag,
 	}
 
 	ctx.containerBuild = &api.ContainerBuild{
diff --git a/container-builder/builder/kubernetes/kaniko.go b/container-builder/builder/kubernetes/kaniko.go
index a596a3d..d2d542c 100644
--- a/container-builder/builder/kubernetes/kaniko.go
+++ b/container-builder/builder/kubernetes/kaniko.go
@@ -28,7 +28,6 @@
 
 	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/api"
 	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/client"
-	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/util/defaults"
 	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/util/minikube"
 	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/util/registry"
 )
@@ -136,7 +135,7 @@
 
 	container := corev1.Container{
 		Name:            strings.ToLower(task.Name),
-		Image:           defaults.KanikoExecutorImage,
+		Image:           task.KanikoExecutorImage,
 		ImagePullPolicy: corev1.PullIfNotPresent,
 		Args:            args,
 		Env:             env,
diff --git a/container-builder/builder/kubernetes/monitor_pod.go b/container-builder/builder/kubernetes/monitor_pod.go
index 9a18aa7..2a52275 100644
--- a/container-builder/builder/kubernetes/monitor_pod.go
+++ b/container-builder/builder/kubernetes/monitor_pod.go
@@ -25,10 +25,6 @@
 	"os"
 	"time"
 
-	"github.com/hashicorp/go-version"
-
-	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/util/defaults"
-
 	"github.com/pkg/errors"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -99,16 +95,6 @@
 			if err = action.addTimeoutAnnotation(ctx, pod, metav1.Now()); err != nil {
 				return nil, err
 			}
-			// In latest Kaniko versions kill is no more available in image's $PATH, do we still need it?
-			// Send SIGTERM signal to running containers
-			current, err := version.NewVersion(defaults.KanikoVersion)
-			maxVersionSupportingKill, err := version.NewVersion(defaults.KanikoVersionSupportingKill)
-			if current.LessThanOrEqual(maxVersionSupportingKill) {
-				if err = action.sigterm(pod); err != nil {
-					// Requeue
-					return nil, err
-				}
-			}
 		}
 
 	case corev1.PodSucceeded:
diff --git a/container-builder/go.mod b/container-builder/go.mod
index fc52361..fccb149 100644
--- a/container-builder/go.mod
+++ b/container-builder/go.mod
@@ -6,7 +6,6 @@
 	github.com/docker/docker v24.0.9+incompatible
 	github.com/docker/go-connections v0.4.1-0.20210727194412-58542c764a11
 	github.com/google/uuid v1.3.1
-	github.com/hashicorp/go-version v1.6.0
 	github.com/heroku/docker-registry-client v0.0.0-20211012143308-9463674c8930
 	github.com/jpillora/backoff v1.0.0
 	github.com/mitchellh/go-homedir v1.1.0
diff --git a/container-builder/go.sum b/container-builder/go.sum
index b4e1a20..54cd567 100644
--- a/container-builder/go.sum
+++ b/container-builder/go.sum
@@ -156,8 +156,6 @@
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
-github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
 github.com/heroku/docker-registry-client v0.0.0-20211012143308-9463674c8930 h1:mNL9ktJqBuzPTV/QP/fKd4y1uOFvfiv6zhe0G7lg9OA=
 github.com/heroku/docker-registry-client v0.0.0-20211012143308-9463674c8930/go.mod h1:Yho0S7KhsnHQRCC5lDraYF1SsLMeWtf/tKdufKu3TJA=
diff --git a/container-builder/util/defaults/kaniko.go b/container-builder/util/defaults/kaniko.go
deleted file mode 100644
index df6c20d..0000000
--- a/container-builder/util/defaults/kaniko.go
+++ /dev/null
@@ -1,26 +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 defaults
-
-const (
-	KanikoVersion               = "1.9.0"
-	KanikoVersionSupportingKill = "0.17.1"
-	KanikoExecutorImage         = "gcr.io/kaniko-project/executor:v" + KanikoVersion
-)
diff --git a/controllers/builder/builder.go b/controllers/builder/builder.go
index 17db22a..d7ef14d 100644
--- a/controllers/builder/builder.go
+++ b/controllers/builder/builder.go
@@ -35,10 +35,10 @@
 )
 
 type buildManagerContext struct {
-	ctx          context.Context
-	client       client.Client
-	platform     *operatorapi.SonataFlowPlatform
-	commonConfig *v1.ConfigMap
+	ctx              context.Context
+	client           client.Client
+	platform         *operatorapi.SonataFlowPlatform
+	builderConfigMap *v1.ConfigMap
 }
 
 type BuildManager interface {
@@ -55,16 +55,16 @@
 		klog.V(log.E).ErrorS(err, "Error retrieving the active platform. Workflow build cannot be performed!", "workflow", targetName)
 		return nil, err
 	}
-	commonConfig, err := GetCommonConfigMap(client, targetNamespace)
+	builderConfig, err := GetBuilderConfigMap(client, targetNamespace)
 	if err != nil {
 		klog.V(log.E).ErrorS(err, "Failed to get common configMap for Workflow Builder. Make sure that sonataflow-operator-builder-config is present in the operator namespace.")
 		return nil, err
 	}
 	managerContext := buildManagerContext{
-		ctx:          ctx,
-		client:       client,
-		platform:     p,
-		commonConfig: commonConfig,
+		ctx:              ctx,
+		client:           client,
+		platform:         p,
+		builderConfigMap: builderConfig,
 	}
 	switch p.Status.Cluster {
 	case operatorapi.PlatformClusterOpenShift:
diff --git a/controllers/builder/config.go b/controllers/builder/config.go
index 77155a4..d949a47 100644
--- a/controllers/builder/config.go
+++ b/controllers/builder/config.go
@@ -24,6 +24,7 @@
 	"fmt"
 	"os"
 
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	"github.com/pkg/errors"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -35,15 +36,13 @@
 )
 
 const (
-	envVarPodNamespaceName = "POD_NAMESPACE"
-	// ConfigMapName is the default name for the Builder ConfigMap name
-	ConfigMapName                       = "sonataflow-operator-builder-config"
-	configKeyDefaultExtension           = "DEFAULT_WORKFLOW_EXTENSION"
-	configKeyDefaultBuilderResourceName = "DEFAULT_BUILDER_RESOURCE_NAME"
+	envVarPodNamespaceName     = "POD_NAMESPACE"
+	configKeyDefaultExtension  = "DEFAULT_WORKFLOW_EXTENSION"
+	defaultBuilderResourceName = "Dockerfile"
 )
 
-// GetCommonConfigMap retrieves the config map with the builder common configuration information
-func GetCommonConfigMap(client client.Client, fallbackNS string) (*corev1.ConfigMap, error) {
+// GetBuilderConfigMap retrieves the config map with the builder common configuration information
+func GetBuilderConfigMap(client client.Client, fallbackNS string) (*corev1.ConfigMap, error) {
 	namespace, found := os.LookupEnv(envVarPodNamespaceName)
 	if !found {
 		namespace = fallbackNS
@@ -59,43 +58,38 @@
 			APIVersion: "v1",
 		},
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      ConfigMapName,
+			Name:      cfg.GetCfg().BuilderConfigMapName,
 			Namespace: namespace,
 		},
 		Data: map[string]string{},
 	}
 
-	err := client.Get(context.TODO(), types.NamespacedName{Name: ConfigMapName, Namespace: namespace}, existingConfigMap)
+	builderConfigMapName := cfg.GetCfg().BuilderConfigMapName
+	err := client.Get(context.TODO(), types.NamespacedName{Name: builderConfigMapName, Namespace: namespace}, existingConfigMap)
 	if err != nil {
-		klog.V(log.E).ErrorS(err, "fetching configmap", "name", ConfigMapName)
+		klog.V(log.E).ErrorS(err, "fetching configmap", "name", builderConfigMapName)
 		return nil, err
 	}
 
-	err = isValidBuilderCommonConfigMap(existingConfigMap)
+	err = isValidBuilderConfigMap(existingConfigMap)
 	if err != nil {
-		klog.V(log.E).ErrorS(err, "configmap is not valid", "name", ConfigMapName)
+		klog.V(log.E).ErrorS(err, "configmap is not valid", "name", builderConfigMapName)
 		return existingConfigMap, err
 	}
 
 	return existingConfigMap, nil
 }
 
-// isValidBuilderCommonConfigMap  function that will verify that in the builder config maps there are the required keys, and they aren't empty
-func isValidBuilderCommonConfigMap(configMap *corev1.ConfigMap) error {
-
+// isValidBuilderConfigMap  function that will verify that in the builder config maps there are the required keys, and they aren't empty
+func isValidBuilderConfigMap(configMap *corev1.ConfigMap) error {
 	// Verifying that the key to hold the extension for the workflow is there and not empty
 	if len(configMap.Data[configKeyDefaultExtension]) == 0 {
 		return fmt.Errorf("unable to find %s key into builder config map", configMap.Data[configKeyDefaultExtension])
 	}
 
-	// Verifying that the key to hold the name of the Dockerfile for building the workflow is there and not empty
-	if len(configMap.Data[configKeyDefaultBuilderResourceName]) == 0 {
-		return fmt.Errorf("unable to find %s key into builder config map", configMap.Data[configKeyDefaultBuilderResourceName])
-	}
-
 	// Verifying that the key to hold the content of the Dockerfile for building the workflow is there and not empty
-	if len(configMap.Data[configMap.Data[configKeyDefaultBuilderResourceName]]) == 0 {
-		return fmt.Errorf("unable to find %s key into builder config map", configMap.Data[configKeyDefaultBuilderResourceName])
+	if len(configMap.Data[defaultBuilderResourceName]) == 0 {
+		return fmt.Errorf("unable to find %s key into builder config map", configMap.Data[defaultBuilderResourceName])
 	}
 	return nil
 }
diff --git a/controllers/builder/containerbuilder.go b/controllers/builder/containerbuilder.go
index a3fc344..c945f02 100644
--- a/controllers/builder/containerbuilder.go
+++ b/controllers/builder/containerbuilder.go
@@ -22,6 +22,7 @@
 import (
 	"time"
 
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	"k8s.io/klog/v2"
 
 	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/workflowdef"
@@ -73,9 +74,10 @@
 			Envs:      build.Spec.Envs,
 			Resources: build.Spec.Resources,
 		},
-		PublishTask:     api.PublishTask{},
-		Cache:           kanikoTaskCache,
-		AdditionalFlags: build.Spec.Arguments,
+		PublishTask:         api.PublishTask{},
+		Cache:               kanikoTaskCache,
+		AdditionalFlags:     build.Spec.Arguments,
+		KanikoExecutorImage: cfg.GetCfg().KanikoExecutorImageTag,
 	}
 	var containerBuilder *api.ContainerBuild
 	var err error
@@ -137,7 +139,7 @@
 		task:               task,
 		workflowDefinition: workflowDef,
 		workflow:           workflow,
-		dockerfile:         platform.GetCustomizedDockerfile(c.commonConfig.Data[c.commonConfig.Data[configKeyDefaultBuilderResourceName]], *c.platform),
+		dockerfile:         platform.GetCustomizedBuilderDockerfile(c.builderConfigMap.Data[defaultBuilderResourceName], *c.platform),
 		imageTag:           buildNamespacedImageTag(workflow),
 	}
 
@@ -173,7 +175,7 @@
 		},
 	}
 
-	build, err := newBuild(buildInput, plat, c.commonConfig.Data[configKeyDefaultExtension], cli)
+	build, err := newBuild(buildInput, plat, c.builderConfigMap.Data[configKeyDefaultExtension], cli)
 	if err != nil {
 		klog.V(log.E).ErrorS(err, "error during build Image")
 		return nil, err
@@ -183,7 +185,12 @@
 
 // Helper function to create a new container-builder build and schedule it
 func newBuild(buildInput kanikoBuildInput, platform api.PlatformContainerBuild, defaultExtension string, cli client.Client) (*api.ContainerBuild, error) {
-	buildInfo := builder.ContainerBuilderInfo{FinalImageName: buildInput.imageTag, BuildUniqueName: buildInput.name, Platform: platform}
+	buildInfo := builder.ContainerBuilderInfo{
+		FinalImageName:           buildInput.imageTag,
+		BuildUniqueName:          buildInput.name,
+		Platform:                 platform,
+		ContainerBuilderImageTag: buildInput.task.KanikoExecutorImage,
+	}
 
 	newBuilder := builder.NewBuild(buildInfo).
 		WithClient(cli).
diff --git a/controllers/builder/openshiftbuilder.go b/controllers/builder/openshiftbuilder.go
index 55c1fc2..44077d4 100644
--- a/controllers/builder/openshiftbuilder.go
+++ b/controllers/builder/openshiftbuilder.go
@@ -150,7 +150,7 @@
 
 func (o *openshiftBuilderManager) newDefaultBuildConfig(build *operatorapi.SonataFlowBuild, workflow *operatorapi.SonataFlow) *buildv1.BuildConfig {
 	optimizationPol := buildv1.ImageOptimizationSkipLayers
-	dockerFile := platform.GetCustomizedDockerfile(o.commonConfig.Data[o.commonConfig.Data[configKeyDefaultBuilderResourceName]], *o.platform)
+	dockerFile := platform.GetCustomizedBuilderDockerfile(o.builderConfigMap.Data[defaultBuilderResourceName], *o.platform)
 	return &buildv1.BuildConfig{
 		ObjectMeta: metav1.ObjectMeta{Namespace: build.Namespace, Name: build.Name},
 		Spec: buildv1.BuildConfigSpec{
diff --git a/controllers/builder/openshiftbuilder_test.go b/controllers/builder/openshiftbuilder_test.go
index 5dc21ea..bd992c3 100644
--- a/controllers/builder/openshiftbuilder_test.go
+++ b/controllers/builder/openshiftbuilder_test.go
@@ -47,10 +47,10 @@
 	buildClient := buildfake.NewSimpleClientset().BuildV1()
 
 	managerContext := buildManagerContext{
-		ctx:          context.TODO(),
-		client:       client,
-		platform:     platform,
-		commonConfig: config,
+		ctx:              context.TODO(),
+		client:           client,
+		platform:         platform,
+		builderConfigMap: config,
 	}
 
 	buildManager := newOpenShiftBuilderManagerWithClient(managerContext, buildClient)
@@ -110,10 +110,10 @@
 	buildClient := buildfake.NewSimpleClientset().BuildV1()
 
 	managerContext := buildManagerContext{
-		ctx:          context.TODO(),
-		client:       client,
-		platform:     platform,
-		commonConfig: config,
+		ctx:              context.TODO(),
+		client:           client,
+		platform:         platform,
+		builderConfigMap: config,
 	}
 
 	buildManager := newOpenShiftBuilderManagerWithClient(managerContext, buildClient)
diff --git a/controllers/cfg/controllers_cfg.go b/controllers/cfg/controllers_cfg.go
new file mode 100644
index 0000000..05e409c
--- /dev/null
+++ b/controllers/cfg/controllers_cfg.go
@@ -0,0 +1,92 @@
+// Copyright 2024 Apache Software Foundation (ASF)
+//
+// Licensed 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.
+
+// note: we use `cfg` instead of `config` or `configuration` in order to have a shorter accessor in the codebase.
+
+package cfg
+
+import (
+	"bytes"
+	"os"
+
+	"github.com/apache/incubator-kie-kogito-serverless-operator/log"
+	"github.com/imdario/mergo"
+	"k8s.io/apimachinery/pkg/util/yaml"
+	"k8s.io/klog/v2"
+)
+
+const (
+	defaultConfigMountPath = "/config/controllers_cfg.yaml"
+)
+
+var controllersCfg *ControllersCfg
+
+var defaultControllersCfg = &ControllersCfg{
+	HealthFailureThresholdDevMode: 50,
+	DefaultPvcKanikoSize:          "1Gi",
+	KanikoDefaultWarmerImageTag:   "gcr.io/kaniko-project/warmer:v1.9.0",
+	KanikoExecutorImageTag:        "gcr.io/kaniko-project/executor:v1.9.0",
+	BuilderConfigMapName:          "sonataflow-operator-builder-config",
+}
+
+type ControllersCfg struct {
+	DefaultPvcKanikoSize          string `yaml:"defaultPvcKanikoSize,omitempty"`
+	HealthFailureThresholdDevMode int32  `yaml:"healthFailureThresholdDevMode,omitempty"`
+	KanikoDefaultWarmerImageTag   string `yaml:"kanikoDefaultWarmerImageTag,omitempty"`
+	KanikoExecutorImageTag        string `yaml:"kanikoExecutorImageTag,omitempty"`
+	JobsServicePostgreSQLImageTag string `yaml:"jobsServicePostgreSQLImageTag,omitempty"`
+	JobsServiceEphemeralImageTag  string `yaml:"jobsServiceEphemeralImageTag,omitempty"`
+	DataIndexPostgreSQLImageTag   string `yaml:"dataIndexPostgreSQLImageTag,omitempty"`
+	DataIndexEphemeralImageTag    string `yaml:"dataIndexEphemeralImageTag,omitempty"`
+	SonataFlowBaseBuilderImageTag string `yaml:"sonataFlowBaseBuilderImageTag,omitempty"`
+	SonataFlowDevModeImageTag     string `yaml:"sonataFlowDevModeImageTag,omitempty"`
+	BuilderConfigMapName          string `yaml:"builderConfigMapName,omitempty"`
+}
+
+// InitializeControllersCfg initializes the platform configuration for this instance.
+// Must be called at the main initialization point.
+//
+// For the main initialization, the configuration is discarded since the controllers will read the cache instance.
+// We keep the pointer return here to make sure we can access it from tests if needed or implement an optional use the defaults if fail to read.
+func InitializeControllersCfg() (*ControllersCfg, error) {
+	return InitializeControllersCfgAt(defaultConfigMountPath)
+}
+
+// InitializeControllersCfgAt same as InitializeControllersCfg receiving a path as input.
+func InitializeControllersCfgAt(configFilePath string) (*ControllersCfg, error) {
+	controllersCfg = nil
+	yamlFile, err := os.ReadFile(configFilePath)
+	if err != nil {
+		klog.V(log.E).ErrorS(err, "Failed to read controllers config file", "YAML file location", defaultConfigMountPath)
+		return defaultControllersCfg, err
+	}
+	err = yaml.NewYAMLOrJSONDecoder(bytes.NewReader(yamlFile), 100).Decode(&controllersCfg)
+	if err != nil {
+		klog.V(log.E).ErrorS(err, "Failed to unmarshal controllers config file", "YAML file location", defaultConfigMountPath)
+		return defaultControllersCfg, err
+	}
+	if err = mergo.Merge(controllersCfg, defaultControllersCfg); err != nil {
+		return defaultControllersCfg, err
+	}
+	return controllersCfg, nil
+}
+
+func GetCfg() *ControllersCfg {
+	// Guard to use defaults in local tests
+	// In runtime, main.go calls InitializeControllersCfg to set the cache.
+	if controllersCfg == nil {
+		return defaultControllersCfg
+	}
+	return controllersCfg
+}
diff --git a/controllers/cfg/controllers_cfg_test.go b/controllers/cfg/controllers_cfg_test.go
new file mode 100644
index 0000000..d2d092d
--- /dev/null
+++ b/controllers/cfg/controllers_cfg_test.go
@@ -0,0 +1,52 @@
+// Copyright 2024 Apache Software Foundation (ASF)
+//
+// Licensed 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 cfg
+
+import (
+	"os"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestInitializeControllersCfgAt_ValidFile(t *testing.T) {
+	cfg, err := InitializeControllersCfgAt("./testdata/controllers-cfg-test.yaml")
+	assert.NoError(t, err)
+	assert.NotNil(t, cfg)
+
+	assert.Equal(t, int32(555), cfg.HealthFailureThresholdDevMode)
+	assert.Equal(t, "2Gi", cfg.DefaultPvcKanikoSize)
+	assert.Equal(t, "local/jobs-service:1.0.0", cfg.JobsServicePostgreSQLImageTag)
+	assert.Equal(t, "local/data-index:1.0.0", cfg.DataIndexPostgreSQLImageTag)
+	assert.Equal(t, "local/sonataflow-builder:1.0.0", cfg.SonataFlowBaseBuilderImageTag)
+	assert.Equal(t, "local/sonataflow-devmode:1.0.0", cfg.SonataFlowDevModeImageTag)
+}
+
+func TestInitializeControllersCfgAt_FileNotFound(t *testing.T) {
+	cfg, err := InitializeControllersCfgAt("./whatever.yaml")
+	assert.Error(t, err)
+	assert.NotNil(t, cfg) //get the default
+	assert.True(t, os.IsNotExist(err))
+	// defaults
+	assert.Equal(t, defaultControllersCfg, cfg)
+}
+
+func TestInitializeControllersCfgAt_NotValidYaml(t *testing.T) {
+	cfg, err := InitializeControllersCfgAt("./testdata/controllers-cfg-invalid.yaml")
+	assert.NoError(t, err)
+	assert.NotNil(t, cfg)
+	// defaults
+	assert.Equal(t, defaultControllersCfg, cfg)
+}
diff --git a/controllers/cfg/testdata/controllers-cfg-invalid.yaml b/controllers/cfg/testdata/controllers-cfg-invalid.yaml
new file mode 100644
index 0000000..3d10351
--- /dev/null
+++ b/controllers/cfg/testdata/controllers-cfg-invalid.yaml
@@ -0,0 +1,15 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed 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.
+
+anyThingNotValid: "true"
diff --git a/controllers/cfg/testdata/controllers-cfg-test.yaml b/controllers/cfg/testdata/controllers-cfg-test.yaml
new file mode 100644
index 0000000..66ec30d
--- /dev/null
+++ b/controllers/cfg/testdata/controllers-cfg-test.yaml
@@ -0,0 +1,23 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed 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.
+
+# The default size of Kaniko PVC when using the internal operator builder manager
+defaultPvcKanikoSize: 2Gi
+healthFailureThresholdDevMode: 555
+kanikoDefaultWarmerImageTag: gcr.io/kaniko-project/warmer:v1.0.0
+kanikoExecutorImageTag: gcr.io/kaniko-project/executor:v1.0.0
+jobsServicePostgreSQLImageTag: "local/jobs-service:1.0.0"
+dataIndexPostgreSQLImageTag: "local/data-index:1.0.0"
+sonataFlowBaseBuilderImageTag: "local/sonataflow-builder:1.0.0"
+sonataFlowDevModeImageTag: "local/sonataflow-devmode:1.0.0"
diff --git a/controllers/platform/initialize.go b/controllers/platform/initialize.go
index 492cd07..d1bfb07 100644
--- a/controllers/platform/initialize.go
+++ b/controllers/platform/initialize.go
@@ -22,6 +22,7 @@
 import (
 	"context"
 
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	"k8s.io/klog/v2"
 
 	corev1 "k8s.io/api/core/v1"
@@ -40,7 +41,6 @@
 )
 
 const (
-	defaultKanikoPVCSize      = "1Gi"
 	defaultKanikoCachePVCName = "kogito-kaniko-cache-pv"
 )
 
@@ -112,7 +112,7 @@
 // TODO: move this to Kaniko packages based on the platform context
 
 func createPersistentVolumeClaim(ctx context.Context, client client.Client, platform *operatorapi.SonataFlowPlatform) error {
-	volumeSize, err := resource.ParseQuantity(defaultKanikoPVCSize)
+	volumeSize, err := resource.ParseQuantity(cfg.GetCfg().DefaultPvcKanikoSize)
 	if err != nil {
 		return err
 	}
diff --git a/controllers/platform/kaniko_cache.go b/controllers/platform/kaniko_cache.go
index 251e5a8..df3b806 100644
--- a/controllers/platform/kaniko_cache.go
+++ b/controllers/platform/kaniko_cache.go
@@ -21,25 +21,24 @@
 
 import (
 	"context"
-	"fmt"
 
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	"github.com/pkg/errors"
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/client"
-	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/util/defaults"
-
 	v08 "github.com/apache/incubator-kie-kogito-serverless-operator/api/v1alpha08"
+	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/client"
 )
 
 // kanikoCacheDir is the cache directory for Kaniko builds (mounted into the Kaniko pod).
-const kanikoCacheDir = "/kaniko/cache"
-const kanikoPVCName = "KanikoPersistentVolumeClaim"
-const kanikoWarmerImage = "KanikoWarmerImage"
-const kanikoBuildCacheEnabled = "KanikoBuildCacheEnabled"
-const kanikoDefaultWarmerImageName = "gcr.io/kaniko-project/warmer"
+const (
+	kanikoCacheDir          = "/kaniko/cache"
+	kanikoPVCName           = "KanikoPersistentVolumeClaim"
+	kanikoWarmerImage       = "KanikoWarmerImage"
+	kanikoBuildCacheEnabled = "KanikoBuildCacheEnabled"
+)
 
 func IsKanikoCacheEnabled(platform *v08.SonataFlowPlatform) bool {
 	return platform.Spec.Build.Config.IsStrategyOptionEnabled(kanikoBuildCacheEnabled)
@@ -62,7 +61,7 @@
 	if image, found := platform.Spec.Build.Config.BuildStrategyOptions[kanikoWarmerImage]; found {
 		warmerImage = image
 	} else {
-		warmerImage = fmt.Sprintf("%s:v%s", kanikoDefaultWarmerImageName, defaults.KanikoVersion)
+		warmerImage = cfg.GetCfg().KanikoDefaultWarmerImageTag
 	}
 
 	pod := corev1.Pod{
diff --git a/controllers/platform/platform.go b/controllers/platform/platform.go
index 0a64805..69b636d 100644
--- a/controllers/platform/platform.go
+++ b/controllers/platform/platform.go
@@ -45,7 +45,6 @@
 
 	OperatorWatchNamespaceEnvVariable = "WATCH_NAMESPACE"
 	operatorNamespaceEnvVariable      = "NAMESPACE"
-	operatorPodNameEnvVariable        = "POD_NAME"
 )
 
 // Copied from https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry
diff --git a/controllers/platform/platformutils.go b/controllers/platform/platformutils.go
index ae14c40..f88863b 100644
--- a/controllers/platform/platformutils.go
+++ b/controllers/platform/platformutils.go
@@ -36,7 +36,6 @@
 	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/workflowdef"
 
 	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/client"
-	"github.com/apache/incubator-kie-kogito-serverless-operator/container-builder/util/defaults"
 	"github.com/apache/incubator-kie-kogito-serverless-operator/log"
 
 	operatorapi "github.com/apache/incubator-kie-kogito-serverless-operator/api/v1alpha08"
@@ -133,10 +132,6 @@
 func setStatusAdditionalInfo(platform *operatorapi.SonataFlowPlatform) {
 	platform.Status.Info = make(map[string]string)
 
-	klog.V(log.D).InfoS("SonataFlow Platform setting build publish strategy", "namespace", platform.Namespace)
-	if platform.Spec.Build.Config.BuildStrategy == operatorapi.OperatorBuildStrategy {
-		platform.Status.Info["kanikoVersion"] = defaults.KanikoVersion
-	}
 	klog.V(log.D).InfoS("SonataFlow setting status info", "namespace", platform.Namespace)
 	platform.Status.Info["goVersion"] = runtime.Version()
 	platform.Status.Info["goOS"] = runtime.GOOS
@@ -163,9 +158,9 @@
 	return nil, nil
 }
 
-// GetCustomizedDockerfile gets the Dockerfile as defined in the default platform ConfigMap, apply any custom requirements and return.
-func GetCustomizedDockerfile(dockerfile string, platform operatorapi.SonataFlowPlatform) string {
-	if platform.Spec.Build.Config.BaseImage != "" {
+// GetCustomizedBuilderDockerfile gets the Dockerfile as defined in the default platform ConfigMap, apply any custom requirements and return.
+func GetCustomizedBuilderDockerfile(dockerfile string, platform operatorapi.SonataFlowPlatform) string {
+	if len(platform.Spec.Build.Config.BaseImage) > 0 {
 		res := builderDockerfileFromRE.FindAllStringSubmatch(dockerfile, 1)
 		dockerfile = strings.Replace(dockerfile, strings.Trim(res[0][1], " "), platform.Spec.Build.Config.BaseImage, 1)
 	}
diff --git a/controllers/platform/platformutils_test.go b/controllers/platform/platformutils_test.go
index 0707250..f111903 100644
--- a/controllers/platform/platformutils_test.go
+++ b/controllers/platform/platformutils_test.go
@@ -37,14 +37,14 @@
 	}
 	dockerfile := string(dockerfileBytes)
 	// 1 - Let's verify that the default image is used (for this unit test is quay.io/kiegroup/kogito-swf-builder-nightly:latest)
-	resDefault := GetCustomizedDockerfile(dockerfile, *platform)
+	resDefault := GetCustomizedBuilderDockerfile(dockerfile, *platform)
 	foundDefault, err := regexp.MatchString("FROM quay.io/kiegroup/kogito-swf-builder-nightly:latest AS builder", resDefault)
 	assert.NoError(t, err)
 	assert.True(t, foundDefault)
 
 	// 2 - Let's try to override using the productized image
 	platform.Spec.Build.Config.BaseImage = "registry.access.redhat.com/openshift-serverless-1-tech-preview/logic-swf-builder-rhel8"
-	resProductized := GetCustomizedDockerfile(dockerfile, *platform)
+	resProductized := GetCustomizedBuilderDockerfile(dockerfile, *platform)
 	foundProductized, err := regexp.MatchString("FROM registry.access.redhat.com/openshift-serverless-1-tech-preview/logic-swf-builder-rhel8 AS builder", resProductized)
 	assert.NoError(t, err)
 	assert.True(t, foundProductized)
diff --git a/controllers/platform/services/services.go b/controllers/platform/services/services.go
index 55e7e72..8bd6d19 100644
--- a/controllers/platform/services/services.go
+++ b/controllers/platform/services/services.go
@@ -22,6 +22,7 @@
 import (
 	"fmt"
 
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
 
@@ -45,7 +46,7 @@
 	GetContainerName() string
 	// GetServiceImageName returns the image name of the service's container. It takes in the service and persistence types and returns a string
 	// that contains the FQDN of the image, including the tag.
-	GetServiceImageName(persistenceName string) string
+	GetServiceImageName(persistenceName constants.PersistenceType) string
 	// GetServiceName returns the name of the kubernetes service prefixed with the platform name
 	GetServiceName() string
 	// GetServiceCmName returns the name of the configmap associated to the service
@@ -101,7 +102,13 @@
 	return constants.DataIndexServiceName
 }
 
-func (d DataIndexHandler) GetServiceImageName(persistenceName string) string {
+func (d DataIndexHandler) GetServiceImageName(persistenceType constants.PersistenceType) string {
+	if persistenceType == constants.PersistenceTypePostgreSQL && len(cfg.GetCfg().DataIndexPostgreSQLImageTag) > 0 {
+		return cfg.GetCfg().DataIndexPostgreSQLImageTag
+	}
+	if persistenceType == constants.PersistenceTypeEphemeral && len(cfg.GetCfg().DataIndexEphemeralImageTag) > 0 {
+		return cfg.GetCfg().DataIndexEphemeralImageTag
+	}
 	var tag = version.GetMajorMinor()
 	var suffix = ""
 	if version.IsSnapshot() {
@@ -110,7 +117,7 @@
 		suffix = constants.ImageNameNightlySuffix
 	}
 	// returns "quay.io/kiegroup/kogito-data-index-<persistence_layer>:<tag>"
-	return fmt.Sprintf("%s-%s-%s:%s", constants.ImageNamePrefix, constants.DataIndexName, persistenceName+suffix, tag)
+	return fmt.Sprintf("%s-%s-%s:%s", constants.ImageNamePrefix, constants.DataIndexName, persistenceType.String()+suffix, tag)
 }
 
 func (d DataIndexHandler) GetServiceName() string {
@@ -266,7 +273,13 @@
 	return constants.JobServiceName
 }
 
-func (j JobServiceHandler) GetServiceImageName(persistenceName string) string {
+func (j JobServiceHandler) GetServiceImageName(persistenceType constants.PersistenceType) string {
+	if persistenceType == constants.PersistenceTypePostgreSQL && len(cfg.GetCfg().JobsServicePostgreSQLImageTag) > 0 {
+		return cfg.GetCfg().JobsServicePostgreSQLImageTag
+	}
+	if persistenceType == constants.PersistenceTypeEphemeral && len(cfg.GetCfg().JobsServiceEphemeralImageTag) > 0 {
+		return cfg.GetCfg().JobsServiceEphemeralImageTag
+	}
 	var tag = version.GetMajorMinor()
 	var suffix = ""
 	if version.IsSnapshot() {
@@ -275,7 +288,7 @@
 		suffix = constants.ImageNameNightlySuffix
 	}
 	// returns "quay.io/kiegroup/kogito-jobs-service-<persistece_layer>:<tag>"
-	return fmt.Sprintf("%s-%s-%s:%s", constants.ImageNamePrefix, constants.JobServiceName, persistenceName+suffix, tag)
+	return fmt.Sprintf("%s-%s-%s:%s", constants.ImageNamePrefix, constants.JobServiceName, persistenceType.String()+suffix, tag)
 }
 
 func (j JobServiceHandler) GetServiceName() string {
diff --git a/controllers/profiles/common/constants/platform_services.go b/controllers/profiles/common/constants/platform_services.go
index c0bc508..30b25fb 100644
--- a/controllers/profiles/common/constants/platform_services.go
+++ b/controllers/profiles/common/constants/platform_services.go
@@ -23,8 +23,6 @@
 	QuarkusHTTP = "quarkus-http"
 
 	ConfigMapWorkflowPropsVolumeName = "workflow-properties"
-	PersistenceTypePostgreSQL        = "postgresql"
-	PersistenceTypeEphemeral         = "ephemeral"
 
 	JobServiceRequestEventsURL       = "mp.messaging.outgoing.kogito-job-service-job-request-events.url"
 	JobServiceRequestEventsConnector = "mp.messaging.outgoing.kogito-job-service-job-request-events.connector"
@@ -34,7 +32,6 @@
 	JobServiceDataSourceReactiveURL  = "quarkus.datasource.reactive.url"
 	JobServiceJobEventsPath          = "/v2/jobs/events"
 
-	KogitoProcessEventsProtocol                 = "http"
 	KogitoProcessInstancesEventsURL             = "mp.messaging.outgoing.kogito-processinstances-events.url"
 	KogitoProcessInstancesEventsEnabled         = "kogito.events.processinstances.enabled"
 	KogitoProcessInstancesEventsPath            = "/processes"
@@ -70,3 +67,14 @@
 	DefaultDatabaseName   string = "sonataflow"
 	DefaultPostgreSQLPort int    = 5432
 )
+
+type PersistenceType string
+
+const (
+	PersistenceTypePostgreSQL PersistenceType = "postgresql"
+	PersistenceTypeEphemeral  PersistenceType = "ephemeral"
+)
+
+func (p PersistenceType) String() string {
+	return string(p)
+}
diff --git a/controllers/profiles/common/persistence/postgresql.go b/controllers/profiles/common/persistence/postgresql.go
index 6da517b..4bb5f38 100644
--- a/controllers/profiles/common/persistence/postgresql.go
+++ b/controllers/profiles/common/persistence/postgresql.go
@@ -92,7 +92,7 @@
 		},
 		{
 			Name:  "QUARKUS_DATASOURCE_DB_KIND",
-			Value: constants.PersistenceTypePostgreSQL,
+			Value: constants.PersistenceTypePostgreSQL.String(),
 		},
 		{
 			Name:  "QUARKUS_DATASOURCE_JDBC_URL",
diff --git a/controllers/profiles/dev/object_creators_dev.go b/controllers/profiles/dev/object_creators_dev.go
index 0d947c0..45f6926 100644
--- a/controllers/profiles/dev/object_creators_dev.go
+++ b/controllers/profiles/dev/object_creators_dev.go
@@ -22,6 +22,7 @@
 import (
 	"path"
 
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/profiles"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
@@ -35,11 +36,6 @@
 	"github.com/apache/incubator-kie-kogito-serverless-operator/workflowproj"
 )
 
-const (
-	// healthFailureThresholdDevMode exclusive threshold for devmode given that it might take longer than the immutable image to start/live/respond.
-	healthFailureThresholdDevMode = 50
-)
-
 // serviceCreator is an objectCreator for a basic Service for a workflow using dev profile
 // aiming a vanilla Kubernetes Deployment.
 // It maps the default HTTP port (80) to the target Java application webserver on port 8080.
@@ -55,21 +51,21 @@
 }
 
 func deploymentCreator(workflow *operatorapi.SonataFlow, plf *operatorapi.SonataFlowPlatform) (client.Object, error) {
-
 	obj, err := common.DeploymentCreator(workflow, plf)
 	if err != nil {
 		return nil, err
 	}
 	deployment := obj.(*appsv1.Deployment)
 	_, idx := kubeutil.GetContainerByName(operatorapi.DefaultContainerName, &deployment.Spec.Template.Spec)
+	healthThreshold := cfg.GetCfg().HealthFailureThresholdDevMode
 	if workflow.Spec.PodTemplate.Container.StartupProbe == nil {
-		deployment.Spec.Template.Spec.Containers[idx].StartupProbe.FailureThreshold = healthFailureThresholdDevMode
+		deployment.Spec.Template.Spec.Containers[idx].StartupProbe.FailureThreshold = healthThreshold
 	}
 	if workflow.Spec.PodTemplate.Container.LivenessProbe == nil {
-		deployment.Spec.Template.Spec.Containers[idx].LivenessProbe.FailureThreshold = healthFailureThresholdDevMode
+		deployment.Spec.Template.Spec.Containers[idx].LivenessProbe.FailureThreshold = healthThreshold
 	}
 	if workflow.Spec.PodTemplate.Container.ReadinessProbe == nil {
-		deployment.Spec.Template.Spec.Containers[idx].ReadinessProbe.FailureThreshold = healthFailureThresholdDevMode
+		deployment.Spec.Template.Spec.Containers[idx].ReadinessProbe.FailureThreshold = healthThreshold
 	}
 	return deployment, nil
 }
diff --git a/controllers/profiles/dev/profile_dev_test.go b/controllers/profiles/dev/profile_dev_test.go
index 1c3478e..c5671fa 100644
--- a/controllers/profiles/dev/profile_dev_test.go
+++ b/controllers/profiles/dev/profile_dev_test.go
@@ -24,6 +24,7 @@
 	"sort"
 	"testing"
 
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	"k8s.io/client-go/rest"
 
 	corev1 "k8s.io/api/core/v1"
@@ -67,7 +68,7 @@
 	// get the deployment, change the probe and reconcile it again
 	newThreshold := int32(5) //yes we have to force the type for the assertion below
 	deployment := test.MustGetDeployment(t, client, workflow)
-	assert.Equal(t, int32(healthFailureThresholdDevMode), deployment.Spec.Template.Spec.Containers[0].StartupProbe.FailureThreshold)
+	assert.Equal(t, cfg.GetCfg().HealthFailureThresholdDevMode, deployment.Spec.Template.Spec.Containers[0].StartupProbe.FailureThreshold)
 	deployment.Spec.Template.Spec.Containers[0].StartupProbe.FailureThreshold = newThreshold
 	assert.NoError(t, client.Update(context.TODO(), deployment))
 	// reconcile and fetch from the cluster
diff --git a/controllers/sonataflowplatform_controller_test.go b/controllers/sonataflowplatform_controller_test.go
index abfffb2..022c760 100644
--- a/controllers/sonataflowplatform_controller_test.go
+++ b/controllers/sonataflowplatform_controller_test.go
@@ -40,7 +40,7 @@
 var (
 	envDBKind = corev1.EnvVar{
 		Name:  "QUARKUS_DATASOURCE_DB_KIND",
-		Value: constants.PersistenceTypePostgreSQL,
+		Value: constants.PersistenceTypePostgreSQL.String(),
 	}
 
 	envDataIndex = corev1.EnvVar{
@@ -130,7 +130,7 @@
 
 		env := corev1.EnvVar{
 			Name:  "QUARKUS_DATASOURCE_DB_KIND",
-			Value: constants.PersistenceTypePostgreSQL,
+			Value: constants.PersistenceTypePostgreSQL.String(),
 		}
 		assert.Len(t, dep.Spec.Template.Spec.Containers, 1)
 		assert.Equal(t, di.GetServiceImageName(constants.PersistenceTypeEphemeral), dep.Spec.Template.Spec.Containers[0].Image)
@@ -216,7 +216,7 @@
 
 		env := corev1.EnvVar{
 			Name:  "QUARKUS_DATASOURCE_DB_KIND",
-			Value: constants.PersistenceTypePostgreSQL,
+			Value: constants.PersistenceTypePostgreSQL.String(),
 		}
 		assert.Len(t, dep.Spec.Template.Spec.Containers, 1)
 		assert.Equal(t, di.GetServiceImageName(constants.PersistenceTypeEphemeral), dep.Spec.Template.Spec.Containers[0].Image)
@@ -294,7 +294,7 @@
 		}
 		dbSourceKind := corev1.EnvVar{
 			Name:  "QUARKUS_DATASOURCE_DB_KIND",
-			Value: constants.PersistenceTypePostgreSQL,
+			Value: constants.PersistenceTypePostgreSQL.String(),
 		}
 		dbSourceDIURL := corev1.EnvVar{
 			Name:  "QUARKUS_DATASOURCE_JDBC_URL",
@@ -398,7 +398,7 @@
 		}
 		dbSourceKind := corev1.EnvVar{
 			Name:  "QUARKUS_DATASOURCE_DB_KIND",
-			Value: constants.PersistenceTypePostgreSQL,
+			Value: constants.PersistenceTypePostgreSQL.String(),
 		}
 		dbDIUsername := corev1.EnvVar{
 			Name:  "QUARKUS_DATASOURCE_USERNAME",
diff --git a/controllers/workflowdef/image.go b/controllers/workflowdef/image.go
index 760a233..220aa20 100644
--- a/controllers/workflowdef/image.go
+++ b/controllers/workflowdef/image.go
@@ -21,6 +21,7 @@
 
 import (
 	"github.com/apache/incubator-kie-kogito-serverless-operator/api/v1alpha08"
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	"github.com/apache/incubator-kie-kogito-serverless-operator/version"
 )
 
@@ -29,7 +30,6 @@
 	nightlySuffix               = "nightly"
 	defaultWorkflowDevModeImage = "quay.io/kiegroup/kogito-swf-devmode"
 	defaultWorkflowBuilderImage = "quay.io/kiegroup/kogito-swf-builder"
-	defaultOperatorImage        = "quay.io/kiegroup/kogito-serverless-operator"
 )
 
 // GetWorkflowAppImageNameTag returns the image name with tag to use for the image to be produced for a given workflow.
@@ -49,17 +49,19 @@
 }
 
 func GetDefaultWorkflowDevModeImageTag() string {
+	if len(cfg.GetCfg().SonataFlowDevModeImageTag) > 0 {
+		return cfg.GetCfg().SonataFlowDevModeImageTag
+	}
 	return GetDefaultImageTag(defaultWorkflowDevModeImage)
 }
 
 func GetDefaultWorkflowBuilderImageTag() string {
+	if len(cfg.GetCfg().SonataFlowBaseBuilderImageTag) > 0 {
+		return cfg.GetCfg().SonataFlowBaseBuilderImageTag
+	}
 	return GetDefaultImageTag(defaultWorkflowBuilderImage)
 }
 
-func GetDefaultOperatorImageTag() string {
-	return GetDefaultImageTag(defaultOperatorImage)
-}
-
 func GetDefaultImageTag(imgTag string) string {
 	if version.IsSnapshot() {
 		imgTag += "-" + nightlySuffix
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
index ba1e363..2112d86 100644
--- a/docs/CONTRIBUTING.md
+++ b/docs/CONTRIBUTING.md
@@ -168,13 +168,12 @@
 A configmap called `sonataflow-operator-builder-config` will be created under the `sonataflow-operator-system` namespace
 when the Operator will be installed, and it contains:
 
-- DEFAULT_BUILDER_RESOURCE = Dockerfile
 - DEFAULT_WORKFLOW_EXTENSION = .sw.json
 - Dockerfile = `<dockerfile content>`
 
 ## Customize Builder Image
 
-At the startup a [Dockerfile](../config/manager/sonataflow_builder_dockerfile.yaml) is placed in a configmap. This
+At the startup a [Dockerfile](../config/manager/SonataFlow-Builder.containerfile) is placed in a configmap. This
 Dockerfile uses a base image
 called [kogito-swf-builder](https://github.com/kiegroup/kogito-images/tree/master/modules/kogito-swf-builder) with:
 
diff --git a/go.mod b/go.mod
index 4f650cf..cecb57f 100644
--- a/go.mod
+++ b/go.mod
@@ -74,7 +74,6 @@
 	github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect
 	github.com/google/uuid v1.3.1 // indirect
 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
-	github.com/hashicorp/go-version v1.6.0 // indirect
 	github.com/hashicorp/golang-lru v1.0.2 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/jpillora/backoff v1.0.0 // indirect
diff --git a/go.sum b/go.sum
index 86d6dfc..f6b34f6 100644
--- a/go.sum
+++ b/go.sum
@@ -371,8 +371,6 @@
 github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
-github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
diff --git a/hack/local/run-e2e.sh b/hack/local/run-e2e.sh
index a048fad..af20051 100755
--- a/hack/local/run-e2e.sh
+++ b/hack/local/run-e2e.sh
@@ -23,6 +23,7 @@
 export OPERATOR_IMAGE_NAME=localhost/kogito-serverless-operator:0.0.1
 
 # clean up previous runs
+kubectl get namespaces -o name | awk -F/ '/^namespace\/test/ {print $2}' | xargs kubectl delete namespace
 make undeploy ignore-not-found=true
 make deploy IMG="${OPERATOR_IMAGE_NAME}"
 
@@ -31,4 +32,6 @@
   echo "Failure: Failed to build image, exiting " >&2
   exit 1
 fi
+
+make deploy IMG="${OPERATOR_IMAGE_NAME}"
 make test-e2e
diff --git a/main.go b/main.go
index 240a1d2..2e39652 100644
--- a/main.go
+++ b/main.go
@@ -23,6 +23,7 @@
 	"flag"
 	"os"
 
+	"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/cfg"
 	eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
 	sourcesv1 "knative.dev/eventing/pkg/apis/sources/v1"
 
@@ -91,6 +92,12 @@
 
 	utils.SetIsOpenShift(mgr.GetConfig())
 
+	// Fail fast, we can change this behavior in the future to read from defaults instead.
+	if _, err = cfg.InitializeControllersCfg(); err != nil {
+		klog.V(log.E).ErrorS(err, "unable to read controllers configuration file")
+		os.Exit(1)
+	}
+
 	if err = (&controllers.SonataFlowReconciler{
 		Client:   mgr.GetClient(),
 		Scheme:   mgr.GetScheme(),
diff --git a/operator.yaml b/operator.yaml
index 939c060..ef09c6c 100644
--- a/operator.yaml
+++ b/operator.yaml
@@ -26857,7 +26857,6 @@
 ---
 apiVersion: v1
 data:
-  DEFAULT_BUILDER_RESOURCE_NAME: Dockerfile
   DEFAULT_WORKFLOW_EXTENSION: .sw.json
   Dockerfile: "FROM quay.io/kiegroup/kogito-swf-builder-nightly:latest AS builder\n\n#
     variables that can be overridden by the builder\n# To add a Quarkus extension
@@ -26881,21 +26880,38 @@
 ---
 apiVersion: v1
 data:
-  controller_manager_config.yaml: |
-    apiVersion: controller-runtime.sigs.k8s.io/v1alpha1
-    kind: ControllerManagerConfig
-    health:
-      healthProbeBindAddress: :8081
-    metrics:
-      bindAddress: 127.0.0.1:8080
-    webhook:
-      port: 9443
-    leaderElection:
-      leaderElect: true
-      resourceName: 1be5e57d.kiegroup.org
+  controllers_cfg.yaml: |
+    # The default size of Kaniko PVC when using the internal operator builder manager
+    defaultPvcKanikoSize: 1Gi
+    # How much time (in seconds) to wait for a devmode workflow to start.
+    # This information is used for the controller manager to create new devmode containers and setup the healthcheck probes.
+    healthFailureThresholdDevMode: 50
+    # Default image used internally by the Operator Managed Kaniko builder to create the warmup pods
+    kanikoDefaultWarmerImageTag: gcr.io/kaniko-project/warmer:v1.9.0
+    # Default image used internally by the Operator Managed Kaniko builder to create the executor pods
+    kanikoExecutorImageTag: gcr.io/kaniko-project/executor:v1.9.0
+    # The Jobs Service image to use, if empty the operator will use the default Apache Community one based on the current operator's version
+    jobsServicePostgreSQLImageTag: ""
+    jobsServiceEphemeralImageTag: ""
+    # The Data Index image to use, if empty the operator will use the default Apache Community one based on the current operator's version
+    dataIndexPostgreSQLImageTag: ""
+    dataIndexEphemeralTag: ""
+    # SonataFlow base builder image used in the internal Dockerfile to build workflow applications in preview profile
+    # Order of precedence is:
+    # 1. SonataFlowPlatform in the given namespace
+    # 2. This configuration
+    # 3. The FROM in the Dockerfile in the operator's namespace "sonataflow-operator-builder-config" configMap.
+    # If 1 or 2, the FROM tag will be replaced by the tag se there.
+    # If empty the operator will use the default Apache Community one based on the current operator's version.
+    sonataFlowBaseBuilderImageTag: ""
+    # The image to use to deploy SonataFlow workflow images in devmode profile.
+    # If empty the operator will use the default Apache Community one based on the current operator's version.
+    sonataFlowDevModeImageTag: ""
+    # The default name of the builder configMap in the operator's namespace
+    builderConfigMapName: "sonataflow-operator-builder-config"
 kind: ConfigMap
 metadata:
-  name: sonataflow-operator-manager-config
+  name: sonataflow-operator-controllers-config
   namespace: sonataflow-operator-system
 ---
 apiVersion: v1
@@ -26935,31 +26951,6 @@
     spec:
       containers:
       - args:
-        - --secure-listen-address=0.0.0.0:8443
-        - --upstream=http://127.0.0.1:8080/
-        - --logtostderr=true
-        - --v=0
-        image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0
-        name: kube-rbac-proxy
-        ports:
-        - containerPort: 8443
-          name: https
-          protocol: TCP
-        resources:
-          limits:
-            cpu: 500m
-            memory: 128Mi
-          requests:
-            cpu: 5m
-            memory: 64Mi
-        securityContext:
-          allowPrivilegeEscalation: false
-          capabilities:
-            drop:
-            - ALL
-          seccompProfile:
-            type: RuntimeDefault
-      - args:
         - --health-probe-bind-address=:8081
         - --metrics-bind-address=127.0.0.1:8080
         - --leader-elect
@@ -26997,7 +26988,40 @@
           capabilities:
             drop:
             - ALL
+        volumeMounts:
+        - mountPath: /config/controllers_cfg.yaml
+          name: controllers-config
+          subPath: controllers_cfg.yaml
+      - args:
+        - --secure-listen-address=0.0.0.0:8443
+        - --upstream=http://127.0.0.1:8080/
+        - --logtostderr=true
+        - --v=0
+        image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0
+        name: kube-rbac-proxy
+        ports:
+        - containerPort: 8443
+          name: https
+          protocol: TCP
+        resources:
+          limits:
+            cpu: 500m
+            memory: 128Mi
+          requests:
+            cpu: 5m
+            memory: 64Mi
+        securityContext:
+          allowPrivilegeEscalation: false
+          capabilities:
+            drop:
+            - ALL
+          seccompProfile:
+            type: RuntimeDefault
       securityContext:
         runAsNonRoot: true
       serviceAccountName: sonataflow-operator-controller-manager
       terminationGracePeriodSeconds: 10
+      volumes:
+      - configMap:
+          name: sonataflow-operator-controllers-config
+        name: controllers-config
diff --git a/testbdd/installers/sonataflow_installer.go b/testbdd/installers/sonataflow_installer.go
index f9520f6..1b528bc 100644
--- a/testbdd/installers/sonataflow_installer.go
+++ b/testbdd/installers/sonataflow_installer.go
@@ -33,6 +33,8 @@
 	srvframework "github.com/apache/incubator-kie-kogito-serverless-operator/testbdd/framework"
 )
 
+const defaultOperatorImage = "quay.io/kiegroup/kogito-serverless-operator"
+
 var (
 	// sonataFlowYamlClusterInstaller installs SonataFlow operator cluster wide using YAMLs
 	sonataFlowYamlClusterInstaller = installers.YamlClusterWideServiceInstaller{
@@ -101,7 +103,7 @@
 		return err
 	}
 
-	regexp, err := regexp.Compile(workflowdef.GetDefaultOperatorImageTag())
+	regexp, err := regexp.Compile(getDefaultOperatorImageTag())
 	if err != nil {
 		return err
 	}
@@ -191,3 +193,7 @@
 	}
 	return true
 }
+
+func getDefaultOperatorImageTag() string {
+	return workflowdef.GetDefaultImageTag(defaultOperatorImage)
+}
diff --git a/utils/common.go b/utils/common.go
index c105f2a..e24e869 100644
--- a/utils/common.go
+++ b/utils/common.go
@@ -28,8 +28,6 @@
 )
 
 const (
-	// DebugV is the default verbosity for the debugger logger
-	DebugV     = 2
 	HttpScheme = "http"
 )