karmada/pkg/scheduler/helper.go

87 lines
2.4 KiB
Go

package scheduler
import (
"encoding/json"
"reflect"
"k8s.io/klog/v2"
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
)
func placementChanged(
placement policyv1alpha1.Placement,
appliedPlacementStr string,
schedulerObservingAffinityName string,
) bool {
if appliedPlacementStr == "" {
return true
}
appliedPlacement := policyv1alpha1.Placement{}
err := json.Unmarshal([]byte(appliedPlacementStr), &appliedPlacement)
if err != nil {
klog.Errorf("Failed to unmarshal applied placement string: %v", err)
return false
}
// first check: entire placement does not change
if reflect.DeepEqual(placement, appliedPlacement) {
return false
}
// second check: except for ClusterAffinities, the placement has changed
if !reflect.DeepEqual(placement.ClusterAffinity, appliedPlacement.ClusterAffinity) ||
!reflect.DeepEqual(placement.ClusterTolerations, appliedPlacement.ClusterTolerations) ||
!reflect.DeepEqual(placement.SpreadConstraints, appliedPlacement.SpreadConstraints) ||
!reflect.DeepEqual(placement.ReplicaScheduling, appliedPlacement.ReplicaScheduling) {
return true
}
// third check: check weather ClusterAffinities has changed
return clusterAffinitiesChanged(placement.ClusterAffinities, appliedPlacement.ClusterAffinities, schedulerObservingAffinityName)
}
func clusterAffinitiesChanged(
clusterAffinities, appliedClusterAffinities []policyv1alpha1.ClusterAffinityTerm,
schedulerObservingAffinityName string,
) bool {
if schedulerObservingAffinityName == "" {
return true
}
var clusterAffinityTerm, appliedClusterAffinityTerm *policyv1alpha1.ClusterAffinityTerm
for index := range clusterAffinities {
if clusterAffinities[index].AffinityName == schedulerObservingAffinityName {
clusterAffinityTerm = &clusterAffinities[index]
break
}
}
for index := range appliedClusterAffinities {
if appliedClusterAffinities[index].AffinityName == schedulerObservingAffinityName {
appliedClusterAffinityTerm = &appliedClusterAffinities[index]
break
}
}
if clusterAffinityTerm == nil || appliedClusterAffinityTerm == nil {
return true
}
if !reflect.DeepEqual(&clusterAffinityTerm, &appliedClusterAffinityTerm) {
return true
}
return false
}
func getAffinityIndex(affinities []policyv1alpha1.ClusterAffinityTerm, observedName string) int {
if observedName == "" {
return 0
}
for index, term := range affinities {
if term.AffinityName == observedName {
return index
}
}
return 0
}