From 0e6b2391ee0c2949e17fb881094d4f50a8ed296b Mon Sep 17 00:00:00 2001 From: Adrian Pedriza Date: Tue, 25 Mar 2025 17:27:41 +0100 Subject: [PATCH] Refine logging when controller waits for ClusterConfig resource Signed-off-by: Adrian Pedriza --- .../k0s_controlplane_controller.go | 44 ++++++++++--------- internal/util/dynamic_config.go | 7 +++ 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/internal/controller/controlplane/k0s_controlplane_controller.go b/internal/controller/controlplane/k0s_controlplane_controller.go index 0986d681f..416d8f306 100644 --- a/internal/controller/controlplane/k0s_controlplane_controller.go +++ b/internal/controller/controlplane/k0s_controlplane_controller.go @@ -193,21 +193,6 @@ func (c *K0sController) Reconcile(ctx context.Context, req ctrl.Request) (res ct log = log.WithValues("cluster", cluster.Name) - if err := c.ensureCertificates(ctx, cluster, kcp); err != nil { - log.Error(err, "Failed to ensure certificates") - return ctrl.Result{}, err - } - - if err := c.reconcileTunneling(ctx, cluster, kcp); err != nil { - log.Error(err, "Failed to reconcile tunneling") - return ctrl.Result{}, err - } - - if err := c.reconcileConfig(ctx, cluster, kcp); err != nil { - log.Error(err, "Failed to reconcile config") - return ctrl.Result{}, err - } - err = c.reconcile(ctx, cluster, kcp) if err != nil { if errors.Is(err, ErrNotReady) { @@ -317,6 +302,18 @@ func (c *K0sController) reconcileKubeconfig(ctx context.Context, cluster *cluste } func (c *K0sController) reconcile(ctx context.Context, cluster *clusterv1.Cluster, kcp *cpv1beta1.K0sControlPlane) error { + if err := c.ensureCertificates(ctx, cluster, kcp); err != nil { + return fmt.Errorf("failed to ensure certificates: %w", err) + } + + if err := c.reconcileTunneling(ctx, cluster, kcp); err != nil { + return fmt.Errorf("failed to reconcile tunneling: %w", err) + } + + if err := c.reconcileConfig(ctx, cluster, kcp); err != nil { + return fmt.Errorf("failed to reconcile config: %w", err) + } + var err error kcp.Spec.K0sConfigSpec.K0s, err = enrichK0sConfigWithClusterData(cluster, kcp.Spec.K0sConfigSpec.K0s) if err != nil { @@ -671,11 +668,18 @@ func (c *K0sController) reconcileConfig(ctx context.Context, cluster *clusterv1. } } - // Reconcile the dynamic config - dErr := kutil.ReconcileDynamicConfig(ctx, cluster, c.Client, *kcp.Spec.K0sConfigSpec.K0s.DeepCopy()) - if dErr != nil { - // Don't return error from dynamic config reconciliation, as it may not be created yet - log.Error(fmt.Errorf("failed to reconcile dynamic config, kubeconfig may not be available yet: %w", dErr), "Failed to reconcile dynamic config") + // Reconcile the dynamic config. The status must be Ready, denoting that the workload cluster API is available to modify + // the configuration dynamically. + if kcp.Status.Ready { + err := kutil.ReconcileDynamicConfig(ctx, cluster, c.Client, *kcp.Spec.K0sConfigSpec.K0s.DeepCopy()) + if err != nil { + if errors.Is(err, kutil.ErrClusterConfigNotFound) { + log.Info("ClusterConfig is not available yet") + return fmt.Errorf("%v: %w", err, ErrNotReady) + } + + return err + } } } diff --git a/internal/util/dynamic_config.go b/internal/util/dynamic_config.go index 2960b680a..1ca3f2256 100644 --- a/internal/util/dynamic_config.go +++ b/internal/util/dynamic_config.go @@ -2,9 +2,11 @@ package util import ( "context" + "errors" "fmt" "time" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/wait" @@ -14,6 +16,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) +var ErrClusterConfigNotFound = errors.New("ClusterConfig not available yet") + func ReconcileDynamicConfig(ctx context.Context, cluster metav1.Object, cli client.Client, u unstructured.Unstructured) error { u.SetName("k0s") u.SetNamespace("kube-system") @@ -45,6 +49,9 @@ func ReconcileDynamicConfig(ctx context.Context, cluster metav1.Object, cli clie return chCS.Patch(ctx, &u, client.RawPatch(client.Merge.Type(), b), []client.PatchOption{}...) }) if err != nil { + if apierrors.IsNotFound(err) { + return fmt.Errorf("failed to patch k0s config: %w", ErrClusterConfigNotFound) + } return fmt.Errorf("failed to patch k0s config: %w", err) }