const preScoreStateKey … const invalidScore … type preScoreState … // Clone implements the mandatory Clone interface. We don't really copy the data since // there is no need for that. func (s *preScoreState) Clone() framework.StateData { … } // initPreScoreState iterates "filteredNodes" to filter out the nodes which // don't have required topologyKey(s), and initialize: // 1) s.TopologyPairToPodCounts: keyed with both eligible topology pair and node names. // 2) s.IgnoredNodes: the set of nodes that shouldn't be scored. // 3) s.TopologyNormalizingWeight: The weight to be given to each constraint based on the number of values in a topology. func (pl *PodTopologySpread) initPreScoreState(s *preScoreState, pod *v1.Pod, filteredNodes []*framework.NodeInfo, requireAllTopologies bool) error { … } // PreScore builds and writes cycle state used by Score and NormalizeScore. func (pl *PodTopologySpread) PreScore( ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, filteredNodes []*framework.NodeInfo, ) *framework.Status { … } // Score invoked at the Score extension point. // The "score" returned in this function is the matching number of pods on the `nodeName`, // it is normalized later. func (pl *PodTopologySpread) Score(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodeName string) (int64, *framework.Status) { … } // NormalizeScore invoked after scoring all nodes. func (pl *PodTopologySpread) NormalizeScore(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, scores framework.NodeScoreList) *framework.Status { … } // ScoreExtensions of the Score plugin. func (pl *PodTopologySpread) ScoreExtensions() framework.ScoreExtensions { … } func getPreScoreState(cycleState *framework.CycleState) (*preScoreState, error) { … } // topologyNormalizingWeight calculates the weight for the topology, based on // the number of values that exist for a topology. // Since <size> is at least 1 (all nodes that passed the Filters are in the // same topology), and k8s supports 5k nodes, the result is in the interval // <1.09, 8.52>. // // Note: <size> could also be zero when no nodes have the required topologies, // however we don't care about topology weight in this case as we return a 0 // score for all nodes. func topologyNormalizingWeight(size int) float64 { … } // scoreForCount calculates the score based on number of matching pods in a // topology domain, the constraint's maxSkew and the topology weight. // `maxSkew-1` is added to the score so that differences between topology // domains get watered down, controlling the tolerance of the score to skews. func scoreForCount(cnt int64, maxSkew int32, tpWeight float64) float64 { … }