karmada/pkg/controllers/hpareplicassyncer/hpa_replicas_syncer_predica...

78 lines
2.3 KiB
Go

package hpareplicassyncer
import (
autoscalingv2 "k8s.io/api/autoscaling/v2"
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
)
var _ predicate.Predicate = &HPAReplicasSyncer{}
func (r *HPAReplicasSyncer) Create(e event.CreateEvent) bool {
hpa, ok := e.Object.(*autoscalingv2.HorizontalPodAutoscaler)
if !ok {
klog.Errorf("create predicates in hpa controller called, but obj is not hpa type")
return false
}
// if hpa exist and has been propagated, add label to its scale ref resource
if hasBeenPropagated(hpa) {
r.scaleRefWorker.Add(labelEvent{addLabelEvent, hpa})
}
return false
}
func (r *HPAReplicasSyncer) Update(e event.UpdateEvent) bool {
oldHPA, ok := e.ObjectOld.(*autoscalingv2.HorizontalPodAutoscaler)
if !ok {
klog.Errorf("update predicates in hpa controller called, but old obj is not hpa type")
return false
}
newHPA, ok := e.ObjectNew.(*autoscalingv2.HorizontalPodAutoscaler)
if !ok {
klog.Errorf("update predicates in hpa controller called, but new obj is not hpa type")
return false
}
// hpa scale ref changed, remove old hpa label and add to new hpa
if oldHPA.Spec.ScaleTargetRef.String() != newHPA.Spec.ScaleTargetRef.String() {
// if scale ref has label, remove label, otherwise skip
r.scaleRefWorker.Add(labelEvent{deleteLabelEvent, oldHPA})
}
// if new hpa exist and has been propagated, add label to its scale ref resource
if hasBeenPropagated(newHPA) {
r.scaleRefWorker.Add(labelEvent{addLabelEvent, newHPA})
}
return oldHPA.Status.DesiredReplicas != newHPA.Status.DesiredReplicas
}
func (r *HPAReplicasSyncer) Delete(e event.DeleteEvent) bool {
hpa, ok := e.Object.(*autoscalingv2.HorizontalPodAutoscaler)
if !ok {
klog.Errorf("delete predicates in hpa controller called, but obj is not hpa type")
return false
}
// if scale ref has label, remove label, otherwise skip
r.scaleRefWorker.Add(labelEvent{deleteLabelEvent, hpa})
return false
}
func (r *HPAReplicasSyncer) Generic(e event.GenericEvent) bool {
return false
}
func hasBeenPropagated(hpa *autoscalingv2.HorizontalPodAutoscaler) bool {
_, ppExist := hpa.GetLabels()[policyv1alpha1.PropagationPolicyUIDLabel]
_, cppExist := hpa.GetLabels()[policyv1alpha1.ClusterPropagationPolicyUIDLabel]
return ppExist || cppExist
}