github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/requester/ranking/max_usage.go (about) 1 package ranking 2 3 import ( 4 "context" 5 6 "github.com/filecoin-project/bacalhau/pkg/compute/capacity" 7 "github.com/filecoin-project/bacalhau/pkg/model" 8 "github.com/filecoin-project/bacalhau/pkg/requester" 9 "github.com/rs/zerolog/log" 10 ) 11 12 type MaxUsageNodeRanker struct { 13 } 14 15 func NewMaxUsageNodeRanker() *MaxUsageNodeRanker { 16 return &MaxUsageNodeRanker{} 17 } 18 19 // RankNodes ranks nodes based on the MaxJobRequirements the compute nodes are accepting: 20 // - Rank 10: Node is accepting MaxJobRequirements that are equal or higher than the job requirements. 21 // - Rank -1: Node is accepting MaxJobRequirements that are lower than the job requirements. 22 // - Rank 0: Node MaxJobRequirements are not set, or the node was discovered not through nodeInfoPublisher (e.g. identity protocol) 23 func (s *MaxUsageNodeRanker) RankNodes(ctx context.Context, job model.Job, nodes []model.NodeInfo) ([]requester.NodeRank, error) { 24 ranks := make([]requester.NodeRank, len(nodes)) 25 jobResourceUsage := capacity.ParseResourceUsageConfig(job.Spec.Resources) 26 jobResourceUsageSet := !jobResourceUsage.IsZero() 27 for i, node := range nodes { 28 rank := 0 29 if jobResourceUsageSet { 30 if jobResourceUsage.LessThanEq(node.ComputeNodeInfo.MaxJobRequirements) { 31 rank = 10 32 } else { 33 log.Ctx(ctx).Trace().Msgf("filtering node %s doesn't accept MaxJobRequirements %s", node.PeerInfo.ID, jobResourceUsage) 34 rank = -1 35 } 36 } 37 ranks[i] = requester.NodeRank{ 38 NodeInfo: node, 39 Rank: rank, 40 } 41 } 42 return ranks, nil 43 }