File: resourcefilters.go

package info (click to toggle)
golang-github-mesos-mesos-go 0.0.6%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 11,724 kB
  • sloc: makefile: 163
file content (100 lines) | stat: -rw-r--r-- 1,812 bytes parent folder | download
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) }