1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
package resourcefilters
import (
"github.com/mesos/mesos-go/api/v1/lib"
)
type (
Interface interface {
Accepts(*mesos.Resource) bool
}
Filter func(*mesos.Resource) bool
Filters []Filter
)
var _ = Interface(Filter(nil))
func (f Filter) Accepts(r *mesos.Resource) bool {
if f != nil {
return f(r)
}
return true
}
func Any(r *mesos.Resource) bool {
return r != nil && !r.IsEmpty()
}
func Unreserved(r *mesos.Resource) bool {
return r.IsUnreserved()
}
func PersistentVolumes(r *mesos.Resource) bool {
return r.IsPersistentVolume()
}
func Revocable(r *mesos.Resource) bool {
return r.IsRevocable()
}
func Scalar(r *mesos.Resource) bool {
return r.GetType() == mesos.SCALAR
}
func Range(r *mesos.Resource) bool {
return r.GetType() == mesos.RANGES
}
func Set(r *mesos.Resource) bool {
return r.GetType() == mesos.SET
}
func (f Filter) OrElse(other Filter) Filter {
return Filter(func(r *mesos.Resource) bool {
return f.Accepts(r) || other.Accepts(r)
})
}
func (f Filter) And(other Filter) Filter {
if f == nil {
if other == nil {
return nil
}
return other
}
if other == nil {
return f
}
return Filter(func(r *mesos.Resource) bool {
return f.Accepts(r) && other.Accepts(r)
})
}
func Select(rf Interface, resources ...mesos.Resource) (result mesos.Resources) {
for i := range resources {
if rf.Accepts(&resources[i]) {
result.Add1(resources[i])
}
}
return
}
func (rf Filters) Accepts(r *mesos.Resource) bool {
for _, f := range rf {
if !f.Accepts(r) {
return false
}
}
return true
}
var _ = Interface(Filters(nil))
func ReservedByRole(role string) Filter {
return Filter(func(r *mesos.Resource) bool {
return r.IsReserved(role)
})
}
// New concatenates the given filters
func New(filters ...Filter) Filters { return Filters(filters) }
|