Skip to content

Commit 903f3f4

Browse files
committed
fix: considers objects in kube-system for cert-manager to avoid upgrading twice
1 parent f8a2970 commit 903f3f4

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

cmd/clusterctl/client/cluster/cert_manager.go

+21-5
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@ package cluster
1919
import (
2020
"context"
2121
_ "embed"
22+
"slices"
2223
"time"
2324

2425
"github.com/blang/semver/v4"
2526
"github.com/pkg/errors"
2627
corev1 "k8s.io/api/core/v1"
2728
apierrors "k8s.io/apimachinery/pkg/api/errors"
29+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2830
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2931
"sigs.k8s.io/controller-runtime/pkg/client"
3032

@@ -201,12 +203,10 @@ func (cm *certManagerClient) install(ctx context.Context, version string, objs [
201203
// a cert-manager upgrade if necessary.
202204
func (cm *certManagerClient) PlanUpgrade(ctx context.Context) (CertManagerUpgradePlan, error) {
203205
log := logf.Log
204-
205-
objs, err := cm.proxy.ListResources(ctx, map[string]string{clusterctlv1.ClusterctlCoreLabel: clusterctlv1.ClusterctlCoreLabelCertManagerValue}, certManagerNamespace)
206+
objs, err := cm.getFilteredCertManagerResources(ctx)
206207
if err != nil {
207-
return CertManagerUpgradePlan{}, errors.Wrap(err, "failed get cert manager components")
208+
return CertManagerUpgradePlan{}, err
208209
}
209-
210210
// If there are no cert manager components with the clusterctl labels, it means that cert-manager is externally managed.
211211
if len(objs) == 0 {
212212
log.V(5).Info("Skipping cert-manager version check because externally managed")
@@ -236,12 +236,28 @@ func (cm *certManagerClient) PlanUpgrade(ctx context.Context) (CertManagerUpgrad
236236
}, nil
237237
}
238238

239+
// getFilteredCertManagerResources gets all relevant objects for a cert-manager installation.
240+
// It also includes relevant resources in the kube-system namespace, which is used by cert-manager
241+
// for leader election (https://github.com/cert-manager/cert-manager/issues/6716).
242+
// It excludes resources that are related to the cert-manager installation, but not relevant
243+
// to evaluating if cert-manager needs an upgrade.
244+
func (cm *certManagerClient) getFilteredCertManagerResources(ctx context.Context) ([]unstructured.Unstructured, error) {
245+
objs, err := cm.proxy.ListResources(ctx, map[string]string{clusterctlv1.ClusterctlCoreLabel: clusterctlv1.ClusterctlCoreLabelCertManagerValue}, certManagerNamespace, metav1.NamespaceSystem)
246+
if err != nil {
247+
return nil, errors.Wrap(err, "failed get cert-manager components")
248+
}
249+
objs = slices.DeleteFunc(objs, func(obj unstructured.Unstructured) bool {
250+
return obj.GetKind() == "Endpoints" || obj.GetKind() == "EndpointSlice"
251+
})
252+
return objs, nil
253+
}
254+
239255
// EnsureLatestVersion checks the cert-manager version currently installed, and if it is
240256
// older than the version currently suggested by clusterctl, upgrades it.
241257
func (cm *certManagerClient) EnsureLatestVersion(ctx context.Context) error {
242258
log := logf.Log
243259

244-
objs, err := cm.proxy.ListResources(ctx, map[string]string{clusterctlv1.ClusterctlCoreLabel: clusterctlv1.ClusterctlCoreLabelCertManagerValue}, certManagerNamespace)
260+
objs, err := cm.getFilteredCertManagerResources(ctx)
245261
if err != nil {
246262
return errors.Wrap(err, "failed get cert manager components")
247263
}

0 commit comments

Comments
 (0)