Files
capsule/internal/controllers/utils/predicates.go
Oliver Bähler 0abc77b56a feat: diverse performance improvements (#1861)
Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>
2026-02-03 22:05:00 +01:00

106 lines
2.7 KiB
Go

// Copyright 2020-2026 Project Capsule Authors
// SPDX-License-Identifier: Apache-2.0
package utils
import (
"slices"
"sigs.k8s.io/controller-runtime/pkg/builder"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
capsulev1beta2 "github.com/projectcapsule/capsule/api/v1beta2"
"github.com/projectcapsule/capsule/pkg/api/meta"
)
var CapsuleConfigSpecChangedPredicate = predicate.Funcs{
UpdateFunc: func(e event.UpdateEvent) bool {
oldObj, ok1 := e.ObjectOld.(*capsulev1beta2.CapsuleConfiguration)
newObj, ok2 := e.ObjectNew.(*capsulev1beta2.CapsuleConfiguration)
if !ok1 || !ok2 {
return false
}
if len(oldObj.Spec.Administrators) != len(newObj.Spec.Administrators) {
return true
}
return false
},
CreateFunc: func(e event.CreateEvent) bool { return false },
DeleteFunc: func(e event.DeleteEvent) bool { return false },
GenericFunc: func(e event.GenericEvent) bool { return false },
}
var PromotedServiceaccountPredicate = predicate.TypedFuncs[client.Object]{
CreateFunc: func(e event.TypedCreateEvent[client.Object]) bool {
v, ok := e.Object.GetLabels()[meta.OwnerPromotionLabel]
return ok && v == meta.ValueTrue
},
DeleteFunc: func(e event.TypedDeleteEvent[client.Object]) bool {
v, ok := e.Object.GetLabels()[meta.OwnerPromotionLabel]
return ok && v == meta.ValueTrue
},
UpdateFunc: func(e event.TypedUpdateEvent[client.Object]) bool {
oldVal, oldOK := e.ObjectOld.GetLabels()[meta.OwnerPromotionLabel]
newVal, newOK := e.ObjectNew.GetLabels()[meta.OwnerPromotionLabel]
return oldOK != newOK || oldVal != newVal
},
GenericFunc: func(event.TypedGenericEvent[client.Object]) bool {
return false
},
}
var UpdatedMetadataPredicate = predicate.Funcs{
CreateFunc: func(e event.CreateEvent) bool { return true },
DeleteFunc: func(e event.DeleteEvent) bool { return true },
UpdateFunc: func(e event.UpdateEvent) bool {
return !labelsEqual(e.ObjectOld.GetLabels(), e.ObjectNew.GetLabels())
},
GenericFunc: func(e event.GenericEvent) bool { return false },
}
func labelsEqual(a, b map[string]string) bool {
if len(a) != len(b) {
return false
}
for k, v := range a {
if bv, ok := b[k]; !ok || bv != v {
return false
}
}
return true
}
func LabelsChanged(keys []string, oldLabels, newLabels map[string]string) bool {
for _, key := range keys {
oldVal, oldOK := oldLabels[key]
newVal, newOK := newLabels[key]
if oldOK != newOK || oldVal != newVal {
return true
}
}
return false
}
func NamesMatchingPredicate(names ...string) builder.Predicates {
return builder.WithPredicates(predicate.NewPredicateFuncs(func(object client.Object) bool {
return slices.Contains(names, object.GetName())
}))
}