From b1e12755f71cb7bbf47f71c0120480290cc211b2 Mon Sep 17 00:00:00 2001 From: Hardik Dodiya Date: Wed, 5 Mar 2025 17:00:08 +0100 Subject: [PATCH] Reconcile ServerBootConfig when reference Ignition Secret is updated --- ...serverbootconfiguration_http_controller.go | 38 +++++++++++++++++++ .../serverbootconfiguration_pxe_controller.go | 38 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/internal/controller/serverbootconfiguration_http_controller.go b/internal/controller/serverbootconfiguration_http_controller.go index fb8331f5..3ae4feb3 100644 --- a/internal/controller/serverbootconfiguration_http_controller.go +++ b/internal/controller/serverbootconfiguration_http_controller.go @@ -8,6 +8,12 @@ import ( "fmt" "strings" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "github.com/go-logr/logr" bootv1alpha1 "github.com/ironcore-dev/boot-operator/api/v1alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -177,5 +183,37 @@ func (r *ServerBootConfigurationHTTPReconciler) SetupWithManager(mgr ctrl.Manage return ctrl.NewControllerManagedBy(mgr). For(&metalv1alpha1.ServerBootConfiguration{}). Owns(&bootv1alpha1.HTTPBootConfig{}). + Watches( + &corev1.Secret{}, + handler.EnqueueRequestsFromMapFunc(r.enqueueServerBootConfigReferencingIgnitionSecret), + ). Complete(r) } + +func (r *ServerBootConfigurationHTTPReconciler) enqueueServerBootConfigReferencingIgnitionSecret(ctx context.Context, secret client.Object) []reconcile.Request { + log := log.Log.WithValues("secret", secret.GetName()) + secretObj, ok := secret.(*corev1.Secret) + if !ok { + log.Error(nil, "can't decode object into Secret", secret) + return nil + } + + list := &metalv1alpha1.ServerBootConfigurationList{} + if err := r.Client.List(ctx, list, client.InNamespace(secretObj.Namespace)); err != nil { + log.Error(err, "failed to list ServerBootConfiguration for secret", secret) + return nil + } + + var requests []reconcile.Request + for _, serverBootConfig := range list.Items { + if serverBootConfig.Spec.IgnitionSecretRef != nil && serverBootConfig.Spec.IgnitionSecretRef.Name == secretObj.Name { + requests = append(requests, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: serverBootConfig.Name, + Namespace: serverBootConfig.Namespace, + }, + }) + } + } + return requests +} diff --git a/internal/controller/serverbootconfiguration_pxe_controller.go b/internal/controller/serverbootconfiguration_pxe_controller.go index d3f81112..5b2d55ce 100644 --- a/internal/controller/serverbootconfiguration_pxe_controller.go +++ b/internal/controller/serverbootconfiguration_pxe_controller.go @@ -23,6 +23,12 @@ import ( "io" "strings" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "github.com/ironcore-dev/boot-operator/api/v1alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -313,5 +319,37 @@ func (r *ServerBootConfigurationPXEReconciler) SetupWithManager(mgr ctrl.Manager return ctrl.NewControllerManagedBy(mgr). For(&metalv1alpha1.ServerBootConfiguration{}). Owns(&v1alpha1.IPXEBootConfig{}). + Watches( + &corev1.Secret{}, + handler.EnqueueRequestsFromMapFunc(r.enqueueServerBootConfigReferencingIgnitionSecret), + ). Complete(r) } + +func (r *ServerBootConfigurationPXEReconciler) enqueueServerBootConfigReferencingIgnitionSecret(ctx context.Context, secret client.Object) []reconcile.Request { + log := log.Log.WithValues("secret", secret.GetName()) + secretObj, ok := secret.(*corev1.Secret) + if !ok { + log.Error(nil, "can't decode object into Secret", secret) + return nil + } + + list := &metalv1alpha1.ServerBootConfigurationList{} + if err := r.Client.List(ctx, list, client.InNamespace(secretObj.Namespace)); err != nil { + log.Error(err, "failed to list ServerBootConfiguration for secret", secret) + return nil + } + + var requests []reconcile.Request + for _, serverBootConfig := range list.Items { + if serverBootConfig.Spec.IgnitionSecretRef != nil && serverBootConfig.Spec.IgnitionSecretRef.Name == secretObj.Name { + requests = append(requests, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: serverBootConfig.Name, + Namespace: serverBootConfig.Namespace, + }, + }) + } + } + return requests +}