@@ -19,12 +19,15 @@ package cluster
19
19
import (
20
20
"context"
21
21
_ "embed"
22
+ "slices"
22
23
"time"
23
24
24
25
"github.com/blang/semver/v4"
25
26
"github.com/pkg/errors"
26
27
corev1 "k8s.io/api/core/v1"
27
28
apierrors "k8s.io/apimachinery/pkg/api/errors"
29
+
30
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
31
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
29
32
"sigs.k8s.io/controller-runtime/pkg/client"
30
33
@@ -201,12 +204,10 @@ func (cm *certManagerClient) install(ctx context.Context, version string, objs [
201
204
// a cert-manager upgrade if necessary.
202
205
func (cm * certManagerClient ) PlanUpgrade (ctx context.Context ) (CertManagerUpgradePlan , error ) {
203
206
log := logf .Log
204
-
205
- objs , err := cm .proxy .ListResources (ctx , map [string ]string {clusterctlv1 .ClusterctlCoreLabel : clusterctlv1 .ClusterctlCoreLabelCertManagerValue }, certManagerNamespace )
207
+ objs , err := cm .getFilteredCertManagerResources (ctx )
206
208
if err != nil {
207
- return CertManagerUpgradePlan {}, errors . Wrap ( err , "failed get cert manager components" )
209
+ return CertManagerUpgradePlan {}, err
208
210
}
209
-
210
211
// If there are no cert manager components with the clusterctl labels, it means that cert-manager is externally managed.
211
212
if len (objs ) == 0 {
212
213
log .V (5 ).Info ("Skipping cert-manager version check because externally managed" )
@@ -236,12 +237,28 @@ func (cm *certManagerClient) PlanUpgrade(ctx context.Context) (CertManagerUpgrad
236
237
}, nil
237
238
}
238
239
240
+ // getFilteredCertManagerResources gets all relevant objects for a cert-manager deployment
241
+ // it also includes objects in the kube-system namespace because leader election namespace
242
+ // is hard coded to kube-system https://github.com/cert-manager/cert-manager/issues/6716
243
+ // it also deletes components that are created by Kubernetes and won't be used to see if
244
+ // new objects need to be created for a cert-manager upgrade.
245
+ func (cm * certManagerClient ) getFilteredCertManagerResources (ctx context.Context ) ([]unstructured.Unstructured , error ) {
246
+ objs , err := cm .proxy .ListResources (ctx , map [string ]string {clusterctlv1 .ClusterctlCoreLabel : clusterctlv1 .ClusterctlCoreLabelCertManagerValue }, certManagerNamespace , metav1 .NamespaceSystem )
247
+ if err != nil {
248
+ return nil , errors .Wrap (err , "failed get cert manager components" )
249
+ }
250
+ objs = slices .DeleteFunc (objs , func (obj unstructured.Unstructured ) bool {
251
+ return obj .GetKind () == "Endpoints" || obj .GetKind () == "EndpointSlice"
252
+ })
253
+ return objs , nil
254
+ }
255
+
239
256
// EnsureLatestVersion checks the cert-manager version currently installed, and if it is
240
257
// older than the version currently suggested by clusterctl, upgrades it.
241
258
func (cm * certManagerClient ) EnsureLatestVersion (ctx context.Context ) error {
242
259
log := logf .Log
243
260
244
- objs , err := cm .proxy . ListResources (ctx , map [ string ] string { clusterctlv1 . ClusterctlCoreLabel : clusterctlv1 . ClusterctlCoreLabelCertManagerValue }, certManagerNamespace )
261
+ objs , err := cm .getFilteredCertManagerResources (ctx )
245
262
if err != nil {
246
263
return errors .Wrap (err , "failed get cert manager components" )
247
264
}
0 commit comments