87 lines
2.4 KiB
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
|
|
}
|