You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2025/03/21 08:30:26 UTC

(camel-k) branch main updated: chore(api): remove IntegrationProfile deprecation notice

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

pcongiusti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/main by this push:
     new 67e017ac7 chore(api): remove IntegrationProfile deprecation notice
67e017ac7 is described below

commit 67e017ac754284856b3ed5c7a4a08e17593364a0
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Mon Mar 17 18:00:58 2025 +0100

    chore(api): remove IntegrationProfile deprecation notice
    
    Refactoring also to make this CR static as it makes no sense to run any reconciliation over the profile.
    
    Closes #6091
---
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  |   3 +-
 e2e/advanced/integration_profile_test.go           |  13 +-
 e2e/support/test_support.go                        |  10 -
 helm/camel-k/crds/camel-k-crds.yaml                |   3 +-
 pkg/apis/camel/v1/integrationprofile_types.go      |   4 +-
 .../camel/v1/integrationprofile_types_support.go   |  99 ----------
 pkg/controller/add_integrationprofile.go           |  26 ---
 .../integration/integration_controller.go          |  49 -----
 pkg/controller/integration/kits.go                 |   6 +-
 pkg/controller/integrationprofile/action.go        |  54 -----
 pkg/controller/integrationprofile/initialize.go    |  64 ------
 .../integrationprofile_controller.go               | 217 ---------------------
 pkg/controller/integrationprofile/log.go           |  23 ---
 pkg/controller/integrationprofile/monitor.go       |  47 -----
 pkg/event/manager.go                               |  17 --
 pkg/platform/profile.go                            |  83 +-------
 pkg/platform/profile_test.go                       | 203 -------------------
 .../camel.apache.org_integrationprofiles.yaml      |   3 +-
 pkg/trait/camel.go                                 |   4 +-
 pkg/trait/quarkus.go                               |   2 +-
 pkg/trait/trait.go                                 |   2 +-
 pkg/trait/trait_configure.go                       |   2 +-
 pkg/trait/util.go                                  |  23 ++-
 pkg/trait/util_test.go                             |  38 +++-
 24 files changed, 71 insertions(+), 924 deletions(-)

diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index ebfd2c584..4e3d99a41 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -226,7 +226,6 @@ Refer to the Kubernetes API documentation for the fields of the `metadata` field
 
 IntegrationProfile is the resource used to apply user defined settings to the Camel K operator behavior.
 It defines the behavior of all Custom Resources (`IntegrationKit`, `Integration`, `Kamelet`) in the given namespace.
-Deprecated: may be removed in future releases. Make use of IntegrationPlatform instead.
 
 [cols="2,2a",options="header"]
 |===
@@ -260,7 +259,7 @@ Refer to the Kubernetes API documentation for the fields of the `metadata` field
 |
 
 
-
+Deprecated: no longer in use.
 
 
 |===
diff --git a/e2e/advanced/integration_profile_test.go b/e2e/advanced/integration_profile_test.go
index c479113e4..d8c83bad6 100644
--- a/e2e/advanced/integration_profile_test.go
+++ b/e2e/advanced/integration_profile_test.go
@@ -51,7 +51,6 @@ func TestIntegrationProfile(t *testing.T) {
 		}
 
 		g.Expect(CreateIntegrationProfile(t, ctx, &integrationProfile)).To(Succeed())
-		g.Eventually(SelectedIntegrationProfilePhase(t, ctx, ns, "ipr-global"), TestTimeoutMedium).Should(Equal(v1.IntegrationProfilePhaseReady))
 
 		WithNewTestNamespace(t, func(ctx context.Context, g *WithT, ns1 string) {
 			integrationProfile := v1.NewIntegrationProfile(ns1, "ipr-local")
@@ -60,7 +59,6 @@ func TestIntegrationProfile(t *testing.T) {
 				LimitCPU: "0.2",
 			}
 			g.Expect(CreateIntegrationProfile(t, ctx, &integrationProfile)).To(Succeed())
-			g.Eventually(SelectedIntegrationProfilePhase(t, ctx, ns1, "ipr-local"), TestTimeoutMedium).Should(Equal(v1.IntegrationProfilePhaseReady))
 
 			t.Run("Run integration with global integration profile", func(t *testing.T) {
 				g.Expect(KamelRunWithID(t, ctx, operatorID, ns1, "--name", "limited", "--integration-profile", "ipr-global", "files/yaml.yaml").Execute()).To(Succeed())
@@ -122,12 +120,11 @@ func TestIntegrationProfileInfluencesKit(t *testing.T) {
 		}
 
 		g.Expect(CreateIntegrationProfile(t, ctx, &integrationProfile)).To(Succeed())
-		g.Eventually(SelectedIntegrationProfilePhase(t, ctx, ns, "ipr-global"), TestTimeoutMedium).Should(Equal(v1.IntegrationProfilePhaseReady))
 
 		g.Expect(KamelRunWithID(t, ctx, operatorID, ns, "--name", "normal", "files/yaml.yaml").Execute()).To(Succeed())
+		g.Eventually(IntegrationConditionStatus(t, ctx, ns, "normal", v1.IntegrationConditionReady), TestTimeoutMedium).Should(Equal(corev1.ConditionTrue))
 		g.Eventually(IntegrationPod(t, ctx, ns, "normal"), TestTimeoutMedium).Should(Not(BeNil()))
-		g.Eventually(IntegrationPodPhase(t, ctx, ns, "normal"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
-		g.Eventually(IntegrationConditionStatus(t, ctx, ns, "normal", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		g.Eventually(IntegrationPodPhase(t, ctx, ns, "normal"), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
 		g.Eventually(IntegrationLogs(t, ctx, ns, "normal"), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
 		// Verify that a new kit has been built based on the default base image
 		integrationKitName := IntegrationKit(t, ctx, ns, "normal")()
@@ -136,9 +133,9 @@ func TestIntegrationProfileInfluencesKit(t *testing.T) {
 
 		g.Expect(KamelRunWithID(t, ctx, operatorID, ns, "--name", "simple", "--integration-profile", "ipr-global", "files/yaml.yaml").Execute()).To(Succeed())
 
+		g.Eventually(IntegrationConditionStatus(t, ctx, ns, "simple", v1.IntegrationConditionReady), TestTimeoutMedium).Should(Equal(corev1.ConditionTrue))
 		g.Eventually(IntegrationPod(t, ctx, ns, "simple"), TestTimeoutMedium).Should(Not(BeNil()))
-		g.Eventually(IntegrationPodPhase(t, ctx, ns, "simple"), TestTimeoutLong).Should(Equal(corev1.PodRunning))
-		g.Eventually(IntegrationConditionStatus(t, ctx, ns, "simple", v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		g.Eventually(IntegrationPodPhase(t, ctx, ns, "simple"), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
 		g.Eventually(IntegrationLogs(t, ctx, ns, "simple"), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
 
 		// Verify that a new kit has been built based on the previous kit
@@ -166,8 +163,6 @@ func TestPropagateIntegrationProfileChanges(t *testing.T) {
 		}
 
 		g.Expect(CreateIntegrationProfile(t, ctx, &integrationProfile)).To(Succeed())
-		g.Eventually(SelectedIntegrationProfilePhase(t, ctx, ns, "debug-profile"), TestTimeoutMedium).Should(Equal(v1.IntegrationProfilePhaseReady))
-
 		g.Expect(KamelRunWithID(t, ctx, operatorID, ns, "--name", "simple", "--integration-profile", "debug-profile", "files/yaml.yaml").Execute()).To(Succeed())
 
 		g.Eventually(IntegrationPod(t, ctx, ns, "simple"), TestTimeoutMedium).Should(Not(BeNil()))
diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go
index f457e3e62..08cae0de3 100644
--- a/e2e/support/test_support.go
+++ b/e2e/support/test_support.go
@@ -2160,16 +2160,6 @@ func SelectedPlatformPhase(t *testing.T, ctx context.Context, ns string, name st
 	}
 }
 
-func SelectedIntegrationProfilePhase(t *testing.T, ctx context.Context, ns string, name string) func() v1.IntegrationProfilePhase {
-	return func() v1.IntegrationProfilePhase {
-		pc := IntegrationProfileByName(t, ctx, ns, name)()
-		if pc == nil {
-			return ""
-		}
-		return pc.Status.Phase
-	}
-}
-
 func PlatformHas(t *testing.T, ctx context.Context, ns string, predicate func(pl *v1.IntegrationPlatform) bool) func() bool {
 	return func() bool {
 		pl := Platform(t, ctx, ns)()
diff --git a/helm/camel-k/crds/camel-k-crds.yaml b/helm/camel-k/crds/camel-k-crds.yaml
index c018394c8..594542e04 100644
--- a/helm/camel-k/crds/camel-k-crds.yaml
+++ b/helm/camel-k/crds/camel-k-crds.yaml
@@ -7702,7 +7702,6 @@ spec:
         description: |-
           IntegrationProfile is the resource used to apply user defined settings to the Camel K operator behavior.
           It defines the behavior of all Custom Resources (`IntegrationKit`, `Integration`, `Kamelet`) in the given namespace.
-          Deprecated: may be removed in future releases. Make use of IntegrationPlatform instead.
         properties:
           apiVersion:
             description: |-
@@ -9764,7 +9763,7 @@ spec:
                 type: object
             type: object
           status:
-            description: IntegrationProfileStatus defines the observed state of IntegrationProfile.
+            description: 'Deprecated: no longer in use.'
             properties:
               build:
                 description: specify how to build the Integration/IntegrationKits
diff --git a/pkg/apis/camel/v1/integrationprofile_types.go b/pkg/apis/camel/v1/integrationprofile_types.go
index dc379d73f..70c5bc14b 100644
--- a/pkg/apis/camel/v1/integrationprofile_types.go
+++ b/pkg/apis/camel/v1/integrationprofile_types.go
@@ -56,12 +56,12 @@ type IntegrationProfileStatus struct {
 
 // IntegrationProfile is the resource used to apply user defined settings to the Camel K operator behavior.
 // It defines the behavior of all Custom Resources (`IntegrationKit`, `Integration`, `Kamelet`) in the given namespace.
-// Deprecated: may be removed in future releases. Make use of IntegrationPlatform instead.
 type IntegrationProfile struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	Spec   IntegrationProfileSpec   `json:"spec,omitempty"`
+	Spec IntegrationProfileSpec `json:"spec,omitempty"`
+	// Deprecated: no longer in use.
 	Status IntegrationProfileStatus `json:"status,omitempty"`
 }
 
diff --git a/pkg/apis/camel/v1/integrationprofile_types_support.go b/pkg/apis/camel/v1/integrationprofile_types_support.go
index 9ea29fb27..da9302b9b 100644
--- a/pkg/apis/camel/v1/integrationprofile_types_support.go
+++ b/pkg/apis/camel/v1/integrationprofile_types_support.go
@@ -41,96 +41,6 @@ func (in *IntegrationProfile) SetOperatorID(operatorID string) {
 	SetAnnotation(&in.ObjectMeta, OperatorIDAnnotation, operatorID)
 }
 
-// GetActualValue can be used to extract information the platform spec or its derived config in the status.
-func (in *IntegrationProfile) GetActualValue(extractor func(spec IntegrationProfileSpec) string) string {
-	res := extractor(in.Status.IntegrationProfileSpec)
-	if res == "" {
-		res = extractor(in.Spec)
-	}
-	return res
-}
-
-// ResyncStatusFullConfig copies the spec configuration into the status field.
-func (in *IntegrationProfile) ResyncStatusFullConfig() {
-	cl := in.Spec.DeepCopy()
-	in.Status.IntegrationProfileSpec = *cl
-}
-
-// GetCondition returns the condition with the provided type.
-func (in *IntegrationProfileStatus) GetCondition(condType IntegrationProfileConditionType) *IntegrationProfileCondition {
-	for i := range in.Conditions {
-		c := in.Conditions[i]
-		if c.Type == condType {
-			return &c
-		}
-	}
-	return nil
-}
-
-// SetCondition sets the condition with the given status, reason, and message.
-func (in *IntegrationProfileStatus) SetCondition(condType IntegrationProfileConditionType, status corev1.ConditionStatus, reason string, message string) {
-	in.SetConditions(IntegrationProfileCondition{
-		Type:               condType,
-		Status:             status,
-		LastUpdateTime:     metav1.Now(),
-		LastTransitionTime: metav1.Now(),
-		Reason:             reason,
-		Message:            message,
-	})
-}
-
-// SetErrorCondition sets the condition with the given reason and error message.
-func (in *IntegrationProfileStatus) SetErrorCondition(condType IntegrationProfileConditionType, reason string, err error) {
-	in.SetConditions(IntegrationProfileCondition{
-		Type:               condType,
-		Status:             corev1.ConditionFalse,
-		LastUpdateTime:     metav1.Now(),
-		LastTransitionTime: metav1.Now(),
-		Reason:             reason,
-		Message:            err.Error(),
-	})
-}
-
-// SetConditions updates the resource to include the provided conditions.
-//
-// If a condition that we are about to add already exists and has the same status and
-// reason then we are not going to update.
-func (in *IntegrationProfileStatus) SetConditions(conditions ...IntegrationProfileCondition) {
-	for _, condition := range conditions {
-		if condition.LastUpdateTime.IsZero() {
-			condition.LastUpdateTime = metav1.Now()
-		}
-		if condition.LastTransitionTime.IsZero() {
-			condition.LastTransitionTime = metav1.Now()
-		}
-
-		currentCond := in.GetCondition(condition.Type)
-
-		if currentCond != nil && currentCond.Status == condition.Status && currentCond.Reason == condition.Reason {
-			return
-		}
-		// Do not update lastTransitionTime if the status of the condition doesn't change.
-		if currentCond != nil && currentCond.Status == condition.Status {
-			condition.LastTransitionTime = currentCond.LastTransitionTime
-		}
-
-		in.RemoveCondition(condition.Type)
-		in.Conditions = append(in.Conditions, condition)
-	}
-}
-
-// RemoveCondition removes the resource condition with the provided type.
-func (in *IntegrationProfileStatus) RemoveCondition(condType IntegrationProfileConditionType) {
-	newConditions := in.Conditions[:0]
-	for _, c := range in.Conditions {
-		if c.Type != condType {
-			newConditions = append(newConditions, c)
-		}
-	}
-
-	in.Conditions = newConditions
-}
-
 // GetTimeout returns the specified duration or a default one.
 func (b *IntegrationProfileBuildSpec) GetTimeout() metav1.Duration {
 	if b.Timeout == nil {
@@ -141,15 +51,6 @@ func (b *IntegrationProfileBuildSpec) GetTimeout() metav1.Duration {
 
 var _ ResourceCondition = &IntegrationProfileCondition{}
 
-// GetConditions --.
-func (in *IntegrationProfileStatus) GetConditions() []ResourceCondition {
-	res := make([]ResourceCondition, 0, len(in.Conditions))
-	for _, c := range in.Conditions {
-		res = append(res, &c)
-	}
-	return res
-}
-
 // GetType --.
 func (c *IntegrationProfileCondition) GetType() string {
 	return string(c.Type)
diff --git a/pkg/controller/add_integrationprofile.go b/pkg/controller/add_integrationprofile.go
deleted file mode 100644
index 469cf40ac..000000000
--- a/pkg/controller/add_integrationprofile.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 controller
-
-import (
-	"github.com/apache/camel-k/v2/pkg/controller/integrationprofile"
-)
-
-func init() {
-	addToManager = append(addToManager, integrationprofile.Add)
-}
diff --git a/pkg/controller/integration/integration_controller.go b/pkg/controller/integration/integration_controller.go
index 8e58a7c02..b5db985fe 100644
--- a/pkg/controller/integration/integration_controller.go
+++ b/pkg/controller/integration/integration_controller.go
@@ -238,45 +238,6 @@ func enqueueRequestsFromConfigFunc(ctx context.Context, c client.Client, res ctr
 	return requests
 }
 
-func integrationProfileEnqueueRequestsFromMapFunc(ctx context.Context, c client.Client, profile *v1.IntegrationProfile) []reconcile.Request {
-	var requests []reconcile.Request
-
-	if profile.Status.Phase != v1.IntegrationProfilePhaseReady {
-		return requests
-	}
-
-	list := &v1.IntegrationList{}
-
-	// Do global search in case of global operator
-	var opts []ctrl.ListOption
-
-	if !platform.IsCurrentOperatorGlobal() {
-		opts = append(opts, ctrl.InNamespace(profile.Namespace))
-	}
-
-	if err := c.List(ctx, list, opts...); err != nil {
-		log.Error(err, "Failed to list integrations")
-		return requests
-	}
-
-	for i := range list.Items {
-		integration := list.Items[i]
-		if integration.Status.Phase == v1.IntegrationPhaseRunning && v1.GetIntegrationProfileAnnotation(&integration) == profile.Name {
-			if profileNamespace := v1.GetIntegrationProfileNamespaceAnnotation(&integration); profileNamespace == "" || profileNamespace == profile.Namespace {
-				log.Infof("IntegrationProfile %s changed, notify integration: %s", profile.Name, integration.Name)
-				requests = append(requests, reconcile.Request{
-					NamespacedName: types.NamespacedName{
-						Namespace: integration.Namespace,
-						Name:      integration.Name,
-					},
-				})
-			}
-		}
-	}
-
-	return requests
-}
-
 func integrationPlatformEnqueueRequestsFromMapFunc(ctx context.Context, c client.Client, p *v1.IntegrationPlatform) []reconcile.Request {
 	var requests []reconcile.Request
 
@@ -375,16 +336,6 @@ func watchIntegrationResources(c client.Client, b *builder.Builder) {
 				}
 				return integrationPlatformEnqueueRequestsFromMapFunc(ctx, c, p)
 			})).
-		// Watch for IntegrationProfile and enqueue requests for any integrations that references the profile
-		Watches(&v1.IntegrationProfile{},
-			handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, a ctrl.Object) []reconcile.Request {
-				profile, ok := a.(*v1.IntegrationProfile)
-				if !ok {
-					log.Error(fmt.Errorf("type assertion failed: %v", a), "Failed to retrieve IntegrationProfile")
-					return []reconcile.Request{}
-				}
-				return integrationProfileEnqueueRequestsFromMapFunc(ctx, c, profile)
-			})).
 		// Watch for Configmaps or Secret used in the Integrations for updates
 		Watches(&corev1.ConfigMap{},
 			handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, a ctrl.Object) []reconcile.Request {
diff --git a/pkg/controller/integration/kits.go b/pkg/controller/integration/kits.go
index df0bdf9f5..6e3df4789 100644
--- a/pkg/controller/integration/kits.go
+++ b/pkg/controller/integration/kits.go
@@ -117,11 +117,13 @@ func integrationMatches(ctx context.Context, c client.Client, integration *v1.In
 	if err != nil && !k8serrors.IsNotFound(err) {
 		return false, err
 	}
-	if _, err := platform.ApplyIntegrationProfile(ctx, c, pl, integration); err != nil {
+
+	itp, err := platform.ApplyIntegrationProfile(ctx, c, integration)
+	if err != nil {
 		return false, err
 	}
 
-	itc, err := trait.NewSpecTraitsOptionsForIntegrationAndPlatform(c, integration, pl)
+	itc, err := trait.NewSpecTraitsOptionsForIntegrationAndPlatform(c, integration, itp, pl)
 	if err != nil {
 		return false, err
 	}
diff --git a/pkg/controller/integrationprofile/action.go b/pkg/controller/integrationprofile/action.go
deleted file mode 100644
index 5bd470964..000000000
--- a/pkg/controller/integrationprofile/action.go
+++ /dev/null
@@ -1,54 +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 integrationprofile
-
-import (
-	"context"
-
-	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/v2/pkg/client"
-	"github.com/apache/camel-k/v2/pkg/util/log"
-)
-
-// Action --.
-type Action interface {
-	client.Injectable
-	log.Injectable
-
-	// a user friendly name for the action
-	Name() string
-
-	// returns true if the action can handle the integration profile
-	CanHandle(profile *v1.IntegrationProfile) bool
-
-	// executes the handling function
-	Handle(ctx context.Context, profile *v1.IntegrationProfile) (*v1.IntegrationProfile, error)
-}
-
-type baseAction struct {
-	client client.Client
-	L      log.Logger
-}
-
-func (action *baseAction) InjectClient(client client.Client) {
-	action.client = client
-}
-
-func (action *baseAction) InjectLogger(log log.Logger) {
-	action.L = log
-}
diff --git a/pkg/controller/integrationprofile/initialize.go b/pkg/controller/integrationprofile/initialize.go
deleted file mode 100644
index ccd2850b8..000000000
--- a/pkg/controller/integrationprofile/initialize.go
+++ /dev/null
@@ -1,64 +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 integrationprofile
-
-import (
-	"context"
-
-	corev1 "k8s.io/api/core/v1"
-
-	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-)
-
-// NewInitializeAction returns the action that initializes the integration profile when not provided by the user.
-func NewInitializeAction() Action {
-	return &initializeAction{}
-}
-
-type initializeAction struct {
-	baseAction
-}
-
-func (action *initializeAction) Name() string {
-	return "initialize"
-}
-
-func (action *initializeAction) CanHandle(profile *v1.IntegrationProfile) bool {
-	return profile.Status.Phase == v1.IntegrationProfilePhaseNone
-}
-
-func (action *initializeAction) Handle(ctx context.Context, profile *v1.IntegrationProfile) (*v1.IntegrationProfile, error) {
-	action.L.Info("Initializing IntegrationProfile")
-	profile.ResyncStatusFullConfig()
-
-	profile.Status.SetCondition(
-		v1.IntegrationProfileConditionTypeCreated,
-		corev1.ConditionTrue,
-		v1.IntegrationProfileConditionCreatedReason,
-		"integration profile created")
-
-	profile.Status.SetCondition(
-		"DeprecationNotice",
-		corev1.ConditionTrue,
-		"DeprecationNoticeWarning",
-		"Usage of IntegrationProfile is deprecated. Make use of IntegrationPlatform instead.")
-
-	profile.Status.Phase = v1.IntegrationProfilePhaseReady
-
-	return profile, nil
-}
diff --git a/pkg/controller/integrationprofile/integrationprofile_controller.go b/pkg/controller/integrationprofile/integrationprofile_controller.go
deleted file mode 100644
index b87806689..000000000
--- a/pkg/controller/integrationprofile/integrationprofile_controller.go
+++ /dev/null
@@ -1,217 +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 integrationprofile
-
-import (
-	"context"
-	"time"
-
-	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"k8s.io/client-go/tools/record"
-
-	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/controller"
-	"sigs.k8s.io/controller-runtime/pkg/event"
-	"sigs.k8s.io/controller-runtime/pkg/handler"
-	"sigs.k8s.io/controller-runtime/pkg/manager"
-	"sigs.k8s.io/controller-runtime/pkg/reconcile"
-	"sigs.k8s.io/controller-runtime/pkg/source"
-
-	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/v2/pkg/client"
-	camelevent "github.com/apache/camel-k/v2/pkg/event"
-	"github.com/apache/camel-k/v2/pkg/platform"
-	"github.com/apache/camel-k/v2/pkg/util/monitoring"
-)
-
-const (
-	requeueAfterDuration = 5 * time.Second
-)
-
-// Add creates a new IntegrationProfile Controller and adds it to the Manager. The Manager will set fields
-// on the Controller and Start it when the Manager is Started.
-func Add(ctx context.Context, mgr manager.Manager, c client.Client) error {
-	return add(mgr, newReconciler(mgr, c))
-}
-
-func newReconciler(mgr manager.Manager, c client.Client) reconcile.Reconciler {
-	return monitoring.NewInstrumentedReconciler(
-		&reconcileIntegrationProfile{
-			client:   c,
-			reader:   mgr.GetAPIReader(),
-			scheme:   mgr.GetScheme(),
-			recorder: mgr.GetEventRecorderFor("camel-k-integration-profile-controller"),
-		},
-		schema.GroupVersionKind{
-			Group:   v1.SchemeGroupVersion.Group,
-			Version: v1.SchemeGroupVersion.Version,
-			Kind:    v1.IntegrationProfileKind,
-		},
-	)
-}
-
-func add(mgr manager.Manager, r reconcile.Reconciler) error {
-	c, err := controller.New("integrationprofile-controller", mgr, controller.Options{Reconciler: r})
-	if err != nil {
-		return err
-	}
-
-	// Watch for changes to primary resource IntegrationProfile
-	err = c.Watch(
-		source.Kind(mgr.GetCache(),
-			&v1.IntegrationProfile{},
-			&handler.TypedEnqueueRequestForObject[*v1.IntegrationProfile]{},
-			platform.FilteringFuncs[*v1.IntegrationProfile]{
-				UpdateFunc: func(e event.TypedUpdateEvent[*v1.IntegrationProfile]) bool {
-					// Ignore updates to the integration profile status in which case metadata.Generation
-					// does not change, or except when the integration profile phase changes as it's used
-					// to transition from one phase to another
-					return e.ObjectOld.Generation != e.ObjectNew.Generation ||
-						e.ObjectOld.Status.Phase != e.ObjectNew.Status.Phase
-				},
-				DeleteFunc: func(e event.TypedDeleteEvent[*v1.IntegrationProfile]) bool {
-					// Evaluates to false if the object has been confirmed deleted
-					return !e.DeleteStateUnknown
-				},
-			},
-		),
-	)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-var _ reconcile.Reconciler = &reconcileIntegrationProfile{}
-
-// reconcileIntegrationProfile reconciles a IntegrationProfile object.
-type reconcileIntegrationProfile struct {
-	// This client, initialized using mgr.Client() above, is a split client
-	// that reads objects from the cache and writes to the API server
-	client client.Client
-	// Non-caching client
-	reader   ctrl.Reader
-	scheme   *runtime.Scheme
-	recorder record.EventRecorder
-}
-
-// Reconcile reads that state of the cluster for a IntegrationProfile object and makes changes based
-// on the state read and what is in the IntegrationProfile.Spec
-// Note:
-// The Controller will requeue the Request to be processed again if the returned error is non-nil or
-// Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
-func (r *reconcileIntegrationProfile) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
-	rlog := Log.WithValues("request-namespace", request.Namespace, "request-name", request.Name)
-	rlog.Debug("Reconciling IntegrationProfile")
-
-	// Make sure the operator is allowed to act on namespace
-	if ok, err := platform.IsOperatorAllowedOnNamespace(ctx, r.client, request.Namespace); err != nil {
-		return reconcile.Result{}, err
-	} else if !ok {
-		rlog.Info("Ignoring request because namespace is locked")
-		return reconcile.Result{}, nil
-	}
-
-	// Fetch the IntegrationProfile instance
-	var instance v1.IntegrationProfile
-
-	if err := r.client.Get(ctx, request.NamespacedName, &instance); err != nil {
-		if k8serrors.IsNotFound(err) {
-			// Request object not found, could have been deleted after reconcile request.
-			// Owned objects are automatically garbage collected. For additional cleanup
-			// logic use finalizers.
-
-			// Return and don't requeue
-			return reconcile.Result{}, nil
-		}
-		// Error reading the object - requeue the request.
-		return reconcile.Result{}, err
-	}
-
-	// Only process resources assigned to the operator
-	if !platform.IsOperatorHandlerConsideringLock(ctx, r.client, request.Namespace, &instance) {
-		rlog.Info("Ignoring request because resource is not assigned to current operator")
-		return reconcile.Result{}, nil
-	}
-
-	actions := []Action{
-		NewInitializeAction(),
-		NewMonitorAction(),
-	}
-
-	var targetPhase v1.IntegrationProfilePhase
-	var err error
-
-	target := instance.DeepCopy()
-	targetLog := rlog.ForIntegrationProfile(target)
-
-	for _, a := range actions {
-		a.InjectClient(r.client)
-		a.InjectLogger(targetLog)
-
-		if !a.CanHandle(target) {
-			continue
-		}
-
-		targetLog.Infof("Invoking action %s", a.Name())
-
-		phaseFrom := target.Status.Phase
-
-		target, err = a.Handle(ctx, target)
-		if err != nil {
-			camelevent.NotifyIntegrationProfileError(ctx, r.client, r.recorder, &instance, target, err)
-			return reconcile.Result{}, err
-		}
-
-		if target != nil {
-			target.Status.ObservedGeneration = instance.Generation
-
-			if err := r.client.Status().Patch(ctx, target, ctrl.MergeFrom(&instance)); err != nil {
-				camelevent.NotifyIntegrationProfileError(ctx, r.client, r.recorder, &instance, target, err)
-				return reconcile.Result{}, err
-			}
-
-			targetPhase = target.Status.Phase
-
-			if targetPhase != phaseFrom {
-				targetLog.Info(
-					"State transition",
-					"phase-from", phaseFrom,
-					"phase-to", target.Status.Phase,
-				)
-			}
-		}
-
-		// handle one action at time so the resource
-		// is always at its latest state
-		camelevent.NotifyIntegrationProfileUpdated(ctx, r.client, r.recorder, &instance, target)
-		break
-	}
-
-	if targetPhase == v1.IntegrationProfilePhaseReady {
-		return reconcile.Result{}, nil
-	}
-
-	// Requeue
-	return reconcile.Result{
-		RequeueAfter: requeueAfterDuration,
-	}, nil
-}
diff --git a/pkg/controller/integrationprofile/log.go b/pkg/controller/integrationprofile/log.go
deleted file mode 100644
index c377ad906..000000000
--- a/pkg/controller/integrationprofile/log.go
+++ /dev/null
@@ -1,23 +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 integrationprofile
-
-import "github.com/apache/camel-k/v2/pkg/util/log"
-
-// Log --.
-var Log = log.Log.WithName("controller").WithName("integrationprofile")
diff --git a/pkg/controller/integrationprofile/monitor.go b/pkg/controller/integrationprofile/monitor.go
deleted file mode 100644
index f980c9ffb..000000000
--- a/pkg/controller/integrationprofile/monitor.go
+++ /dev/null
@@ -1,47 +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 integrationprofile
-
-import (
-	"context"
-
-	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-)
-
-// NewMonitorAction returns an action that monitors the integration profile after it's fully initialized.
-func NewMonitorAction() Action {
-	return &monitorAction{}
-}
-
-type monitorAction struct {
-	baseAction
-}
-
-func (action *monitorAction) Name() string {
-	return "monitor"
-}
-
-func (action *monitorAction) CanHandle(profile *v1.IntegrationProfile) bool {
-	return profile.Status.Phase == v1.IntegrationProfilePhaseReady
-}
-
-func (action *monitorAction) Handle(ctx context.Context, profile *v1.IntegrationProfile) (*v1.IntegrationProfile, error) {
-	// Refresh applied profile
-	profile.ResyncStatusFullConfig()
-	return profile, nil
-}
diff --git a/pkg/event/manager.go b/pkg/event/manager.go
index 435f13b62..2cfa9202f 100644
--- a/pkg/event/manager.go
+++ b/pkg/event/manager.go
@@ -174,23 +174,6 @@ func NotifyIntegrationPlatformError(ctx context.Context, c client.Client, record
 	recorder.Eventf(p, corev1.EventTypeWarning, ReasonIntegrationPlatformError, "Cannot reconcile Integration Platform %s: %v", p.Name, err)
 }
 
-// NotifyIntegrationProfileUpdated automatically generates events when a integration profile changes.
-func NotifyIntegrationProfileUpdated(ctx context.Context, c client.Client, recorder record.EventRecorder, old, newResource *v1.IntegrationProfile) {
-	if newResource == nil {
-		return
-	}
-	oldPhase := ""
-	var oldConditions []v1.ResourceCondition
-	if old != nil {
-		oldPhase = string(old.Status.Phase)
-		oldConditions = old.Status.GetConditions()
-	}
-	if newResource.Status.Phase != v1.IntegrationProfilePhaseNone {
-		notifyIfConditionUpdated(recorder, newResource, oldConditions, newResource.Status.GetConditions(), "Integration Profile", newResource.Name, ReasonIntegrationProfileConditionChanged)
-	}
-	notifyIfPhaseUpdated(ctx, c, recorder, newResource, oldPhase, string(newResource.Status.Phase), "Integration Profile", newResource.Name, ReasonIntegrationProfilePhaseUpdated, "")
-}
-
 // NotifyIntegrationProfileError automatically generates error events when the integration Platform reconcile cycle phase has an error.
 func NotifyIntegrationProfileError(ctx context.Context, c client.Client, recorder record.EventRecorder, old, newResource *v1.IntegrationProfile, err error) {
 	p := old
diff --git a/pkg/platform/profile.go b/pkg/platform/profile.go
index 8f9459a95..b2d5fd9c9 100644
--- a/pkg/platform/profile.go
+++ b/pkg/platform/profile.go
@@ -21,98 +21,19 @@ import (
 	"context"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/v2/pkg/util"
 	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
-	"github.com/apache/camel-k/v2/pkg/util/log"
 
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
-// ApplyIntegrationProfile resolves integration profile from given object and applies the profile settings to the given integration platform.
-func ApplyIntegrationProfile(ctx context.Context, c k8sclient.Reader, ip *v1.IntegrationPlatform, o k8sclient.Object) (*v1.IntegrationProfile, error) {
+// ApplyIntegrationProfile resolves integration profile from given object.
+func ApplyIntegrationProfile(ctx context.Context, c k8sclient.Reader, o k8sclient.Object) (*v1.IntegrationProfile, error) {
 	profile, err := findIntegrationProfile(ctx, c, o)
 	if err != nil && !k8serrors.IsNotFound(err) {
 		return nil, err
 	}
 
-	if ip == nil || profile == nil {
-		return nil, nil
-	}
-
-	if profile.Status.Build.RuntimeVersion != "" && profile.Status.Build.RuntimeVersion != ip.Status.Build.RuntimeVersion {
-		log.Debugf("Integration Platform %s [%s]: setting runtime version", ip.Name, ip.Namespace)
-		ip.Status.Build.RuntimeVersion = profile.Status.Build.RuntimeVersion
-	}
-
-	if profile.Status.Build.RuntimeProvider != "" && profile.Status.Build.RuntimeProvider != ip.Status.Build.RuntimeProvider {
-		log.Debugf("Integration Platform %s [%s]: setting runtime provider", ip.Name, ip.Namespace)
-		ip.Status.Build.RuntimeProvider = profile.Status.Build.RuntimeProvider
-	}
-
-	if profile.Status.Build.BaseImage != "" && profile.Status.Build.BaseImage != ip.Status.Build.BaseImage {
-		log.Debugf("Integration Platform %s [%s]: setting base image", ip.Name, ip.Namespace)
-		ip.Status.Build.BaseImage = profile.Status.Build.BaseImage
-	}
-
-	if profile.Status.Build.Maven.LocalRepository != "" &&
-		profile.Status.Build.Maven.LocalRepository != ip.Status.Build.Maven.LocalRepository {
-		log.Debugf("Integration Platform %s [%s]: setting local repository", ip.Name, ip.Namespace)
-		ip.Status.Build.Maven.LocalRepository = profile.Status.Build.Maven.LocalRepository
-	}
-
-	if len(profile.Status.Build.Maven.CLIOptions) > 0 {
-		log.Debugf("Integration Platform %s [%s]: setting CLI options", ip.Name, ip.Namespace)
-		if len(ip.Status.Build.Maven.CLIOptions) == 0 {
-			ip.Status.Build.Maven.CLIOptions = make([]string, len(profile.Status.Build.Maven.CLIOptions))
-			copy(ip.Status.Build.Maven.CLIOptions, profile.Status.Build.Maven.CLIOptions)
-		} else {
-			util.StringSliceUniqueConcat(&ip.Status.Build.Maven.CLIOptions, profile.Status.Build.Maven.CLIOptions)
-		}
-	}
-
-	if len(profile.Status.Build.Maven.Properties) > 0 {
-		log.Debugf("Integration Platform %s [%s]: setting Maven properties", ip.Name, ip.Namespace)
-		if len(ip.Status.Build.Maven.Properties) == 0 {
-			ip.Status.Build.Maven.Properties = make(map[string]string, len(profile.Status.Build.Maven.Properties))
-		}
-
-		for key, val := range profile.Status.Build.Maven.Properties {
-			// only set unknown properties on target
-			if _, ok := ip.Status.Build.Maven.Properties[key]; !ok {
-				ip.Status.Build.Maven.Properties[key] = val
-			}
-		}
-	}
-
-	if len(profile.Status.Build.Maven.Extension) > 0 && len(ip.Status.Build.Maven.Extension) == 0 {
-		log.Debugf("Integration Platform %s [%s]: setting Maven extensions", ip.Name, ip.Namespace)
-		ip.Status.Build.Maven.Extension = make([]v1.MavenArtifact, len(profile.Status.Build.Maven.Extension))
-		copy(ip.Status.Build.Maven.Extension, profile.Status.Build.Maven.Extension)
-	}
-
-	if profile.Status.Build.Registry.Address != "" && profile.Status.Build.Registry.Address != ip.Status.Build.Registry.Address {
-		log.Debugf("Integration Platform %s [%s]: setting registry", ip.Name, ip.Namespace)
-		profile.Status.Build.Registry.DeepCopyInto(&ip.Status.Build.Registry)
-	}
-
-	if err := ip.Status.Traits.Merge(profile.Status.Traits); err != nil {
-		log.Errorf(err, "Integration Platform %s [%s]: failed to merge traits", ip.Name, ip.Namespace)
-	} else if err := ip.Status.Traits.Merge(ip.Spec.Traits); err != nil {
-		log.Errorf(err, "Integration Platform %s [%s]: failed to merge traits", ip.Name, ip.Namespace)
-	}
-
-	// Build timeout
-	if profile.Status.Build.Timeout != nil {
-		log.Debugf("Integration Platform %s [%s]: setting build timeout", ip.Name, ip.Namespace)
-		ip.Status.Build.Timeout = profile.Status.Build.Timeout
-	}
-
-	if len(profile.Status.Kamelet.Repositories) > 0 {
-		log.Debugf("Integration Platform %s [%s]: setting kamelet repositories", ip.Name, ip.Namespace)
-		ip.Status.Kamelet.Repositories = append(ip.Status.Kamelet.Repositories, profile.Status.Kamelet.Repositories...)
-	}
-
 	return profile, nil
 }
 
diff --git a/pkg/platform/profile_test.go b/pkg/platform/profile_test.go
index 8ae42bd55..238b2b437 100644
--- a/pkg/platform/profile_test.go
+++ b/pkg/platform/profile_test.go
@@ -23,11 +23,9 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
 	"github.com/apache/camel-k/v2/pkg/internal"
 )
 
@@ -39,8 +37,6 @@ func TestFindIntegrationProfile(t *testing.T) {
 		},
 	}
 
-	profile.ResyncStatusFullConfig()
-
 	c, err := internal.NewFakeClient(&profile)
 	require.NoError(t, err)
 
@@ -70,8 +66,6 @@ func TestFindIntegrationProfileWithNamespace(t *testing.T) {
 		},
 	}
 
-	profile.ResyncStatusFullConfig()
-
 	c, err := internal.NewFakeClient(&profile)
 	require.NoError(t, err)
 
@@ -102,8 +96,6 @@ func TestFindIntegrationProfileInOperatorNamespace(t *testing.T) {
 		},
 	}
 
-	profile.ResyncStatusFullConfig()
-
 	c, err := internal.NewFakeClient(&profile)
 	require.NoError(t, err)
 
@@ -126,198 +118,3 @@ func TestFindIntegrationProfileInOperatorNamespace(t *testing.T) {
 	require.NoError(t, err)
 	assert.NotNil(t, found)
 }
-
-func TestApplyIntegrationProfile(t *testing.T) {
-	profile := v1.IntegrationProfile{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "custom",
-			Namespace: "ns",
-		},
-		Spec: v1.IntegrationProfileSpec{
-			Build: v1.IntegrationProfileBuildSpec{
-				Maven: v1.MavenSpec{
-					Properties: map[string]string{
-						"global_prop1": "global_value1",
-						"global_prop2": "global_value2",
-					},
-					CLIOptions: []string{
-						"-V",
-						"--no-transfer-progress",
-						"-Dstyle.color=never",
-						"-E",
-					},
-				},
-				RuntimeVersion: "0.99.0",
-			},
-			Traits: v1.Traits{
-				Logging: &trait.LoggingTrait{
-					Level: "DEBUG",
-				},
-				Container: &trait.ContainerTrait{
-					ImagePullPolicy: corev1.PullAlways,
-					LimitCPU:        "0.1",
-				},
-			},
-		},
-	}
-
-	profile.ResyncStatusFullConfig()
-
-	c, err := internal.NewFakeClient(&profile)
-	require.NoError(t, err)
-
-	ip := v1.IntegrationPlatform{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "local-camel-k",
-			Namespace: "ns",
-		},
-		Spec: v1.IntegrationPlatformSpec{
-			Build: v1.IntegrationPlatformBuildSpec{
-				BuildConfiguration: v1.BuildConfiguration{
-					Strategy:      v1.BuildStrategyRoutine,
-					OrderStrategy: v1.BuildOrderStrategyFIFO,
-				},
-			},
-			Cluster: v1.IntegrationPlatformClusterOpenShift,
-			Profile: v1.TraitProfileOpenShift,
-		},
-	}
-
-	ip.ResyncStatusFullConfig()
-
-	err = ConfigureDefaults(context.TODO(), c, &ip, true)
-	require.NoError(t, err)
-
-	integration := v1.Integration{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test",
-			Namespace: "ns",
-			Annotations: map[string]string{
-				v1.IntegrationProfileAnnotation: "custom",
-			},
-		},
-		Status: v1.IntegrationStatus{
-			Phase: v1.IntegrationPhaseRunning,
-		},
-	}
-
-	_, err = ApplyIntegrationProfile(context.TODO(), c, &ip, &integration)
-	require.NoError(t, err)
-
-	assert.Equal(t, v1.IntegrationPlatformClusterOpenShift, ip.Status.Cluster)
-	assert.Equal(t, v1.TraitProfileOpenShift, ip.Status.Profile)
-	assert.Equal(t, v1.BuildStrategyRoutine, ip.Status.Build.BuildConfiguration.Strategy)
-	assert.Equal(t, v1.BuildOrderStrategyFIFO, ip.Status.Build.BuildConfiguration.OrderStrategy)
-	assert.True(t, ip.Status.Build.MaxRunningBuilds == 3) // default for build strategy routine
-	assert.Equal(t, len(profile.Status.Build.Maven.CLIOptions), len(ip.Status.Build.Maven.CLIOptions))
-	assert.Equal(t, profile.Status.Build.Maven.CLIOptions, ip.Status.Build.Maven.CLIOptions)
-	assert.NotNil(t, ip.Status.Traits)
-	assert.NotNil(t, ip.Status.Traits.Logging)
-	assert.Equal(t, "DEBUG", ip.Status.Traits.Logging.Level)
-	assert.NotNil(t, ip.Status.Traits.Container)
-	assert.Equal(t, corev1.PullAlways, ip.Status.Traits.Container.ImagePullPolicy)
-	assert.Equal(t, "0.1", ip.Status.Traits.Container.LimitCPU)
-	assert.Equal(t, 2, len(ip.Status.Build.Maven.Properties))
-	assert.Equal(t, "global_value1", ip.Status.Build.Maven.Properties["global_prop1"])
-	assert.Equal(t, "global_value2", ip.Status.Build.Maven.Properties["global_prop2"])
-}
-
-func TestApplyIntegrationProfileAndRetainPlatformSpec(t *testing.T) {
-	profile := v1.IntegrationProfile{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      DefaultPlatformName,
-			Namespace: "ns",
-		},
-		Spec: v1.IntegrationProfileSpec{
-			Build: v1.IntegrationProfileBuildSpec{
-				Maven: v1.MavenSpec{
-					Properties: map[string]string{
-						"global_prop1": "global_value1",
-						"global_prop2": "global_value2",
-					},
-				},
-			},
-			Traits: v1.Traits{
-				Logging: &trait.LoggingTrait{
-					Level: "DEBUG",
-				},
-				Container: &trait.ContainerTrait{
-					ImagePullPolicy: corev1.PullIfNotPresent,
-					LimitCPU:        "0.1",
-				},
-			},
-		},
-	}
-
-	profile.ResyncStatusFullConfig()
-
-	c, err := internal.NewFakeClient(&profile)
-	require.NoError(t, err)
-
-	ip := v1.IntegrationPlatform{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "local-camel-k",
-			Namespace: "ns",
-		},
-		Spec: v1.IntegrationPlatformSpec{
-			Build: v1.IntegrationPlatformBuildSpec{
-				BuildConfiguration: v1.BuildConfiguration{
-					Strategy:      v1.BuildStrategyPod,
-					OrderStrategy: v1.BuildOrderStrategyFIFO,
-				},
-				MaxRunningBuilds: 1,
-				Maven: v1.MavenSpec{
-					Properties: map[string]string{
-						"local_prop1":  "local_value1",
-						"global_prop2": "local_value2",
-					},
-				},
-			},
-			Traits: v1.Traits{
-				Container: &trait.ContainerTrait{
-					ImagePullPolicy: corev1.PullAlways,
-				},
-			},
-			Cluster: v1.IntegrationPlatformClusterKubernetes,
-			Profile: v1.TraitProfileKnative,
-		},
-	}
-
-	ip.ResyncStatusFullConfig()
-
-	err = ConfigureDefaults(context.TODO(), c, &ip, true)
-	require.NoError(t, err)
-
-	integration := v1.Integration{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "test",
-			Namespace: "ns",
-			Annotations: map[string]string{
-				v1.IntegrationProfileAnnotation: DefaultPlatformName,
-			},
-		},
-		Status: v1.IntegrationStatus{
-			Phase: v1.IntegrationPhaseRunning,
-		},
-	}
-
-	_, err = ApplyIntegrationProfile(context.TODO(), c, &ip, &integration)
-	require.NoError(t, err)
-
-	assert.Equal(t, v1.IntegrationPlatformClusterKubernetes, ip.Status.Cluster)
-	assert.Equal(t, v1.TraitProfileKnative, ip.Status.Profile)
-	assert.Equal(t, v1.BuildStrategyPod, ip.Status.Build.BuildConfiguration.Strategy)
-	assert.Equal(t, v1.BuildOrderStrategyFIFO, ip.Status.Build.BuildConfiguration.OrderStrategy)
-	assert.True(t, ip.Status.Build.MaxRunningBuilds == 1)
-	assert.Equal(t, 3, len(ip.Status.Build.Maven.CLIOptions))
-	assert.NotNil(t, ip.Status.Traits)
-	assert.NotNil(t, ip.Status.Traits.Logging)
-	assert.Equal(t, "DEBUG", ip.Status.Traits.Logging.Level)
-	assert.NotNil(t, ip.Status.Traits.Container)
-	assert.Equal(t, corev1.PullAlways, ip.Status.Traits.Container.ImagePullPolicy)
-	assert.Equal(t, "0.1", ip.Status.Traits.Container.LimitCPU)
-	assert.Equal(t, 3, len(ip.Status.Build.Maven.Properties))
-	assert.Equal(t, "global_value1", ip.Status.Build.Maven.Properties["global_prop1"])
-	assert.Equal(t, "local_value2", ip.Status.Build.Maven.Properties["global_prop2"])
-	assert.Equal(t, "local_value1", ip.Status.Build.Maven.Properties["local_prop1"])
-}
diff --git a/pkg/resources/config/crd/bases/camel.apache.org_integrationprofiles.yaml b/pkg/resources/config/crd/bases/camel.apache.org_integrationprofiles.yaml
index b8c743434..2c10d4958 100644
--- a/pkg/resources/config/crd/bases/camel.apache.org_integrationprofiles.yaml
+++ b/pkg/resources/config/crd/bases/camel.apache.org_integrationprofiles.yaml
@@ -51,7 +51,6 @@ spec:
         description: |-
           IntegrationProfile is the resource used to apply user defined settings to the Camel K operator behavior.
           It defines the behavior of all Custom Resources (`IntegrationKit`, `Integration`, `Kamelet`) in the given namespace.
-          Deprecated: may be removed in future releases. Make use of IntegrationPlatform instead.
         properties:
           apiVersion:
             description: |-
@@ -2113,7 +2112,7 @@ spec:
                 type: object
             type: object
           status:
-            description: IntegrationProfileStatus defines the observed state of IntegrationProfile.
+            description: 'Deprecated: no longer in use.'
             properties:
               build:
                 description: specify how to build the Integration/IntegrationKits
diff --git a/pkg/trait/camel.go b/pkg/trait/camel.go
index 963b78231..43868a991 100644
--- a/pkg/trait/camel.go
+++ b/pkg/trait/camel.go
@@ -204,8 +204,8 @@ func determineRuntimeVersion(e *Environment) (string, error) {
 	if e.IntegrationKit != nil && e.IntegrationKit.Status.RuntimeVersion != "" {
 		return e.IntegrationKit.Status.RuntimeVersion, nil
 	}
-	if e.IntegrationProfile != nil && e.IntegrationProfile.Status.Build.RuntimeVersion != "" {
-		return e.IntegrationProfile.Status.Build.RuntimeVersion, nil
+	if e.IntegrationProfile != nil && e.IntegrationProfile.Spec.Build.RuntimeVersion != "" {
+		return e.IntegrationProfile.Spec.Build.RuntimeVersion, nil
 	}
 	if e.Platform != nil && e.Platform.Status.Build.RuntimeVersion != "" {
 		return e.Platform.Status.Build.RuntimeVersion, nil
diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
index d210eacdd..c8be8947c 100644
--- a/pkg/trait/quarkus.go
+++ b/pkg/trait/quarkus.go
@@ -315,7 +315,7 @@ func propagateKitTraits(e *Environment) v1.IntegrationKitTraits {
 	}
 
 	if e.IntegrationProfile != nil {
-		propagate(fmt.Sprintf("integration profile %q", e.IntegrationProfile.Name), e.IntegrationProfile.Status.Traits, &kitTraits, e)
+		propagate(fmt.Sprintf("integration profile %q", e.IntegrationProfile.Name), e.IntegrationProfile.Spec.Traits, &kitTraits, e)
 	}
 
 	propagate(fmt.Sprintf("integration %q", e.Integration.Name), e.Integration.Spec.Traits, &kitTraits, e)
diff --git a/pkg/trait/trait.go b/pkg/trait/trait.go
index 93c10a74a..7e698980f 100644
--- a/pkg/trait/trait.go
+++ b/pkg/trait/trait.go
@@ -122,7 +122,7 @@ func newEnvironment(ctx context.Context, c client.Client, integration *v1.Integr
 		return nil, err
 	}
 
-	ipr, err := platform.ApplyIntegrationProfile(ctx, c, pl, obj)
+	ipr, err := platform.ApplyIntegrationProfile(ctx, c, obj)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/trait/trait_configure.go b/pkg/trait/trait_configure.go
index bd617bdcc..57bb60fb4 100644
--- a/pkg/trait/trait_configure.go
+++ b/pkg/trait/trait_configure.go
@@ -42,7 +42,7 @@ func (c *Catalog) Configure(env *Environment) error {
 		}
 	}
 	if env.IntegrationProfile != nil {
-		if err := c.configureTraits(env.IntegrationProfile.Status.Traits); err != nil {
+		if err := c.configureTraits(env.IntegrationProfile.Spec.Traits); err != nil {
 			return err
 		}
 	}
diff --git a/pkg/trait/util.go b/pkg/trait/util.go
index 6d930b407..3bc6c4c80 100644
--- a/pkg/trait/util.go
+++ b/pkg/trait/util.go
@@ -382,17 +382,24 @@ func extractAsArray(value string) []string {
 	return []string{value}
 }
 
-// NewSpecTraitsOptionsForIntegrationAndPlatform will merge traits giving priority to Integration configuration over Platform configuration.
-func NewSpecTraitsOptionsForIntegrationAndPlatform(c client.Client, i *v1.Integration, pl *v1.IntegrationPlatform) (Options, error) {
-	var mergedTraits v1.Traits
+// NewSpecTraitsOptionsForIntegrationAndPlatform will merge traits giving priority to Integration, Profile and Platform respectively.
+func NewSpecTraitsOptionsForIntegrationAndPlatform(
+	c client.Client, i *v1.Integration, itp *v1.IntegrationProfile, pl *v1.IntegrationPlatform) (Options, error) {
+	mergedTraits := v1.Traits{}
+	itpTraits := v1.Traits{}
 	if pl != nil {
 		mergedTraits = pl.Status.Traits
-		if err := mergedTraits.Merge(i.Spec.Traits); err != nil {
-			return nil, err
-		}
-	} else {
-		mergedTraits = i.Spec.Traits
 	}
+	if itp != nil {
+		itpTraits = itp.Spec.Traits
+	}
+	if err := mergedTraits.Merge(itpTraits); err != nil {
+		return nil, err
+	}
+	if err := mergedTraits.Merge(i.Spec.Traits); err != nil {
+		return nil, err
+	}
+
 	options, err := ToTraitMap(mergedTraits)
 	if err != nil {
 		return nil, err
diff --git a/pkg/trait/util_test.go b/pkg/trait/util_test.go
index d32247ce0..d08d61311 100644
--- a/pkg/trait/util_test.go
+++ b/pkg/trait/util_test.go
@@ -297,7 +297,7 @@ func TestMergePlatformTraits(t *testing.T) {
 
 	c, err := internal.NewFakeClient()
 	require.NoError(t, err)
-	mergedOptions, err := NewSpecTraitsOptionsForIntegrationAndPlatform(c, integration, platform)
+	mergedOptions, err := NewSpecTraitsOptionsForIntegrationAndPlatform(c, integration, nil, platform)
 	require.NoError(t, err)
 	assert.Equal(t, expectedOptions, mergedOptions)
 }
@@ -334,7 +334,41 @@ func TestMergePlatformTraitsIntegrationPriority(t *testing.T) {
 
 	c, err := internal.NewFakeClient()
 	require.NoError(t, err)
-	mergedOptions, err := NewSpecTraitsOptionsForIntegrationAndPlatform(c, integration, platform)
+	mergedOptions, err := NewSpecTraitsOptionsForIntegrationAndPlatform(c, integration, nil, platform)
+	require.NoError(t, err)
+	assert.Equal(t, expectedOptions, mergedOptions)
+}
+
+func TestMergeIntegrationProfileTraits(t *testing.T) {
+	integration := &v1.Integration{
+		Spec: v1.IntegrationSpec{
+			Traits: v1.Traits{
+				Camel: &traitv1.CamelTrait{
+					Properties: []string{"hello=world"},
+				},
+			},
+		},
+	}
+	profile := &v1.IntegrationProfile{
+		Spec: v1.IntegrationProfileSpec{
+			Traits: v1.Traits{
+				Camel: &traitv1.CamelTrait{
+					RuntimeVersion: "1.2.3",
+				},
+			},
+		},
+	}
+
+	expectedOptions := Options{
+		"camel": {
+			"properties":     []any{"hello=world"},
+			"runtimeVersion": "1.2.3",
+		},
+	}
+
+	c, err := internal.NewFakeClient()
+	require.NoError(t, err)
+	mergedOptions, err := NewSpecTraitsOptionsForIntegrationAndPlatform(c, integration, profile, nil)
 	require.NoError(t, err)
 	assert.Equal(t, expectedOptions, mergedOptions)
 }