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 fd2b535b6ef2b7727c206b3f434b1d939ca82c95
Author: Keerthan <[email protected]>
AuthorDate: Wed Sep 16 21:20:11 2026 +0530

    refactor: added types to prevent unstructured, ingress_test made it enabled 
by default and added a function to disable it
---
 pkg/apis/addtoscheme_certmanager_duck_v1.go        |  27 +++++
 pkg/apis/duck/certmanager/v1/doc.go                |  21 ++++
 pkg/apis/duck/certmanager/v1/duck_types.go         |  65 +++++++++++
 pkg/apis/duck/certmanager/v1/register.go           |  48 ++++++++
 .../duck/certmanager/v1/zz_generated.deepcopy.go   | 123 +++++++++++++++++++++
 pkg/internal/client.go                             |  12 +-
 pkg/trait/ingress.go                               |  27 ++---
 pkg/trait/ingress_test.go                          |  41 +++----
 pkg/util/certmanager/enabled.go                    |  51 ++-------
 pkg/util/certmanager/enabled_test.go               |  42 ++++---
 10 files changed, 346 insertions(+), 111 deletions(-)

diff --git a/pkg/apis/addtoscheme_certmanager_duck_v1.go 
b/pkg/apis/addtoscheme_certmanager_duck_v1.go
new file mode 100644
index 000000000..4cffce670
--- /dev/null
+++ b/pkg/apis/addtoscheme_certmanager_duck_v1.go
@@ -0,0 +1,27 @@
+/*
+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 (
+       v1 "github.com/apache/camel-k/v2/pkg/apis/duck/certmanager/v1"
+)
+
+func init() {
+       // Register the types with the Scheme so the components can map objects 
to GroupVersionKinds and back
+       AddToSchemes = append(AddToSchemes, v1.SchemeBuilder.AddToScheme)
+}
diff --git a/pkg/apis/duck/certmanager/v1/doc.go 
b/pkg/apis/duck/certmanager/v1/doc.go
new file mode 100644
index 000000000..154ce67a2
--- /dev/null
+++ b/pkg/apis/duck/certmanager/v1/doc.go
@@ -0,0 +1,21 @@
+/*
+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 contains a partial schema of the cert-manager APIs
+// +kubebuilder:object:generate=true
+// +groupName=cert-manager.io
+package v1
diff --git a/pkg/apis/duck/certmanager/v1/duck_types.go 
b/pkg/apis/duck/certmanager/v1/duck_types.go
new file mode 100644
index 000000000..3e0121562
--- /dev/null
+++ b/pkg/apis/duck/certmanager/v1/duck_types.go
@@ -0,0 +1,65 @@
+/*
+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"
+)
+
+const (
+       CertManagerGroup   = "cert-manager.io"
+       CertManagerVersion = "v1"
+)
+
+// +kubebuilder:object:root=true
+
+// ClusterIssuer is a partial schema of the cert-manager ClusterIssuer 
resource,
+// carrying only the fields Camel K needs to verify its existence.
+type ClusterIssuer struct {
+       metav1.TypeMeta   `json:",inline"`
+       metav1.ObjectMeta `json:"metadata,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+
+// ClusterIssuerList contains a list of ClusterIssuer.
+type ClusterIssuerList struct {
+       metav1.TypeMeta `json:",inline"`
+       metav1.ListMeta `json:"metadata,omitempty"`
+
+       Items []ClusterIssuer `json:"items"`
+}
+
+// +kubebuilder:object:root=true
+
+// Issuer is a partial schema of the cert-manager Issuer resource, carrying
+// only the fields Camel K needs to verify its existence.
+type Issuer struct {
+       metav1.TypeMeta   `json:",inline"`
+       metav1.ObjectMeta `json:"metadata,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+
+// IssuerList contains a list of Issuer.
+type IssuerList struct {
+       metav1.TypeMeta `json:",inline"`
+       metav1.ListMeta `json:"metadata,omitempty"`
+
+       Items []Issuer `json:"items"`
+}
diff --git a/pkg/apis/duck/certmanager/v1/register.go 
b/pkg/apis/duck/certmanager/v1/register.go
new file mode 100644
index 000000000..bc4f114eb
--- /dev/null
+++ b/pkg/apis/duck/certmanager/v1/register.go
@@ -0,0 +1,48 @@
+/*
+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"
+)
+
+var (
+       // SchemeGroupVersion is group version used to register these objects.
+       SchemeGroupVersion = schema.GroupVersion{Group: CertManagerGroup, 
Version: CertManagerVersion}
+
+       // 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,
+               &ClusterIssuer{},
+               &ClusterIssuerList{},
+               &Issuer{},
+               &IssuerList{},
+       )
+       metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+
+       return nil
+}
diff --git a/pkg/apis/duck/certmanager/v1/zz_generated.deepcopy.go 
b/pkg/apis/duck/certmanager/v1/zz_generated.deepcopy.go
new file mode 100644
index 000000000..26a2dc12e
--- /dev/null
+++ b/pkg/apis/duck/certmanager/v1/zz_generated.deepcopy.go
@@ -0,0 +1,123 @@
+//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 *ClusterIssuer) DeepCopyInto(out *ClusterIssuer) {
+       *out = *in
+       out.TypeMeta = in.TypeMeta
+       in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new ClusterIssuer.
+func (in *ClusterIssuer) DeepCopy() *ClusterIssuer {
+       if in == nil {
+               return nil
+       }
+       out := new(ClusterIssuer)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, 
creating a new runtime.Object.
+func (in *ClusterIssuer) 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 *ClusterIssuerList) DeepCopyInto(out *ClusterIssuerList) {
+       *out = *in
+       out.TypeMeta = in.TypeMeta
+       in.ListMeta.DeepCopyInto(&out.ListMeta)
+       if in.Items != nil {
+               in, out := &in.Items, &out.Items
+               *out = make([]ClusterIssuer, len(*in))
+               for i := range *in {
+                       (*in)[i].DeepCopyInto(&(*out)[i])
+               }
+       }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new ClusterIssuerList.
+func (in *ClusterIssuerList) DeepCopy() *ClusterIssuerList {
+       if in == nil {
+               return nil
+       }
+       out := new(ClusterIssuerList)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, 
creating a new runtime.Object.
+func (in *ClusterIssuerList) 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 *Issuer) DeepCopyInto(out *Issuer) {
+       *out = *in
+       out.TypeMeta = in.TypeMeta
+       in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new Issuer.
+func (in *Issuer) DeepCopy() *Issuer {
+       if in == nil {
+               return nil
+       }
+       out := new(Issuer)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, 
creating a new runtime.Object.
+func (in *Issuer) 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 *IssuerList) DeepCopyInto(out *IssuerList) {
+       *out = *in
+       out.TypeMeta = in.TypeMeta
+       in.ListMeta.DeepCopyInto(&out.ListMeta)
+       if in.Items != nil {
+               in, out := &in.Items, &out.Items
+               *out = make([]Issuer, len(*in))
+               for i := range *in {
+                       (*in)[i].DeepCopyInto(&(*out)[i])
+               }
+       }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new IssuerList.
+func (in *IssuerList) DeepCopy() *IssuerList {
+       if in == nil {
+               return nil
+       }
+       out := new(IssuerList)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, 
creating a new runtime.Object.
+func (in *IssuerList) DeepCopyObject() runtime.Object {
+       if c := in.DeepCopy(); c != nil {
+               return c
+       }
+       return nil
+}
diff --git a/pkg/internal/client.go b/pkg/internal/client.go
index 2c15d3892..50f014123 100644
--- a/pkg/internal/client.go
+++ b/pkg/internal/client.go
@@ -79,7 +79,8 @@ func NewFakeClient(initObjs ...runtime.Object) 
(client.Client, error) {
                return strings.Contains(gvk.Group, "camel")
        })...)
        clientset := fakeclientset.NewSimpleClientset(filterObjects(scheme, 
initObjs, func(gvk schema.GroupVersionKind) bool {
-               return !strings.Contains(gvk.Group, "camel") && 
!strings.Contains(gvk.Group, "knative")
+               return !strings.Contains(gvk.Group, "camel") && 
!strings.Contains(gvk.Group, "knative") &&
+                       !strings.Contains(gvk.Group, "cert-manager")
        })...)
        replicasCount := make(map[string]int32)
        fakescaleclient := fakescale.FakeScaleClient{}
@@ -125,6 +126,7 @@ func NewFakeClient(initObjs ...runtime.Object) 
(client.Client, error) {
                scales:                 &fakescaleclient,
                enabledKnativeServing:  true,
                enabledKnativeEventing: true,
+               enabledCertManager:     true,
        }, nil
 }
 
@@ -203,10 +205,6 @@ func (c *FakeClient) EnableOpenshiftDiscovery() {
        c.enabledOpenshift = true
 }
 
-func (c *FakeClient) EnableCertManagerDiscovery() {
-       c.enabledCertManager = true
-}
-
 func (c *FakeClient) DisableKnativeServing() {
        c.enabledKnativeServing = false
 }
@@ -215,6 +213,10 @@ func (c *FakeClient) DisableKnativeEventing() {
        c.enabledKnativeEventing = false
 }
 
+func (c *FakeClient) DisableCertManagerDiscovery() {
+       c.enabledCertManager = false
+}
+
 func (c *FakeClient) AuthorizationV1() 
authorizationv1.AuthorizationV1Interface {
        return &FakeAuthorization{
                AuthorizationV1Interface: c.Interface.AuthorizationV1(),
diff --git a/pkg/trait/ingress.go b/pkg/trait/ingress.go
index b06efeec3..aadcce161 100644
--- a/pkg/trait/ingress.go
+++ b/pkg/trait/ingress.go
@@ -191,11 +191,12 @@ func (t *ingressTrait) Apply(e *Environment) error {
 func (t *ingressTrait) resolveCertManagerIssuer(e *Environment) 
(annotationKey, issuerName string, err error) {
        namespace := e.Integration.Namespace
 
+       installed, err := certmanager.IsInstalled(t.Client)
+       if err != nil {
+               return "", "", err
+       }
+
        if t.TLSIssuerName != "" {
-               installed, err := certmanager.IsInstalled(e.Client)
-               if err != nil {
-                       return "", "", err
-               }
                if !installed {
                        return "", "", fmt.Errorf("cert-manager is not 
installed but tlsIssuerName %q was set", t.TLSIssuerName)
                }
@@ -207,7 +208,7 @@ func (t *ingressTrait) resolveCertManagerIssuer(e 
*Environment) (annotationKey,
 
                switch kind {
                case "Issuer":
-                       exists, err := certmanager.GetIssuer(e.Ctx, e.Client, 
namespace, t.TLSIssuerName)
+                       exists, err := certmanager.GetIssuer(e.Ctx, t.Client, 
namespace, t.TLSIssuerName)
                        if err != nil {
                                return "", "", err
                        }
@@ -217,7 +218,7 @@ func (t *ingressTrait) resolveCertManagerIssuer(e 
*Environment) (annotationKey,
 
                        return certmanager.AnnotationIssuer, t.TLSIssuerName, 
nil
                case "ClusterIssuer":
-                       exists, err := certmanager.GetClusterIssuer(e.Ctx, 
e.Client, t.TLSIssuerName)
+                       exists, err := certmanager.GetClusterIssuer(e.Ctx, 
t.Client, t.TLSIssuerName)
                        if err != nil {
                                return "", "", err
                        }
@@ -231,19 +232,11 @@ func (t *ingressTrait) resolveCertManagerIssuer(e 
*Environment) (annotationKey,
                }
        }
 
-       if !ptr.Deref(t.TLSCertManagerAuto, false) {
-               return "", "", nil
-       }
-
-       installed, err := certmanager.IsInstalled(e.Client)
-       if err != nil {
-               return "", "", err
-       }
-       if !installed {
+       if !ptr.Deref(t.TLSCertManagerAuto, false) || !installed {
                return "", "", nil
        }
 
-       clusterIssuers, err := certmanager.ListClusterIssuers(e.Ctx, e.Client)
+       clusterIssuers, err := certmanager.ListClusterIssuers(e.Ctx, t.Client)
        if err != nil {
                return "", "", err
        }
@@ -251,7 +244,7 @@ func (t *ingressTrait) resolveCertManagerIssuer(e 
*Environment) (annotationKey,
                return certmanager.AnnotationClusterIssuer, clusterIssuers[0], 
nil
        }
 
-       issuers, err := certmanager.ListIssuers(e.Ctx, e.Client, namespace)
+       issuers, err := certmanager.ListIssuers(e.Ctx, t.Client, namespace)
        if err != nil {
                return "", "", err
        }
diff --git a/pkg/trait/ingress_test.go b/pkg/trait/ingress_test.go
index e7477567c..dd0acd237 100644
--- a/pkg/trait/ingress_test.go
+++ b/pkg/trait/ingress_test.go
@@ -27,11 +27,11 @@ import (
        corev1 "k8s.io/api/core/v1"
        networkingv1 "k8s.io/api/networking/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-       "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
        "k8s.io/apimachinery/pkg/runtime"
        "k8s.io/utils/ptr"
 
        v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+       certmanagerv1 
"github.com/apache/camel-k/v2/pkg/apis/duck/certmanager/v1"
        "github.com/apache/camel-k/v2/pkg/internal"
        "github.com/apache/camel-k/v2/pkg/util/certmanager"
        "github.com/apache/camel-k/v2/pkg/util/kubernetes"
@@ -345,7 +345,8 @@ func 
TestApplyIngressTraitCertManagerAutoNotInstalledDoesNoop(t *testing.T) {
        environment.Ctx = context.Background()
        fakeClient, err := internal.NewFakeClient()
        require.NoError(t, err)
-       environment.Client = fakeClient
+       fakeClient.(*internal.FakeClient).DisableCertManagerDiscovery()
+       ingressTrait.Client = fakeClient
 
        _, _, err = ingressTrait.Configure(environment)
        require.NoError(t, err)
@@ -367,8 +368,7 @@ func TestApplyIngressTraitCertManagerAutoNoIssuerDoesNoop(t 
*testing.T) {
        environment.Ctx = context.Background()
        fakeClient, err := internal.NewFakeClient()
        require.NoError(t, err)
-       fakeClient.(*internal.FakeClient).EnableCertManagerDiscovery()
-       environment.Client = fakeClient
+       ingressTrait.Client = fakeClient
 
        _, _, err = ingressTrait.Configure(environment)
        require.NoError(t, err)
@@ -391,8 +391,7 @@ func 
TestApplyIngressTraitCertManagerAutoClusterIssuerFoundDoesSucceed(t *testin
        clusterIssuer := newClusterIssuer("letsencrypt-prod")
        fakeClient, err := internal.NewFakeClient(clusterIssuer)
        require.NoError(t, err)
-       fakeClient.(*internal.FakeClient).EnableCertManagerDiscovery()
-       environment.Client = fakeClient
+       ingressTrait.Client = fakeClient
 
        _, _, err = ingressTrait.Configure(environment)
        require.NoError(t, err)
@@ -419,8 +418,7 @@ func TestApplyIngressTraitForcedIssuerExistsDoesSucceed(t 
*testing.T) {
        issuer := newIssuer("my-issuer", "namespace")
        fakeClient, err := internal.NewFakeClient(issuer)
        require.NoError(t, err)
-       fakeClient.(*internal.FakeClient).EnableCertManagerDiscovery()
-       environment.Client = fakeClient
+       ingressTrait.Client = fakeClient
 
        _, _, err = ingressTrait.Configure(environment)
        require.NoError(t, err)
@@ -443,8 +441,7 @@ func 
TestApplyIngressTraitForcedIssuerMissingDoesNotSucceed(t *testing.T) {
 
        fakeClient, err := internal.NewFakeClient()
        require.NoError(t, err)
-       fakeClient.(*internal.FakeClient).EnableCertManagerDiscovery()
-       environment.Client = fakeClient
+       ingressTrait.Client = fakeClient
 
        _, _, err = ingressTrait.Configure(environment)
 
@@ -460,7 +457,8 @@ func 
TestApplyIngressTraitForcedIssuerCertManagerNotInstalledDoesNotSucceed(t *t
 
        fakeClient, err := internal.NewFakeClient()
        require.NoError(t, err)
-       environment.Client = fakeClient
+       fakeClient.(*internal.FakeClient).DisableCertManagerDiscovery()
+       ingressTrait.Client = fakeClient
 
        _, _, err = ingressTrait.Configure(environment)
 
@@ -468,21 +466,16 @@ func 
TestApplyIngressTraitForcedIssuerCertManagerNotInstalledDoesNotSucceed(t *t
        assert.Contains(t, err.Error(), "cert-manager is not installed")
 }
 
-func newClusterIssuer(name string) *unstructured.Unstructured {
-       u := &unstructured.Unstructured{}
-       u.SetGroupVersionKind(certmanager.ClusterIssuerGVK)
-       u.SetName(name)
-
-       return u
+func newClusterIssuer(name string) *certmanagerv1.ClusterIssuer {
+       return &certmanagerv1.ClusterIssuer{
+               ObjectMeta: metav1.ObjectMeta{Name: name},
+       }
 }
 
-func newIssuer(name, namespace string) *unstructured.Unstructured {
-       u := &unstructured.Unstructured{}
-       u.SetGroupVersionKind(certmanager.IssuerGVK)
-       u.SetName(name)
-       u.SetNamespace(namespace)
-
-       return u
+func newIssuer(name, namespace string) *certmanagerv1.Issuer {
+       return &certmanagerv1.Issuer{
+               ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace},
+       }
 }
 
 func createNominalIngressTestWithIngressClassName(ingressClassName string) 
(*ingressTrait, *Environment) {
diff --git a/pkg/util/certmanager/enabled.go b/pkg/util/certmanager/enabled.go
index 627002280..32b13a7d4 100644
--- a/pkg/util/certmanager/enabled.go
+++ b/pkg/util/certmanager/enabled.go
@@ -23,42 +23,21 @@ import (
 
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
        "k8s.io/apimachinery/pkg/api/meta"
-       "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
        "k8s.io/apimachinery/pkg/runtime/schema"
        "k8s.io/client-go/kubernetes"
        ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
+       certmanagerv1 
"github.com/apache/camel-k/v2/pkg/apis/duck/certmanager/v1"
        kubernetesutil "github.com/apache/camel-k/v2/pkg/util/kubernetes"
 )
 
 const (
-       // CertManagerAPIGroup is the API group for cert-manager.
-       CertManagerAPIGroup = "cert-manager.io"
-       // CertManagerAPIVersion is the current API version for cert-manager.
-       CertManagerAPIVersion = "v1"
-
        // AnnotationClusterIssuer is the Ingress annotation to specify a 
ClusterIssuer.
        AnnotationClusterIssuer = "cert-manager.io/cluster-issuer"
        // AnnotationIssuer is the Ingress annotation to specify a namespaced 
Issuer.
        AnnotationIssuer = "cert-manager.io/issuer"
 )
 
-var (
-       // ClusterIssuerGVK is the GroupVersionKind for cert-manager 
ClusterIssuer.
-       ClusterIssuerGVK = schema.GroupVersionKind{
-               Group:   CertManagerAPIGroup,
-               Version: CertManagerAPIVersion,
-               Kind:    "ClusterIssuer",
-       }
-
-       // IssuerGVK is the GroupVersionKind for cert-manager Issuer.
-       IssuerGVK = schema.GroupVersionKind{
-               Group:   CertManagerAPIGroup,
-               Version: CertManagerAPIVersion,
-               Kind:    "Issuer",
-       }
-)
-
 func isResourceNotFoundError(err error) bool {
        if err == nil {
                return false
@@ -70,8 +49,8 @@ func isResourceNotFoundError(err error) bool {
 // IsInstalled returns true if connected to a cluster with cert-manager 
installed.
 func IsInstalled(c kubernetes.Interface) (bool, error) {
        _, err := 
c.Discovery().ServerResourcesForGroupVersion(schema.GroupVersion{
-               Group:   CertManagerAPIGroup,
-               Version: CertManagerAPIVersion,
+               Group:   certmanagerv1.CertManagerGroup,
+               Version: certmanagerv1.CertManagerVersion,
        }.String())
        if isResourceNotFoundError(err) {
                return false, nil
@@ -84,13 +63,7 @@ func IsInstalled(c kubernetes.Interface) (bool, error) {
 
 // ListClusterIssuers returns all ClusterIssuer names available in the cluster.
 func ListClusterIssuers(ctx context.Context, c ctrl.Reader) ([]string, error) {
-       list := &unstructured.UnstructuredList{}
-       list.SetGroupVersionKind(schema.GroupVersionKind{
-               Group:   CertManagerAPIGroup,
-               Version: CertManagerAPIVersion,
-               Kind:    "ClusterIssuerList",
-       })
-
+       list := &certmanagerv1.ClusterIssuerList{}
        if err := c.List(ctx, list); err != nil {
                if isResourceNotFoundError(err) {
                        return nil, nil
@@ -101,7 +74,7 @@ func ListClusterIssuers(ctx context.Context, c ctrl.Reader) 
([]string, error) {
 
        names := make([]string, 0, len(list.Items))
        for _, item := range list.Items {
-               names = append(names, item.GetName())
+               names = append(names, item.Name)
        }
        sort.Strings(names)
 
@@ -110,7 +83,7 @@ func ListClusterIssuers(ctx context.Context, c ctrl.Reader) 
([]string, error) {
 
 // GetClusterIssuer checks if a specific ClusterIssuer exists in the cluster.
 func GetClusterIssuer(ctx context.Context, c ctrl.Reader, name string) (bool, 
error) {
-       _, err := kubernetesutil.GetUnstructured(ctx, c, ClusterIssuerGVK, 
name, "")
+       err := c.Get(ctx, ctrl.ObjectKey{Name: name}, 
&certmanagerv1.ClusterIssuer{})
        if err != nil {
                if isResourceNotFoundError(err) {
                        return false, nil
@@ -124,13 +97,7 @@ func GetClusterIssuer(ctx context.Context, c ctrl.Reader, 
name string) (bool, er
 
 // ListIssuers returns all Issuer names available in a specific namespace.
 func ListIssuers(ctx context.Context, c ctrl.Reader, namespace string) 
([]string, error) {
-       list := &unstructured.UnstructuredList{}
-       list.SetGroupVersionKind(schema.GroupVersionKind{
-               Group:   CertManagerAPIGroup,
-               Version: CertManagerAPIVersion,
-               Kind:    "IssuerList",
-       })
-
+       list := &certmanagerv1.IssuerList{}
        if err := c.List(ctx, list, ctrl.InNamespace(namespace)); err != nil {
                if isResourceNotFoundError(err) {
                        return nil, nil
@@ -141,7 +108,7 @@ func ListIssuers(ctx context.Context, c ctrl.Reader, 
namespace string) ([]string
 
        names := make([]string, 0, len(list.Items))
        for _, item := range list.Items {
-               names = append(names, item.GetName())
+               names = append(names, item.Name)
        }
        sort.Strings(names)
 
@@ -150,7 +117,7 @@ func ListIssuers(ctx context.Context, c ctrl.Reader, 
namespace string) ([]string
 
 // GetIssuer checks if a specific namespaced Issuer exists.
 func GetIssuer(ctx context.Context, c ctrl.Reader, namespace, name string) 
(bool, error) {
-       _, err := kubernetesutil.GetUnstructured(ctx, c, IssuerGVK, name, 
namespace)
+       err := c.Get(ctx, ctrl.ObjectKey{Name: name, Namespace: namespace}, 
&certmanagerv1.Issuer{})
        if err != nil {
                if isResourceNotFoundError(err) {
                        return false, nil
diff --git a/pkg/util/certmanager/enabled_test.go 
b/pkg/util/certmanager/enabled_test.go
index 65a0c60ef..5b77247a7 100644
--- a/pkg/util/certmanager/enabled_test.go
+++ b/pkg/util/certmanager/enabled_test.go
@@ -27,10 +27,11 @@ import (
        "github.com/stretchr/testify/require"
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
        "k8s.io/apimachinery/pkg/api/meta"
-       "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/runtime/schema"
        ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
+       certmanagerv1 
"github.com/apache/camel-k/v2/pkg/apis/duck/certmanager/v1"
        "github.com/apache/camel-k/v2/pkg/internal"
 )
 
@@ -56,26 +57,21 @@ func (m *errorMockReader) Get(ctx context.Context, key 
ctrl.ObjectKey, obj ctrl.
        return m.Reader.Get(ctx, key, obj, opts...)
 }
 
-func newUnstructuredClusterIssuer(name string) *unstructured.Unstructured {
-       u := &unstructured.Unstructured{}
-       u.SetGroupVersionKind(ClusterIssuerGVK)
-       u.SetName(name)
-
-       return u
+func newClusterIssuer(name string) *certmanagerv1.ClusterIssuer {
+       return &certmanagerv1.ClusterIssuer{
+               ObjectMeta: metav1.ObjectMeta{Name: name},
+       }
 }
 
-func newUnstructuredIssuer(namespace, name string) *unstructured.Unstructured {
-       u := &unstructured.Unstructured{}
-       u.SetGroupVersionKind(IssuerGVK)
-       u.SetNamespace(namespace)
-       u.SetName(name)
-
-       return u
+func newIssuer(namespace, name string) *certmanagerv1.Issuer {
+       return &certmanagerv1.Issuer{
+               ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: name},
+       }
 }
 
 func TestListClusterIssuers(t *testing.T) {
-       ci1 := newUnstructuredClusterIssuer("letsencrypt-staging")
-       ci2 := newUnstructuredClusterIssuer("letsencrypt-prod")
+       ci1 := newClusterIssuer("letsencrypt-staging")
+       ci2 := newClusterIssuer("letsencrypt-prod")
 
        c, err := internal.NewFakeClient(ci1, ci2)
        require.NoError(t, err)
@@ -86,7 +82,7 @@ func TestListClusterIssuers(t *testing.T) {
 }
 
 func TestGetClusterIssuer(t *testing.T) {
-       ci := newUnstructuredClusterIssuer("my-cluster-issuer")
+       ci := newClusterIssuer("my-cluster-issuer")
 
        c, err := internal.NewFakeClient(ci)
        require.NoError(t, err)
@@ -101,9 +97,9 @@ func TestGetClusterIssuer(t *testing.T) {
 }
 
 func TestListIssuers(t *testing.T) {
-       i1 := newUnstructuredIssuer("ns1", "issuer-b")
-       i2 := newUnstructuredIssuer("ns1", "issuer-a")
-       i3 := newUnstructuredIssuer("ns2", "issuer-other")
+       i1 := newIssuer("ns1", "issuer-b")
+       i2 := newIssuer("ns1", "issuer-a")
+       i3 := newIssuer("ns2", "issuer-other")
 
        c, err := internal.NewFakeClient(i1, i2, i3)
        require.NoError(t, err)
@@ -122,7 +118,7 @@ func TestListIssuers(t *testing.T) {
 }
 
 func TestGetIssuer(t *testing.T) {
-       i := newUnstructuredIssuer("test-ns", "my-issuer")
+       i := newIssuer("test-ns", "my-issuer")
 
        c, err := internal.NewFakeClient(i)
        require.NoError(t, err)
@@ -145,7 +141,7 @@ func TestCRDsAbsentEntirely(t *testing.T) {
        require.NoError(t, err)
 
        noKindMatchErr := &meta.NoKindMatchError{
-               GroupKind:        schema.GroupKind{Group: CertManagerAPIGroup, 
Kind: "ClusterIssuerList"},
+               GroupKind:        schema.GroupKind{Group: 
certmanagerv1.CertManagerGroup, Kind: "ClusterIssuerList"},
                SearchedVersions: []string{"v1"},
        }
 
@@ -202,7 +198,7 @@ func TestCRDsAbsentViaNotFoundError(t *testing.T) {
        require.NoError(t, err)
 
        notFoundErr := k8serrors.NewNotFound(
-               schema.GroupResource{Group: CertManagerAPIGroup, Resource: 
"clusterissuers"},
+               schema.GroupResource{Group: certmanagerv1.CertManagerGroup, 
Resource: "clusterissuers"},
                "my-ci",
        )
 

Reply via email to