scheduler: add resource type filter

This commit is contained in:
Zexi Li
2018-12-07 15:45:03 +08:00
parent 1f5ab8750f
commit 4e344450c5
13 changed files with 118 additions and 21 deletions
@@ -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()
}