mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
scheduler: add resource type filter
This commit is contained in:
@@ -24,6 +24,7 @@ const (
|
||||
ErrNoMoreSpaceForUnspecificSplit = `no more space for an unspecific split`
|
||||
ErrSubtotalOfSplitExceedsDiskSize = `subtotal of split exceeds disk size`
|
||||
ErrBaremetalHasAlreadyBeenOccupied = `baremetal has already been occupied`
|
||||
ErrPrepaidHostOccupied = `prepaid host occupied`
|
||||
|
||||
ErrUnknown = `unknown error`
|
||||
)
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package predicates
|
||||
|
||||
import (
|
||||
"yunion.io/x/onecloud/pkg/compute/models"
|
||||
"yunion.io/x/onecloud/pkg/scheduler/core"
|
||||
)
|
||||
|
||||
type ResourceTypePredicate struct {
|
||||
BasePredicate
|
||||
}
|
||||
|
||||
func (p *ResourceTypePredicate) Name() string {
|
||||
return "resource_type"
|
||||
}
|
||||
|
||||
func (p *ResourceTypePredicate) Clone() core.FitPredicate {
|
||||
return &ResourceTypePredicate{}
|
||||
}
|
||||
|
||||
func (p *ResourceTypePredicate) PreExecute(u *core.Unit, cs []core.Candidater) (bool, error) {
|
||||
if u.SchedData().ResourceType == "" {
|
||||
return false, nil
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func (p *ResourceTypePredicate) Execute(u *core.Unit, c core.Candidater) (bool, []core.PredicateFailureReason, error) {
|
||||
h := NewPredicateHelper(p, u, c)
|
||||
|
||||
d := u.SchedData()
|
||||
|
||||
hostResType := c.GetResourceType()
|
||||
reqResType := d.ResourceType
|
||||
if hostResType != reqResType {
|
||||
h.Exclude2("resource_type", hostResType, reqResType)
|
||||
}
|
||||
|
||||
if reqResType == models.HostResourceTypePrepaidRecycle {
|
||||
if c.GetGuestCount() == 0 {
|
||||
h.SetCapacity(1)
|
||||
} else {
|
||||
h.Exclude(ErrPrepaidHostOccupied)
|
||||
}
|
||||
}
|
||||
// TODO: support HostResourceTypeDedicated
|
||||
|
||||
return h.GetResult()
|
||||
}
|
||||
Reference in New Issue
Block a user