Skip to content

Commit b1e4aea

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

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

cmd/clusterctl/client/cluster/cert_manager.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@ 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+
30+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2831
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2932
"sigs.k8s.io/controller-runtime/pkg/client"
3033

@@ -201,12 +204,10 @@ func (cm *certManagerClient) install(ctx context.Context, version string, objs [
201204
// a cert-manager upgrade if necessary.
202205
func (cm *certManagerClient) PlanUpgrade(ctx context.Context) (CertManagerUpgradePlan, error) {
203206
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)
206208
if err != nil {
207-
return CertManagerUpgradePlan{}, errors.Wrap(err, "failed get cert manager components")
209+
return CertManagerUpgradePlan{}, err
208210
}
209-
210211
// If there are no cert manager components with the clusterctl labels, it means that cert-manager is externally managed.
211212
if len(objs) == 0 {
212213
log.V(5).Info("Skipping cert-manager version check because externally managed")
@@ -236,12 +237,28 @@ func (cm *certManagerClient) PlanUpgrade(ctx context.Context) (CertManagerUpgrad
236237
}, nil
237238
}
238239

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+
239256
// EnsureLatestVersion checks the cert-manager version currently installed, and if it is
240257
// older than the version currently suggested by clusterctl, upgrades it.
241258
func (cm *certManagerClient) EnsureLatestVersion(ctx context.Context) error {
242259
log := logf.Log
243260

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

0 commit comments

Comments
 (0)