Skip to content

Commit fae02e5

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

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

cmd/clusterctl/client/cluster/cert_manager.go

+17-11
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

@@ -53,6 +55,10 @@ const (
5355
var (
5456
//go:embed assets/cert-manager-test-resources.yaml
5557
certManagerTestManifest []byte
58+
// namespaces for all relevant objects in a cert-manager installation.
59+
// It also includes relevant resources in the kube-system namespace, which is used by cert-manager
60+
// for leader election (https://github.com/cert-manager/cert-manager/issues/6716).
61+
certManagerNamespaces = []string{certManagerNamespace, metav1.NamespaceSystem}
5662
)
5763

5864
// CertManagerUpgradePlan defines the upgrade plan if cert-manager needs to be
@@ -202,9 +208,9 @@ func (cm *certManagerClient) install(ctx context.Context, version string, objs [
202208
func (cm *certManagerClient) PlanUpgrade(ctx context.Context) (CertManagerUpgradePlan, error) {
203209
log := logf.Log
204210

205-
objs, err := cm.proxy.ListResources(ctx, map[string]string{clusterctlv1.ClusterctlCoreLabel: clusterctlv1.ClusterctlCoreLabelCertManagerValue}, certManagerNamespace)
211+
objs, err := cm.proxy.ListResources(ctx, map[string]string{clusterctlv1.ClusterctlCoreLabel: clusterctlv1.ClusterctlCoreLabelCertManagerValue}, certManagerNamespaces...)
206212
if err != nil {
207-
return CertManagerUpgradePlan{}, errors.Wrap(err, "failed get cert manager components")
213+
return CertManagerUpgradePlan{}, errors.Wrap(err, "failed to get cert-manager components")
208214
}
209215

210216
// If there are no cert manager components with the clusterctl labels, it means that cert-manager is externally managed.
@@ -240,12 +246,10 @@ func (cm *certManagerClient) PlanUpgrade(ctx context.Context) (CertManagerUpgrad
240246
// older than the version currently suggested by clusterctl, upgrades it.
241247
func (cm *certManagerClient) EnsureLatestVersion(ctx context.Context) error {
242248
log := logf.Log
243-
244-
objs, err := cm.proxy.ListResources(ctx, map[string]string{clusterctlv1.ClusterctlCoreLabel: clusterctlv1.ClusterctlCoreLabelCertManagerValue}, certManagerNamespace)
249+
objs, err := cm.proxy.ListResources(ctx, map[string]string{clusterctlv1.ClusterctlCoreLabel: clusterctlv1.ClusterctlCoreLabelCertManagerValue}, certManagerNamespaces...)
245250
if err != nil {
246-
return errors.Wrap(err, "failed get cert manager components")
251+
return errors.Wrap(err, "failed to get cert-manager components")
247252
}
248-
249253
// If there are no cert manager components with the clusterctl labels, it means that cert-manager is externally managed.
250254
if len(objs) == 0 {
251255
log.V(5).Info("Skipping cert-manager upgrade because externally managed")
@@ -338,14 +342,16 @@ func (cm *certManagerClient) shouldUpgrade(desiredVersion string, objs, installO
338342

339343
needUpgrade := false
340344
currentVersion := ""
345+
346+
// removes resources that are generated by the kubernetes API
347+
// this is relevant if the versions are the same, because we compare
348+
// the number of objects when version of objects are equal
349+
objs = slices.DeleteFunc(objs, func(obj unstructured.Unstructured) bool {
350+
return obj.GetKind() == "Endpoints" || obj.GetKind() == "EndpointSlice"
351+
})
341352
for i := range objs {
342353
obj := objs[i]
343354

344-
// Endpoints and EndpointSlices are generated by Kubernetes without the version annotation, so we are skipping them
345-
if obj.GetKind() == "Endpoints" || obj.GetKind() == "EndpointSlice" {
346-
continue
347-
}
348-
349355
// if there is no version annotation, this means the obj is cert-manager v0.11.0 (installed with older version of clusterctl)
350356
objVersion, ok := obj.GetAnnotations()[clusterctlv1.CertManagerVersionAnnotation]
351357
if !ok {

0 commit comments

Comments
 (0)