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 2026/10/07 14:12:14 UTC

(camel-k) branch main updated (36965a9e8 -> 433ba49ca)

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

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


    from 36965a9e8 fix(ci): upgrade test and update to Quarkus 3.40.1
     new d00a39037 feat(knative): replace the Knative API dependencies with duck types
     new 4bb27cc39 address review comments
     new 433ba49ca address review and resolve merge conflicts

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 docs/antora.yml                                    |   1 -
 docs/modules/ROOT/pages/concepts/dependencies.adoc |   5 +-
 e2e/support/test_support.go                        |   3 +-
 e2e/support/util/dump.go                           |   8 +-
 go.mod                                             |  22 --
 go.sum                                             | 135 -------------
 pkg/apis/addtoscheme_knative_eventing.go           |  10 +-
 pkg/apis/addtoscheme_knative_serving.go            |   2 +-
 pkg/apis/{camel/v1 => duck/knative/apis}/doc.go    |   8 +-
 pkg/apis/duck/knative/apis/duck_types.go           |  88 ++++++++
 pkg/apis/duck/knative/apis/url.go                  |  84 ++++++++
 .../duck/knative/apis/zz_generated.deepcopy.go     | 159 +++++++++++++++
 .../{certmanager => knative/eventing}/v1/doc.go    |   4 +-
 pkg/apis/duck/knative/eventing/v1/duck_types.go    |  65 ++++++
 .../{strimzi => knative/eventing}/v1/register.go   |  13 +-
 .../eventing}/v1/zz_generated.deepcopy.go          |  87 ++++----
 .../{certmanager => knative/messaging}/v1/doc.go   |   4 +-
 .../messaging}/v1/duck_types.go                    |  40 ++--
 .../{strimzi => knative/messaging}/v1/register.go  |  13 +-
 .../knative/messaging/v1/zz_generated.deepcopy.go  |  89 +++++++++
 .../{certmanager => knative/serving}/v1/doc.go     |   4 +-
 pkg/apis/duck/knative/serving/v1/duck_types.go     |  97 +++++++++
 .../{strimzi => knative/serving}/v1/register.go    |  13 +-
 .../serving}/v1/zz_generated.deepcopy.go           | 134 +++++++------
 .../{certmanager => knative/sources}/v1/doc.go     |   4 +-
 .../sources}/v1/duck_types.go                      |  39 ++--
 .../{strimzi => knative/sources}/v1/register.go    |  13 +-
 .../knative/sources/v1/zz_generated.deepcopy.go    |  84 ++++++++
 pkg/cmd/operator/operator.go                       |   3 +-
 .../integration/integration_controller.go          |   3 +-
 pkg/controller/integration/monitor.go              |   3 +-
 pkg/controller/integration/monitor_knative.go      |  17 +-
 pkg/controller/integration/monitor_knative_test.go | 221 +++++++++++++++++++++
 pkg/controller/integration/predicate_test.go       |  76 +++++++
 pkg/trait/container.go                             |   3 +-
 pkg/trait/container_test.go                        |   2 +-
 pkg/trait/default_container_annotation_test.go     |   3 +-
 pkg/trait/gc_test.go                               |   4 +-
 pkg/trait/init_containers.go                       |   3 +-
 pkg/trait/istio.go                                 |   3 +-
 pkg/trait/istio_test.go                            |   3 +-
 pkg/trait/jvm_test.go                              |   2 +-
 pkg/trait/knative.go                               |   5 +-
 pkg/trait/knative_service.go                       |   3 +-
 pkg/trait/knative_service_test.go                  |  73 ++++++-
 pkg/trait/knative_test.go                          | 112 ++++-------
 pkg/trait/mount.go                                 |   3 +-
 pkg/trait/owner.go                                 |   3 +-
 pkg/trait/pod.go                                   |   3 +-
 pkg/trait/security_context_test.go                 |   2 +-
 pkg/trait/trait_support_test.go                    |   3 +-
 pkg/trait/trait_types.go                           |   2 +-
 pkg/util/bindings/catalog_test.go                  |   2 +-
 pkg/util/knative/knative.go                        |  53 +++--
 pkg/util/knative/knative_test.go                   | 181 +++++++++++++++++
 pkg/util/kubernetes/collection.go                  |   7 +-
 pkg/util/kubernetes/conditions.go                  |   6 +-
 pkg/util/kubernetes/replace.go                     |   3 +-
 pkg/util/reference/reference.go                    |   6 +-
 script/update_docs.sh                              |   3 -
 60 files changed, 1519 insertions(+), 525 deletions(-)
 copy pkg/apis/{camel/v1 => duck/knative/apis}/doc.go (83%)
 create mode 100644 pkg/apis/duck/knative/apis/duck_types.go
 create mode 100644 pkg/apis/duck/knative/apis/url.go
 create mode 100644 pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
 copy pkg/apis/duck/{certmanager => knative/eventing}/v1/doc.go (88%)
 create mode 100644 pkg/apis/duck/knative/eventing/v1/duck_types.go
 copy pkg/apis/duck/{strimzi => knative/eventing}/v1/register.go (86%)
 copy pkg/apis/duck/{certmanager => knative/eventing}/v1/zz_generated.deepcopy.go (53%)
 copy pkg/apis/duck/{certmanager => knative/messaging}/v1/doc.go (87%)
 copy pkg/apis/duck/{certmanager => knative/messaging}/v1/duck_types.go (55%)
 copy pkg/apis/duck/{strimzi => knative/messaging}/v1/register.go (85%)
 create mode 100644 pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
 copy pkg/apis/duck/{certmanager => knative/serving}/v1/doc.go (88%)
 create mode 100644 pkg/apis/duck/knative/serving/v1/duck_types.go
 copy pkg/apis/duck/{strimzi => knative/serving}/v1/register.go (86%)
 copy pkg/apis/duck/{strimzi => knative/serving}/v1/zz_generated.deepcopy.go (51%)
 copy pkg/apis/duck/{certmanager => knative/sources}/v1/doc.go (87%)
 copy pkg/apis/duck/{certmanager => knative/sources}/v1/duck_types.go (55%)
 copy pkg/apis/duck/{strimzi => knative/sources}/v1/register.go (86%)
 create mode 100644 pkg/apis/duck/knative/sources/v1/zz_generated.deepcopy.go
 create mode 100644 pkg/controller/integration/monitor_knative_test.go
 create mode 100644 pkg/controller/integration/predicate_test.go
 create mode 100644 pkg/util/knative/knative_test.go


(camel-k) 02/03: address review comments

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4bb27cc397c25d7a5f0b0059e985ca4af95430cc
Author: Michal Vavřík <de...@michalvavrik.net>
AuthorDate: Mon Sep 28 00:12:55 2026 +0200

    address review comments
    
    Signed-off-by: Michal Vavřík <de...@michalvavrik.net>
---
 docs/antora.yml                                    |  1 -
 docs/modules/ROOT/pages/concepts/dependencies.adoc |  5 +-
 e2e/support/util/dump.go                           |  6 +-
 pkg/apis/camel/v1/trait/zz_generated.deepcopy.go   |  2 +-
 pkg/apis/camel/v1/zz_generated.deepcopy.go         |  1 +
 .../duck/keda/v1alpha1/zz_generated.deepcopy.go    |  2 +-
 pkg/apis/duck/knative/apis/condition_types.go      | 11 ---
 pkg/apis/duck/knative/apis/condition_types_test.go | 44 -----------
 pkg/apis/duck/knative/apis/duck_types.go           | 16 ----
 pkg/apis/duck/knative/apis/url_test.go             | 66 -----------------
 pkg/apis/duck/knative/apis/volatile_time.go        | 46 ------------
 pkg/apis/duck/knative/apis/volatile_time_test.go   | 56 --------------
 .../duck/knative/apis/zz_generated.deepcopy.go     | 32 +-------
 pkg/apis/duck/knative/eventing/v1/duck_types.go    | 23 +-----
 .../knative/eventing/v1/zz_generated.deepcopy.go   | 63 +---------------
 pkg/apis/duck/knative/messaging/v1/duck_types.go   | 45 +----------
 .../knative/messaging/v1/zz_generated.deepcopy.go  | 86 ----------------------
 pkg/apis/duck/knative/serving/v1/duck_types.go     | 61 +--------------
 .../knative/serving/v1/zz_generated.deepcopy.go    | 81 --------------------
 pkg/apis/duck/knative/sources/v1/duck_types.go     |  8 +-
 .../knative/sources/v1/zz_generated.deepcopy.go    | 17 -----
 pkg/controller/integration/monitor_knative_test.go | 72 ++++++++++++++++++
 pkg/controller/integration/predicate_test.go       | 77 +++++++++++++++++++
 pkg/trait/knative_test.go                          |  3 +-
 pkg/util/knative/knative_test.go                   |  9 +--
 script/update_docs.sh                              |  7 --
 26 files changed, 173 insertions(+), 667 deletions(-)

diff --git a/docs/antora.yml b/docs/antora.yml
index 3f649ebea..96aeec53d 100644
--- a/docs/antora.yml
+++ b/docs/antora.yml
@@ -38,6 +38,5 @@ asciidoc:
     kustomize-version: 5.7.1
     kubernetes-api-version: 0.37.0
     operator-fwk-api-version: 0.45.0
-    knative-api-version: 1.20.1
     service-binding-op-version: ""
     prometheus-op-version: 0.94.1
diff --git a/docs/modules/ROOT/pages/concepts/dependencies.adoc b/docs/modules/ROOT/pages/concepts/dependencies.adoc
index 0cf9b06f6..8ae2ceb2b 100644
--- a/docs/modules/ROOT/pages/concepts/dependencies.adoc
+++ b/docs/modules/ROOT/pages/concepts/dependencies.adoc
@@ -23,16 +23,15 @@ Below you can find a list of the main dependencies and APIs used by Camel K and
 
 [caption=]
 .Kubernetes and other dependencies
-[width="100%",cols="4,2,2,2,2,2",options="header"]
+[width="100%",cols="4,2,2,2,2",options="header"]
 |===
 |Camel K Version
 |Kubernetes API
 |Operator Framework API
-|Knative
 |Prometheus Operator
 |Kustomize version
 |===
 
 //cannot use top level index.adoc as the page with the query is always omitted.
-indexTable::[version="*",relative="running/running.adoc",cellformats="util.ckRef(pageComponentDisplayVersion, pageComponentVersion)|kubernetesApiVersion|operatorFwkApiVersion|knativeApiVersion|prometheusOpVersion|kustomizeVersion", requires={requires},transform=util.sortCompatibilityItems]
+indexTable::[version="*",relative="running/running.adoc",cellformats="util.ckRef(pageComponentDisplayVersion, pageComponentVersion)|kubernetesApiVersion|operatorFwkApiVersion|prometheusOpVersion|kustomizeVersion", requires={requires},transform=util.sortCompatibilityItems]
 
diff --git a/e2e/support/util/dump.go b/e2e/support/util/dump.go
index c77b23bb0..142b705ba 100644
--- a/e2e/support/util/dump.go
+++ b/e2e/support/util/dump.go
@@ -28,6 +28,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
@@ -156,7 +157,10 @@ func Dump(ctx context.Context, c client.Client, ns string, t *testing.T) error {
 	}
 
 	if installed, _ := knative.IsServingInstalled(c); installed {
-		var ksrvs servingv1.ServiceList
+		// List the Knative Services as unstructured objects, so that the dump carries
+		// the complete resources rather than the partial schema of the duck type.
+		var ksrvs unstructured.UnstructuredList
+		ksrvs.SetGroupVersionKind(servingv1.SchemeGroupVersion.WithKind("ServiceList"))
 		err = c.List(ctx, &ksrvs)
 		if err == nil {
 			t.Logf("Found %d Knative services:\n", len(ksrvs.Items))
diff --git a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
index 5466a9cb0..739912370 100644
--- a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
@@ -5,7 +5,7 @@
 package trait
 
 import (
-	"k8s.io/api/core/v1"
+	v1 "k8s.io/api/core/v1"
 	networkingv1 "k8s.io/api/networking/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 )
diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go
index 07e39cd5e..af1a8a1dc 100644
--- a/pkg/apis/camel/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go
@@ -6,6 +6,7 @@ package v1
 
 import (
 	"encoding/json"
+
 	"github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
diff --git a/pkg/apis/duck/keda/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/duck/keda/v1alpha1/zz_generated.deepcopy.go
index 27d57d72a..450aba305 100644
--- a/pkg/apis/duck/keda/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/keda/v1alpha1/zz_generated.deepcopy.go
@@ -5,7 +5,7 @@
 package v1alpha1
 
 import (
-	"k8s.io/api/core/v1"
+	v1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 )
 
diff --git a/pkg/apis/duck/knative/apis/condition_types.go b/pkg/apis/duck/knative/apis/condition_types.go
index 0a3d1c549..c3875a547 100644
--- a/pkg/apis/duck/knative/apis/condition_types.go
+++ b/pkg/apis/duck/knative/apis/condition_types.go
@@ -30,9 +30,6 @@ type ConditionType string
 // ConditionReady specifies that the resource is ready.
 const ConditionReady ConditionType = "Ready"
 
-// ConditionSeverity expresses the severity of a Condition Type failing.
-type ConditionSeverity string
-
 // Condition defines a readiness condition for a Knative resource.
 type Condition struct {
 	// Type of condition.
@@ -41,14 +38,6 @@ type Condition struct {
 	// Status of the condition, one of True, False, Unknown.
 	Status corev1.ConditionStatus `json:"status"`
 
-	// Severity with which to treat failures of this type of condition.
-	// +optional
-	Severity ConditionSeverity `json:"severity,omitempty"`
-
-	// LastTransitionTime is the last time the condition transitioned from one status to another.
-	// +optional
-	LastTransitionTime VolatileTime `json:"lastTransitionTime,omitempty"`
-
 	// The reason for the condition's last transition.
 	// +optional
 	Reason string `json:"reason,omitempty"`
diff --git a/pkg/apis/duck/knative/apis/condition_types_test.go b/pkg/apis/duck/knative/apis/condition_types_test.go
deleted file mode 100644
index 9beea7cf4..000000000
--- a/pkg/apis/duck/knative/apis/condition_types_test.go
+++ /dev/null
@@ -1,44 +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 apis
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-
-	corev1 "k8s.io/api/core/v1"
-)
-
-func TestConditionAccessors(t *testing.T) {
-	var c *Condition
-	assert.False(t, c.IsTrue())
-	assert.False(t, c.IsFalse())
-	assert.Empty(t, c.GetReason())
-	assert.Empty(t, c.GetMessage())
-
-	c = &Condition{Type: ConditionReady, Status: corev1.ConditionFalse, Reason: "RevisionFailed", Message: "revision failed"}
-	assert.False(t, c.IsTrue())
-	assert.True(t, c.IsFalse())
-	assert.Equal(t, "RevisionFailed", c.GetReason())
-	assert.Equal(t, "revision failed", c.GetMessage())
-
-	c.Status = corev1.ConditionTrue
-	assert.True(t, c.IsTrue())
-	assert.False(t, c.IsFalse())
-}
diff --git a/pkg/apis/duck/knative/apis/duck_types.go b/pkg/apis/duck/knative/apis/duck_types.go
index 0e54ffe5d..291a53c78 100644
--- a/pkg/apis/duck/knative/apis/duck_types.go
+++ b/pkg/apis/duck/knative/apis/duck_types.go
@@ -19,17 +19,9 @@ package apis
 
 // Status is the common status of the Knative resources.
 type Status struct {
-	// ObservedGeneration is the 'Generation' of the resource that was last processed by the controller.
-	// +optional
-	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
-
 	// Conditions the latest available observations of a resource's current state.
 	// +optional
 	Conditions Conditions `json:"conditions,omitempty"`
-
-	// Annotations is additional Status fields for the resource to save some additional state.
-	// +optional
-	Annotations map[string]string `json:"annotations,omitempty"`
 }
 
 // AddressStatus is the status of an addressable resource.
@@ -61,10 +53,6 @@ type KReference struct {
 	// Kind of the referent.
 	Kind string `json:"kind"`
 
-	// Namespace of the referent.
-	// +optional
-	Namespace string `json:"namespace,omitempty"`
-
 	// Name of the referent.
 	Name string `json:"name"`
 
@@ -95,10 +83,6 @@ type Reference struct {
 	// +optional
 	Kind string `json:"kind,omitempty"`
 
-	// Namespace of the referent.
-	// +optional
-	Namespace string `json:"namespace,omitempty"`
-
 	// Name of the referent.
 	// +optional
 	Name string `json:"name,omitempty"`
diff --git a/pkg/apis/duck/knative/apis/url_test.go b/pkg/apis/duck/knative/apis/url_test.go
deleted file mode 100644
index b8d7ab7b0..000000000
--- a/pkg/apis/duck/knative/apis/url_test.go
+++ /dev/null
@@ -1,66 +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 apis
-
-import (
-	"encoding/json"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"k8s.io/apimachinery/pkg/api/equality"
-)
-
-func TestURLJSON(t *testing.T) {
-	u, err := ParseURL("http://my-service.my-ns.svc.cluster.local/path?query=1")
-	require.NoError(t, err)
-
-	data, err := json.Marshal(u)
-	require.NoError(t, err)
-	assert.Equal(t, `"http://my-service.my-ns.svc.cluster.local/path?query=1"`, string(data))
-
-	var parsed URL
-	require.NoError(t, json.Unmarshal(data, &parsed))
-	assert.Equal(t, *u, parsed)
-	assert.Equal(t, "my-service.my-ns.svc.cluster.local", parsed.Host)
-	assert.Equal(t, "/path", parsed.Path)
-
-	require.NoError(t, json.Unmarshal([]byte(`""`), &parsed))
-	assert.Equal(t, URL{}, parsed)
-	require.Error(t, json.Unmarshal([]byte(`"://invalid"`), &parsed))
-}
-
-func TestParseURLEmpty(t *testing.T) {
-	u, err := ParseURL("")
-	require.NoError(t, err)
-	assert.Nil(t, u)
-	assert.Empty(t, u.String())
-}
-
-func TestURLSemanticEquality(t *testing.T) {
-	a, err := ParseURL("http://my-host/a")
-	require.NoError(t, err)
-	b, err := ParseURL("http://my-host/a")
-	require.NoError(t, err)
-	c, err := ParseURL("http://my-host/c")
-	require.NoError(t, err)
-
-	assert.True(t, equality.Semantic.DeepEqual(a, b))
-	assert.False(t, equality.Semantic.DeepEqual(a, c))
-}
diff --git a/pkg/apis/duck/knative/apis/volatile_time.go b/pkg/apis/duck/knative/apis/volatile_time.go
deleted file mode 100644
index 09dc7adde..000000000
--- a/pkg/apis/duck/knative/apis/volatile_time.go
+++ /dev/null
@@ -1,46 +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 apis
-
-import (
-	"k8s.io/apimachinery/pkg/api/equality"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-// VolatileTime wraps metav1.Time. Unlike metav1.Time, two VolatileTime values are always
-// semantically equal, so that a change of a condition transition time alone is not
-// considered a status change.
-type VolatileTime struct { //nolint: recvcheck
-	Inner metav1.Time `json:",inline"`
-}
-
-func init() {
-	_ = equality.Semantic.AddFunc(func(VolatileTime, VolatileTime) bool {
-		return true
-	})
-}
-
-// MarshalJSON implements json.Marshaler.
-func (t VolatileTime) MarshalJSON() ([]byte, error) {
-	return t.Inner.MarshalJSON()
-}
-
-// UnmarshalJSON implements json.Unmarshaler.
-func (t *VolatileTime) UnmarshalJSON(b []byte) error {
-	return t.Inner.UnmarshalJSON(b)
-}
diff --git a/pkg/apis/duck/knative/apis/volatile_time_test.go b/pkg/apis/duck/knative/apis/volatile_time_test.go
deleted file mode 100644
index e5f16c349..000000000
--- a/pkg/apis/duck/knative/apis/volatile_time_test.go
+++ /dev/null
@@ -1,56 +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 apis
-
-import (
-	"encoding/json"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	corev1 "k8s.io/api/core/v1"
-	"k8s.io/apimachinery/pkg/api/equality"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-func TestVolatileTimeJSON(t *testing.T) {
-	vt := VolatileTime{Inner: metav1.NewTime(time.Date(2026, 1, 2, 3, 4, 5, 0, time.UTC))}
-
-	data, err := json.Marshal(vt)
-	require.NoError(t, err)
-	assert.Equal(t, `"2026-01-02T03:04:05Z"`, string(data))
-
-	var parsed VolatileTime
-	require.NoError(t, json.Unmarshal(data, &parsed))
-	assert.True(t, vt.Inner.Equal(&parsed.Inner))
-}
-
-func TestVolatileTimeSemanticEquality(t *testing.T) {
-	t1 := VolatileTime{Inner: metav1.NewTime(time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC))}
-	t2 := VolatileTime{Inner: metav1.NewTime(time.Date(2026, 6, 1, 0, 0, 0, 0, time.UTC))}
-	assert.True(t, equality.Semantic.DeepEqual(t1, t2))
-
-	c1 := Condition{Type: ConditionReady, Status: corev1.ConditionTrue, LastTransitionTime: t1}
-	c2 := Condition{Type: ConditionReady, Status: corev1.ConditionTrue, LastTransitionTime: t2}
-	assert.True(t, equality.Semantic.DeepEqual(c1, c2))
-
-	c2.Status = corev1.ConditionFalse
-	assert.False(t, equality.Semantic.DeepEqual(c1, c2))
-}
diff --git a/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go b/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
index 342c85f6d..114ecba4f 100644
--- a/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
@@ -67,7 +67,6 @@ func (in *BindingSpec) DeepCopy() *BindingSpec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Condition) DeepCopyInto(out *Condition) {
 	*out = *in
-	in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Condition.
@@ -85,9 +84,7 @@ func (in Conditions) DeepCopyInto(out *Conditions) {
 	{
 		in := &in
 		*out = make(Conditions, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
+		copy(*out, *in)
 	}
 }
 
@@ -178,16 +175,7 @@ func (in *Status) DeepCopyInto(out *Status) {
 	if in.Conditions != nil {
 		in, out := &in.Conditions, &out.Conditions
 		*out = make(Conditions, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	if in.Annotations != nil {
-		in, out := &in.Annotations, &out.Annotations
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
+		copy(*out, *in)
 	}
 }
 
@@ -220,19 +208,3 @@ func (in *URL) DeepCopy() *URL {
 	in.DeepCopyInto(out)
 	return out
 }
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *VolatileTime) DeepCopyInto(out *VolatileTime) {
-	*out = *in
-	in.Inner.DeepCopyInto(&out.Inner)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolatileTime.
-func (in *VolatileTime) DeepCopy() *VolatileTime {
-	if in == nil {
-		return nil
-	}
-	out := new(VolatileTime)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/apis/duck/knative/eventing/v1/duck_types.go b/pkg/apis/duck/knative/eventing/v1/duck_types.go
index bd455456a..35e9610e4 100644
--- a/pkg/apis/duck/knative/eventing/v1/duck_types.go
+++ b/pkg/apis/duck/knative/eventing/v1/duck_types.go
@@ -31,8 +31,7 @@ type Trigger struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	Spec   TriggerSpec   `json:"spec,omitempty"`
-	Status TriggerStatus `json:"status,omitempty"`
+	Spec TriggerSpec `json:"spec,omitempty"`
 }
 
 // TriggerSpec defines the desired state of the Trigger.
@@ -52,15 +51,7 @@ type TriggerSpec struct {
 type TriggerFilter struct {
 	// Attributes filters events by exact match on event context attributes.
 	// +optional
-	Attributes TriggerFilterAttributes `json:"attributes,omitempty"`
-}
-
-// TriggerFilterAttributes is a map of context attribute names to values for filtering by equality.
-type TriggerFilterAttributes map[string]string
-
-// TriggerStatus represents the current state of a Trigger.
-type TriggerStatus struct {
-	apis.Status `json:",inline"`
+	Attributes map[string]string `json:"attributes,omitempty"`
 }
 
 // +kubebuilder:object:root=true
@@ -81,21 +72,11 @@ type Broker struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	Spec   BrokerSpec   `json:"spec,omitempty"`
 	Status BrokerStatus `json:"status,omitempty"`
 }
 
-// BrokerSpec defines the desired state of the Broker.
-type BrokerSpec struct {
-	// Config is a KReference to the configuration that specifies configuration options for this Broker.
-	// +optional
-	Config *apis.KReference `json:"config,omitempty"`
-}
-
 // BrokerStatus represents the current state of a Broker.
 type BrokerStatus struct {
-	apis.Status `json:",inline"`
-
 	// AddressStatus is the part where the Broker fulfills the Addressable contract.
 	apis.AddressStatus `json:",inline"`
 }
diff --git a/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go
index a848c09de..9493d4d9e 100644
--- a/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go
@@ -5,7 +5,6 @@
 package v1
 
 import (
-	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
 	"k8s.io/apimachinery/pkg/runtime"
 )
 
@@ -14,7 +13,6 @@ func (in *Broker) DeepCopyInto(out *Broker) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Spec.DeepCopyInto(&out.Spec)
 	in.Status.DeepCopyInto(&out.Status)
 }
 
@@ -68,30 +66,9 @@ func (in *BrokerList) DeepCopyObject() runtime.Object {
 	return nil
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *BrokerSpec) DeepCopyInto(out *BrokerSpec) {
-	*out = *in
-	if in.Config != nil {
-		in, out := &in.Config, &out.Config
-		*out = new(apis.KReference)
-		**out = **in
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BrokerSpec.
-func (in *BrokerSpec) DeepCopy() *BrokerSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(BrokerSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *BrokerStatus) DeepCopyInto(out *BrokerStatus) {
 	*out = *in
-	in.Status.DeepCopyInto(&out.Status)
 	in.AddressStatus.DeepCopyInto(&out.AddressStatus)
 }
 
@@ -111,7 +88,6 @@ func (in *Trigger) DeepCopyInto(out *Trigger) {
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
 	in.Spec.DeepCopyInto(&out.Spec)
-	in.Status.DeepCopyInto(&out.Status)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Trigger.
@@ -137,7 +113,7 @@ func (in *TriggerFilter) DeepCopyInto(out *TriggerFilter) {
 	*out = *in
 	if in.Attributes != nil {
 		in, out := &in.Attributes, &out.Attributes
-		*out = make(TriggerFilterAttributes, len(*in))
+		*out = make(map[string]string, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -154,27 +130,6 @@ func (in *TriggerFilter) DeepCopy() *TriggerFilter {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in TriggerFilterAttributes) DeepCopyInto(out *TriggerFilterAttributes) {
-	{
-		in := &in
-		*out = make(TriggerFilterAttributes, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TriggerFilterAttributes.
-func (in TriggerFilterAttributes) DeepCopy() TriggerFilterAttributes {
-	if in == nil {
-		return nil
-	}
-	out := new(TriggerFilterAttributes)
-	in.DeepCopyInto(out)
-	return *out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *TriggerList) DeepCopyInto(out *TriggerList) {
 	*out = *in
@@ -227,19 +182,3 @@ func (in *TriggerSpec) DeepCopy() *TriggerSpec {
 	in.DeepCopyInto(out)
 	return out
 }
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TriggerStatus) DeepCopyInto(out *TriggerStatus) {
-	*out = *in
-	in.Status.DeepCopyInto(&out.Status)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TriggerStatus.
-func (in *TriggerStatus) DeepCopy() *TriggerStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(TriggerStatus)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/apis/duck/knative/messaging/v1/duck_types.go b/pkg/apis/duck/knative/messaging/v1/duck_types.go
index 00626803a..f6f0add9d 100644
--- a/pkg/apis/duck/knative/messaging/v1/duck_types.go
+++ b/pkg/apis/duck/knative/messaging/v1/duck_types.go
@@ -29,10 +29,9 @@ import (
 // routing the events received on a Channel to a Subscriber.
 type Subscription struct {
 	metav1.TypeMeta   `json:",inline"`
-	metav1.ObjectMeta `json:"metadata"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	Spec   SubscriptionSpec   `json:"spec"`
-	Status SubscriptionStatus `json:"status,omitempty"`
+	Spec SubscriptionSpec `json:"spec,omitempty"`
 }
 
 // SubscriptionSpec specifies the Channel for incoming events and the Subscriber processing them.
@@ -43,29 +42,6 @@ type SubscriptionSpec struct {
 	// Subscriber is reference to the function for processing events.
 	// +optional
 	Subscriber *apis.Destination `json:"subscriber,omitempty"`
-
-	// Reply specifies how to handle events returned from the Subscriber target.
-	// +optional
-	Reply *apis.Destination `json:"reply,omitempty"`
-}
-
-// SubscriptionStatus represents the current state of a Subscription.
-type SubscriptionStatus struct {
-	apis.Status `json:",inline"`
-
-	// PhysicalSubscription is the fully resolved values that this Subscription represents.
-	PhysicalSubscription SubscriptionStatusPhysicalSubscription `json:"physicalSubscription,omitempty"`
-}
-
-// SubscriptionStatusPhysicalSubscription represents the fully resolved values for this Subscription.
-type SubscriptionStatusPhysicalSubscription struct {
-	// SubscriberURI is the fully resolved URI for spec.subscriber.
-	// +optional
-	SubscriberURI *apis.URL `json:"subscriberUri,omitempty"`
-
-	// ReplyURI is the fully resolved URI for the spec.reply.
-	// +optional
-	ReplyURI *apis.URL `json:"replyUri,omitempty"`
 }
 
 // +kubebuilder:object:root=true
@@ -73,7 +49,7 @@ type SubscriptionStatusPhysicalSubscription struct {
 // SubscriptionList contains a list of Subscription.
 type SubscriptionList struct {
 	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata"`
+	metav1.ListMeta `json:"metadata,omitempty"`
 
 	Items []Subscription `json:"items"`
 }
@@ -85,26 +61,11 @@ type Channel struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	Spec   ChannelSpec   `json:"spec,omitempty"`
 	Status ChannelStatus `json:"status,omitempty"`
 }
 
-// ChannelSpec holds the desired state of the Channel.
-type ChannelSpec struct {
-	// ChannelTemplate specifies which Channel CRD to use to create the backing Channel.
-	// +optional
-	ChannelTemplate *ChannelTemplateSpec `json:"channelTemplate,omitempty"`
-}
-
-// ChannelTemplateSpec identifies the underlying Channel implementation.
-type ChannelTemplateSpec struct {
-	metav1.TypeMeta `json:",inline"`
-}
-
 // ChannelStatus represents the current state of a Channel.
 type ChannelStatus struct {
-	apis.Status `json:",inline"`
-
 	// AddressStatus is the part where the Channel fulfills the Addressable contract.
 	apis.AddressStatus `json:",inline"`
 }
diff --git a/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
index 636ae22d1..f0f1181e1 100644
--- a/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
@@ -14,7 +14,6 @@ func (in *Channel) DeepCopyInto(out *Channel) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Spec.DeepCopyInto(&out.Spec)
 	in.Status.DeepCopyInto(&out.Status)
 }
 
@@ -68,30 +67,9 @@ func (in *ChannelList) DeepCopyObject() runtime.Object {
 	return nil
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ChannelSpec) DeepCopyInto(out *ChannelSpec) {
-	*out = *in
-	if in.ChannelTemplate != nil {
-		in, out := &in.ChannelTemplate, &out.ChannelTemplate
-		*out = new(ChannelTemplateSpec)
-		**out = **in
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChannelSpec.
-func (in *ChannelSpec) DeepCopy() *ChannelSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(ChannelSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ChannelStatus) DeepCopyInto(out *ChannelStatus) {
 	*out = *in
-	in.Status.DeepCopyInto(&out.Status)
 	in.AddressStatus.DeepCopyInto(&out.AddressStatus)
 }
 
@@ -105,29 +83,12 @@ func (in *ChannelStatus) DeepCopy() *ChannelStatus {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ChannelTemplateSpec) DeepCopyInto(out *ChannelTemplateSpec) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChannelTemplateSpec.
-func (in *ChannelTemplateSpec) DeepCopy() *ChannelTemplateSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(ChannelTemplateSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Subscription) DeepCopyInto(out *Subscription) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
 	in.Spec.DeepCopyInto(&out.Spec)
-	in.Status.DeepCopyInto(&out.Status)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Subscription.
@@ -189,11 +150,6 @@ func (in *SubscriptionSpec) DeepCopyInto(out *SubscriptionSpec) {
 		*out = new(apis.Destination)
 		(*in).DeepCopyInto(*out)
 	}
-	if in.Reply != nil {
-		in, out := &in.Reply, &out.Reply
-		*out = new(apis.Destination)
-		(*in).DeepCopyInto(*out)
-	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubscriptionSpec.
@@ -205,45 +161,3 @@ func (in *SubscriptionSpec) DeepCopy() *SubscriptionSpec {
 	in.DeepCopyInto(out)
 	return out
 }
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SubscriptionStatus) DeepCopyInto(out *SubscriptionStatus) {
-	*out = *in
-	in.Status.DeepCopyInto(&out.Status)
-	in.PhysicalSubscription.DeepCopyInto(&out.PhysicalSubscription)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubscriptionStatus.
-func (in *SubscriptionStatus) DeepCopy() *SubscriptionStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(SubscriptionStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SubscriptionStatusPhysicalSubscription) DeepCopyInto(out *SubscriptionStatusPhysicalSubscription) {
-	*out = *in
-	if in.SubscriberURI != nil {
-		in, out := &in.SubscriberURI, &out.SubscriberURI
-		*out = new(apis.URL)
-		(*in).DeepCopyInto(*out)
-	}
-	if in.ReplyURI != nil {
-		in, out := &in.ReplyURI, &out.ReplyURI
-		*out = new(apis.URL)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubscriptionStatusPhysicalSubscription.
-func (in *SubscriptionStatusPhysicalSubscription) DeepCopy() *SubscriptionStatusPhysicalSubscription {
-	if in == nil {
-		return nil
-	}
-	out := new(SubscriptionStatusPhysicalSubscription)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/apis/duck/knative/serving/v1/duck_types.go b/pkg/apis/duck/knative/serving/v1/duck_types.go
index 0e8371b24..7e4794af5 100644
--- a/pkg/apis/duck/knative/serving/v1/duck_types.go
+++ b/pkg/apis/duck/knative/serving/v1/duck_types.go
@@ -43,9 +43,6 @@ type Service struct {
 type ServiceSpec struct {
 	// ConfigurationSpec holds the desired state of the Configuration.
 	ConfigurationSpec `json:",inline"`
-
-	// RouteSpec holds the desired state of the Route.
-	RouteSpec `json:",inline"`
 }
 
 // ConfigurationSpec holds the desired state of the Configuration.
@@ -65,71 +62,19 @@ type RevisionTemplateSpec struct {
 type RevisionSpec struct {
 	corev1.PodSpec `json:",inline"`
 
-	// ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container of the Revision.
-	// +optional
-	ContainerConcurrency *int64 `json:"containerConcurrency,omitempty"`
-
 	// TimeoutSeconds is the maximum duration in seconds that the request instance is allowed to respond to a request.
 	// +optional
 	TimeoutSeconds *int64 `json:"timeoutSeconds,omitempty"`
 }
 
-// RouteSpec holds the desired state of the Route.
-type RouteSpec struct {
-	// Traffic specifies how to distribute traffic over a collection of revisions and configurations.
-	// +optional
-	Traffic []TrafficTarget `json:"traffic,omitempty"`
-}
-
-// TrafficTarget holds a single entry of the routing table for a Route.
-type TrafficTarget struct {
-	// Tag is optionally used to expose a dedicated url for referencing this target exclusively.
-	// +optional
-	Tag string `json:"tag,omitempty"`
-
-	// RevisionName of a specific revision to which to send this portion of traffic.
-	// +optional
-	RevisionName string `json:"revisionName,omitempty"`
-
-	// ConfigurationName of a configuration to whose latest revision we will send this portion of traffic.
-	// +optional
-	ConfigurationName string `json:"configurationName,omitempty"`
-
-	// LatestRevision indicates that the latest ready Revision of the Configuration should be used for this traffic target.
-	// +optional
-	LatestRevision *bool `json:"latestRevision,omitempty"`
-
-	// Percent indicates the percent of traffic that is to be routed to this Revision or Configuration.
-	// +optional
-	Percent *int64 `json:"percent,omitempty"`
-
-	// URL displays the URL for accessing named traffic targets. It is only present in the status.
-	// +optional
-	URL *apis.URL `json:"url,omitempty"`
-}
-
 // ServiceStatus represents the status of the Service resource.
 type ServiceStatus struct {
 	apis.Status `json:",inline"`
 
-	// ConfigurationStatusFields represents the current Configuration.
-	ConfigurationStatusFields `json:",inline"`
-
 	// RouteStatusFields represents the current Route.
 	RouteStatusFields `json:",inline"`
 }
 
-// ConfigurationStatusFields holds the fields of the Configuration status.
-type ConfigurationStatusFields struct {
-	// LatestReadyRevisionName holds the name of the latest Revision that has become ready.
-	// +optional
-	LatestReadyRevisionName string `json:"latestReadyRevisionName,omitempty"`
-
-	// LatestCreatedRevisionName is the last revision that was created from this Configuration.
-	// +optional
-	LatestCreatedRevisionName string `json:"latestCreatedRevisionName,omitempty"`
-}
-
 // RouteStatusFields holds the fields of the Route status.
 type RouteStatusFields struct {
 	// URL holds the url that will distribute traffic over the provided traffic targets.
@@ -139,10 +84,6 @@ type RouteStatusFields struct {
 	// Address holds the information needed for a Route to be the target of an event.
 	// +optional
 	Address *apis.Addressable `json:"address,omitempty"`
-
-	// Traffic holds the configured traffic distribution.
-	// +optional
-	Traffic []TrafficTarget `json:"traffic,omitempty"`
 }
 
 // +kubebuilder:object:root=true
@@ -150,7 +91,7 @@ type RouteStatusFields struct {
 // ServiceList contains a list of Service.
 type ServiceList struct {
 	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata"`
+	metav1.ListMeta `json:"metadata,omitempty"`
 
 	Items []Service `json:"items"`
 }
diff --git a/pkg/apis/duck/knative/serving/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/serving/v1/zz_generated.deepcopy.go
index 0ccc5cdd4..a43f0d802 100644
--- a/pkg/apis/duck/knative/serving/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/knative/serving/v1/zz_generated.deepcopy.go
@@ -25,30 +25,10 @@ func (in *ConfigurationSpec) DeepCopy() *ConfigurationSpec {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ConfigurationStatusFields) DeepCopyInto(out *ConfigurationStatusFields) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigurationStatusFields.
-func (in *ConfigurationStatusFields) DeepCopy() *ConfigurationStatusFields {
-	if in == nil {
-		return nil
-	}
-	out := new(ConfigurationStatusFields)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *RevisionSpec) DeepCopyInto(out *RevisionSpec) {
 	*out = *in
 	in.PodSpec.DeepCopyInto(&out.PodSpec)
-	if in.ContainerConcurrency != nil {
-		in, out := &in.ContainerConcurrency, &out.ContainerConcurrency
-		*out = new(int64)
-		**out = **in
-	}
 	if in.TimeoutSeconds != nil {
 		in, out := &in.TimeoutSeconds, &out.TimeoutSeconds
 		*out = new(int64)
@@ -83,28 +63,6 @@ func (in *RevisionTemplateSpec) DeepCopy() *RevisionTemplateSpec {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *RouteSpec) DeepCopyInto(out *RouteSpec) {
-	*out = *in
-	if in.Traffic != nil {
-		in, out := &in.Traffic, &out.Traffic
-		*out = make([]TrafficTarget, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RouteSpec.
-func (in *RouteSpec) DeepCopy() *RouteSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(RouteSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *RouteStatusFields) DeepCopyInto(out *RouteStatusFields) {
 	*out = *in
@@ -118,13 +76,6 @@ func (in *RouteStatusFields) DeepCopyInto(out *RouteStatusFields) {
 		*out = new(apis.Addressable)
 		(*in).DeepCopyInto(*out)
 	}
-	if in.Traffic != nil {
-		in, out := &in.Traffic, &out.Traffic
-		*out = make([]TrafficTarget, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RouteStatusFields.
@@ -200,7 +151,6 @@ func (in *ServiceList) DeepCopyObject() runtime.Object {
 func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) {
 	*out = *in
 	in.ConfigurationSpec.DeepCopyInto(&out.ConfigurationSpec)
-	in.RouteSpec.DeepCopyInto(&out.RouteSpec)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceSpec.
@@ -217,7 +167,6 @@ func (in *ServiceSpec) DeepCopy() *ServiceSpec {
 func (in *ServiceStatus) DeepCopyInto(out *ServiceStatus) {
 	*out = *in
 	in.Status.DeepCopyInto(&out.Status)
-	out.ConfigurationStatusFields = in.ConfigurationStatusFields
 	in.RouteStatusFields.DeepCopyInto(&out.RouteStatusFields)
 }
 
@@ -230,33 +179,3 @@ func (in *ServiceStatus) DeepCopy() *ServiceStatus {
 	in.DeepCopyInto(out)
 	return out
 }
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TrafficTarget) DeepCopyInto(out *TrafficTarget) {
-	*out = *in
-	if in.LatestRevision != nil {
-		in, out := &in.LatestRevision, &out.LatestRevision
-		*out = new(bool)
-		**out = **in
-	}
-	if in.Percent != nil {
-		in, out := &in.Percent, &out.Percent
-		*out = new(int64)
-		**out = **in
-	}
-	if in.URL != nil {
-		in, out := &in.URL, &out.URL
-		*out = new(apis.URL)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrafficTarget.
-func (in *TrafficTarget) DeepCopy() *TrafficTarget {
-	if in == nil {
-		return nil
-	}
-	out := new(TrafficTarget)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/apis/duck/knative/sources/v1/duck_types.go b/pkg/apis/duck/knative/sources/v1/duck_types.go
index 6a8cf0ee0..e6a5c46f3 100644
--- a/pkg/apis/duck/knative/sources/v1/duck_types.go
+++ b/pkg/apis/duck/knative/sources/v1/duck_types.go
@@ -31,8 +31,7 @@ type SinkBinding struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
-	Spec   SinkBindingSpec   `json:"spec"`
-	Status SinkBindingStatus `json:"status"`
+	Spec SinkBindingSpec `json:"spec,omitempty"`
 }
 
 // SinkBindingSpec holds the desired state of the SinkBinding.
@@ -44,11 +43,6 @@ type SinkBindingSpec struct {
 	apis.BindingSpec `json:",inline"`
 }
 
-// SinkBindingStatus communicates the observed state of the SinkBinding.
-type SinkBindingStatus struct {
-	apis.Status `json:",inline"`
-}
-
 // +kubebuilder:object:root=true
 
 // SinkBindingList contains a list of SinkBinding.
diff --git a/pkg/apis/duck/knative/sources/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/sources/v1/zz_generated.deepcopy.go
index a4c77c568..478719126 100644
--- a/pkg/apis/duck/knative/sources/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/knative/sources/v1/zz_generated.deepcopy.go
@@ -14,7 +14,6 @@ func (in *SinkBinding) DeepCopyInto(out *SinkBinding) {
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
 	in.Spec.DeepCopyInto(&out.Spec)
-	in.Status.DeepCopyInto(&out.Status)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SinkBinding.
@@ -83,19 +82,3 @@ func (in *SinkBindingSpec) DeepCopy() *SinkBindingSpec {
 	in.DeepCopyInto(out)
 	return out
 }
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SinkBindingStatus) DeepCopyInto(out *SinkBindingStatus) {
-	*out = *in
-	in.Status.DeepCopyInto(&out.Status)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SinkBindingStatus.
-func (in *SinkBindingStatus) DeepCopy() *SinkBindingStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(SinkBindingStatus)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/controller/integration/monitor_knative_test.go b/pkg/controller/integration/monitor_knative_test.go
index a1190d441..3604d5498 100644
--- a/pkg/controller/integration/monitor_knative_test.go
+++ b/pkg/controller/integration/monitor_knative_test.go
@@ -19,6 +19,7 @@ package integration
 
 import (
 	"context"
+	"encoding/json"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -26,6 +27,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/utils/ptr"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
@@ -127,3 +129,73 @@ func TestKnativeServiceControllerMissingCondition(t *testing.T) {
 	require.NotNil(t, cond)
 	assert.Equal(t, corev1.ConditionFalse, cond.Status)
 }
+
+// knativeServicePayload mimics a Knative Serving Service as returned by the API server:
+// it carries a number of fields the duck type does not model, which must be ignored.
+const knativeServicePayload = `{
+	"apiVersion": "serving.knative.dev/v1",
+	"kind": "Service",
+	"metadata": {"name": "my-ksvc", "namespace": "ns", "generation": 2},
+	"spec": {
+		"template": {
+			"metadata": {"labels": {"camel.apache.org/integration": "my-it"}},
+			"spec": {
+				"containerConcurrency": 0,
+				"containers": [{"name": "integration", "image": "my-image"}],
+				"enableServiceLinks": false,
+				"timeoutSeconds": 300
+			}
+		},
+		"traffic": [{"latestRevision": true, "percent": 100}]
+	},
+	"status": {
+		"address": {"url": "http://my-ksvc.ns.svc.cluster.local"},
+		"conditions": [
+			{"lastTransitionTime": "2026-01-02T03:04:05Z", "status": "True", "type": "ConfigurationsReady"},
+			{"lastTransitionTime": "2026-01-02T03:04:05Z", "status": "False", "type": "Ready",
+				"reason": "RevisionFailed", "message": "Revision \"my-ksvc-00001\" failed with message: Container failed."},
+			{"lastTransitionTime": "2026-01-02T03:04:05Z", "status": "False", "type": "RoutesReady",
+				"reason": "RevisionMissing", "message": "Configuration \"my-ksvc\" does not have any ready Revision.", "severity": "Info"}
+		],
+		"latestCreatedRevisionName": "my-ksvc-00001",
+		"latestReadyRevisionName": "my-ksvc-00001",
+		"observedGeneration": 2,
+		"traffic": [{"latestRevision": true, "percent": 100, "revisionName": "my-ksvc-00001"}],
+		"url": "http://my-ksvc.ns.example.com"
+	}
+}`
+
+func TestKnativeServiceControllerFromAPIServerPayload(t *testing.T) {
+	svc := &servingv1.Service{}
+	require.NoError(t, json.Unmarshal([]byte(knativeServicePayload), svc))
+
+	assert.Equal(t, "http://my-ksvc.ns.example.com", svc.Status.URL.String())
+	require.NotNil(t, svc.Status.Address)
+	assert.Equal(t, "my-ksvc.ns.svc.cluster.local", svc.Status.Address.URL.Host)
+	assert.Equal(t, int64(300), ptr.Deref(svc.Spec.Template.Spec.TimeoutSeconds, 0))
+	assert.Len(t, svc.Spec.Template.Spec.Containers, 1)
+
+	c := &knativeServiceController{
+		obj: svc,
+		integration: &v1.Integration{
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: "ns",
+				Name:      "my-it",
+			},
+			Status: v1.IntegrationStatus{
+				Phase: v1.IntegrationPhaseRunning,
+			},
+		},
+	}
+	assert.True(t, c.hasTemplateIntegrationLabel())
+	assert.Equal(t, "KnativeService/my-ksvc", c.getControllerName())
+
+	done, err := c.checkReadyCondition(context.TODO())
+	require.NoError(t, err)
+	assert.True(t, done)
+	assert.Equal(t, v1.IntegrationPhaseError, c.integration.Status.Phase)
+	cond := c.integration.Status.GetCondition(v1.IntegrationConditionReady)
+	require.NotNil(t, cond)
+	assert.Equal(t, corev1.ConditionFalse, cond.Status)
+	assert.Contains(t, cond.Message, "my-ksvc-00001")
+}
diff --git a/pkg/controller/integration/predicate_test.go b/pkg/controller/integration/predicate_test.go
new file mode 100644
index 000000000..47384ea6e
--- /dev/null
+++ b/pkg/controller/integration/predicate_test.go
@@ -0,0 +1,77 @@
+/*
+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 integration
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"sigs.k8s.io/controller-runtime/pkg/event"
+
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
+)
+
+func newKnativeServiceWithStatus(t *testing.T, url string, ready corev1.ConditionStatus) *servingv1.Service {
+	t.Helper()
+	parsed, err := apis.ParseURL(url)
+	require.NoError(t, err)
+
+	return &servingv1.Service{
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-ksvc",
+		},
+		Status: servingv1.ServiceStatus{
+			Status: apis.Status{
+				Conditions: apis.Conditions{
+					{Type: servingv1.ServiceConditionReady, Status: ready},
+				},
+			},
+			RouteStatusFields: servingv1.RouteStatusFields{
+				URL:     parsed,
+				Address: &apis.Addressable{URL: parsed},
+			},
+		},
+	}
+}
+
+func TestStatusChangedPredicateKnativeService(t *testing.T) {
+	p := StatusChangedPredicate{}
+
+	// A URL with user information makes url.URL carry an unexported *url.Userinfo:
+	// the semantic equality can only compare it through the URL equality function.
+	old := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local", corev1.ConditionTrue)
+
+	same := old.DeepCopy()
+	same.Generation++
+	assert.False(t, p.Update(event.UpdateEvent{ObjectOld: old, ObjectNew: same}))
+
+	changedURL := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local/other", corev1.ConditionTrue)
+	assert.True(t, p.Update(event.UpdateEvent{ObjectOld: old, ObjectNew: changedURL}))
+
+	notReady := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local", corev1.ConditionFalse)
+	assert.True(t, p.Update(event.UpdateEvent{ObjectOld: old, ObjectNew: notReady}))
+
+	assert.False(t, p.Update(event.UpdateEvent{ObjectOld: nil, ObjectNew: same}))
+	assert.False(t, p.Update(event.UpdateEvent{ObjectOld: old, ObjectNew: nil}))
+}
diff --git a/pkg/trait/knative_test.go b/pkg/trait/knative_test.go
index 553f087c5..33b6d0004 100644
--- a/pkg/trait/knative_test.go
+++ b/pkg/trait/knative_test.go
@@ -1406,7 +1406,6 @@ func newFakeClient(namespace string) (client.Client, error) {
 				Namespace: namespace,
 				Name:      "default",
 			},
-			Spec: eventing.BrokerSpec{},
 			Status: eventing.BrokerStatus{
 				AddressStatus: apis.AddressStatus{
 					Address: &apis.Addressable{
@@ -1426,7 +1425,7 @@ func newFakeClient(namespace string) (client.Client, error) {
 			},
 			Spec: eventing.TriggerSpec{
 				Filter: &eventing.TriggerFilter{
-					Attributes: eventing.TriggerFilterAttributes{
+					Attributes: map[string]string{
 						"type": "event-source-1",
 					},
 				},
diff --git a/pkg/util/knative/knative_test.go b/pkg/util/knative/knative_test.go
index 71047d683..c6dee9761 100644
--- a/pkg/util/knative/knative_test.go
+++ b/pkg/util/knative/knative_test.go
@@ -57,8 +57,7 @@ func TestCreateSinkBinding(t *testing.T) {
 		"spec": {
 			"sink": {"ref": {"kind": "Channel", "name": "my-channel", "apiVersion": "messaging.knative.dev/v1"}},
 			"subject": {"apiVersion": "apps/v1", "kind": "Deployment", "name": "my-source"}
-		},
-		"status": {}
+		}
 	}`, string(actual))
 }
 
@@ -88,8 +87,7 @@ func TestCreateSubscription(t *testing.T) {
 				"ref": {"kind": "Service", "name": "my-service", "apiVersion": "serving.knative.dev/v1"},
 				"uri": "/channels/my-channel"
 			}
-		},
-		"status": {"physicalSubscription": {}}
+		}
 	}`, string(actual))
 }
 
@@ -122,8 +120,7 @@ func TestCreateKnativeServiceTrigger(t *testing.T) {
 				"ref": {"kind": "Service", "name": "my-service", "apiVersion": "serving.knative.dev/v1"},
 				"uri": "/events/evt.type"
 			}
-		},
-		"status": {}
+		}
 	}`, string(actual))
 }
 
diff --git a/script/update_docs.sh b/script/update_docs.sh
index 42d9f4987..086ae5f24 100755
--- a/script/update_docs.sh
+++ b/script/update_docs.sh
@@ -42,10 +42,3 @@ yq -i ".asciidoc.attributes.kubernetes-api-version = \"$KUBE_API_VERSION\"" $loc
 yq -i ".asciidoc.attributes.operator-fwk-api-version = \"$OPERATOR_FWK_API_VERSION\"" $location/../docs/antora.yml
 yq -i ".asciidoc.attributes.service-binding-op-version = \"$SERVICE_BINDING_OP_VERSION\"" $location/../docs/antora.yml
 yq -i ".asciidoc.attributes.prometheus-op-version = \"$PROMETHEUS_OP_VERSION\"" $location/../docs/antora.yml
-
-echo "Scraping information from e2e/knative/files/setup.sh"
-KNATIVE_VERSION=$(grep '^KNATIVE_VERSION=' $location/../e2e/knative/files/setup.sh | sed 's/^.*=//')
-
-echo "Knative version: $KNATIVE_VERSION"
-
-yq -i ".asciidoc.attributes.knative-api-version = \"$KNATIVE_VERSION\"" $location/../docs/antora.yml


(camel-k) 03/03: address review and resolve merge conflicts

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 433ba49caa20745fd6ada768ba41419bdd06f561
Author: Michal Vavřík <de...@michalvavrik.net>
AuthorDate: Thu Oct 1 13:53:51 2026 +0200

    address review and resolve merge conflicts
    
    Signed-off-by: Michal Vavřík <de...@michalvavrik.net>
---
 pkg/apis/camel/v1/trait/zz_generated.deepcopy.go   |  2 +-
 pkg/apis/camel/v1/zz_generated.deepcopy.go         |  1 -
 .../duck/keda/v1alpha1/zz_generated.deepcopy.go    |  2 +-
 pkg/apis/duck/knative/apis/condition_types.go      | 84 ---------------------
 pkg/apis/duck/knative/apis/duck_types.go           | 15 ++--
 .../duck/knative/apis/zz_generated.deepcopy.go     | 61 ++-------------
 pkg/apis/duck/knative/eventing/v1/duck_types.go    | 27 -------
 pkg/apis/duck/knative/eventing/v1/register.go      |  2 -
 .../knative/eventing/v1/zz_generated.deepcopy.go   | 74 -------------------
 pkg/apis/duck/knative/messaging/v1/duck_types.go   | 26 -------
 pkg/apis/duck/knative/messaging/v1/register.go     |  2 -
 .../knative/messaging/v1/zz_generated.deepcopy.go  | 74 -------------------
 pkg/apis/duck/knative/serving/v1/duck_types.go     |  2 +-
 pkg/controller/integration/monitor_knative.go      | 14 +++-
 pkg/controller/integration/monitor_knative_test.go | 38 +++++++---
 pkg/controller/integration/predicate_test.go       | 11 ++-
 pkg/trait/knative_test.go                          | 86 +++++++++-------------
 pkg/util/knative/knative_test.go                   | 45 ++++++-----
 pkg/util/kubernetes/conditions.go                  |  4 +-
 19 files changed, 117 insertions(+), 453 deletions(-)

diff --git a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
index 739912370..5466a9cb0 100644
--- a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
@@ -5,7 +5,7 @@
 package trait
 
 import (
-	v1 "k8s.io/api/core/v1"
+	"k8s.io/api/core/v1"
 	networkingv1 "k8s.io/api/networking/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 )
diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go
index af1a8a1dc..07e39cd5e 100644
--- a/pkg/apis/camel/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go
@@ -6,7 +6,6 @@ package v1
 
 import (
 	"encoding/json"
-
 	"github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
diff --git a/pkg/apis/duck/keda/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/duck/keda/v1alpha1/zz_generated.deepcopy.go
index 450aba305..27d57d72a 100644
--- a/pkg/apis/duck/keda/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/keda/v1alpha1/zz_generated.deepcopy.go
@@ -5,7 +5,7 @@
 package v1alpha1
 
 import (
-	v1 "k8s.io/api/core/v1"
+	"k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 )
 
diff --git a/pkg/apis/duck/knative/apis/condition_types.go b/pkg/apis/duck/knative/apis/condition_types.go
deleted file mode 100644
index c3875a547..000000000
--- a/pkg/apis/duck/knative/apis/condition_types.go
+++ /dev/null
@@ -1,84 +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 apis
-
-import (
-	corev1 "k8s.io/api/core/v1"
-)
-
-// Conditions is the schema for the conditions portion of the payload.
-type Conditions []Condition
-
-// ConditionType is a camel-cased condition type.
-type ConditionType string
-
-// ConditionReady specifies that the resource is ready.
-const ConditionReady ConditionType = "Ready"
-
-// Condition defines a readiness condition for a Knative resource.
-type Condition struct {
-	// Type of condition.
-	Type ConditionType `json:"type"`
-
-	// Status of the condition, one of True, False, Unknown.
-	Status corev1.ConditionStatus `json:"status"`
-
-	// The reason for the condition's last transition.
-	// +optional
-	Reason string `json:"reason,omitempty"`
-
-	// A human readable message indicating details about the transition.
-	// +optional
-	Message string `json:"message,omitempty"`
-}
-
-// IsTrue is true if the condition is True.
-func (c *Condition) IsTrue() bool {
-	if c == nil {
-		return false
-	}
-
-	return c.Status == corev1.ConditionTrue
-}
-
-// IsFalse is true if the condition is False.
-func (c *Condition) IsFalse() bool {
-	if c == nil {
-		return false
-	}
-
-	return c.Status == corev1.ConditionFalse
-}
-
-// GetReason returns the reason of the condition, or an empty string for a nil condition.
-func (c *Condition) GetReason() string {
-	if c == nil {
-		return ""
-	}
-
-	return c.Reason
-}
-
-// GetMessage returns the message of the condition, or an empty string for a nil condition.
-func (c *Condition) GetMessage() string {
-	if c == nil {
-		return ""
-	}
-
-	return c.Message
-}
diff --git a/pkg/apis/duck/knative/apis/duck_types.go b/pkg/apis/duck/knative/apis/duck_types.go
index 291a53c78..3bdbe2e68 100644
--- a/pkg/apis/duck/knative/apis/duck_types.go
+++ b/pkg/apis/duck/knative/apis/duck_types.go
@@ -17,18 +17,17 @@ limitations under the License.
 
 package apis
 
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
 // Status is the common status of the Knative resources.
 type Status struct {
 	// Conditions the latest available observations of a resource's current state.
+	// The Knative conditions are read as Kubernetes API conditions, as they share
+	// the fields Camel K uses (type, status, reason and message).
 	// +optional
-	Conditions Conditions `json:"conditions,omitempty"`
-}
-
-// AddressStatus is the status of an addressable resource.
-type AddressStatus struct {
-	// Address is a single Addressable address.
-	// +optional
-	Address *Addressable `json:"address,omitempty"`
+	Conditions []metav1.Condition `json:"conditions,omitempty"`
 }
 
 // Addressable is a destination for message delivery.
diff --git a/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go b/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
index 114ecba4f..23905df76 100644
--- a/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
@@ -5,29 +5,10 @@
 package apis
 
 import (
+	"k8s.io/apimachinery/pkg/apis/meta/v1"
 	"net/url"
 )
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *AddressStatus) DeepCopyInto(out *AddressStatus) {
-	*out = *in
-	if in.Address != nil {
-		in, out := &in.Address, &out.Address
-		*out = new(Addressable)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddressStatus.
-func (in *AddressStatus) DeepCopy() *AddressStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(AddressStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Addressable) DeepCopyInto(out *Addressable) {
 	*out = *in
@@ -64,40 +45,6 @@ func (in *BindingSpec) DeepCopy() *BindingSpec {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Condition) DeepCopyInto(out *Condition) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Condition.
-func (in *Condition) DeepCopy() *Condition {
-	if in == nil {
-		return nil
-	}
-	out := new(Condition)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in Conditions) DeepCopyInto(out *Conditions) {
-	{
-		in := &in
-		*out = make(Conditions, len(*in))
-		copy(*out, *in)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Conditions.
-func (in Conditions) DeepCopy() Conditions {
-	if in == nil {
-		return nil
-	}
-	out := new(Conditions)
-	in.DeepCopyInto(out)
-	return *out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Destination) DeepCopyInto(out *Destination) {
 	*out = *in
@@ -174,8 +121,10 @@ func (in *Status) DeepCopyInto(out *Status) {
 	*out = *in
 	if in.Conditions != nil {
 		in, out := &in.Conditions, &out.Conditions
-		*out = make(Conditions, len(*in))
-		copy(*out, *in)
+		*out = make([]v1.Condition, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
 	}
 }
 
diff --git a/pkg/apis/duck/knative/eventing/v1/duck_types.go b/pkg/apis/duck/knative/eventing/v1/duck_types.go
index 35e9610e4..91dc8463c 100644
--- a/pkg/apis/duck/knative/eventing/v1/duck_types.go
+++ b/pkg/apis/duck/knative/eventing/v1/duck_types.go
@@ -63,30 +63,3 @@ type TriggerList struct {
 
 	Items []Trigger `json:"items"`
 }
-
-// +kubebuilder:object:root=true
-
-// Broker is a partial schema of the Knative Eventing Broker resource: a pool of
-// events that are consumable using Triggers.
-type Broker struct {
-	metav1.TypeMeta   `json:",inline"`
-	metav1.ObjectMeta `json:"metadata,omitempty"`
-
-	Status BrokerStatus `json:"status,omitempty"`
-}
-
-// BrokerStatus represents the current state of a Broker.
-type BrokerStatus struct {
-	// AddressStatus is the part where the Broker fulfills the Addressable contract.
-	apis.AddressStatus `json:",inline"`
-}
-
-// +kubebuilder:object:root=true
-
-// BrokerList contains a list of Broker.
-type BrokerList struct {
-	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata,omitempty"`
-
-	Items []Broker `json:"items"`
-}
diff --git a/pkg/apis/duck/knative/eventing/v1/register.go b/pkg/apis/duck/knative/eventing/v1/register.go
index 51213722b..fabf95bea 100644
--- a/pkg/apis/duck/knative/eventing/v1/register.go
+++ b/pkg/apis/duck/knative/eventing/v1/register.go
@@ -44,8 +44,6 @@ func addKnownTypes(scheme *runtime.Scheme) error {
 	scheme.AddKnownTypes(SchemeGroupVersion,
 		&Trigger{},
 		&TriggerList{},
-		&Broker{},
-		&BrokerList{},
 	)
 	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
 
diff --git a/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go
index 9493d4d9e..e51997e00 100644
--- a/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go
@@ -8,80 +8,6 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 )
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Broker) DeepCopyInto(out *Broker) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Status.DeepCopyInto(&out.Status)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Broker.
-func (in *Broker) DeepCopy() *Broker {
-	if in == nil {
-		return nil
-	}
-	out := new(Broker)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Broker) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *BrokerList) DeepCopyInto(out *BrokerList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ListMeta.DeepCopyInto(&out.ListMeta)
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]Broker, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BrokerList.
-func (in *BrokerList) DeepCopy() *BrokerList {
-	if in == nil {
-		return nil
-	}
-	out := new(BrokerList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *BrokerList) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *BrokerStatus) DeepCopyInto(out *BrokerStatus) {
-	*out = *in
-	in.AddressStatus.DeepCopyInto(&out.AddressStatus)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BrokerStatus.
-func (in *BrokerStatus) DeepCopy() *BrokerStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(BrokerStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Trigger) DeepCopyInto(out *Trigger) {
 	*out = *in
diff --git a/pkg/apis/duck/knative/messaging/v1/duck_types.go b/pkg/apis/duck/knative/messaging/v1/duck_types.go
index f6f0add9d..41d821898 100644
--- a/pkg/apis/duck/knative/messaging/v1/duck_types.go
+++ b/pkg/apis/duck/knative/messaging/v1/duck_types.go
@@ -53,29 +53,3 @@ type SubscriptionList struct {
 
 	Items []Subscription `json:"items"`
 }
-
-// +kubebuilder:object:root=true
-
-// Channel is a partial schema of the Knative Eventing Channel resource.
-type Channel struct {
-	metav1.TypeMeta   `json:",inline"`
-	metav1.ObjectMeta `json:"metadata,omitempty"`
-
-	Status ChannelStatus `json:"status,omitempty"`
-}
-
-// ChannelStatus represents the current state of a Channel.
-type ChannelStatus struct {
-	// AddressStatus is the part where the Channel fulfills the Addressable contract.
-	apis.AddressStatus `json:",inline"`
-}
-
-// +kubebuilder:object:root=true
-
-// ChannelList contains a list of Channel.
-type ChannelList struct {
-	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata,omitempty"`
-
-	Items []Channel `json:"items"`
-}
diff --git a/pkg/apis/duck/knative/messaging/v1/register.go b/pkg/apis/duck/knative/messaging/v1/register.go
index edcfd6b70..d7823ec7f 100644
--- a/pkg/apis/duck/knative/messaging/v1/register.go
+++ b/pkg/apis/duck/knative/messaging/v1/register.go
@@ -44,8 +44,6 @@ func addKnownTypes(scheme *runtime.Scheme) error {
 	scheme.AddKnownTypes(SchemeGroupVersion,
 		&Subscription{},
 		&SubscriptionList{},
-		&Channel{},
-		&ChannelList{},
 	)
 	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
 
diff --git a/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
index f0f1181e1..52c068dc0 100644
--- a/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
@@ -9,80 +9,6 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 )
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Channel) DeepCopyInto(out *Channel) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Status.DeepCopyInto(&out.Status)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Channel.
-func (in *Channel) DeepCopy() *Channel {
-	if in == nil {
-		return nil
-	}
-	out := new(Channel)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Channel) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ChannelList) DeepCopyInto(out *ChannelList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ListMeta.DeepCopyInto(&out.ListMeta)
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]Channel, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChannelList.
-func (in *ChannelList) DeepCopy() *ChannelList {
-	if in == nil {
-		return nil
-	}
-	out := new(ChannelList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *ChannelList) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ChannelStatus) DeepCopyInto(out *ChannelStatus) {
-	*out = *in
-	in.AddressStatus.DeepCopyInto(&out.AddressStatus)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChannelStatus.
-func (in *ChannelStatus) DeepCopy() *ChannelStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(ChannelStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Subscription) DeepCopyInto(out *Subscription) {
 	*out = *in
diff --git a/pkg/apis/duck/knative/serving/v1/duck_types.go b/pkg/apis/duck/knative/serving/v1/duck_types.go
index 7e4794af5..db8994aeb 100644
--- a/pkg/apis/duck/knative/serving/v1/duck_types.go
+++ b/pkg/apis/duck/knative/serving/v1/duck_types.go
@@ -25,7 +25,7 @@ import (
 )
 
 // ServiceConditionReady is set when the service is configured and has available backends ready to receive traffic.
-const ServiceConditionReady = apis.ConditionReady
+const ServiceConditionReady = "Ready"
 
 // +kubebuilder:object:root=true
 
diff --git a/pkg/controller/integration/monitor_knative.go b/pkg/controller/integration/monitor_knative.go
index d516801c8..949969f5b 100644
--- a/pkg/controller/integration/monitor_knative.go
+++ b/pkg/controller/integration/monitor_knative.go
@@ -21,6 +21,7 @@ import (
 	"context"
 
 	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"
 	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
@@ -36,8 +37,8 @@ var _ controller = &knativeServiceController{}
 
 func (c *knativeServiceController) checkReadyCondition(ctx context.Context) (bool, error) {
 	// Check the KnativeService conditions
-	if ready := kubernetes.GetKnativeServiceCondition(*c.obj, servingv1.ServiceConditionReady); ready.IsFalse() &&
-		ready.GetReason() == "RevisionFailed" {
+	if ready := kubernetes.GetKnativeServiceCondition(*c.obj, servingv1.ServiceConditionReady); ready != nil &&
+		ready.Status == metav1.ConditionFalse && ready.Reason == "RevisionFailed" {
 		c.integration.Status.Phase = v1.IntegrationPhaseError
 		c.integration.SetReadyConditionError(ready.Message)
 
@@ -49,14 +50,19 @@ func (c *knativeServiceController) checkReadyCondition(ctx context.Context) (boo
 
 func (c *knativeServiceController) updateReadyCondition(readyPods int32) bool {
 	ready := kubernetes.GetKnativeServiceCondition(*c.obj, servingv1.ServiceConditionReady)
-	if ready.IsTrue() {
+	if ready == nil {
+		c.integration.SetReadyCondition(corev1.ConditionFalse, "", "")
+
+		return false
+	}
+	if ready.Status == metav1.ConditionTrue {
 		c.integration.SetReadyCondition(corev1.ConditionTrue,
 			v1.IntegrationConditionKnativeServiceReadyReason, "")
 
 		return true
 	}
 	c.integration.SetReadyCondition(corev1.ConditionFalse,
-		ready.GetReason(), ready.GetMessage())
+		ready.Reason, ready.Message)
 
 	return false
 }
diff --git a/pkg/controller/integration/monitor_knative_test.go b/pkg/controller/integration/monitor_knative_test.go
index 3604d5498..7e87047a9 100644
--- a/pkg/controller/integration/monitor_knative_test.go
+++ b/pkg/controller/integration/monitor_knative_test.go
@@ -30,11 +30,10 @@ import (
 	"k8s.io/utils/ptr"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
 	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
-func newKnativeServiceController(ready *apis.Condition) *knativeServiceController {
+func newKnativeServiceController(ready *metav1.Condition) *knativeServiceController {
 	svc := &servingv1.Service{
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: "ns",
@@ -42,7 +41,7 @@ func newKnativeServiceController(ready *apis.Condition) *knativeServiceControlle
 		},
 	}
 	if ready != nil {
-		svc.Status.Conditions = apis.Conditions{*ready}
+		svc.Status.Conditions = []metav1.Condition{*ready}
 	}
 
 	return &knativeServiceController{
@@ -60,9 +59,9 @@ func newKnativeServiceController(ready *apis.Condition) *knativeServiceControlle
 }
 
 func TestKnativeServiceControllerReady(t *testing.T) {
-	c := newKnativeServiceController(&apis.Condition{
+	c := newKnativeServiceController(&metav1.Condition{
 		Type:   servingv1.ServiceConditionReady,
-		Status: corev1.ConditionTrue,
+		Status: metav1.ConditionTrue,
 	})
 
 	done, err := c.checkReadyCondition(context.TODO())
@@ -78,9 +77,9 @@ func TestKnativeServiceControllerReady(t *testing.T) {
 }
 
 func TestKnativeServiceControllerRevisionFailed(t *testing.T) {
-	c := newKnativeServiceController(&apis.Condition{
+	c := newKnativeServiceController(&metav1.Condition{
 		Type:    servingv1.ServiceConditionReady,
-		Status:  corev1.ConditionFalse,
+		Status:  metav1.ConditionFalse,
 		Reason:  "RevisionFailed",
 		Message: "revision failed",
 	})
@@ -96,9 +95,9 @@ func TestKnativeServiceControllerRevisionFailed(t *testing.T) {
 }
 
 func TestKnativeServiceControllerNotReady(t *testing.T) {
-	c := newKnativeServiceController(&apis.Condition{
+	c := newKnativeServiceController(&metav1.Condition{
 		Type:    servingv1.ServiceConditionReady,
-		Status:  corev1.ConditionFalse,
+		Status:  metav1.ConditionFalse,
 		Reason:  "Deploying",
 		Message: "still deploying",
 	})
@@ -116,6 +115,27 @@ func TestKnativeServiceControllerNotReady(t *testing.T) {
 	assert.Equal(t, "still deploying", cond.Message)
 }
 
+func TestKnativeServiceControllerUnknown(t *testing.T) {
+	c := newKnativeServiceController(&metav1.Condition{
+		Type:    servingv1.ServiceConditionReady,
+		Status:  metav1.ConditionUnknown,
+		Reason:  "RevisionMissing",
+		Message: "waiting for the revision",
+	})
+
+	done, err := c.checkReadyCondition(context.TODO())
+	require.NoError(t, err)
+	assert.False(t, done)
+	assert.Equal(t, v1.IntegrationPhaseRunning, c.integration.Status.Phase)
+
+	assert.False(t, c.updateReadyCondition(0))
+	cond := c.integration.Status.GetCondition(v1.IntegrationConditionReady)
+	require.NotNil(t, cond)
+	assert.Equal(t, corev1.ConditionFalse, cond.Status)
+	assert.Equal(t, "RevisionMissing", cond.Reason)
+	assert.Equal(t, "waiting for the revision", cond.Message)
+}
+
 func TestKnativeServiceControllerMissingCondition(t *testing.T) {
 	c := newKnativeServiceController(nil)
 
diff --git a/pkg/controller/integration/predicate_test.go b/pkg/controller/integration/predicate_test.go
index 47384ea6e..70f59958f 100644
--- a/pkg/controller/integration/predicate_test.go
+++ b/pkg/controller/integration/predicate_test.go
@@ -23,7 +23,6 @@ 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"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 
@@ -31,7 +30,7 @@ import (
 	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
-func newKnativeServiceWithStatus(t *testing.T, url string, ready corev1.ConditionStatus) *servingv1.Service {
+func newKnativeServiceWithStatus(t *testing.T, url string, ready metav1.ConditionStatus) *servingv1.Service {
 	t.Helper()
 	parsed, err := apis.ParseURL(url)
 	require.NoError(t, err)
@@ -43,7 +42,7 @@ func newKnativeServiceWithStatus(t *testing.T, url string, ready corev1.Conditio
 		},
 		Status: servingv1.ServiceStatus{
 			Status: apis.Status{
-				Conditions: apis.Conditions{
+				Conditions: []metav1.Condition{
 					{Type: servingv1.ServiceConditionReady, Status: ready},
 				},
 			},
@@ -60,16 +59,16 @@ func TestStatusChangedPredicateKnativeService(t *testing.T) {
 
 	// A URL with user information makes url.URL carry an unexported *url.Userinfo:
 	// the semantic equality can only compare it through the URL equality function.
-	old := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local", corev1.ConditionTrue)
+	old := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local", metav1.ConditionTrue)
 
 	same := old.DeepCopy()
 	same.Generation++
 	assert.False(t, p.Update(event.UpdateEvent{ObjectOld: old, ObjectNew: same}))
 
-	changedURL := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local/other", corev1.ConditionTrue)
+	changedURL := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local/other", metav1.ConditionTrue)
 	assert.True(t, p.Update(event.UpdateEvent{ObjectOld: old, ObjectNew: changedURL}))
 
-	notReady := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local", corev1.ConditionFalse)
+	notReady := newKnativeServiceWithStatus(t, "http://user:pass@my-ksvc.ns.svc.cluster.local", metav1.ConditionFalse)
 	assert.True(t, p.Update(event.UpdateEvent{ObjectOld: old, ObjectNew: notReady}))
 
 	assert.False(t, p.Update(event.UpdateEvent{ObjectOld: nil, ObjectNew: same}))
diff --git a/pkg/trait/knative_test.go b/pkg/trait/knative_test.go
index 33b6d0004..7526b5a09 100644
--- a/pkg/trait/knative_test.go
+++ b/pkg/trait/knative_test.go
@@ -28,6 +28,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/utils/ptr"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
@@ -1307,14 +1308,6 @@ func NewFakeEnvironmentForKitWithoutCatalog(t *testing.T) Environment {
 }
 
 func newFakeClient(namespace string) (client.Client, error) {
-	channelSourceURL, err := apis.ParseURL("http://channel-source-1.host/")
-	if err != nil {
-		return nil, err
-	}
-	channelSinkURL, err := apis.ParseURL("http://channel-sink-1.host/")
-	if err != nil {
-		return nil, err
-	}
 	sink1URL, err := apis.ParseURL("http://endpoint-sink-1.host/")
 	if err != nil {
 		return nil, err
@@ -1323,42 +1316,35 @@ func newFakeClient(namespace string) (client.Client, error) {
 	if err != nil {
 		return nil, err
 	}
-	brokerURL, err := apis.ParseURL("http://broker-default.host/")
-	if err != nil {
-		return nil, err
-	}
 
+	// The Channel and Broker resources are only read as unstructured objects
 	return internal.NewFakeClient(
-		&messaging.Channel{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Channel",
-				APIVersion: messaging.SchemeGroupVersion.String(),
-			},
-			ObjectMeta: metav1.ObjectMeta{
-				Namespace: namespace,
-				Name:      "channel-source-1",
-			},
-			Status: messaging.ChannelStatus{
-				AddressStatus: apis.AddressStatus{
-					Address: &apis.Addressable{
-						URL: channelSourceURL,
+		&unstructured.Unstructured{
+			Object: map[string]any{
+				"apiVersion": messaging.SchemeGroupVersion.String(),
+				"kind":       "Channel",
+				"metadata": map[string]any{
+					"namespace": namespace,
+					"name":      "channel-source-1",
+				},
+				"status": map[string]any{
+					"address": map[string]any{
+						"url": "http://channel-source-1.host/",
 					},
 				},
 			},
 		},
-		&messaging.Channel{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Channel",
-				APIVersion: messaging.SchemeGroupVersion.String(),
-			},
-			ObjectMeta: metav1.ObjectMeta{
-				Namespace: namespace,
-				Name:      "channel-sink-1",
-			},
-			Status: messaging.ChannelStatus{
-				AddressStatus: apis.AddressStatus{
-					Address: &apis.Addressable{
-						URL: channelSinkURL,
+		&unstructured.Unstructured{
+			Object: map[string]any{
+				"apiVersion": messaging.SchemeGroupVersion.String(),
+				"kind":       "Channel",
+				"metadata": map[string]any{
+					"namespace": namespace,
+					"name":      "channel-sink-1",
+				},
+				"status": map[string]any{
+					"address": map[string]any{
+						"url": "http://channel-sink-1.host/",
 					},
 				},
 			},
@@ -1397,19 +1383,17 @@ func newFakeClient(namespace string) (client.Client, error) {
 				},
 			},
 		},
-		&eventing.Broker{
-			TypeMeta: metav1.TypeMeta{
-				APIVersion: eventing.SchemeGroupVersion.String(),
-				Kind:       "Broker",
-			},
-			ObjectMeta: metav1.ObjectMeta{
-				Namespace: namespace,
-				Name:      "default",
-			},
-			Status: eventing.BrokerStatus{
-				AddressStatus: apis.AddressStatus{
-					Address: &apis.Addressable{
-						URL: brokerURL,
+		&unstructured.Unstructured{
+			Object: map[string]any{
+				"apiVersion": eventing.SchemeGroupVersion.String(),
+				"kind":       "Broker",
+				"metadata": map[string]any{
+					"namespace": namespace,
+					"name":      "default",
+				},
+				"status": map[string]any{
+					"address": map[string]any{
+						"url": "http://broker-default.host/",
 					},
 				},
 			},
diff --git a/pkg/util/knative/knative_test.go b/pkg/util/knative/knative_test.go
index c6dee9761..18db2a14a 100644
--- a/pkg/util/knative/knative_test.go
+++ b/pkg/util/knative/knative_test.go
@@ -28,8 +28,8 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 
-	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
 	eventing "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 )
@@ -125,34 +125,31 @@ func TestCreateKnativeServiceTrigger(t *testing.T) {
 }
 
 func TestGetSinkURL(t *testing.T) {
-	brokerURL, err := apis.ParseURL("http://broker-ingress.knative-eventing.svc.cluster.local/my-ns/default")
-	require.NoError(t, err)
+	// The Broker resources are only read as unstructured objects
 	client, err := internal.NewFakeClient(
-		&eventing.Broker{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Broker",
-				APIVersion: eventing.SchemeGroupVersion.String(),
-			},
-			ObjectMeta: metav1.ObjectMeta{
-				Namespace: "my-ns",
-				Name:      "default",
-			},
-			Status: eventing.BrokerStatus{
-				AddressStatus: apis.AddressStatus{
-					Address: &apis.Addressable{
-						URL: brokerURL,
+		&unstructured.Unstructured{
+			Object: map[string]any{
+				"apiVersion": eventing.SchemeGroupVersion.String(),
+				"kind":       "Broker",
+				"metadata": map[string]any{
+					"namespace": "my-ns",
+					"name":      "default",
+				},
+				"status": map[string]any{
+					"address": map[string]any{
+						"url": "http://broker-ingress.knative-eventing.svc.cluster.local/my-ns/default",
 					},
 				},
 			},
 		},
-		&eventing.Broker{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Broker",
-				APIVersion: eventing.SchemeGroupVersion.String(),
-			},
-			ObjectMeta: metav1.ObjectMeta{
-				Namespace: "my-ns",
-				Name:      "not-ready",
+		&unstructured.Unstructured{
+			Object: map[string]any{
+				"apiVersion": eventing.SchemeGroupVersion.String(),
+				"kind":       "Broker",
+				"metadata": map[string]any{
+					"namespace": "my-ns",
+					"name":      "not-ready",
+				},
 			},
 		},
 		&corev1.Service{
diff --git a/pkg/util/kubernetes/conditions.go b/pkg/util/kubernetes/conditions.go
index 9d8a7ae5e..f587d63c4 100644
--- a/pkg/util/kubernetes/conditions.go
+++ b/pkg/util/kubernetes/conditions.go
@@ -21,8 +21,8 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-	knative "github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
 	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
@@ -48,7 +48,7 @@ func GetDeploymentCondition(deployment appsv1.Deployment, conditionType appsv1.D
 	return nil
 }
 
-func GetKnativeServiceCondition(service servingv1.Service, conditionType knative.ConditionType) *knative.Condition {
+func GetKnativeServiceCondition(service servingv1.Service, conditionType string) *metav1.Condition {
 	for i := range service.Status.Conditions {
 		condition := service.Status.Conditions[i]
 		if condition.Type == conditionType {


(camel-k) 01/03: feat(knative): replace the Knative API dependencies with duck types

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d00a39037b7b428196df1f94901ea910f9d50fc6
Author: Michal Vavřík <de...@michalvavrik.net>
AuthorDate: Thu Sep 24 19:38:40 2026 +0200

    feat(knative): replace the Knative API dependencies with duck types
    
    Signed-off-by: Michal Vavřík <de...@michalvavrik.net>
---
 docs/antora.yml                                    |   2 +-
 docs/modules/ROOT/pages/concepts/dependencies.adoc |   2 +-
 e2e/support/test_support.go                        |   3 +-
 e2e/support/util/dump.go                           |   2 +-
 go.mod                                             |  22 --
 go.sum                                             | 135 -----------
 pkg/apis/addtoscheme_knative_eventing.go           |  10 +-
 pkg/apis/addtoscheme_knative_serving.go            |   2 +-
 pkg/apis/duck/knative/apis/condition_types.go      |  95 ++++++++
 .../knative/apis/condition_types_test.go}          |  25 +-
 .../knative/apis/doc.go}                           |  12 +-
 pkg/apis/duck/knative/apis/duck_types.go           | 105 +++++++++
 pkg/apis/duck/knative/apis/url.go                  |  84 +++++++
 pkg/apis/duck/knative/apis/url_test.go             |  66 ++++++
 .../knative/apis/volatile_time.go}                 |  33 ++-
 pkg/apis/duck/knative/apis/volatile_time_test.go   |  56 +++++
 .../duck/knative/apis/zz_generated.deepcopy.go     | 238 +++++++++++++++++++
 .../knative/eventing/v1/doc.go}                    |  14 +-
 pkg/apis/duck/knative/eventing/v1/duck_types.go    | 111 +++++++++
 pkg/apis/duck/knative/eventing/v1/register.go      |  53 +++++
 .../knative/eventing/v1/zz_generated.deepcopy.go   | 245 +++++++++++++++++++
 .../knative/messaging/v1/doc.go}                   |  14 +-
 pkg/apis/duck/knative/messaging/v1/duck_types.go   | 120 ++++++++++
 pkg/apis/duck/knative/messaging/v1/register.go     |  53 +++++
 .../knative/messaging/v1/zz_generated.deepcopy.go  | 249 ++++++++++++++++++++
 .../knative/serving/v1/doc.go}                     |  14 +-
 pkg/apis/duck/knative/serving/v1/duck_types.go     | 156 ++++++++++++
 pkg/apis/duck/knative/serving/v1/register.go       |  51 ++++
 .../knative/serving/v1/zz_generated.deepcopy.go    | 262 +++++++++++++++++++++
 .../knative/sources/v1/doc.go}                     |  14 +-
 pkg/apis/duck/knative/sources/v1/duck_types.go     |  60 +++++
 pkg/apis/duck/knative/sources/v1/register.go       |  51 ++++
 .../knative/sources/v1/zz_generated.deepcopy.go    | 101 ++++++++
 pkg/cmd/operator/operator.go                       |   3 +-
 .../integration/integration_controller.go          |   3 +-
 pkg/controller/integration/monitor.go              |   3 +-
 pkg/controller/integration/monitor_knative.go      |   3 +-
 pkg/controller/integration/monitor_knative_test.go | 129 ++++++++++
 pkg/trait/container.go                             |   3 +-
 pkg/trait/container_test.go                        |   2 +-
 pkg/trait/default_container_annotation_test.go     |   3 +-
 pkg/trait/gc_test.go                               |   4 +-
 pkg/trait/init_containers.go                       |   3 +-
 pkg/trait/istio.go                                 |   3 +-
 pkg/trait/istio_test.go                            |   3 +-
 pkg/trait/jvm_test.go                              |   2 +-
 pkg/trait/knative.go                               |   5 +-
 pkg/trait/knative_service.go                       |   3 +-
 pkg/trait/knative_service_test.go                  |  73 +++++-
 pkg/trait/knative_test.go                          |  39 ++-
 pkg/trait/mount.go                                 |   3 +-
 pkg/trait/owner.go                                 |   3 +-
 pkg/trait/pod.go                                   |   3 +-
 pkg/trait/security_context_test.go                 |   2 +-
 pkg/trait/trait_support_test.go                    |   3 +-
 pkg/trait/trait_types.go                           |   2 +-
 pkg/util/bindings/catalog_test.go                  |   2 +-
 pkg/util/knative/knative.go                        |  53 ++---
 pkg/util/knative/knative_test.go                   | 187 +++++++++++++++
 pkg/util/kubernetes/collection.go                  |   7 +-
 pkg/util/kubernetes/conditions.go                  |   4 +-
 pkg/util/kubernetes/replace.go                     |   3 +-
 pkg/util/reference/reference.go                    |   6 +-
 script/update_docs.sh                              |  10 +-
 64 files changed, 2693 insertions(+), 339 deletions(-)

diff --git a/docs/antora.yml b/docs/antora.yml
index e9d84d98e..3f649ebea 100644
--- a/docs/antora.yml
+++ b/docs/antora.yml
@@ -38,6 +38,6 @@ asciidoc:
     kustomize-version: 5.7.1
     kubernetes-api-version: 0.37.0
     operator-fwk-api-version: 0.45.0
-    knative-api-version: 0.50.0
+    knative-api-version: 1.20.1
     service-binding-op-version: ""
     prometheus-op-version: 0.94.1
diff --git a/docs/modules/ROOT/pages/concepts/dependencies.adoc b/docs/modules/ROOT/pages/concepts/dependencies.adoc
index e263b8620..0cf9b06f6 100644
--- a/docs/modules/ROOT/pages/concepts/dependencies.adoc
+++ b/docs/modules/ROOT/pages/concepts/dependencies.adoc
@@ -28,7 +28,7 @@ Below you can find a list of the main dependencies and APIs used by Camel K and
 |Camel K Version
 |Kubernetes API
 |Operator Framework API
-|Knative API
+|Knative
 |Prometheus Operator
 |Kustomize version
 |===
diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go
index 8543e77bb..b0adbccc3 100644
--- a/e2e/support/test_support.go
+++ b/e2e/support/test_support.go
@@ -60,11 +60,10 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
-
 	"github.com/apache/camel-k/v2/e2e/support/util"
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	kedav1alpha1 "github.com/apache/camel-k/v2/pkg/apis/duck/keda/v1alpha1"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	"github.com/apache/camel-k/v2/pkg/cmd"
 	"github.com/apache/camel-k/v2/pkg/platform"
diff --git a/e2e/support/util/dump.go b/e2e/support/util/dump.go
index df221ce3e..c77b23bb0 100644
--- a/e2e/support/util/dump.go
+++ b/e2e/support/util/dump.go
@@ -32,8 +32,8 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	olm "github.com/operator-framework/api/pkg/operators/v1alpha1"
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
 
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	"github.com/apache/camel-k/v2/pkg/client/camel/clientset/versioned"
 	"github.com/apache/camel-k/v2/pkg/util/knative"
diff --git a/go.mod b/go.mod
index 2a08a698c..83e6a3593 100644
--- a/go.mod
+++ b/go.mod
@@ -46,9 +46,6 @@ require (
 	k8s.io/gengo v0.0.0-20251215205346-5ee0d033ba5b
 	k8s.io/klog/v2 v2.140.0
 	k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3
-	knative.dev/eventing v0.50.0
-	knative.dev/pkg v0.0.0-20260727151759-521cb33b33dd
-	knative.dev/serving v0.50.0
 	sigs.k8s.io/controller-runtime v0.25.1
 	sigs.k8s.io/gateway-api v1.6.2
 	sigs.k8s.io/structured-merge-diff/v6 v6.4.2
@@ -59,25 +56,19 @@ require (
 	github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
 	github.com/Microsoft/go-winio v0.6.2 // indirect
 	github.com/ProtonMail/go-crypto v1.1.6 // indirect
-	github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/blang/semver/v4 v4.0.0 // indirect
-	github.com/blendle/zapdriver v1.3.1 // indirect
 	github.com/cespare/xxhash/v2 v2.3.0 // indirect
-	github.com/cloudevents/sdk-go/sql/v2 v2.15.2 // indirect
-	github.com/cloudevents/sdk-go/v2 v2.16.1 // indirect
 	github.com/cloudflare/circl v1.6.3 // indirect
 	github.com/cyphar/filepath-securejoin v0.6.1 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/emicklei/go-restful/v3 v3.13.0 // indirect
 	github.com/emirpasic/gods v1.18.1 // indirect
 	github.com/evanphx/json-patch/v5 v5.9.11 // indirect
-	github.com/felixge/httpsnoop v1.0.4 // indirect
 	github.com/fsnotify/fsnotify v1.10.1 // indirect
 	github.com/fxamacker/cbor/v2 v2.9.3 // indirect
 	github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
 	github.com/go-git/go-billy/v5 v5.9.0 // indirect
-	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-logr/zapr v1.3.0 // indirect
 	github.com/go-openapi/jsonpointer v1.0.0 // indirect
 	github.com/go-openapi/jsonreference v1.0.0 // indirect
@@ -97,14 +88,11 @@ require (
 	github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
 	github.com/google/gnostic-models v0.7.1 // indirect
 	github.com/google/go-cmp v0.7.0 // indirect
-	github.com/google/go-containerregistry v0.20.3 // indirect
 	github.com/google/go-querystring v1.1.0 // indirect
 	github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
-	github.com/hashicorp/golang-lru v1.0.2 // indirect
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 	github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/kelseyhightower/envconfig v1.4.0 // indirect
 	github.com/kevinburke/ssh_config v1.2.0 // indirect
 	github.com/klauspost/cpuid/v2 v2.3.0 // indirect
 	github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
@@ -113,14 +101,10 @@ require (
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
-	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/pelletier/go-toml/v2 v2.2.4 // indirect
 	github.com/pjbgf/sha1cd v0.6.0 // indirect
 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 	github.com/prometheus/procfs v0.21.1 // indirect
-	github.com/rickb777/date v1.13.0 // indirect
-	github.com/rickb777/plural v1.2.1 // indirect
-	github.com/robfig/cron/v3 v3.0.1 // indirect
 	github.com/sagikazarmark/locafero v0.11.0 // indirect
 	github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
 	github.com/skeema/knownhosts v1.3.1 // indirect
@@ -130,11 +114,6 @@ require (
 	github.com/subosito/gotenv v1.6.0 // indirect
 	github.com/x448/float16 v0.8.4 // indirect
 	github.com/xanzy/ssh-agent v0.3.3 // indirect
-	go.opentelemetry.io/auto/sdk v1.2.1 // indirect
-	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect
-	go.opentelemetry.io/otel v1.44.0 // indirect
-	go.opentelemetry.io/otel/metric v1.44.0 // indirect
-	go.opentelemetry.io/otel/trace v1.44.0 // indirect
 	go.yaml.in/yaml/v2 v2.4.4 // indirect
 	go.yaml.in/yaml/v3 v3.0.5 // indirect
 	golang.org/x/crypto v0.57.0 // indirect
@@ -150,7 +129,6 @@ require (
 	k8s.io/apiextensions-apiserver v0.37.0 // indirect
 	k8s.io/kube-openapi v0.0.0-20260821135717-be32def86098 // indirect
 	k8s.io/streaming v0.37.0 // indirect
-	knative.dev/networking v0.0.0-20260727162500-c7a7b772cac9 // indirect
 	sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
 	sigs.k8s.io/randfill v1.0.0 // indirect
 )
diff --git a/go.sum b/go.sum
index 7a899b355..b456278c7 100644
--- a/go.sum
+++ b/go.sum
@@ -13,30 +13,16 @@ github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNx
 github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
-github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves=
-github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
 github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
-github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE=
-github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc=
-github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
-github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
-github.com/cert-manager/cert-manager v1.16.3 h1:seEF5eidFaeduaCuM85PFEuzH/1X/HOV5Y8zDQrHgpc=
-github.com/cert-manager/cert-manager v1.16.3/go.mod h1:6JQ/GAZ6dH+erqS1BbaqorPy8idJzCtWFUmJQBTjo6Q=
 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cloudevents/sdk-go/sql/v2 v2.15.2 h1:TNaTeWIbDaci89xgXbmmNVGccawQOvEfWYLWrr7Fk/k=
-github.com/cloudevents/sdk-go/sql/v2 v2.15.2/go.mod h1:us+PSk8OXdk8pDbRfvxy5w8ub5goKE7UP9PjKDY7TPw=
-github.com/cloudevents/sdk-go/v2 v2.16.1 h1:G91iUdqvl88BZ1GYYr9vScTj5zzXSyEuqbfE63gbu9Q=
-github.com/cloudevents/sdk-go/v2 v2.16.1/go.mod h1:v/kVOaWjNfbvc6tkhhlkhvLapj8Aa8kvXiH5GiOHCKI=
 github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8=
 github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4=
-github.com/coreos/go-oidc/v3 v3.9.0 h1:0J/ogVOd4y8P0f0xUh8l9t07xRP/d8tccvjHl2dcsSo=
-github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4=
 github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
 github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
 github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
@@ -56,11 +42,8 @@ github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb
 github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
 github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
-github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
-github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho=
 github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
 github.com/fxamacker/cbor/v2 v2.9.3 h1:oQBnFATpNdY8gJHTndDDv5Xl4QqNaz51G5LLEPhng3Q=
@@ -77,14 +60,9 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj
 github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
 github.com/go-git/go-git/v5 v5.19.2 h1:wkfn7vOlUBu8ivAWKBWisTiwJK4jYHzTF8Ndv1LyGqY=
 github.com/go-git/go-git/v5 v5.19.2/go.mod h1:QqCBE1EFN5ddFmrliLQ3/ntRCUjZU3EJuwuB/jWEHjk=
-github.com/go-jose/go-jose/v3 v3.0.5 h1:BLLJWbC4nMZOfuPVxoZIxeYsn6Nl2r1fITaJ78UQlVQ=
-github.com/go-jose/go-jose/v3 v3.0.5/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
-github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8=
 github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
-github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
 github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
 github.com/go-openapi/jsonpointer v1.0.0 h1:kR9tHqY0CtZaOPVFm622dPVNhrvYpwr4uCxgL3h1H8s=
@@ -129,23 +107,12 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
 github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c=
 github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
-github.com/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM7kqkbXTpyiovI=
-github.com/google/go-containerregistry v0.20.3/go.mod h1:w00pIgBRDVUDFM6bq+Qx8lwNWK+cxgCuX1vd3PIBDNI=
 github.com/google/go-github/v72 v72.0.0 h1:FcIO37BLoVPBO9igQQ6tStsv2asG4IPcYFi655PPvBM=
 github.com/google/go-github/v72 v72.0.0/go.mod h1:WWtw8GMRiL62mvIquf1kO3onRHeWWKmK01qdCY8c5fg=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
@@ -160,15 +127,6 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
 github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs=
-github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
-github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
-github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU=
-github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
-github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
-github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
@@ -177,8 +135,6 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E
 github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
-github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
 github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -203,7 +159,6 @@ github.com/magiconair/properties v1.18.12 h1:sT9zQpvTB3B4gzrX0tmZNTEaGyg8Zw55MFY
 github.com/magiconair/properties v1.18.12/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
 github.com/mattn/go-shellwords v1.0.16 h1:RRxAaRzU1YbzOSCj9NJqg2/VIbSWv0dnPoD3EwE8kxI=
 github.com/mattn/go-shellwords v1.0.16/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
-github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
 github.com/moby/spdystream v0.5.1 h1:9sNYeYZUcci9R6/w7KDaFWEWeV4LStVG78Mpyq/Zm/Y=
 github.com/moby/spdystream v0.5.1/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
 github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
@@ -216,18 +171,10 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd
 github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ=
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/ginkgo/v2 v2.27.4 h1:fcEcQW/A++6aZAZQNUmNjvA9PSOzefMJBerHJ4t8v8Y=
 github.com/onsi/ginkgo/v2 v2.27.4/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo=
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.44.0 h1:eAiGl3Pw5jz5GQdDff0BcxYpAX1JxW8xD7mFUuwNfZQ=
 github.com/onsi/gomega v1.44.0/go.mod h1:e/C2HwaZ1DhvjzXXuFhcR7hY7Sh9pl7MmoWKEjzwcdA=
-github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
-github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/openshift/api v0.0.0-20250820105013-6282350d0c39 h1:X42iTyo3AAHS36BkiBkU8FvxfK8NEDmnBi3QrnaCIlA=
 github.com/openshift/api v0.0.0-20250820105013-6282350d0c39/go.mod h1:SPLf21TYPipzCO67BURkCfK6dcIIxx0oNRVWaOyRcXM=
 github.com/operator-framework/api v0.45.0 h1:hkROwtsLH3oszp4IW+WsXEFSDgveSahHI7DKStOtrUI=
@@ -236,7 +183,6 @@ github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0
 github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
 github.com/pjbgf/sha1cd v0.6.0 h1:3WJ8Wz8gvDz29quX1OcEmkAlUg9diU4GxJHqs0/XiwU=
 github.com/pjbgf/sha1cd v0.6.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -252,16 +198,8 @@ github.com/prometheus/client_model v0.6.3 h1:O0jaTVAYNxTHYInEPFJt5I3+sN8zqBtVMPT
 github.com/prometheus/client_model v0.6.3/go.mod h1:gpN5P9S7Rr6Yr92PiQ+Ixvhf6JZEkF1dnxsYL2aPBEM=
 github.com/prometheus/common v0.72.0 h1:tAYsE+sPJxIncDAobm4H5aQjmox9ZxEIIqPbiffa8G4=
 github.com/prometheus/common v0.72.0/go.mod h1:77NWqAQ2tXT7BIK40qjJdw5Acrsrg1TlHAnsQi3i6mk=
-github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos=
-github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM=
 github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI=
 github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY=
-github.com/rickb777/date v1.13.0 h1:+8AmwLuY1d/rldzdqvqTEg7107bZ8clW37x4nsdG3Hs=
-github.com/rickb777/date v1.13.0/go.mod h1:GZf3LoGnxPWjX+/1TXOuzHefZFDovTyNLHDMd3qH70k=
-github.com/rickb777/plural v1.2.1 h1:UitRAgR70+yHFt26Tmj/F9dU9aV6UfjGXSbO1DcC9/U=
-github.com/rickb777/plural v1.2.1/go.mod h1:j058+3M5QQFgcZZ2oKIOekcygoZUL8gKW5yRO14BuAw=
-github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
-github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
 github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
 github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
@@ -290,7 +228,6 @@ github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
 github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
 github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
-github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:CKI4AZ4XmGV240rTHfO0hfE83S6/a3/Q1siZJ/vXf7A=
 github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs=
 github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -308,55 +245,18 @@ github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWD
 github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg=
 github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
-github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
-github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
 github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
-go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI=
-go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU=
-go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.44.0 h1:SUplec5dp06reu1zaXmOXdvqH398taqrDXqUl99jxSc=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.44.0/go.mod h1:ho2g4N+ane+swq5I/VBkKWnRDY4kUINH3FuqyZqX/Ug=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.44.0 h1:RuynHbfU8JUEw7DyONgkVYg2SVtsoF28y0LGIr69jgA=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.44.0/go.mod h1:qZF+/lBs71APw8mlnEZcqZHMzqrYrsFiJOv83lX1OGo=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0 h1:lgh3PiVrRUWMLOVSkQicxzZll5NjF1r+AtsX1XRIHw0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0/go.mod h1:5Cnhth3m/AgOeTgE3ex12pPmiu/gGtZit03kSzx9X7s=
-go.opentelemetry.io/otel/exporters/prometheus v0.66.0 h1:vkrK8PAznv2NKt2r+kdu252ccGzkEqLc2aSXbQIALYQ=
-go.opentelemetry.io/otel/exporters/prometheus v0.66.0/go.mod h1:V/UB6D3vMF/UBOL5igAsAYnk1nG/bzYYTzvsB16cy7o=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.44.0 h1:bl2S7Ubua0Nms+D/gAmznQTd4dxxMA93aKbcpKqiTCs=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.44.0/go.mod h1:L0hRV50XdVIODHUfWEqGRCXQvj2rV82STVo12FMFBU0=
-go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc=
-go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo=
-go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58=
-go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0=
-go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI=
-go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA=
-go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk=
-go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE=
-go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g=
-go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
-go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
 go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
 go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
 go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo=
 go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q=
 go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
@@ -374,30 +274,23 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c=
 golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.59.0 h1:5zfYln+w5XCxwrnMMJPufRgNoXEaGxl0wo5GqPXyues=
 golang.org/x/net v0.59.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg=
 golang.org/x/oauth2 v0.37.0 h1:JUlcxA8oAtauLfiH8FX2/FkAWHAdi0QtGCGc+hofE98=
 golang.org/x/oauth2 v0.37.0/go.mod h1:IxwZNxUULJmpBFf9K/9NTMSIfZZuvuTy1gGxhigP/58=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk=
 golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -411,7 +304,6 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
 golang.org/x/term v0.46.0 h1:3+OXuTbaKDgwk8jTi3aSLHRlmWqHEUDUtxnbFigO4YE=
 golang.org/x/term v0.46.0/go.mod h1:+K02xbkittuwc0Am4abfA3Fc+XRGXkvBXNO88NCXPoc=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI=
@@ -421,7 +313,6 @@ golang.org/x/time v0.16.0/go.mod h1:rVKOqvZeKvrDKTQiAHJ7wmwP0RzleSphoEA9RcdLA0s=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512001501-aaeff5de670a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI=
@@ -432,18 +323,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0=
 gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8=
-google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
-google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE=
-google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc=
 google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -452,16 +331,12 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo=
 gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
 gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -472,8 +347,6 @@ k8s.io/apiextensions-apiserver v0.37.0 h1:zRMQ3+/LIE5oZ0tVvXwYHC+dIkSP5cjNWju7AZ
 k8s.io/apiextensions-apiserver v0.37.0/go.mod h1:HU0PfSBwchHL5iDau6jjt9zU6ryWkDDlaVUiq91NK80=
 k8s.io/apimachinery v0.37.0 h1:Np2AbDtf8x6RDHiD8T9LbKJ9gaegeVNa8yNm5FuGKm0=
 k8s.io/apimachinery v0.37.0/go.mod h1:RN3nhprFSCxOi5Selxd7oMTXOe/c+ZbcE7Im+TS2zkE=
-k8s.io/apiserver v0.37.0 h1:TXg7OxsOWrAH8J4Zi/gBAZuMw1Dfdd+6cca2h4qjRqo=
-k8s.io/apiserver v0.37.0/go.mod h1:OddHDF4gy9qyIb8o/3+qaeP6S0vEObWLgOygVqXksv0=
 k8s.io/cli-runtime v0.37.0 h1:U3XakUeirBQJMz5688r04z74SIHSE7V5SIZ6Ho5JyBM=
 k8s.io/cli-runtime v0.37.0/go.mod h1:qiQMFkKwFFuPH6zy953On+nc3qfpEHAIDrJmAuRz5Vg=
 k8s.io/client-go v0.37.0 h1:nsN31fy8wBySuZ+QRnKmrjRSQLOG2rvoGN0tKd12zhQ=
@@ -489,14 +362,6 @@ k8s.io/streaming v0.37.0 h1:iPBUZLZiKt5bV+lxJurASMOV07VuBhNpiwJt2//AWrM=
 k8s.io/streaming v0.37.0/go.mod h1:APlJR26ZWRcVy5bIEj0QRrKUXROtBHPcxl2NT7EAzPU=
 k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE=
 k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM=
-knative.dev/eventing v0.50.0 h1:4GSn7yyMLgpGUqU0vZjcyFKK0vSi3TtZXPVzb7HW7Ds=
-knative.dev/eventing v0.50.0/go.mod h1:HC1K7A1oa/sMd6X6RHO547NgvL2gtKlmNK+HYnELz6g=
-knative.dev/networking v0.0.0-20260727162500-c7a7b772cac9 h1:DX4tHb6E2L6sqJbbbSoK7ury7jobfC95Tx3To+tQQF0=
-knative.dev/networking v0.0.0-20260727162500-c7a7b772cac9/go.mod h1:B1jEsChm8uZvhXwuc7ySZEKG8B6GK+FrQeGx+cL7GGc=
-knative.dev/pkg v0.0.0-20260727151759-521cb33b33dd h1:Tpo7m+KdcccVGygF/fr0af9Qv4CG4DTAE756fEDURIo=
-knative.dev/pkg v0.0.0-20260727151759-521cb33b33dd/go.mod h1:H+Z0Cy8MsihAolnB4luN7/7RV96ed8VzLvf4jzE8OP4=
-knative.dev/serving v0.50.0 h1:9XUQq2yqUPN1YZUuGH6nF8IMvuumNvGXzCrSTYu44bA=
-knative.dev/serving v0.50.0/go.mod h1:MP+yKsx/gLczU+agah1HgRrpU6KT0SV96a7bD+v5PKo=
 sigs.k8s.io/controller-runtime v0.25.1 h1:BKgU9OeE8xv8EbbM8cY0NVzTQs35rokkdq1jh12fMb4=
 sigs.k8s.io/controller-runtime v0.25.1/go.mod h1:4QqLdT6z/L6Olj8JJCtvztid4/fnIiYsfaTFScegctc=
 sigs.k8s.io/gateway-api v1.6.2 h1:vh5YzKlbdBivEaLX61+APKLGRq4tZ7Fj4XfGkv08xB4=
diff --git a/pkg/apis/addtoscheme_knative_eventing.go b/pkg/apis/addtoscheme_knative_eventing.go
index 6618f5b6e..3cebc095b 100644
--- a/pkg/apis/addtoscheme_knative_eventing.go
+++ b/pkg/apis/addtoscheme_knative_eventing.go
@@ -18,18 +18,14 @@ limitations under the License.
 package apis
 
 import (
-	eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
-	eventingv1beta1 "knative.dev/eventing/pkg/apis/eventing/v1beta1"
-	messagingv1 "knative.dev/eventing/pkg/apis/messaging/v1"
-	sourcesv1 "knative.dev/eventing/pkg/apis/sources/v1"
-	sourcesv1beta2 "knative.dev/eventing/pkg/apis/sources/v1beta2"
+	eventingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
+	messagingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/messaging/v1"
+	sourcesv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/sources/v1"
 )
 
 func init() {
 	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, eventingv1beta1.AddToScheme)
 	AddToSchemes = append(AddToSchemes, eventingv1.AddToScheme)
 	AddToSchemes = append(AddToSchemes, messagingv1.AddToScheme)
 	AddToSchemes = append(AddToSchemes, sourcesv1.AddToScheme)
-	AddToSchemes = append(AddToSchemes, sourcesv1beta2.AddToScheme)
 }
diff --git a/pkg/apis/addtoscheme_knative_serving.go b/pkg/apis/addtoscheme_knative_serving.go
index f270608e9..81437116e 100644
--- a/pkg/apis/addtoscheme_knative_serving.go
+++ b/pkg/apis/addtoscheme_knative_serving.go
@@ -18,7 +18,7 @@ limitations under the License.
 package apis
 
 import (
-	serving "knative.dev/serving/pkg/apis/serving/v1"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
 func init() {
diff --git a/pkg/apis/duck/knative/apis/condition_types.go b/pkg/apis/duck/knative/apis/condition_types.go
new file mode 100644
index 000000000..0a3d1c549
--- /dev/null
+++ b/pkg/apis/duck/knative/apis/condition_types.go
@@ -0,0 +1,95 @@
+/*
+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 apis
+
+import (
+	corev1 "k8s.io/api/core/v1"
+)
+
+// Conditions is the schema for the conditions portion of the payload.
+type Conditions []Condition
+
+// ConditionType is a camel-cased condition type.
+type ConditionType string
+
+// ConditionReady specifies that the resource is ready.
+const ConditionReady ConditionType = "Ready"
+
+// ConditionSeverity expresses the severity of a Condition Type failing.
+type ConditionSeverity string
+
+// Condition defines a readiness condition for a Knative resource.
+type Condition struct {
+	// Type of condition.
+	Type ConditionType `json:"type"`
+
+	// Status of the condition, one of True, False, Unknown.
+	Status corev1.ConditionStatus `json:"status"`
+
+	// Severity with which to treat failures of this type of condition.
+	// +optional
+	Severity ConditionSeverity `json:"severity,omitempty"`
+
+	// LastTransitionTime is the last time the condition transitioned from one status to another.
+	// +optional
+	LastTransitionTime VolatileTime `json:"lastTransitionTime,omitempty"`
+
+	// The reason for the condition's last transition.
+	// +optional
+	Reason string `json:"reason,omitempty"`
+
+	// A human readable message indicating details about the transition.
+	// +optional
+	Message string `json:"message,omitempty"`
+}
+
+// IsTrue is true if the condition is True.
+func (c *Condition) IsTrue() bool {
+	if c == nil {
+		return false
+	}
+
+	return c.Status == corev1.ConditionTrue
+}
+
+// IsFalse is true if the condition is False.
+func (c *Condition) IsFalse() bool {
+	if c == nil {
+		return false
+	}
+
+	return c.Status == corev1.ConditionFalse
+}
+
+// GetReason returns the reason of the condition, or an empty string for a nil condition.
+func (c *Condition) GetReason() string {
+	if c == nil {
+		return ""
+	}
+
+	return c.Reason
+}
+
+// GetMessage returns the message of the condition, or an empty string for a nil condition.
+func (c *Condition) GetMessage() string {
+	if c == nil {
+		return ""
+	}
+
+	return c.Message
+}
diff --git a/pkg/apis/addtoscheme_knative_serving.go b/pkg/apis/duck/knative/apis/condition_types_test.go
similarity index 55%
copy from pkg/apis/addtoscheme_knative_serving.go
copy to pkg/apis/duck/knative/apis/condition_types_test.go
index f270608e9..9beea7cf4 100644
--- a/pkg/apis/addtoscheme_knative_serving.go
+++ b/pkg/apis/duck/knative/apis/condition_types_test.go
@@ -18,10 +18,27 @@ limitations under the License.
 package apis
 
 import (
-	serving "knative.dev/serving/pkg/apis/serving/v1"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+
+	corev1 "k8s.io/api/core/v1"
 )
 
-func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, serving.AddToScheme)
+func TestConditionAccessors(t *testing.T) {
+	var c *Condition
+	assert.False(t, c.IsTrue())
+	assert.False(t, c.IsFalse())
+	assert.Empty(t, c.GetReason())
+	assert.Empty(t, c.GetMessage())
+
+	c = &Condition{Type: ConditionReady, Status: corev1.ConditionFalse, Reason: "RevisionFailed", Message: "revision failed"}
+	assert.False(t, c.IsTrue())
+	assert.True(t, c.IsFalse())
+	assert.Equal(t, "RevisionFailed", c.GetReason())
+	assert.Equal(t, "revision failed", c.GetMessage())
+
+	c.Status = corev1.ConditionTrue
+	assert.True(t, c.IsTrue())
+	assert.False(t, c.IsFalse())
 }
diff --git a/pkg/apis/addtoscheme_knative_serving.go b/pkg/apis/duck/knative/apis/doc.go
similarity index 76%
copy from pkg/apis/addtoscheme_knative_serving.go
copy to pkg/apis/duck/knative/apis/doc.go
index f270608e9..7bce2f80f 100644
--- a/pkg/apis/addtoscheme_knative_serving.go
+++ b/pkg/apis/duck/knative/apis/doc.go
@@ -15,13 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
+// Package apis contains a partial schema of the Knative API types (knative.dev/pkg)
+// shared by the Knative Serving and Eventing duck types
+// +kubebuilder:object:generate=true
 package apis
-
-import (
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-)
-
-func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, serving.AddToScheme)
-}
diff --git a/pkg/apis/duck/knative/apis/duck_types.go b/pkg/apis/duck/knative/apis/duck_types.go
new file mode 100644
index 000000000..0e54ffe5d
--- /dev/null
+++ b/pkg/apis/duck/knative/apis/duck_types.go
@@ -0,0 +1,105 @@
+/*
+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 apis
+
+// Status is the common status of the Knative resources.
+type Status struct {
+	// ObservedGeneration is the 'Generation' of the resource that was last processed by the controller.
+	// +optional
+	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
+
+	// Conditions the latest available observations of a resource's current state.
+	// +optional
+	Conditions Conditions `json:"conditions,omitempty"`
+
+	// Annotations is additional Status fields for the resource to save some additional state.
+	// +optional
+	Annotations map[string]string `json:"annotations,omitempty"`
+}
+
+// AddressStatus is the status of an addressable resource.
+type AddressStatus struct {
+	// Address is a single Addressable address.
+	// +optional
+	Address *Addressable `json:"address,omitempty"`
+}
+
+// Addressable is a destination for message delivery.
+type Addressable struct {
+	// URL is the address URL.
+	URL *URL `json:"url,omitempty"`
+}
+
+// Destination represents a target of an invocation over HTTP.
+type Destination struct {
+	// Ref points to an Addressable.
+	// +optional
+	Ref *KReference `json:"ref,omitempty"`
+
+	// URI can be an absolute URL pointing to the target or a relative URI resolved against Ref.
+	// +optional
+	URI *URL `json:"uri,omitempty"`
+}
+
+// KReference contains enough information to refer to another object.
+type KReference struct {
+	// Kind of the referent.
+	Kind string `json:"kind"`
+
+	// Namespace of the referent.
+	// +optional
+	Namespace string `json:"namespace,omitempty"`
+
+	// Name of the referent.
+	Name string `json:"name"`
+
+	// API version of the referent.
+	// +optional
+	APIVersion string `json:"apiVersion,omitempty"`
+}
+
+// SourceSpec is the minimum resource shape to adhere to the Source specification.
+type SourceSpec struct {
+	// Sink is a reference to an object that will resolve to a uri to use as the sink.
+	Sink Destination `json:"sink,omitempty"`
+}
+
+// BindingSpec is the minimum resource shape to adhere to the Binding specification.
+type BindingSpec struct {
+	// Subject references the resource whose runtime contract should be augmented by the Binding.
+	Subject Reference `json:"subject"`
+}
+
+// Reference identifies the subject of a Binding.
+type Reference struct {
+	// API version of the referent.
+	// +optional
+	APIVersion string `json:"apiVersion,omitempty"`
+
+	// Kind of the referent.
+	// +optional
+	Kind string `json:"kind,omitempty"`
+
+	// Namespace of the referent.
+	// +optional
+	Namespace string `json:"namespace,omitempty"`
+
+	// Name of the referent.
+	// +optional
+	Name string `json:"name,omitempty"`
+}
diff --git a/pkg/apis/duck/knative/apis/url.go b/pkg/apis/duck/knative/apis/url.go
new file mode 100644
index 000000000..fd780a9fe
--- /dev/null
+++ b/pkg/apis/duck/knative/apis/url.go
@@ -0,0 +1,84 @@
+/*
+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 apis
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+
+	"k8s.io/apimachinery/pkg/api/equality"
+)
+
+// URL is an alias of url.URL with custom JSON marshalling: it is serialized as a plain string.
+type URL url.URL //nolint: recvcheck
+
+func init() {
+	// url.URL has an unexported field (url.Userinfo) that breaks the reflection based
+	// semantic equality, hence the custom equality function.
+	_ = equality.Semantic.AddFunc(func(a, b URL) bool {
+		return a.String() == b.String()
+	})
+}
+
+// ParseURL attempts to parse the given string as a URL. An empty string yields a nil URL.
+func ParseURL(u string) (*URL, error) {
+	if u == "" {
+		return nil, nil
+	}
+	pu, err := url.Parse(u)
+	if err != nil {
+		return nil, err
+	}
+
+	return (*URL)(pu), nil
+}
+
+// MarshalJSON implements json.Marshaler.
+func (u URL) MarshalJSON() ([]byte, error) {
+	return []byte(strconv.Quote(u.String())), nil
+}
+
+// UnmarshalJSON implements json.Unmarshaler.
+func (u *URL) UnmarshalJSON(b []byte) error {
+	var ref string
+	if err := json.Unmarshal(b, &ref); err != nil {
+		return err
+	}
+	r, err := ParseURL(ref)
+	if err != nil {
+		return err
+	}
+	if r != nil {
+		*u = *r
+	} else {
+		*u = URL{}
+	}
+
+	return nil
+}
+
+// String returns the string representation of the URL, or an empty string for a nil URL.
+func (u *URL) String() string {
+	if u == nil {
+		return ""
+	}
+	uu := url.URL(*u)
+
+	return uu.String()
+}
diff --git a/pkg/apis/duck/knative/apis/url_test.go b/pkg/apis/duck/knative/apis/url_test.go
new file mode 100644
index 000000000..b8d7ab7b0
--- /dev/null
+++ b/pkg/apis/duck/knative/apis/url_test.go
@@ -0,0 +1,66 @@
+/*
+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 apis
+
+import (
+	"encoding/json"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+
+	"k8s.io/apimachinery/pkg/api/equality"
+)
+
+func TestURLJSON(t *testing.T) {
+	u, err := ParseURL("http://my-service.my-ns.svc.cluster.local/path?query=1")
+	require.NoError(t, err)
+
+	data, err := json.Marshal(u)
+	require.NoError(t, err)
+	assert.Equal(t, `"http://my-service.my-ns.svc.cluster.local/path?query=1"`, string(data))
+
+	var parsed URL
+	require.NoError(t, json.Unmarshal(data, &parsed))
+	assert.Equal(t, *u, parsed)
+	assert.Equal(t, "my-service.my-ns.svc.cluster.local", parsed.Host)
+	assert.Equal(t, "/path", parsed.Path)
+
+	require.NoError(t, json.Unmarshal([]byte(`""`), &parsed))
+	assert.Equal(t, URL{}, parsed)
+	require.Error(t, json.Unmarshal([]byte(`"://invalid"`), &parsed))
+}
+
+func TestParseURLEmpty(t *testing.T) {
+	u, err := ParseURL("")
+	require.NoError(t, err)
+	assert.Nil(t, u)
+	assert.Empty(t, u.String())
+}
+
+func TestURLSemanticEquality(t *testing.T) {
+	a, err := ParseURL("http://my-host/a")
+	require.NoError(t, err)
+	b, err := ParseURL("http://my-host/a")
+	require.NoError(t, err)
+	c, err := ParseURL("http://my-host/c")
+	require.NoError(t, err)
+
+	assert.True(t, equality.Semantic.DeepEqual(a, b))
+	assert.False(t, equality.Semantic.DeepEqual(a, c))
+}
diff --git a/pkg/apis/addtoscheme_knative_eventing.go b/pkg/apis/duck/knative/apis/volatile_time.go
similarity index 52%
copy from pkg/apis/addtoscheme_knative_eventing.go
copy to pkg/apis/duck/knative/apis/volatile_time.go
index 6618f5b6e..09dc7adde 100644
--- a/pkg/apis/addtoscheme_knative_eventing.go
+++ b/pkg/apis/duck/knative/apis/volatile_time.go
@@ -18,18 +18,29 @@ limitations under the License.
 package apis
 
 import (
-	eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
-	eventingv1beta1 "knative.dev/eventing/pkg/apis/eventing/v1beta1"
-	messagingv1 "knative.dev/eventing/pkg/apis/messaging/v1"
-	sourcesv1 "knative.dev/eventing/pkg/apis/sources/v1"
-	sourcesv1beta2 "knative.dev/eventing/pkg/apis/sources/v1beta2"
+	"k8s.io/apimachinery/pkg/api/equality"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
+// VolatileTime wraps metav1.Time. Unlike metav1.Time, two VolatileTime values are always
+// semantically equal, so that a change of a condition transition time alone is not
+// considered a status change.
+type VolatileTime struct { //nolint: recvcheck
+	Inner metav1.Time `json:",inline"`
+}
+
 func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, eventingv1beta1.AddToScheme)
-	AddToSchemes = append(AddToSchemes, eventingv1.AddToScheme)
-	AddToSchemes = append(AddToSchemes, messagingv1.AddToScheme)
-	AddToSchemes = append(AddToSchemes, sourcesv1.AddToScheme)
-	AddToSchemes = append(AddToSchemes, sourcesv1beta2.AddToScheme)
+	_ = equality.Semantic.AddFunc(func(VolatileTime, VolatileTime) bool {
+		return true
+	})
+}
+
+// MarshalJSON implements json.Marshaler.
+func (t VolatileTime) MarshalJSON() ([]byte, error) {
+	return t.Inner.MarshalJSON()
+}
+
+// UnmarshalJSON implements json.Unmarshaler.
+func (t *VolatileTime) UnmarshalJSON(b []byte) error {
+	return t.Inner.UnmarshalJSON(b)
 }
diff --git a/pkg/apis/duck/knative/apis/volatile_time_test.go b/pkg/apis/duck/knative/apis/volatile_time_test.go
new file mode 100644
index 000000000..e5f16c349
--- /dev/null
+++ b/pkg/apis/duck/knative/apis/volatile_time_test.go
@@ -0,0 +1,56 @@
+/*
+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 apis
+
+import (
+	"encoding/json"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/equality"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+func TestVolatileTimeJSON(t *testing.T) {
+	vt := VolatileTime{Inner: metav1.NewTime(time.Date(2026, 1, 2, 3, 4, 5, 0, time.UTC))}
+
+	data, err := json.Marshal(vt)
+	require.NoError(t, err)
+	assert.Equal(t, `"2026-01-02T03:04:05Z"`, string(data))
+
+	var parsed VolatileTime
+	require.NoError(t, json.Unmarshal(data, &parsed))
+	assert.True(t, vt.Inner.Equal(&parsed.Inner))
+}
+
+func TestVolatileTimeSemanticEquality(t *testing.T) {
+	t1 := VolatileTime{Inner: metav1.NewTime(time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC))}
+	t2 := VolatileTime{Inner: metav1.NewTime(time.Date(2026, 6, 1, 0, 0, 0, 0, time.UTC))}
+	assert.True(t, equality.Semantic.DeepEqual(t1, t2))
+
+	c1 := Condition{Type: ConditionReady, Status: corev1.ConditionTrue, LastTransitionTime: t1}
+	c2 := Condition{Type: ConditionReady, Status: corev1.ConditionTrue, LastTransitionTime: t2}
+	assert.True(t, equality.Semantic.DeepEqual(c1, c2))
+
+	c2.Status = corev1.ConditionFalse
+	assert.False(t, equality.Semantic.DeepEqual(c1, c2))
+}
diff --git a/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go b/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
new file mode 100644
index 000000000..342c85f6d
--- /dev/null
+++ b/pkg/apis/duck/knative/apis/zz_generated.deepcopy.go
@@ -0,0 +1,238 @@
+//go:build !ignore_autogenerated
+
+// Code generated by controller-gen. DO NOT EDIT.
+
+package apis
+
+import (
+	"net/url"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AddressStatus) DeepCopyInto(out *AddressStatus) {
+	*out = *in
+	if in.Address != nil {
+		in, out := &in.Address, &out.Address
+		*out = new(Addressable)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddressStatus.
+func (in *AddressStatus) DeepCopy() *AddressStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(AddressStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Addressable) DeepCopyInto(out *Addressable) {
+	*out = *in
+	if in.URL != nil {
+		in, out := &in.URL, &out.URL
+		*out = new(URL)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Addressable.
+func (in *Addressable) DeepCopy() *Addressable {
+	if in == nil {
+		return nil
+	}
+	out := new(Addressable)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *BindingSpec) DeepCopyInto(out *BindingSpec) {
+	*out = *in
+	out.Subject = in.Subject
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BindingSpec.
+func (in *BindingSpec) DeepCopy() *BindingSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(BindingSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Condition) DeepCopyInto(out *Condition) {
+	*out = *in
+	in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Condition.
+func (in *Condition) DeepCopy() *Condition {
+	if in == nil {
+		return nil
+	}
+	out := new(Condition)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in Conditions) DeepCopyInto(out *Conditions) {
+	{
+		in := &in
+		*out = make(Conditions, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Conditions.
+func (in Conditions) DeepCopy() Conditions {
+	if in == nil {
+		return nil
+	}
+	out := new(Conditions)
+	in.DeepCopyInto(out)
+	return *out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Destination) DeepCopyInto(out *Destination) {
+	*out = *in
+	if in.Ref != nil {
+		in, out := &in.Ref, &out.Ref
+		*out = new(KReference)
+		**out = **in
+	}
+	if in.URI != nil {
+		in, out := &in.URI, &out.URI
+		*out = new(URL)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Destination.
+func (in *Destination) DeepCopy() *Destination {
+	if in == nil {
+		return nil
+	}
+	out := new(Destination)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *KReference) DeepCopyInto(out *KReference) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KReference.
+func (in *KReference) DeepCopy() *KReference {
+	if in == nil {
+		return nil
+	}
+	out := new(KReference)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Reference) DeepCopyInto(out *Reference) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Reference.
+func (in *Reference) DeepCopy() *Reference {
+	if in == nil {
+		return nil
+	}
+	out := new(Reference)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SourceSpec) DeepCopyInto(out *SourceSpec) {
+	*out = *in
+	in.Sink.DeepCopyInto(&out.Sink)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SourceSpec.
+func (in *SourceSpec) DeepCopy() *SourceSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(SourceSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Status) DeepCopyInto(out *Status) {
+	*out = *in
+	if in.Conditions != nil {
+		in, out := &in.Conditions, &out.Conditions
+		*out = make(Conditions, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.Annotations != nil {
+		in, out := &in.Annotations, &out.Annotations
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Status.
+func (in *Status) DeepCopy() *Status {
+	if in == nil {
+		return nil
+	}
+	out := new(Status)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *URL) DeepCopyInto(out *URL) {
+	*out = *in
+	if in.User != nil {
+		in, out := &in.User, &out.User
+		*out = new(url.Userinfo)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new URL.
+func (in *URL) DeepCopy() *URL {
+	if in == nil {
+		return nil
+	}
+	out := new(URL)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VolatileTime) DeepCopyInto(out *VolatileTime) {
+	*out = *in
+	in.Inner.DeepCopyInto(&out.Inner)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolatileTime.
+func (in *VolatileTime) DeepCopy() *VolatileTime {
+	if in == nil {
+		return nil
+	}
+	out := new(VolatileTime)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/apis/addtoscheme_knative_serving.go b/pkg/apis/duck/knative/eventing/v1/doc.go
similarity index 74%
copy from pkg/apis/addtoscheme_knative_serving.go
copy to pkg/apis/duck/knative/eventing/v1/doc.go
index f270608e9..d8780481f 100644
--- a/pkg/apis/addtoscheme_knative_serving.go
+++ b/pkg/apis/duck/knative/eventing/v1/doc.go
@@ -15,13 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package apis
-
-import (
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-)
-
-func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, serving.AddToScheme)
-}
+// Package v1 contains a partial schema of the Knative Eventing APIs
+// +kubebuilder:object:generate=true
+// +groupName=eventing.knative.dev
+package v1
diff --git a/pkg/apis/duck/knative/eventing/v1/duck_types.go b/pkg/apis/duck/knative/eventing/v1/duck_types.go
new file mode 100644
index 000000000..bd455456a
--- /dev/null
+++ b/pkg/apis/duck/knative/eventing/v1/duck_types.go
@@ -0,0 +1,111 @@
+/*
+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 v1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+)
+
+// +kubebuilder:object:root=true
+
+// Trigger is a partial schema of the Knative Eventing Trigger resource: a request
+// to have events delivered to a Subscriber from a Broker's event pool.
+type Trigger struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec   TriggerSpec   `json:"spec,omitempty"`
+	Status TriggerStatus `json:"status,omitempty"`
+}
+
+// TriggerSpec defines the desired state of the Trigger.
+type TriggerSpec struct {
+	// Broker is the broker that this trigger receives events from.
+	Broker string `json:"broker,omitempty"`
+
+	// Filter is the filter to apply against all events from the Broker.
+	// +optional
+	Filter *TriggerFilter `json:"filter,omitempty"`
+
+	// Subscriber is the addressable that receives events from the Broker that pass the Filter.
+	Subscriber apis.Destination `json:"subscriber"`
+}
+
+// TriggerFilter allows filtering events destined for a Trigger's Subscriber.
+type TriggerFilter struct {
+	// Attributes filters events by exact match on event context attributes.
+	// +optional
+	Attributes TriggerFilterAttributes `json:"attributes,omitempty"`
+}
+
+// TriggerFilterAttributes is a map of context attribute names to values for filtering by equality.
+type TriggerFilterAttributes map[string]string
+
+// TriggerStatus represents the current state of a Trigger.
+type TriggerStatus struct {
+	apis.Status `json:",inline"`
+}
+
+// +kubebuilder:object:root=true
+
+// TriggerList contains a list of Trigger.
+type TriggerList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+
+	Items []Trigger `json:"items"`
+}
+
+// +kubebuilder:object:root=true
+
+// Broker is a partial schema of the Knative Eventing Broker resource: a pool of
+// events that are consumable using Triggers.
+type Broker struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec   BrokerSpec   `json:"spec,omitempty"`
+	Status BrokerStatus `json:"status,omitempty"`
+}
+
+// BrokerSpec defines the desired state of the Broker.
+type BrokerSpec struct {
+	// Config is a KReference to the configuration that specifies configuration options for this Broker.
+	// +optional
+	Config *apis.KReference `json:"config,omitempty"`
+}
+
+// BrokerStatus represents the current state of a Broker.
+type BrokerStatus struct {
+	apis.Status `json:",inline"`
+
+	// AddressStatus is the part where the Broker fulfills the Addressable contract.
+	apis.AddressStatus `json:",inline"`
+}
+
+// +kubebuilder:object:root=true
+
+// BrokerList contains a list of Broker.
+type BrokerList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+
+	Items []Broker `json:"items"`
+}
diff --git a/pkg/apis/duck/knative/eventing/v1/register.go b/pkg/apis/duck/knative/eventing/v1/register.go
new file mode 100644
index 000000000..51213722b
--- /dev/null
+++ b/pkg/apis/duck/knative/eventing/v1/register.go
@@ -0,0 +1,53 @@
+/*
+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 v1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+const (
+	KnativeEventingGroup   = "eventing.knative.dev"
+	KnativeEventingVersion = "v1"
+)
+
+var (
+	// SchemeGroupVersion is group version used to register these objects.
+	SchemeGroupVersion = schema.GroupVersion{Group: KnativeEventingGroup, Version: KnativeEventingVersion}
+
+	// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
+	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+
+	// AddToScheme is a shortcut to SchemeBuilder.AddToScheme.
+	AddToScheme = SchemeBuilder.AddToScheme
+)
+
+// Adds the list of known types to Scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&Trigger{},
+		&TriggerList{},
+		&Broker{},
+		&BrokerList{},
+	)
+	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+
+	return nil
+}
diff --git a/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go
new file mode 100644
index 000000000..a848c09de
--- /dev/null
+++ b/pkg/apis/duck/knative/eventing/v1/zz_generated.deepcopy.go
@@ -0,0 +1,245 @@
+//go:build !ignore_autogenerated
+
+// Code generated by controller-gen. DO NOT EDIT.
+
+package v1
+
+import (
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Broker) DeepCopyInto(out *Broker) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Broker.
+func (in *Broker) DeepCopy() *Broker {
+	if in == nil {
+		return nil
+	}
+	out := new(Broker)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Broker) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *BrokerList) DeepCopyInto(out *BrokerList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Broker, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BrokerList.
+func (in *BrokerList) DeepCopy() *BrokerList {
+	if in == nil {
+		return nil
+	}
+	out := new(BrokerList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *BrokerList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *BrokerSpec) DeepCopyInto(out *BrokerSpec) {
+	*out = *in
+	if in.Config != nil {
+		in, out := &in.Config, &out.Config
+		*out = new(apis.KReference)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BrokerSpec.
+func (in *BrokerSpec) DeepCopy() *BrokerSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(BrokerSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *BrokerStatus) DeepCopyInto(out *BrokerStatus) {
+	*out = *in
+	in.Status.DeepCopyInto(&out.Status)
+	in.AddressStatus.DeepCopyInto(&out.AddressStatus)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BrokerStatus.
+func (in *BrokerStatus) DeepCopy() *BrokerStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(BrokerStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Trigger) DeepCopyInto(out *Trigger) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Trigger.
+func (in *Trigger) DeepCopy() *Trigger {
+	if in == nil {
+		return nil
+	}
+	out := new(Trigger)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Trigger) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TriggerFilter) DeepCopyInto(out *TriggerFilter) {
+	*out = *in
+	if in.Attributes != nil {
+		in, out := &in.Attributes, &out.Attributes
+		*out = make(TriggerFilterAttributes, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TriggerFilter.
+func (in *TriggerFilter) DeepCopy() *TriggerFilter {
+	if in == nil {
+		return nil
+	}
+	out := new(TriggerFilter)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in TriggerFilterAttributes) DeepCopyInto(out *TriggerFilterAttributes) {
+	{
+		in := &in
+		*out = make(TriggerFilterAttributes, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TriggerFilterAttributes.
+func (in TriggerFilterAttributes) DeepCopy() TriggerFilterAttributes {
+	if in == nil {
+		return nil
+	}
+	out := new(TriggerFilterAttributes)
+	in.DeepCopyInto(out)
+	return *out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TriggerList) DeepCopyInto(out *TriggerList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Trigger, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TriggerList.
+func (in *TriggerList) DeepCopy() *TriggerList {
+	if in == nil {
+		return nil
+	}
+	out := new(TriggerList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *TriggerList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TriggerSpec) DeepCopyInto(out *TriggerSpec) {
+	*out = *in
+	if in.Filter != nil {
+		in, out := &in.Filter, &out.Filter
+		*out = new(TriggerFilter)
+		(*in).DeepCopyInto(*out)
+	}
+	in.Subscriber.DeepCopyInto(&out.Subscriber)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TriggerSpec.
+func (in *TriggerSpec) DeepCopy() *TriggerSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(TriggerSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TriggerStatus) DeepCopyInto(out *TriggerStatus) {
+	*out = *in
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TriggerStatus.
+func (in *TriggerStatus) DeepCopy() *TriggerStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(TriggerStatus)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/apis/addtoscheme_knative_serving.go b/pkg/apis/duck/knative/messaging/v1/doc.go
similarity index 74%
copy from pkg/apis/addtoscheme_knative_serving.go
copy to pkg/apis/duck/knative/messaging/v1/doc.go
index f270608e9..80eabe6b0 100644
--- a/pkg/apis/addtoscheme_knative_serving.go
+++ b/pkg/apis/duck/knative/messaging/v1/doc.go
@@ -15,13 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package apis
-
-import (
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-)
-
-func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, serving.AddToScheme)
-}
+// Package v1 contains a partial schema of the Knative Eventing Messaging APIs
+// +kubebuilder:object:generate=true
+// +groupName=messaging.knative.dev
+package v1
diff --git a/pkg/apis/duck/knative/messaging/v1/duck_types.go b/pkg/apis/duck/knative/messaging/v1/duck_types.go
new file mode 100644
index 000000000..00626803a
--- /dev/null
+++ b/pkg/apis/duck/knative/messaging/v1/duck_types.go
@@ -0,0 +1,120 @@
+/*
+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 v1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+)
+
+// +kubebuilder:object:root=true
+
+// Subscription is a partial schema of the Knative Eventing Subscription resource,
+// routing the events received on a Channel to a Subscriber.
+type Subscription struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata"`
+
+	Spec   SubscriptionSpec   `json:"spec"`
+	Status SubscriptionStatus `json:"status,omitempty"`
+}
+
+// SubscriptionSpec specifies the Channel for incoming events and the Subscriber processing them.
+type SubscriptionSpec struct {
+	// Channel is a reference to the channel that will be used to create the subscription.
+	Channel apis.KReference `json:"channel"`
+
+	// Subscriber is reference to the function for processing events.
+	// +optional
+	Subscriber *apis.Destination `json:"subscriber,omitempty"`
+
+	// Reply specifies how to handle events returned from the Subscriber target.
+	// +optional
+	Reply *apis.Destination `json:"reply,omitempty"`
+}
+
+// SubscriptionStatus represents the current state of a Subscription.
+type SubscriptionStatus struct {
+	apis.Status `json:",inline"`
+
+	// PhysicalSubscription is the fully resolved values that this Subscription represents.
+	PhysicalSubscription SubscriptionStatusPhysicalSubscription `json:"physicalSubscription,omitempty"`
+}
+
+// SubscriptionStatusPhysicalSubscription represents the fully resolved values for this Subscription.
+type SubscriptionStatusPhysicalSubscription struct {
+	// SubscriberURI is the fully resolved URI for spec.subscriber.
+	// +optional
+	SubscriberURI *apis.URL `json:"subscriberUri,omitempty"`
+
+	// ReplyURI is the fully resolved URI for the spec.reply.
+	// +optional
+	ReplyURI *apis.URL `json:"replyUri,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+
+// SubscriptionList contains a list of Subscription.
+type SubscriptionList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata"`
+
+	Items []Subscription `json:"items"`
+}
+
+// +kubebuilder:object:root=true
+
+// Channel is a partial schema of the Knative Eventing Channel resource.
+type Channel struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec   ChannelSpec   `json:"spec,omitempty"`
+	Status ChannelStatus `json:"status,omitempty"`
+}
+
+// ChannelSpec holds the desired state of the Channel.
+type ChannelSpec struct {
+	// ChannelTemplate specifies which Channel CRD to use to create the backing Channel.
+	// +optional
+	ChannelTemplate *ChannelTemplateSpec `json:"channelTemplate,omitempty"`
+}
+
+// ChannelTemplateSpec identifies the underlying Channel implementation.
+type ChannelTemplateSpec struct {
+	metav1.TypeMeta `json:",inline"`
+}
+
+// ChannelStatus represents the current state of a Channel.
+type ChannelStatus struct {
+	apis.Status `json:",inline"`
+
+	// AddressStatus is the part where the Channel fulfills the Addressable contract.
+	apis.AddressStatus `json:",inline"`
+}
+
+// +kubebuilder:object:root=true
+
+// ChannelList contains a list of Channel.
+type ChannelList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+
+	Items []Channel `json:"items"`
+}
diff --git a/pkg/apis/duck/knative/messaging/v1/register.go b/pkg/apis/duck/knative/messaging/v1/register.go
new file mode 100644
index 000000000..edcfd6b70
--- /dev/null
+++ b/pkg/apis/duck/knative/messaging/v1/register.go
@@ -0,0 +1,53 @@
+/*
+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 v1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+const (
+	KnativeMessagingGroup   = "messaging.knative.dev"
+	KnativeMessagingVersion = "v1"
+)
+
+var (
+	// SchemeGroupVersion is group version used to register these objects.
+	SchemeGroupVersion = schema.GroupVersion{Group: KnativeMessagingGroup, Version: KnativeMessagingVersion}
+
+	// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
+	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+
+	// AddToScheme is a shortcut to SchemeBuilder.AddToScheme.
+	AddToScheme = SchemeBuilder.AddToScheme
+)
+
+// Adds the list of known types to Scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&Subscription{},
+		&SubscriptionList{},
+		&Channel{},
+		&ChannelList{},
+	)
+	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+
+	return nil
+}
diff --git a/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
new file mode 100644
index 000000000..636ae22d1
--- /dev/null
+++ b/pkg/apis/duck/knative/messaging/v1/zz_generated.deepcopy.go
@@ -0,0 +1,249 @@
+//go:build !ignore_autogenerated
+
+// Code generated by controller-gen. DO NOT EDIT.
+
+package v1
+
+import (
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Channel) DeepCopyInto(out *Channel) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Channel.
+func (in *Channel) DeepCopy() *Channel {
+	if in == nil {
+		return nil
+	}
+	out := new(Channel)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Channel) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ChannelList) DeepCopyInto(out *ChannelList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Channel, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChannelList.
+func (in *ChannelList) DeepCopy() *ChannelList {
+	if in == nil {
+		return nil
+	}
+	out := new(ChannelList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ChannelList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ChannelSpec) DeepCopyInto(out *ChannelSpec) {
+	*out = *in
+	if in.ChannelTemplate != nil {
+		in, out := &in.ChannelTemplate, &out.ChannelTemplate
+		*out = new(ChannelTemplateSpec)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChannelSpec.
+func (in *ChannelSpec) DeepCopy() *ChannelSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ChannelSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ChannelStatus) DeepCopyInto(out *ChannelStatus) {
+	*out = *in
+	in.Status.DeepCopyInto(&out.Status)
+	in.AddressStatus.DeepCopyInto(&out.AddressStatus)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChannelStatus.
+func (in *ChannelStatus) DeepCopy() *ChannelStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(ChannelStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ChannelTemplateSpec) DeepCopyInto(out *ChannelTemplateSpec) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChannelTemplateSpec.
+func (in *ChannelTemplateSpec) DeepCopy() *ChannelTemplateSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ChannelTemplateSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Subscription) DeepCopyInto(out *Subscription) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Subscription.
+func (in *Subscription) DeepCopy() *Subscription {
+	if in == nil {
+		return nil
+	}
+	out := new(Subscription)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Subscription) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SubscriptionList) DeepCopyInto(out *SubscriptionList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Subscription, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubscriptionList.
+func (in *SubscriptionList) DeepCopy() *SubscriptionList {
+	if in == nil {
+		return nil
+	}
+	out := new(SubscriptionList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *SubscriptionList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SubscriptionSpec) DeepCopyInto(out *SubscriptionSpec) {
+	*out = *in
+	out.Channel = in.Channel
+	if in.Subscriber != nil {
+		in, out := &in.Subscriber, &out.Subscriber
+		*out = new(apis.Destination)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Reply != nil {
+		in, out := &in.Reply, &out.Reply
+		*out = new(apis.Destination)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubscriptionSpec.
+func (in *SubscriptionSpec) DeepCopy() *SubscriptionSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(SubscriptionSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SubscriptionStatus) DeepCopyInto(out *SubscriptionStatus) {
+	*out = *in
+	in.Status.DeepCopyInto(&out.Status)
+	in.PhysicalSubscription.DeepCopyInto(&out.PhysicalSubscription)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubscriptionStatus.
+func (in *SubscriptionStatus) DeepCopy() *SubscriptionStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(SubscriptionStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SubscriptionStatusPhysicalSubscription) DeepCopyInto(out *SubscriptionStatusPhysicalSubscription) {
+	*out = *in
+	if in.SubscriberURI != nil {
+		in, out := &in.SubscriberURI, &out.SubscriberURI
+		*out = new(apis.URL)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.ReplyURI != nil {
+		in, out := &in.ReplyURI, &out.ReplyURI
+		*out = new(apis.URL)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubscriptionStatusPhysicalSubscription.
+func (in *SubscriptionStatusPhysicalSubscription) DeepCopy() *SubscriptionStatusPhysicalSubscription {
+	if in == nil {
+		return nil
+	}
+	out := new(SubscriptionStatusPhysicalSubscription)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/apis/addtoscheme_knative_serving.go b/pkg/apis/duck/knative/serving/v1/doc.go
similarity index 74%
copy from pkg/apis/addtoscheme_knative_serving.go
copy to pkg/apis/duck/knative/serving/v1/doc.go
index f270608e9..30bb06e17 100644
--- a/pkg/apis/addtoscheme_knative_serving.go
+++ b/pkg/apis/duck/knative/serving/v1/doc.go
@@ -15,13 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package apis
-
-import (
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-)
-
-func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, serving.AddToScheme)
-}
+// Package v1 contains a partial schema of the Knative Serving APIs
+// +kubebuilder:object:generate=true
+// +groupName=serving.knative.dev
+package v1
diff --git a/pkg/apis/duck/knative/serving/v1/duck_types.go b/pkg/apis/duck/knative/serving/v1/duck_types.go
new file mode 100644
index 000000000..0e8371b24
--- /dev/null
+++ b/pkg/apis/duck/knative/serving/v1/duck_types.go
@@ -0,0 +1,156 @@
+/*
+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 v1
+
+import (
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+)
+
+// ServiceConditionReady is set when the service is configured and has available backends ready to receive traffic.
+const ServiceConditionReady = apis.ConditionReady
+
+// +kubebuilder:object:root=true
+
+// Service is a partial schema of the Knative Serving Service resource, carrying
+// the fields Camel K produces and consumes.
+type Service struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec   ServiceSpec   `json:"spec,omitempty"`
+	Status ServiceStatus `json:"status,omitempty"`
+}
+
+// ServiceSpec represents the configuration for the Service object.
+type ServiceSpec struct {
+	// ConfigurationSpec holds the desired state of the Configuration.
+	ConfigurationSpec `json:",inline"`
+
+	// RouteSpec holds the desired state of the Route.
+	RouteSpec `json:",inline"`
+}
+
+// ConfigurationSpec holds the desired state of the Configuration.
+type ConfigurationSpec struct {
+	// Template holds the latest specification for the Revision to be stamped out.
+	Template RevisionTemplateSpec `json:"template"`
+}
+
+// RevisionTemplateSpec describes the data a revision should have when created from a template.
+type RevisionTemplateSpec struct {
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec RevisionSpec `json:"spec,omitempty"`
+}
+
+// RevisionSpec holds the desired state of the Revision.
+type RevisionSpec struct {
+	corev1.PodSpec `json:",inline"`
+
+	// ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container of the Revision.
+	// +optional
+	ContainerConcurrency *int64 `json:"containerConcurrency,omitempty"`
+
+	// TimeoutSeconds is the maximum duration in seconds that the request instance is allowed to respond to a request.
+	// +optional
+	TimeoutSeconds *int64 `json:"timeoutSeconds,omitempty"`
+}
+
+// RouteSpec holds the desired state of the Route.
+type RouteSpec struct {
+	// Traffic specifies how to distribute traffic over a collection of revisions and configurations.
+	// +optional
+	Traffic []TrafficTarget `json:"traffic,omitempty"`
+}
+
+// TrafficTarget holds a single entry of the routing table for a Route.
+type TrafficTarget struct {
+	// Tag is optionally used to expose a dedicated url for referencing this target exclusively.
+	// +optional
+	Tag string `json:"tag,omitempty"`
+
+	// RevisionName of a specific revision to which to send this portion of traffic.
+	// +optional
+	RevisionName string `json:"revisionName,omitempty"`
+
+	// ConfigurationName of a configuration to whose latest revision we will send this portion of traffic.
+	// +optional
+	ConfigurationName string `json:"configurationName,omitempty"`
+
+	// LatestRevision indicates that the latest ready Revision of the Configuration should be used for this traffic target.
+	// +optional
+	LatestRevision *bool `json:"latestRevision,omitempty"`
+
+	// Percent indicates the percent of traffic that is to be routed to this Revision or Configuration.
+	// +optional
+	Percent *int64 `json:"percent,omitempty"`
+
+	// URL displays the URL for accessing named traffic targets. It is only present in the status.
+	// +optional
+	URL *apis.URL `json:"url,omitempty"`
+}
+
+// ServiceStatus represents the status of the Service resource.
+type ServiceStatus struct {
+	apis.Status `json:",inline"`
+
+	// ConfigurationStatusFields represents the current Configuration.
+	ConfigurationStatusFields `json:",inline"`
+
+	// RouteStatusFields represents the current Route.
+	RouteStatusFields `json:",inline"`
+}
+
+// ConfigurationStatusFields holds the fields of the Configuration status.
+type ConfigurationStatusFields struct {
+	// LatestReadyRevisionName holds the name of the latest Revision that has become ready.
+	// +optional
+	LatestReadyRevisionName string `json:"latestReadyRevisionName,omitempty"`
+
+	// LatestCreatedRevisionName is the last revision that was created from this Configuration.
+	// +optional
+	LatestCreatedRevisionName string `json:"latestCreatedRevisionName,omitempty"`
+}
+
+// RouteStatusFields holds the fields of the Route status.
+type RouteStatusFields struct {
+	// URL holds the url that will distribute traffic over the provided traffic targets.
+	// +optional
+	URL *apis.URL `json:"url,omitempty"`
+
+	// Address holds the information needed for a Route to be the target of an event.
+	// +optional
+	Address *apis.Addressable `json:"address,omitempty"`
+
+	// Traffic holds the configured traffic distribution.
+	// +optional
+	Traffic []TrafficTarget `json:"traffic,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+
+// ServiceList contains a list of Service.
+type ServiceList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata"`
+
+	Items []Service `json:"items"`
+}
diff --git a/pkg/apis/duck/knative/serving/v1/register.go b/pkg/apis/duck/knative/serving/v1/register.go
new file mode 100644
index 000000000..6065ffbc7
--- /dev/null
+++ b/pkg/apis/duck/knative/serving/v1/register.go
@@ -0,0 +1,51 @@
+/*
+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 v1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+const (
+	KnativeServingGroup   = "serving.knative.dev"
+	KnativeServingVersion = "v1"
+)
+
+var (
+	// SchemeGroupVersion is group version used to register these objects.
+	SchemeGroupVersion = schema.GroupVersion{Group: KnativeServingGroup, Version: KnativeServingVersion}
+
+	// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
+	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+
+	// AddToScheme is a shortcut to SchemeBuilder.AddToScheme.
+	AddToScheme = SchemeBuilder.AddToScheme
+)
+
+// Adds the list of known types to Scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&Service{},
+		&ServiceList{},
+	)
+	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+
+	return nil
+}
diff --git a/pkg/apis/duck/knative/serving/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/serving/v1/zz_generated.deepcopy.go
new file mode 100644
index 000000000..0ccc5cdd4
--- /dev/null
+++ b/pkg/apis/duck/knative/serving/v1/zz_generated.deepcopy.go
@@ -0,0 +1,262 @@
+//go:build !ignore_autogenerated
+
+// Code generated by controller-gen. DO NOT EDIT.
+
+package v1
+
+import (
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigurationSpec) DeepCopyInto(out *ConfigurationSpec) {
+	*out = *in
+	in.Template.DeepCopyInto(&out.Template)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigurationSpec.
+func (in *ConfigurationSpec) DeepCopy() *ConfigurationSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ConfigurationSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigurationStatusFields) DeepCopyInto(out *ConfigurationStatusFields) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigurationStatusFields.
+func (in *ConfigurationStatusFields) DeepCopy() *ConfigurationStatusFields {
+	if in == nil {
+		return nil
+	}
+	out := new(ConfigurationStatusFields)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RevisionSpec) DeepCopyInto(out *RevisionSpec) {
+	*out = *in
+	in.PodSpec.DeepCopyInto(&out.PodSpec)
+	if in.ContainerConcurrency != nil {
+		in, out := &in.ContainerConcurrency, &out.ContainerConcurrency
+		*out = new(int64)
+		**out = **in
+	}
+	if in.TimeoutSeconds != nil {
+		in, out := &in.TimeoutSeconds, &out.TimeoutSeconds
+		*out = new(int64)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RevisionSpec.
+func (in *RevisionSpec) DeepCopy() *RevisionSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(RevisionSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RevisionTemplateSpec) DeepCopyInto(out *RevisionTemplateSpec) {
+	*out = *in
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RevisionTemplateSpec.
+func (in *RevisionTemplateSpec) DeepCopy() *RevisionTemplateSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(RevisionTemplateSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RouteSpec) DeepCopyInto(out *RouteSpec) {
+	*out = *in
+	if in.Traffic != nil {
+		in, out := &in.Traffic, &out.Traffic
+		*out = make([]TrafficTarget, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RouteSpec.
+func (in *RouteSpec) DeepCopy() *RouteSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(RouteSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RouteStatusFields) DeepCopyInto(out *RouteStatusFields) {
+	*out = *in
+	if in.URL != nil {
+		in, out := &in.URL, &out.URL
+		*out = new(apis.URL)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Address != nil {
+		in, out := &in.Address, &out.Address
+		*out = new(apis.Addressable)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Traffic != nil {
+		in, out := &in.Traffic, &out.Traffic
+		*out = make([]TrafficTarget, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RouteStatusFields.
+func (in *RouteStatusFields) DeepCopy() *RouteStatusFields {
+	if in == nil {
+		return nil
+	}
+	out := new(RouteStatusFields)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Service) DeepCopyInto(out *Service) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Service.
+func (in *Service) DeepCopy() *Service {
+	if in == nil {
+		return nil
+	}
+	out := new(Service)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Service) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceList) DeepCopyInto(out *ServiceList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Service, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceList.
+func (in *ServiceList) DeepCopy() *ServiceList {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ServiceList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) {
+	*out = *in
+	in.ConfigurationSpec.DeepCopyInto(&out.ConfigurationSpec)
+	in.RouteSpec.DeepCopyInto(&out.RouteSpec)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceSpec.
+func (in *ServiceSpec) DeepCopy() *ServiceSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceStatus) DeepCopyInto(out *ServiceStatus) {
+	*out = *in
+	in.Status.DeepCopyInto(&out.Status)
+	out.ConfigurationStatusFields = in.ConfigurationStatusFields
+	in.RouteStatusFields.DeepCopyInto(&out.RouteStatusFields)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceStatus.
+func (in *ServiceStatus) DeepCopy() *ServiceStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TrafficTarget) DeepCopyInto(out *TrafficTarget) {
+	*out = *in
+	if in.LatestRevision != nil {
+		in, out := &in.LatestRevision, &out.LatestRevision
+		*out = new(bool)
+		**out = **in
+	}
+	if in.Percent != nil {
+		in, out := &in.Percent, &out.Percent
+		*out = new(int64)
+		**out = **in
+	}
+	if in.URL != nil {
+		in, out := &in.URL, &out.URL
+		*out = new(apis.URL)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrafficTarget.
+func (in *TrafficTarget) DeepCopy() *TrafficTarget {
+	if in == nil {
+		return nil
+	}
+	out := new(TrafficTarget)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/apis/addtoscheme_knative_serving.go b/pkg/apis/duck/knative/sources/v1/doc.go
similarity index 74%
copy from pkg/apis/addtoscheme_knative_serving.go
copy to pkg/apis/duck/knative/sources/v1/doc.go
index f270608e9..70f7f3c5d 100644
--- a/pkg/apis/addtoscheme_knative_serving.go
+++ b/pkg/apis/duck/knative/sources/v1/doc.go
@@ -15,13 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package apis
-
-import (
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-)
-
-func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, serving.AddToScheme)
-}
+// Package v1 contains a partial schema of the Knative Eventing Sources APIs
+// +kubebuilder:object:generate=true
+// +groupName=sources.knative.dev
+package v1
diff --git a/pkg/apis/duck/knative/sources/v1/duck_types.go b/pkg/apis/duck/knative/sources/v1/duck_types.go
new file mode 100644
index 000000000..6a8cf0ee0
--- /dev/null
+++ b/pkg/apis/duck/knative/sources/v1/duck_types.go
@@ -0,0 +1,60 @@
+/*
+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 v1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+)
+
+// +kubebuilder:object:root=true
+
+// SinkBinding is a partial schema of the Knative Eventing SinkBinding resource: a
+// Binding that resolves its sink to a URL and projects it into the subject.
+type SinkBinding struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec   SinkBindingSpec   `json:"spec"`
+	Status SinkBindingStatus `json:"status"`
+}
+
+// SinkBindingSpec holds the desired state of the SinkBinding.
+type SinkBindingSpec struct {
+	// SourceSpec provides the Sink to resolve.
+	apis.SourceSpec `json:",inline"`
+
+	// BindingSpec provides the Subject to augment.
+	apis.BindingSpec `json:",inline"`
+}
+
+// SinkBindingStatus communicates the observed state of the SinkBinding.
+type SinkBindingStatus struct {
+	apis.Status `json:",inline"`
+}
+
+// +kubebuilder:object:root=true
+
+// SinkBindingList contains a list of SinkBinding.
+type SinkBindingList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+
+	Items []SinkBinding `json:"items"`
+}
diff --git a/pkg/apis/duck/knative/sources/v1/register.go b/pkg/apis/duck/knative/sources/v1/register.go
new file mode 100644
index 000000000..1281db0ef
--- /dev/null
+++ b/pkg/apis/duck/knative/sources/v1/register.go
@@ -0,0 +1,51 @@
+/*
+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 v1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+const (
+	KnativeSourcesGroup   = "sources.knative.dev"
+	KnativeSourcesVersion = "v1"
+)
+
+var (
+	// SchemeGroupVersion is group version used to register these objects.
+	SchemeGroupVersion = schema.GroupVersion{Group: KnativeSourcesGroup, Version: KnativeSourcesVersion}
+
+	// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
+	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+
+	// AddToScheme is a shortcut to SchemeBuilder.AddToScheme.
+	AddToScheme = SchemeBuilder.AddToScheme
+)
+
+// Adds the list of known types to Scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&SinkBinding{},
+		&SinkBindingList{},
+	)
+	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+
+	return nil
+}
diff --git a/pkg/apis/duck/knative/sources/v1/zz_generated.deepcopy.go b/pkg/apis/duck/knative/sources/v1/zz_generated.deepcopy.go
new file mode 100644
index 000000000..a4c77c568
--- /dev/null
+++ b/pkg/apis/duck/knative/sources/v1/zz_generated.deepcopy.go
@@ -0,0 +1,101 @@
+//go:build !ignore_autogenerated
+
+// Code generated by controller-gen. DO NOT EDIT.
+
+package v1
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SinkBinding) DeepCopyInto(out *SinkBinding) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SinkBinding.
+func (in *SinkBinding) DeepCopy() *SinkBinding {
+	if in == nil {
+		return nil
+	}
+	out := new(SinkBinding)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *SinkBinding) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SinkBindingList) DeepCopyInto(out *SinkBindingList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]SinkBinding, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SinkBindingList.
+func (in *SinkBindingList) DeepCopy() *SinkBindingList {
+	if in == nil {
+		return nil
+	}
+	out := new(SinkBindingList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *SinkBindingList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SinkBindingSpec) DeepCopyInto(out *SinkBindingSpec) {
+	*out = *in
+	in.SourceSpec.DeepCopyInto(&out.SourceSpec)
+	out.BindingSpec = in.BindingSpec
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SinkBindingSpec.
+func (in *SinkBindingSpec) DeepCopy() *SinkBindingSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(SinkBindingSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SinkBindingStatus) DeepCopyInto(out *SinkBindingStatus) {
+	*out = *in
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SinkBindingStatus.
+func (in *SinkBindingStatus) DeepCopy() *SinkBindingStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(SinkBindingStatus)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/cmd/operator/operator.go b/pkg/cmd/operator/operator.go
index fe116c981..490dc5dab 100644
--- a/pkg/cmd/operator/operator.go
+++ b/pkg/cmd/operator/operator.go
@@ -52,10 +52,9 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/manager/signals"
 	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
-
 	"github.com/apache/camel-k/v2/pkg/apis"
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	"github.com/apache/camel-k/v2/pkg/controller"
 	"github.com/apache/camel-k/v2/pkg/install"
diff --git a/pkg/controller/integration/integration_controller.go b/pkg/controller/integration/integration_controller.go
index 9da11fa18..85570d97f 100644
--- a/pkg/controller/integration/integration_controller.go
+++ b/pkg/controller/integration/integration_controller.go
@@ -39,9 +39,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/predicate"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/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"
diff --git a/pkg/controller/integration/monitor.go b/pkg/controller/integration/monitor.go
index 0c4ae4072..ad7ff3c99 100644
--- a/pkg/controller/integration/monitor.go
+++ b/pkg/controller/integration/monitor.go
@@ -35,9 +35,8 @@ import (
 
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	"github.com/apache/camel-k/v2/pkg/trait"
 	"github.com/apache/camel-k/v2/pkg/util"
diff --git a/pkg/controller/integration/monitor_knative.go b/pkg/controller/integration/monitor_knative.go
index 8294b9bb6..d516801c8 100644
--- a/pkg/controller/integration/monitor_knative.go
+++ b/pkg/controller/integration/monitor_knative.go
@@ -22,9 +22,8 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
 )
 
diff --git a/pkg/controller/integration/monitor_knative_test.go b/pkg/controller/integration/monitor_knative_test.go
new file mode 100644
index 000000000..a1190d441
--- /dev/null
+++ b/pkg/controller/integration/monitor_knative_test.go
@@ -0,0 +1,129 @@
+/*
+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 integration
+
+import (
+	"context"
+	"testing"
+
+	"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/duck/knative/apis"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
+)
+
+func newKnativeServiceController(ready *apis.Condition) *knativeServiceController {
+	svc := &servingv1.Service{
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: "ns",
+			Name:      "my-ksvc",
+		},
+	}
+	if ready != nil {
+		svc.Status.Conditions = apis.Conditions{*ready}
+	}
+
+	return &knativeServiceController{
+		obj: svc,
+		integration: &v1.Integration{
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: "ns",
+				Name:      "my-it",
+			},
+			Status: v1.IntegrationStatus{
+				Phase: v1.IntegrationPhaseRunning,
+			},
+		},
+	}
+}
+
+func TestKnativeServiceControllerReady(t *testing.T) {
+	c := newKnativeServiceController(&apis.Condition{
+		Type:   servingv1.ServiceConditionReady,
+		Status: corev1.ConditionTrue,
+	})
+
+	done, err := c.checkReadyCondition(context.TODO())
+	require.NoError(t, err)
+	assert.False(t, done)
+	assert.Equal(t, v1.IntegrationPhaseRunning, c.integration.Status.Phase)
+
+	assert.True(t, c.updateReadyCondition(1))
+	cond := c.integration.Status.GetCondition(v1.IntegrationConditionReady)
+	require.NotNil(t, cond)
+	assert.Equal(t, corev1.ConditionTrue, cond.Status)
+	assert.Equal(t, v1.IntegrationConditionKnativeServiceReadyReason, cond.Reason)
+}
+
+func TestKnativeServiceControllerRevisionFailed(t *testing.T) {
+	c := newKnativeServiceController(&apis.Condition{
+		Type:    servingv1.ServiceConditionReady,
+		Status:  corev1.ConditionFalse,
+		Reason:  "RevisionFailed",
+		Message: "revision failed",
+	})
+
+	done, err := c.checkReadyCondition(context.TODO())
+	require.NoError(t, err)
+	assert.True(t, done)
+	assert.Equal(t, v1.IntegrationPhaseError, c.integration.Status.Phase)
+	cond := c.integration.Status.GetCondition(v1.IntegrationConditionReady)
+	require.NotNil(t, cond)
+	assert.Equal(t, corev1.ConditionFalse, cond.Status)
+	assert.Equal(t, "revision failed", cond.Message)
+}
+
+func TestKnativeServiceControllerNotReady(t *testing.T) {
+	c := newKnativeServiceController(&apis.Condition{
+		Type:    servingv1.ServiceConditionReady,
+		Status:  corev1.ConditionFalse,
+		Reason:  "Deploying",
+		Message: "still deploying",
+	})
+
+	done, err := c.checkReadyCondition(context.TODO())
+	require.NoError(t, err)
+	assert.False(t, done)
+	assert.Equal(t, v1.IntegrationPhaseRunning, c.integration.Status.Phase)
+
+	assert.False(t, c.updateReadyCondition(0))
+	cond := c.integration.Status.GetCondition(v1.IntegrationConditionReady)
+	require.NotNil(t, cond)
+	assert.Equal(t, corev1.ConditionFalse, cond.Status)
+	assert.Equal(t, "Deploying", cond.Reason)
+	assert.Equal(t, "still deploying", cond.Message)
+}
+
+func TestKnativeServiceControllerMissingCondition(t *testing.T) {
+	c := newKnativeServiceController(nil)
+
+	done, err := c.checkReadyCondition(context.TODO())
+	require.NoError(t, err)
+	assert.False(t, done)
+	assert.Equal(t, v1.IntegrationPhaseRunning, c.integration.Status.Phase)
+
+	assert.False(t, c.updateReadyCondition(0))
+	cond := c.integration.Status.GetCondition(v1.IntegrationConditionReady)
+	require.NotNil(t, cond)
+	assert.Equal(t, corev1.ConditionFalse, cond.Status)
+}
diff --git a/pkg/trait/container.go b/pkg/trait/container.go
index db817188e..88212fbe2 100644
--- a/pkg/trait/container.go
+++ b/pkg/trait/container.go
@@ -29,10 +29,9 @@ import (
 	"k8s.io/apimachinery/pkg/util/intstr"
 	"k8s.io/utils/ptr"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/util"
 	"github.com/apache/camel-k/v2/pkg/util/camel"
 	"github.com/apache/camel-k/v2/pkg/util/digest"
diff --git a/pkg/trait/container_test.go b/pkg/trait/container_test.go
index c90db6c6d..3b37555d1 100644
--- a/pkg/trait/container_test.go
+++ b/pkg/trait/container_test.go
@@ -24,7 +24,6 @@ import (
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	serving "knative.dev/serving/pkg/apis/serving/v1"
 
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
@@ -34,6 +33,7 @@ import (
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	"github.com/apache/camel-k/v2/pkg/platform"
 	"github.com/apache/camel-k/v2/pkg/util/camel"
diff --git a/pkg/trait/default_container_annotation_test.go b/pkg/trait/default_container_annotation_test.go
index 77590103c..1c3cf88e8 100644
--- a/pkg/trait/default_container_annotation_test.go
+++ b/pkg/trait/default_container_annotation_test.go
@@ -29,10 +29,9 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	"github.com/apache/camel-k/v2/pkg/platform"
 	"github.com/apache/camel-k/v2/pkg/util/camel"
diff --git a/pkg/trait/gc_test.go b/pkg/trait/gc_test.go
index 0b0e16843..820b2cc0e 100644
--- a/pkg/trait/gc_test.go
+++ b/pkg/trait/gc_test.go
@@ -26,14 +26,14 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
+	eventingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/utils/ptr"
-	eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 )
diff --git a/pkg/trait/init_containers.go b/pkg/trait/init_containers.go
index f7a9c3af9..687048268 100644
--- a/pkg/trait/init_containers.go
+++ b/pkg/trait/init_containers.go
@@ -25,9 +25,8 @@ import (
 	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/util/defaults"
 	"k8s.io/apimachinery/pkg/api/resource"
 	"k8s.io/utils/ptr"
diff --git a/pkg/trait/istio.go b/pkg/trait/istio.go
index 5edcb3177..ad68a6f7c 100644
--- a/pkg/trait/istio.go
+++ b/pkg/trait/istio.go
@@ -25,9 +25,8 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	"k8s.io/utils/ptr"
 
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
-
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
 const (
diff --git a/pkg/trait/istio_test.go b/pkg/trait/istio_test.go
index 9d1d9ff83..77b10e9fe 100644
--- a/pkg/trait/istio_test.go
+++ b/pkg/trait/istio_test.go
@@ -27,10 +27,9 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/utils/ptr"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	"github.com/apache/camel-k/v2/pkg/util/boolean"
 	"github.com/apache/camel-k/v2/pkg/util/camel"
diff --git a/pkg/trait/jvm_test.go b/pkg/trait/jvm_test.go
index 7d5e654c2..e47009630 100644
--- a/pkg/trait/jvm_test.go
+++ b/pkg/trait/jvm_test.go
@@ -24,6 +24,7 @@ import (
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	"github.com/apache/camel-k/v2/pkg/util/camel"
 	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
@@ -33,7 +34,6 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
-	serving "knative.dev/serving/pkg/apis/serving/v1"
 )
 
 var (
diff --git a/pkg/trait/knative.go b/pkg/trait/knative.go
index 1c2cb0b69..253047490 100644
--- a/pkg/trait/knative.go
+++ b/pkg/trait/knative.go
@@ -36,11 +36,10 @@ import (
 
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
-	eventing "knative.dev/eventing/pkg/apis/eventing/v1"
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	eventing "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	knativeapi "github.com/apache/camel-k/v2/pkg/internal/knative"
 	"github.com/apache/camel-k/v2/pkg/metadata"
 	"github.com/apache/camel-k/v2/pkg/util"
diff --git a/pkg/trait/knative_service.go b/pkg/trait/knative_service.go
index f384a4592..b376f6459 100644
--- a/pkg/trait/knative_service.go
+++ b/pkg/trait/knative_service.go
@@ -26,10 +26,9 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/metadata"
 	"github.com/apache/camel-k/v2/pkg/util/boolean"
 	"github.com/apache/camel-k/v2/pkg/util/knative"
diff --git a/pkg/trait/knative_service_test.go b/pkg/trait/knative_service_test.go
index 5451ea829..e7afd6fd0 100644
--- a/pkg/trait/knative_service_test.go
+++ b/pkg/trait/knative_service_test.go
@@ -18,6 +18,7 @@ limitations under the License.
 package trait
 
 import (
+	"encoding/json"
 	"path/filepath"
 	"reflect"
 	"testing"
@@ -30,10 +31,9 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	"github.com/apache/camel-k/v2/pkg/platform"
 	"github.com/apache/camel-k/v2/pkg/util/boolean"
@@ -642,3 +642,72 @@ func TestKnativeServiceAuto(t *testing.T) {
 		},
 	}, traits.KnativeService)
 }
+
+func TestKnativeServiceSerialization(t *testing.T) {
+	tr, ok := newKnativeServiceTrait().(*knativeServiceTrait)
+	require.True(t, ok)
+	tr.Class = "hpa.autoscaling.knative.dev"
+	tr.Metric = "cpu"
+	tr.Target = ptr.To(80)
+	tr.MinScale = ptr.To(1)
+	tr.MaxScale = ptr.To(5)
+	tr.RolloutDuration = "60s"
+	tr.Visibility = "cluster-local"
+	tr.TimeoutSeconds = ptr.To(int64(44))
+	tr.Annotations = map[string]string{"my-annotation": "my-value"}
+
+	e := &Environment{
+		Integration: &v1.Integration{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "my-it",
+				Namespace: "my-ns",
+			},
+			Spec: v1.IntegrationSpec{
+				ServiceAccountName: "my-sa",
+			},
+		},
+	}
+
+	svc, err := tr.getServiceFor(e)
+	require.NoError(t, err)
+	actual, err := json.Marshal(svc)
+	require.NoError(t, err)
+	assert.JSONEq(t, `{
+		"kind": "Service",
+		"apiVersion": "serving.knative.dev/v1",
+		"metadata": {
+			"name": "my-it",
+			"namespace": "my-ns",
+			"labels": {
+				"bindings.knative.dev/include": "true",
+				"camel.apache.org/integration": "my-it",
+				"networking.knative.dev/visibility": "cluster-local"
+			},
+			"annotations": {
+				"my-annotation": "my-value",
+				"serving.knative.dev/rolloutDuration": "60s"
+			}
+		},
+		"spec": {
+			"template": {
+				"metadata": {
+					"labels": {"camel.apache.org/integration": "my-it"},
+					"annotations": {
+						"autoscaling.knative.dev/class": "hpa.autoscaling.knative.dev",
+						"autoscaling.knative.dev/maxScale": "5",
+						"autoscaling.knative.dev/metric": "cpu",
+						"autoscaling.knative.dev/minScale": "1",
+						"autoscaling.knative.dev/target": "80",
+						"kubectl.kubernetes.io/default-container": "integration"
+					}
+				},
+				"spec": {
+					"containers": null,
+					"serviceAccountName": "my-sa",
+					"timeoutSeconds": 44
+				}
+			}
+		},
+		"status": {}
+	}`, string(actual))
+}
diff --git a/pkg/trait/knative_test.go b/pkg/trait/knative_test.go
index 5064f944b..553f087c5 100644
--- a/pkg/trait/knative_test.go
+++ b/pkg/trait/knative_test.go
@@ -30,15 +30,12 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
 
-	eventingduckv1 "knative.dev/eventing/pkg/apis/duck/v1"
-	eventing "knative.dev/eventing/pkg/apis/eventing/v1"
-	messaging "knative.dev/eventing/pkg/apis/messaging/v1"
-	"knative.dev/pkg/apis"
-	duckv1 "knative.dev/pkg/apis/duck/v1"
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+	eventing "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
+	messaging "github.com/apache/camel-k/v2/pkg/apis/duck/knative/messaging/v1"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	knativeapi "github.com/apache/camel-k/v2/pkg/internal/knative"
@@ -1342,11 +1339,9 @@ func newFakeClient(namespace string) (client.Client, error) {
 				Name:      "channel-source-1",
 			},
 			Status: messaging.ChannelStatus{
-				ChannelableStatus: eventingduckv1.ChannelableStatus{
-					AddressStatus: duckv1.AddressStatus{
-						Address: &duckv1.Addressable{
-							URL: channelSourceURL,
-						},
+				AddressStatus: apis.AddressStatus{
+					Address: &apis.Addressable{
+						URL: channelSourceURL,
 					},
 				},
 			},
@@ -1361,11 +1356,9 @@ func newFakeClient(namespace string) (client.Client, error) {
 				Name:      "channel-sink-1",
 			},
 			Status: messaging.ChannelStatus{
-				ChannelableStatus: eventingduckv1.ChannelableStatus{
-					AddressStatus: duckv1.AddressStatus{
-						Address: &duckv1.Addressable{
-							URL: channelSinkURL,
-						},
+				AddressStatus: apis.AddressStatus{
+					Address: &apis.Addressable{
+						URL: channelSinkURL,
 					},
 				},
 			},
@@ -1381,7 +1374,7 @@ func newFakeClient(namespace string) (client.Client, error) {
 			},
 			Status: serving.ServiceStatus{
 				RouteStatusFields: serving.RouteStatusFields{
-					Address: &duckv1.Addressable{
+					Address: &apis.Addressable{
 						URL: sink1URL,
 					},
 				},
@@ -1398,7 +1391,7 @@ func newFakeClient(namespace string) (client.Client, error) {
 			},
 			Status: serving.ServiceStatus{
 				RouteStatusFields: serving.RouteStatusFields{
-					Address: &duckv1.Addressable{
+					Address: &apis.Addressable{
 						URL: sink2URL,
 					},
 				},
@@ -1415,8 +1408,8 @@ func newFakeClient(namespace string) (client.Client, error) {
 			},
 			Spec: eventing.BrokerSpec{},
 			Status: eventing.BrokerStatus{
-				AddressStatus: duckv1.AddressStatus{
-					Address: &duckv1.Addressable{
+				AddressStatus: apis.AddressStatus{
+					Address: &apis.Addressable{
 						URL: brokerURL,
 					},
 				},
@@ -1438,8 +1431,8 @@ func newFakeClient(namespace string) (client.Client, error) {
 					},
 				},
 				Broker: "default",
-				Subscriber: duckv1.Destination{
-					Ref: &duckv1.KReference{
+				Subscriber: apis.Destination{
+					Ref: &apis.KReference{
 						APIVersion: serving.SchemeGroupVersion.String(),
 						Kind:       "Service",
 						Name:       "event-source-1",
diff --git a/pkg/trait/mount.go b/pkg/trait/mount.go
index a8a0a3ea6..3a5e5e450 100644
--- a/pkg/trait/mount.go
+++ b/pkg/trait/mount.go
@@ -27,10 +27,9 @@ import (
 	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/util/boolean"
 	"github.com/apache/camel-k/v2/pkg/util/camel"
 	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
diff --git a/pkg/trait/owner.go b/pkg/trait/owner.go
index 0ec69ed4b..74a2dbcb1 100644
--- a/pkg/trait/owner.go
+++ b/pkg/trait/owner.go
@@ -25,10 +25,9 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
 const (
diff --git a/pkg/trait/pod.go b/pkg/trait/pod.go
index 892d1cc8a..7bd65e6b5 100644
--- a/pkg/trait/pod.go
+++ b/pkg/trait/pod.go
@@ -26,10 +26,9 @@ import (
 	"k8s.io/apimachinery/pkg/util/json"
 	"k8s.io/apimachinery/pkg/util/strategicpatch"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
 const podTraitOrder = 1800
diff --git a/pkg/trait/security_context_test.go b/pkg/trait/security_context_test.go
index c70130be2..9bb24c095 100644
--- a/pkg/trait/security_context_test.go
+++ b/pkg/trait/security_context_test.go
@@ -22,7 +22,6 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	serving "knative.dev/serving/pkg/apis/serving/v1"
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -30,6 +29,7 @@ import (
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	"github.com/apache/camel-k/v2/pkg/util/camel"
 	"github.com/apache/camel-k/v2/pkg/util/defaults"
diff --git a/pkg/trait/trait_support_test.go b/pkg/trait/trait_support_test.go
index fae6bb795..ffcce7188 100644
--- a/pkg/trait/trait_support_test.go
+++ b/pkg/trait/trait_support_test.go
@@ -21,14 +21,13 @@ import (
 	"encoding/json"
 	"testing"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	appsv1 "k8s.io/api/apps/v1"
 	batchv1 "k8s.io/api/batch/v1"
 	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"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
 
 	"github.com/stretchr/testify/require"
diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go
index f790ed1fd..a7fc334cb 100644
--- a/pkg/trait/trait_types.go
+++ b/pkg/trait/trait_types.go
@@ -29,9 +29,9 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
-	serving "knative.dev/serving/pkg/apis/serving/v1"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	"github.com/apache/camel-k/v2/pkg/metadata"
 	"github.com/apache/camel-k/v2/pkg/platform"
diff --git a/pkg/util/bindings/catalog_test.go b/pkg/util/bindings/catalog_test.go
index 44e0f2422..4dff0b703 100644
--- a/pkg/util/bindings/catalog_test.go
+++ b/pkg/util/bindings/catalog_test.go
@@ -23,9 +23,9 @@ import (
 	"testing"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	eventing "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
 	"github.com/apache/camel-k/v2/pkg/internal"
 	corev1 "k8s.io/api/core/v1"
-	eventing "knative.dev/eventing/pkg/apis/eventing/v1"
 
 	"github.com/stretchr/testify/require"
 )
diff --git a/pkg/util/knative/knative.go b/pkg/util/knative/knative.go
index 372f1e72d..e10e80c90 100644
--- a/pkg/util/knative/knative.go
+++ b/pkg/util/knative/knative.go
@@ -30,18 +30,14 @@ import (
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/types"
-	"knative.dev/pkg/apis"
 
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
-	eventing "knative.dev/eventing/pkg/apis/eventing/v1"
-	messaging "knative.dev/eventing/pkg/apis/messaging/v1"
-	sources "knative.dev/eventing/pkg/apis/sources/v1"
-	"knative.dev/pkg/apis/duck"
-	duckv1 "knative.dev/pkg/apis/duck/v1"
-	"knative.dev/pkg/tracker"
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+	eventing "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
+	messaging "github.com/apache/camel-k/v2/pkg/apis/duck/knative/messaging/v1"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
+	sources "github.com/apache/camel-k/v2/pkg/apis/duck/knative/sources/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 	util "github.com/apache/camel-k/v2/pkg/util/kubernetes"
 )
@@ -55,13 +51,13 @@ func CreateSubscription(channelReference corev1.ObjectReference, serviceName str
 		Namespace:  channelReference.Namespace,
 		Name:       channelReference.Name + "-" + serviceName,
 		Spec: messaging.SubscriptionSpec{
-			Channel: duckv1.KReference{
+			Channel: apis.KReference{
 				APIVersion: channelReference.GroupVersionKind().GroupVersion().String(),
 				Kind:       channelReference.Kind,
 				Name:       channelReference.Name,
 			},
-			Subscriber: &duckv1.Destination{
-				Ref: &duckv1.KReference{
+			Subscriber: &apis.Destination{
+				Ref: &apis.KReference{
 					APIVersion: serving.SchemeGroupVersion.String(),
 					Kind:       knativeService,
 					Name:       serviceName,
@@ -76,7 +72,7 @@ func CreateSubscription(channelReference corev1.ObjectReference, serviceName str
 
 // CreateServiceTrigger create Knative trigger with arbitrary Kubernetes Service as a subscriber - usually used when no Knative Serving is available on the cluster.
 func CreateServiceTrigger(brokerReference corev1.ObjectReference, serviceName string, eventType string, path string, attributes map[string]string) (*eventing.Trigger, error) {
-	subscriberRef := duckv1.KReference{
+	subscriberRef := apis.KReference{
 		APIVersion: "v1",
 		Kind:       knativeService,
 		Name:       serviceName,
@@ -87,7 +83,7 @@ func CreateServiceTrigger(brokerReference corev1.ObjectReference, serviceName st
 
 // CreateKnativeServiceTrigger create Knative trigger with Knative Serving Service as a subscriber - default option when Knative Serving is available on the cluster.
 func CreateKnativeServiceTrigger(brokerReference corev1.ObjectReference, serviceName string, eventType string, path string, attributes map[string]string) (*eventing.Trigger, error) {
-	subscriberRef := duckv1.KReference{
+	subscriberRef := apis.KReference{
 		APIVersion: serving.SchemeGroupVersion.String(),
 		Kind:       knativeService,
 		Name:       serviceName,
@@ -96,7 +92,7 @@ func CreateKnativeServiceTrigger(brokerReference corev1.ObjectReference, service
 	return CreateTrigger(brokerReference, subscriberRef, eventType, path, attributes)
 }
 
-func CreateTrigger(brokerReference corev1.ObjectReference, subscriberRef duckv1.KReference, eventType string, path string, attributes map[string]string) (*eventing.Trigger, error) {
+func CreateTrigger(brokerReference corev1.ObjectReference, subscriberRef apis.KReference, eventType string, path string, attributes map[string]string) (*eventing.Trigger, error) {
 	trigger := eventing.Trigger{
 		APIVersion: eventing.SchemeGroupVersion.String(),
 		Kind:       "Trigger",
@@ -104,7 +100,7 @@ func CreateTrigger(brokerReference corev1.ObjectReference, subscriberRef duckv1.
 		Name:       GetTriggerName(brokerReference.Name, subscriberRef.Name, eventType),
 		Spec: eventing.TriggerSpec{
 			Broker: brokerReference.Name,
-			Subscriber: duckv1.Destination{
+			Subscriber: apis.Destination{
 				Ref: &subscriberRef,
 				URI: &apis.URL{
 					Path: path,
@@ -138,16 +134,16 @@ func CreateSinkBinding(source corev1.ObjectReference, target corev1.ObjectRefere
 		Namespace:  source.Namespace,
 		Name:       source.Name,
 		Spec: sources.SinkBindingSpec{
-			BindingSpec: duckv1.BindingSpec{
-				Subject: tracker.Reference{
+			BindingSpec: apis.BindingSpec{
+				Subject: apis.Reference{
 					APIVersion: source.APIVersion,
 					Kind:       source.Kind,
 					Name:       source.Name,
 				},
 			},
-			SourceSpec: duckv1.SourceSpec{
-				Sink: duckv1.Destination{
-					Ref: &duckv1.KReference{
+			SourceSpec: apis.SourceSpec{
+				Sink: apis.Destination{
+					Ref: &apis.KReference{
 						APIVersion: target.APIVersion,
 						Kind:       target.Kind,
 						Name:       target.Name,
@@ -208,22 +204,23 @@ func getSinkURI(ctx context.Context, c client.Client, sink *corev1.ObjectReferen
 		return fmt.Sprintf("http://%s.%s.svc/", u.GetName(), u.GetNamespace()), nil
 	}
 
-	t := duckv1.AddressableType{}
-	err = duck.FromUnstructured(u, &t)
+	addressURL, found, err := unstructured.NestedString(u.Object, "status", "address", "url")
 	if err != nil {
 		return "", fmt.Errorf("failed to deserialize sink %s: %w", objIdentifier, err)
 	}
-
-	if t.Status.Address == nil || t.Status.Address.URL == nil {
+	if !found || addressURL == "" {
 		return "", fmt.Errorf("sink %s does not contain address or URL", objIdentifier)
 	}
 
-	addressURL := t.Status.Address.URL
-	if addressURL.Host == "" {
+	parsedURL, err := url.Parse(addressURL)
+	if err != nil {
+		return "", fmt.Errorf("failed to deserialize sink %s: %w", objIdentifier, err)
+	}
+	if parsedURL.Host == "" {
 		return "", fmt.Errorf("sink %s contains an empty hostname", objIdentifier)
 	}
 
-	return addressURL.String(), nil
+	return parsedURL.String(), nil
 }
 
 // EnableKnativeBindInNamespace sets the "bindings.knative.dev/include=true" label to the namespace, only
diff --git a/pkg/util/knative/knative_test.go b/pkg/util/knative/knative_test.go
new file mode 100644
index 000000000..71047d683
--- /dev/null
+++ b/pkg/util/knative/knative_test.go
@@ -0,0 +1,187 @@
+/*
+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 knative
+
+import (
+	"context"
+	"encoding/json"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+
+	corev1 "k8s.io/api/core/v1"
+	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+	eventing "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
+	"github.com/apache/camel-k/v2/pkg/internal"
+)
+
+func TestCreateSinkBinding(t *testing.T) {
+	sb := CreateSinkBinding(
+		corev1.ObjectReference{APIVersion: "apps/v1", Kind: "Deployment", Name: "my-source", Namespace: "my-ns"},
+		corev1.ObjectReference{APIVersion: "messaging.knative.dev/v1", Kind: "Channel", Name: "my-channel"},
+	)
+
+	assert.Equal(t, "my-ns", sb.Namespace)
+	assert.Equal(t, "my-source", sb.Name)
+	assert.Equal(t, "Deployment", sb.Spec.Subject.Kind)
+	assert.Equal(t, "my-source", sb.Spec.Subject.Name)
+	require.NotNil(t, sb.Spec.Sink.Ref)
+	assert.Equal(t, "Channel", sb.Spec.Sink.Ref.Kind)
+	assert.Equal(t, "my-channel", sb.Spec.Sink.Ref.Name)
+
+	actual, err := json.Marshal(sb)
+	require.NoError(t, err)
+	assert.JSONEq(t, `{
+		"kind": "SinkBinding",
+		"apiVersion": "sources.knative.dev/v1",
+		"metadata": {"name": "my-source", "namespace": "my-ns"},
+		"spec": {
+			"sink": {"ref": {"kind": "Channel", "name": "my-channel", "apiVersion": "messaging.knative.dev/v1"}},
+			"subject": {"apiVersion": "apps/v1", "kind": "Deployment", "name": "my-source"}
+		},
+		"status": {}
+	}`, string(actual))
+}
+
+func TestCreateSubscription(t *testing.T) {
+	sub := CreateSubscription(
+		corev1.ObjectReference{APIVersion: "messaging.knative.dev/v1", Kind: "Channel", Name: "my-channel", Namespace: "my-ns"},
+		"my-service", "/channels/my-channel",
+	)
+
+	assert.Equal(t, "my-ns", sub.Namespace)
+	assert.Equal(t, "my-channel-my-service", sub.Name)
+	assert.Equal(t, "my-channel", sub.Spec.Channel.Name)
+	require.NotNil(t, sub.Spec.Subscriber)
+	require.NotNil(t, sub.Spec.Subscriber.Ref)
+	assert.Equal(t, "my-service", sub.Spec.Subscriber.Ref.Name)
+	assert.Equal(t, "/channels/my-channel", sub.Spec.Subscriber.URI.String())
+
+	actual, err := json.Marshal(sub)
+	require.NoError(t, err)
+	assert.JSONEq(t, `{
+		"kind": "Subscription",
+		"apiVersion": "messaging.knative.dev/v1",
+		"metadata": {"name": "my-channel-my-service", "namespace": "my-ns"},
+		"spec": {
+			"channel": {"kind": "Channel", "name": "my-channel", "apiVersion": "messaging.knative.dev/v1"},
+			"subscriber": {
+				"ref": {"kind": "Service", "name": "my-service", "apiVersion": "serving.knative.dev/v1"},
+				"uri": "/channels/my-channel"
+			}
+		},
+		"status": {"physicalSubscription": {}}
+	}`, string(actual))
+}
+
+func TestCreateKnativeServiceTrigger(t *testing.T) {
+	trigger, err := CreateKnativeServiceTrigger(
+		corev1.ObjectReference{APIVersion: "eventing.knative.dev/v1", Kind: "Broker", Name: "default", Namespace: "my-ns"},
+		"my-service", "evt.type", "/events/evt.type", map[string]string{"type": "evt.type"},
+	)
+	require.NoError(t, err)
+
+	assert.Equal(t, "my-ns", trigger.Namespace)
+	assert.Equal(t, "default-my-service-evttype", trigger.Name)
+	assert.Equal(t, "default", trigger.Spec.Broker)
+	require.NotNil(t, trigger.Spec.Subscriber.Ref)
+	assert.Equal(t, "my-service", trigger.Spec.Subscriber.Ref.Name)
+	assert.Equal(t, "/events/evt.type", trigger.Spec.Subscriber.URI.String())
+	require.NotNil(t, trigger.Spec.Filter)
+	assert.Equal(t, "evt.type", trigger.Spec.Filter.Attributes["type"])
+
+	actual, err := json.Marshal(trigger)
+	require.NoError(t, err)
+	assert.JSONEq(t, `{
+		"kind": "Trigger",
+		"apiVersion": "eventing.knative.dev/v1",
+		"metadata": {"name": "default-my-service-evttype", "namespace": "my-ns"},
+		"spec": {
+			"broker": "default",
+			"filter": {"attributes": {"type": "evt.type"}},
+			"subscriber": {
+				"ref": {"kind": "Service", "name": "my-service", "apiVersion": "serving.knative.dev/v1"},
+				"uri": "/events/evt.type"
+			}
+		},
+		"status": {}
+	}`, string(actual))
+}
+
+func TestGetSinkURL(t *testing.T) {
+	brokerURL, err := apis.ParseURL("http://broker-ingress.knative-eventing.svc.cluster.local/my-ns/default")
+	require.NoError(t, err)
+	client, err := internal.NewFakeClient(
+		&eventing.Broker{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "Broker",
+				APIVersion: eventing.SchemeGroupVersion.String(),
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: "my-ns",
+				Name:      "default",
+			},
+			Status: eventing.BrokerStatus{
+				AddressStatus: apis.AddressStatus{
+					Address: &apis.Addressable{
+						URL: brokerURL,
+					},
+				},
+			},
+		},
+		&eventing.Broker{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "Broker",
+				APIVersion: eventing.SchemeGroupVersion.String(),
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: "my-ns",
+				Name:      "not-ready",
+			},
+		},
+		&corev1.Service{
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: "my-ns",
+				Name:      "my-service",
+			},
+		},
+	)
+	require.NoError(t, err)
+
+	brokerRef := corev1.ObjectReference{APIVersion: "eventing.knative.dev/v1", Kind: "Broker", Name: "default"}
+	sinkURL, err := GetSinkURL(context.TODO(), client, &brokerRef, "my-ns")
+	require.NoError(t, err)
+	assert.Equal(t, "http://broker-ingress.knative-eventing.svc.cluster.local/my-ns/default", sinkURL.String())
+
+	serviceRef := corev1.ObjectReference{APIVersion: "v1", Kind: "Service", Name: "my-service"}
+	sinkURL, err = GetSinkURL(context.TODO(), client, &serviceRef, "my-ns")
+	require.NoError(t, err)
+	assert.Equal(t, "http://my-service.my-ns.svc/", sinkURL.String())
+
+	notReadyRef := corev1.ObjectReference{APIVersion: "eventing.knative.dev/v1", Kind: "Broker", Name: "not-ready"}
+	_, err = GetSinkURL(context.TODO(), client, &notReadyRef, "my-ns")
+	require.ErrorContains(t, err, "does not contain address or URL")
+
+	missingRef := corev1.ObjectReference{APIVersion: "eventing.knative.dev/v1", Kind: "Broker", Name: "missing"}
+	_, err = GetSinkURL(context.TODO(), client, &missingRef, "my-ns")
+	require.True(t, k8serrors.IsNotFound(err))
+}
diff --git a/pkg/util/kubernetes/collection.go b/pkg/util/kubernetes/collection.go
index 11bd8dbc9..3f8a83eec 100644
--- a/pkg/util/kubernetes/collection.go
+++ b/pkg/util/kubernetes/collection.go
@@ -23,18 +23,17 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
-	messaging "knative.dev/eventing/pkg/apis/messaging/v1"
 
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
-	eventing "knative.dev/eventing/pkg/apis/eventing/v1"
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
 
 	routev1 "github.com/openshift/api/route/v1"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	eventing "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
+	messaging "github.com/apache/camel-k/v2/pkg/apis/duck/knative/messaging/v1"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
 // A Collection is a container of Kubernetes resources.
diff --git a/pkg/util/kubernetes/conditions.go b/pkg/util/kubernetes/conditions.go
index 80632be2d..9d8a7ae5e 100644
--- a/pkg/util/kubernetes/conditions.go
+++ b/pkg/util/kubernetes/conditions.go
@@ -22,8 +22,8 @@ import (
 	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
 
-	knative "knative.dev/pkg/apis"
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
+	knative "github.com/apache/camel-k/v2/pkg/apis/duck/knative/apis"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 )
 
 func GetPodCondition(pod corev1.Pod, conditionType corev1.PodConditionType) *corev1.PodCondition {
diff --git a/pkg/util/kubernetes/replace.go b/pkg/util/kubernetes/replace.go
index aa708e800..8aa89afb0 100644
--- a/pkg/util/kubernetes/replace.go
+++ b/pkg/util/kubernetes/replace.go
@@ -27,11 +27,10 @@ import (
 
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
-	serving "knative.dev/serving/pkg/apis/serving/v1"
-
 	routev1 "github.com/openshift/api/route/v1"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	serving "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 	"github.com/apache/camel-k/v2/pkg/client"
 )
 
diff --git a/pkg/util/reference/reference.go b/pkg/util/reference/reference.go
index 0d051308c..569b199d3 100644
--- a/pkg/util/reference/reference.go
+++ b/pkg/util/reference/reference.go
@@ -25,11 +25,11 @@ import (
 	"unicode"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+	eventingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/eventing/v1"
+	messagingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/messaging/v1"
+	servingv1 "github.com/apache/camel-k/v2/pkg/apis/duck/knative/serving/v1"
 
 	corev1 "k8s.io/api/core/v1"
-	eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
-	messagingv1 "knative.dev/eventing/pkg/apis/messaging/v1"
-	servingv1 "knative.dev/serving/pkg/apis/serving/v1"
 )
 
 const (
diff --git a/script/update_docs.sh b/script/update_docs.sh
index f5f5a8540..42d9f4987 100755
--- a/script/update_docs.sh
+++ b/script/update_docs.sh
@@ -28,7 +28,6 @@ yq -i ".asciidoc.attributes.last-released-version = \"$LAST_RELEASED_VERSION\""
 yq -i ".asciidoc.attributes.kustomize-version = \"$KUSTOMIZE_VERSION\"" $location/../docs/antora.yml
 
 echo "Scraping information from go.mod"
-KNATIVE_API_VERSION=$(grep '^.*knative.dev/eventing ' $location/../go.mod | sed 's/^.* //' | sed 's/^.//')
 KUBE_API_VERSION=$(grep '^.*k8s.io/api ' $location/../go.mod | sed 's/^.* //' | sed 's/^.//')
 OPERATOR_FWK_API_VERSION=$(grep '^.*github.com/operator-framework/api ' $location/../go.mod | sed 's/^.* //' | sed 's/^.//')
 SERVICE_BINDING_OP_VERSION=$(grep '^.*github.com/redhat-developer/service-binding-operator ' $location/../go.mod | sed 's/^.* //' | sed 's/^.//')
@@ -36,12 +35,17 @@ PROMETHEUS_OP_VERSION=$(grep '^.*github.com/prometheus-operator/prometheus-opera
 
 echo "Kubernetes API version: $KUBE_API_VERSION"
 echo "Operator Framework API version: $OPERATOR_FWK_API_VERSION"
-echo "Knative API version: $KNATIVE_API_VERSION"
 echo "Service Binding Operator version: $SERVICE_BINDING_OP_VERSION"
 echo "Prometheus Operator version: $PROMETHEUS_OP_VERSION"
 
 yq -i ".asciidoc.attributes.kubernetes-api-version = \"$KUBE_API_VERSION\"" $location/../docs/antora.yml
 yq -i ".asciidoc.attributes.operator-fwk-api-version = \"$OPERATOR_FWK_API_VERSION\"" $location/../docs/antora.yml
-yq -i ".asciidoc.attributes.knative-api-version = \"$KNATIVE_API_VERSION\"" $location/../docs/antora.yml
 yq -i ".asciidoc.attributes.service-binding-op-version = \"$SERVICE_BINDING_OP_VERSION\"" $location/../docs/antora.yml
 yq -i ".asciidoc.attributes.prometheus-op-version = \"$PROMETHEUS_OP_VERSION\"" $location/../docs/antora.yml
+
+echo "Scraping information from e2e/knative/files/setup.sh"
+KNATIVE_VERSION=$(grep '^KNATIVE_VERSION=' $location/../e2e/knative/files/setup.sh | sed 's/^.*=//')
+
+echo "Knative version: $KNATIVE_VERSION"
+
+yq -i ".asciidoc.attributes.knative-api-version = \"$KNATIVE_VERSION\"" $location/../docs/antora.yml