diff --git a/operator/internal/controller/auto/update_controller.go b/operator/internal/controller/auto/update_controller.go index 54be6433..e07242f0 100644 --- a/operator/internal/controller/auto/update_controller.go +++ b/operator/internal/controller/auto/update_controller.go @@ -199,15 +199,15 @@ func isWorkspaceReady(ws *autov1alpha1.Workspace) bool { return meta.IsStatusConditionTrue(ws.Status.Conditions, autov1alpha1.WorkspaceReady) } -type workspaceReadyPredicate struct { - predicate.Funcs -} +type workspaceReadyPredicate struct{} + +var _ predicate.Predicate = &workspaceReadyPredicate{} func (workspaceReadyPredicate) Create(e event.CreateEvent) bool { return isWorkspaceReady(e.Object.(*autov1alpha1.Workspace)) } -func (workspaceReadyPredicate) Delete(e event.DeleteEvent) bool { +func (workspaceReadyPredicate) Delete(_ event.DeleteEvent) bool { return false } @@ -218,7 +218,7 @@ func (workspaceReadyPredicate) Update(e event.UpdateEvent) bool { return !isWorkspaceReady(e.ObjectOld.(*autov1alpha1.Workspace)) && isWorkspaceReady(e.ObjectNew.(*autov1alpha1.Workspace)) } -func (workspaceReadyPredicate) Generic(e event.GenericEvent) bool { +func (workspaceReadyPredicate) Generic(_ event.GenericEvent) bool { return false } diff --git a/operator/internal/controller/auto/utils.go b/operator/internal/controller/auto/utils.go index 06480b6e..4aa06f53 100644 --- a/operator/internal/controller/auto/utils.go +++ b/operator/internal/controller/auto/utils.go @@ -91,10 +91,11 @@ func marshalConfigValue(item autov1alpha1.ConfigItem) *agentpb.ConfigValue { var l = log.Log.WithName("predicate").WithName("debug") type DebugPredicate struct { - predicate.Funcs Controller string } +var _ predicate.Predicate = &DebugPredicate{} + func (p *DebugPredicate) Create(e event.CreateEvent) bool { l.V(1).Info("Create", "controller", p.Controller, "type", fmt.Sprintf("%T", e.Object), "name", e.Object.GetName(), "revision", e.Object.GetResourceVersion()) return true diff --git a/operator/internal/controller/auto/workspace_controller.go b/operator/internal/controller/auto/workspace_controller.go index 3d6e469b..af9a63be 100644 --- a/operator/internal/controller/auto/workspace_controller.go +++ b/operator/internal/controller/auto/workspace_controller.go @@ -333,15 +333,25 @@ func (r *WorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error { Complete(r) } -type statefulSetReadyPredicate struct { - predicate.Funcs +type statefulSetReadyPredicate struct{} + +var _ predicate.Predicate = &statefulSetReadyPredicate{} + +func isStatefulSetReady(ss *appsv1.StatefulSet) bool { + if ss.Status.ObservedGeneration != ss.Generation || ss.Status.UpdateRevision != ss.Status.CurrentRevision { + return false + } + if ss.Status.AvailableReplicas < 1 { + return false + } + return true } func (statefulSetReadyPredicate) Create(e event.CreateEvent) bool { - return false + return isStatefulSetReady(e.Object.(*appsv1.StatefulSet)) } -func (statefulSetReadyPredicate) Delete(e event.DeleteEvent) bool { +func (statefulSetReadyPredicate) Delete(_ event.DeleteEvent) bool { return false } @@ -349,19 +359,10 @@ func (statefulSetReadyPredicate) Update(e event.UpdateEvent) bool { if e.ObjectOld == nil || e.ObjectNew == nil { return false } - ready := func(ss *appsv1.StatefulSet) bool { - if ss.Status.ObservedGeneration != ss.Generation || ss.Status.UpdateRevision != ss.Status.CurrentRevision { - return false - } - if ss.Status.AvailableReplicas < 1 { - return false - } - return true - } - return !ready(e.ObjectOld.(*appsv1.StatefulSet)) && ready(e.ObjectNew.(*appsv1.StatefulSet)) + return !isStatefulSetReady(e.ObjectOld.(*appsv1.StatefulSet)) && isStatefulSetReady(e.ObjectNew.(*appsv1.StatefulSet)) } -func (statefulSetReadyPredicate) Generic(e event.GenericEvent) bool { +func (statefulSetReadyPredicate) Generic(_ event.GenericEvent) bool { return false } diff --git a/operator/internal/controller/pulumi/flux.go b/operator/internal/controller/pulumi/flux.go index d944110d..61ec9bf5 100644 --- a/operator/internal/controller/pulumi/flux.go +++ b/operator/internal/controller/pulumi/flux.go @@ -105,15 +105,15 @@ func fluxSourceKey(gvk schema.GroupVersionKind, name string) string { return fmt.Sprintf("%s:%s", gvk, name) } -type fluxSourceReadyPredicate struct { - predicate.Funcs -} +type fluxSourceReadyPredicate struct{} + +var _ predicate.Predicate = &fluxSourceReadyPredicate{} func (fluxSourceReadyPredicate) Create(e event.CreateEvent) bool { return checkFluxSourceReady(e.Object.(*unstructured.Unstructured)) } -func (fluxSourceReadyPredicate) Delete(e event.DeleteEvent) bool { +func (fluxSourceReadyPredicate) Delete(_ event.DeleteEvent) bool { return false } @@ -124,6 +124,6 @@ func (fluxSourceReadyPredicate) Update(e event.UpdateEvent) bool { return !checkFluxSourceReady(e.ObjectOld.(*unstructured.Unstructured)) && checkFluxSourceReady(e.ObjectNew.(*unstructured.Unstructured)) } -func (fluxSourceReadyPredicate) Generic(e event.GenericEvent) bool { +func (fluxSourceReadyPredicate) Generic(_ event.GenericEvent) bool { return false -} \ No newline at end of file +} diff --git a/operator/internal/controller/pulumi/stack_controller.go b/operator/internal/controller/pulumi/stack_controller.go index f4f1270e..cf4b8131 100644 --- a/operator/internal/controller/pulumi/stack_controller.go +++ b/operator/internal/controller/pulumi/stack_controller.go @@ -102,7 +102,7 @@ func (r *StackReconciler) SetupWithManager(mgr ctrl.Manager) error { // or the "force reconcile" annotation is used (and not marked as handled). predicates := []predicate.Predicate{ predicate.Or( - predicate.And(predicate.GenerationChangedPredicate{}, predicate.Not(&FinalizerAddedPredicate{})), + predicate.And(predicate.GenerationChangedPredicate{}, predicate.Not(&finalizerAddedPredicate{})), ReconcileRequestedPredicate{}), } @@ -354,15 +354,15 @@ func isWorkspaceReady(ws *autov1alpha1.Workspace) bool { return meta.IsStatusConditionTrue(ws.Status.Conditions, autov1alpha1.WorkspaceReady) } -type workspaceReadyPredicate struct { - predicate.Funcs -} +type workspaceReadyPredicate struct{} + +var _ predicate.Predicate = &workspaceReadyPredicate{} func (workspaceReadyPredicate) Create(e event.CreateEvent) bool { return isWorkspaceReady(e.Object.(*autov1alpha1.Workspace)) } -func (workspaceReadyPredicate) Delete(e event.DeleteEvent) bool { +func (workspaceReadyPredicate) Delete(_ event.DeleteEvent) bool { return false } @@ -373,7 +373,7 @@ func (workspaceReadyPredicate) Update(e event.UpdateEvent) bool { return !isWorkspaceReady(e.ObjectOld.(*autov1alpha1.Workspace)) && isWorkspaceReady(e.ObjectNew.(*autov1alpha1.Workspace)) } -func (workspaceReadyPredicate) Generic(e event.GenericEvent) bool { +func (workspaceReadyPredicate) Generic(_ event.GenericEvent) bool { return false } @@ -384,9 +384,9 @@ func isUpdateComplete(update *autov1alpha1.Update) bool { return meta.IsStatusConditionTrue(update.Status.Conditions, autov1alpha1.UpdateConditionTypeComplete) } -type updateCompletePredicate struct { - predicate.Funcs -} +type updateCompletePredicate struct{} + +var _ predicate.Predicate = &updateCompletePredicate{} func (updateCompletePredicate) Create(e event.CreateEvent) bool { return isUpdateComplete(e.Object.(*autov1alpha1.Update)) @@ -1453,3 +1453,29 @@ func patchObject[T any, V any](base T, patch V) (*T, error) { return &result, nil } + +// finalizerAddedPredicate detects when a finalizer is added to an object. +// It is used to suppress reconciliation when the stack controller adds its finalizer, which causes +// a generation change that would otherwise trigger reconciliation. +type finalizerAddedPredicate struct{} + +var _ predicate.Predicate = &finalizerAddedPredicate{} + +func (p *finalizerAddedPredicate) Create(_ event.CreateEvent) bool { + return false +} + +func (p *finalizerAddedPredicate) Delete(_ event.DeleteEvent) bool { + return false +} + +func (p *finalizerAddedPredicate) Update(e event.UpdateEvent) bool { + if e.ObjectOld == nil || e.ObjectNew == nil { + return false + } + return !controllerutil.ContainsFinalizer(e.ObjectOld, pulumiFinalizer) && controllerutil.ContainsFinalizer(e.ObjectNew, pulumiFinalizer) +} + +func (p *finalizerAddedPredicate) Generic(_ event.GenericEvent) bool { + return false +} diff --git a/operator/internal/controller/pulumi/utils.go b/operator/internal/controller/pulumi/utils.go index ba66bda3..d6547931 100644 --- a/operator/internal/controller/pulumi/utils.go +++ b/operator/internal/controller/pulumi/utils.go @@ -19,9 +19,6 @@ package pulumi import ( "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" ) func exactlyOneOf(these ...bool) bool { @@ -44,29 +41,3 @@ func getGaugeValue(metric prometheus.Gauge) (float64, error) { } return m.Gauge.GetValue(), nil } - -// FinalizerAddedPredicate detects when a finalizer is added to an object. -// It is used to suppress reconciliation when the stack controller adds its finalizer, which causes -// a generation change that would otherwise trigger reconciliation. -type FinalizerAddedPredicate struct { - predicate.Funcs -} - -func (p *FinalizerAddedPredicate) Create(e event.CreateEvent) bool { - return false -} - -func (p *FinalizerAddedPredicate) Delete(e event.DeleteEvent) bool { - return false -} - -func (p *FinalizerAddedPredicate) Update(e event.UpdateEvent) bool { - if e.ObjectOld == nil || e.ObjectNew == nil { - return false - } - return !controllerutil.ContainsFinalizer(e.ObjectOld, pulumiFinalizer) && controllerutil.ContainsFinalizer(e.ObjectNew, pulumiFinalizer) -} - -func (p *FinalizerAddedPredicate) Generic(e event.GenericEvent) bool { - return false -}