78 lines
2.3 KiB
Go
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
|
|
}
|