From 9f331cac4f76cb275557e369c9ee8c5309a99d5c Mon Sep 17 00:00:00 2001 From: TheiLLeniumStudios <104288623+TheiLLeniumStudios@users.noreply.github.com> Date: Sun, 28 Dec 2025 14:52:44 +0100 Subject: [PATCH] refactor(reloader): replace CreateOrUpdate with Runnable for metadata publishing and update RBAC to include watch permission --- cmd/reloader/main.go | 4 +-- .../kubernetes/chart/reloader/Chart.yaml | 2 +- .../chart/reloader/templates/clusterrole.yaml | 1 + .../chart/reloader/templates/role.yaml | 1 + internal/pkg/metadata/publisher.go | 33 ++++++++++++++----- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/cmd/reloader/main.go b/cmd/reloader/main.go index 712a9d5a..f89a3375 100644 --- a/cmd/reloader/main.go +++ b/cmd/reloader/main.go @@ -119,8 +119,8 @@ func run(cmd *cobra.Command, args []string) error { return fmt.Errorf("setting up reconcilers: %w", err) } - if err := metadata.CreateOrUpdate(mgr.GetClient(), cfg, log); err != nil { - log.Error(err, "Failed to create metadata ConfigMap") + if err := mgr.Add(metadata.Runnable(mgr.GetClient(), cfg, log)); err != nil { + log.Error(err, "Failed to add metadata publisher") // Non-fatal, continue starting } diff --git a/deployments/kubernetes/chart/reloader/Chart.yaml b/deployments/kubernetes/chart/reloader/Chart.yaml index 536fd6be..8c4c4508 100644 --- a/deployments/kubernetes/chart/reloader/Chart.yaml +++ b/deployments/kubernetes/chart/reloader/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v1 name: reloader description: Reloader chart that runs on kubernetes -version: 2.2.7 +version: 2.3.0 appVersion: v1.4.12 keywords: - Reloader diff --git a/deployments/kubernetes/chart/reloader/templates/clusterrole.yaml b/deployments/kubernetes/chart/reloader/templates/clusterrole.yaml index 9f655aa9..c229c113 100644 --- a/deployments/kubernetes/chart/reloader/templates/clusterrole.yaml +++ b/deployments/kubernetes/chart/reloader/templates/clusterrole.yaml @@ -76,6 +76,7 @@ rules: - get - update - patch + - watch {{- if .Values.reloader.ignoreCronJobs }}{{- else }} - apiGroups: - "batch" diff --git a/deployments/kubernetes/chart/reloader/templates/role.yaml b/deployments/kubernetes/chart/reloader/templates/role.yaml index 70a68157..860cf895 100644 --- a/deployments/kubernetes/chart/reloader/templates/role.yaml +++ b/deployments/kubernetes/chart/reloader/templates/role.yaml @@ -67,6 +67,7 @@ rules: - get - update - patch + - watch - apiGroups: - "batch" resources: diff --git a/internal/pkg/metadata/publisher.go b/internal/pkg/metadata/publisher.go index 78bfa92a..b92cc8c7 100644 --- a/internal/pkg/metadata/publisher.go +++ b/internal/pkg/metadata/publisher.go @@ -40,10 +40,12 @@ func (p *Publisher) Publish(ctx context.Context) error { configMap := metaInfo.ToConfigMap() existing := &corev1.ConfigMap{} - err := p.client.Get(ctx, client.ObjectKey{ - Name: ConfigMapName, - Namespace: namespace, - }, existing) + err := p.client.Get( + ctx, client.ObjectKey{ + Name: ConfigMapName, + Namespace: namespace, + }, existing, + ) if err != nil { if !errors.IsNotFound(err) { @@ -73,8 +75,23 @@ func PublishMetaInfoConfigMap(ctx context.Context, c client.Client, cfg *config. return publisher.Publish(ctx) } -// CreateOrUpdate creates or updates the metadata ConfigMap using the provided client. -func CreateOrUpdate(c client.Client, cfg *config.Config, log logr.Logger) error { - ctx := context.Background() - return PublishMetaInfoConfigMap(ctx, c, cfg, log) +// Runnable returns a controller-runtime Runnable that publishes the metadata ConfigMap +// when the manager starts. This ensures the cache is ready before accessing the API. +func Runnable(c client.Client, cfg *config.Config, log logr.Logger) RunnableFunc { + return func(ctx context.Context) error { + if err := PublishMetaInfoConfigMap(ctx, c, cfg, log); err != nil { + log.Error(err, "Failed to create metadata ConfigMap") + // Non-fatal, don't return error to avoid crashing the manager + } + <-ctx.Done() + return nil + } +} + +// RunnableFunc is a function that implements the controller-runtime Runnable interface. +type RunnableFunc func(context.Context) error + +// Start implements the Runnable interface. +func (r RunnableFunc) Start(ctx context.Context) error { + return r(ctx) }