package controller import ( "context" "strings" "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" v1alpha1 "git.unkin.net/unkin/kea-operator/api/v1alpha1" ) // KeaClientClassReconciler validates KeaClientClass CRs and maintains status. type KeaClientClassReconciler struct { client.Client Scheme *runtime.Scheme } // +kubebuilder:rbac:groups=kea.unkin.net,resources=keaclientclasses,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=kea.unkin.net,resources=keaclientclasses/status,verbs=get;update;patch func (r *KeaClientClassReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { var cc v1alpha1.KeaClientClass if err := r.Get(ctx, req.NamespacedName, &cc); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } if cc.Spec.Test == "" && len(cc.Spec.ArchHex) == 0 { cc.Status.Phase = "Invalid" setReady(&cc.Status.Conditions, cc.Generation, false, "NoMatch", "either test or archHex must be set") _ = r.Status().Update(ctx, &cc) return ctrl.Result{}, nil } for _, a := range cc.Spec.ArchHex { if !strings.HasPrefix(a, "0x") { cc.Status.Phase = "Invalid" setReady(&cc.Status.Conditions, cc.Generation, false, "BadArch", "archHex values must be 0x-prefixed, e.g. 0x0007") _ = r.Status().Update(ctx, &cc) return ctrl.Result{}, nil } } cc.Status.Phase = "Ready" cc.Status.ObservedGeneration = cc.Generation setReady(&cc.Status.Conditions, cc.Generation, true, "Validated", "client class accepted") if err := r.Status().Update(ctx, &cc); err != nil { return ctrl.Result{}, err } return ctrl.Result{}, nil } func (r *KeaClientClassReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.KeaClientClass{}). Complete(r) }