-
Notifications
You must be signed in to change notification settings - Fork 149
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lib: break bits out of resources into extras, resourcefilters, resour…
…cetest
- Loading branch information
James DeFelice
committed
Jun 13, 2017
1 parent
600b7c8
commit 13d8b85
Showing
15 changed files
with
1,004 additions
and
888 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
package resources | ||
|
||
import ( | ||
"github.com/mesos/mesos-go/api/v1/lib" | ||
"github.com/mesos/mesos-go/api/v1/lib/resourcefilters" | ||
) | ||
|
||
func SumScalars(rf resourcefilters.Filter, resources ...mesos.Resource) *mesos.Value_Scalar { | ||
predicate := resourcefilters.Filters{rf, resourcefilters.Scalar} | ||
var x *mesos.Value_Scalar | ||
for i := range resources { | ||
if !predicate.Accepts(&resources[i]) { | ||
continue | ||
} | ||
x = x.Add(resources[i].GetScalar()) | ||
} | ||
return x | ||
} | ||
|
||
func SumRanges(rf resourcefilters.Filter, resources ...mesos.Resource) *mesos.Value_Ranges { | ||
predicate := resourcefilters.Filters{rf, resourcefilters.Range} | ||
var x *mesos.Value_Ranges | ||
for i := range resources { | ||
if !predicate.Accepts(&resources[i]) { | ||
continue | ||
} | ||
x = x.Add(resources[i].GetRanges()) | ||
} | ||
return x | ||
} | ||
|
||
func SumSets(rf resourcefilters.Filter, resources ...mesos.Resource) *mesos.Value_Set { | ||
predicate := resourcefilters.Filters{rf, resourcefilters.Set} | ||
var x *mesos.Value_Set | ||
for i := range resources { | ||
if !predicate.Accepts(&resources[i]) { | ||
continue | ||
} | ||
x = x.Add(resources[i].GetSet()) | ||
} | ||
return x | ||
} | ||
|
||
func CPUs(resources ...mesos.Resource) (float64, bool) { | ||
v := SumScalars(resourcefilters.Named(ResourceNameCPUs), resources...) | ||
if v != nil { | ||
return v.Value, true | ||
} | ||
return 0, false | ||
} | ||
|
||
func GPUs(resources ...mesos.Resource) (float64, bool) { | ||
v := SumScalars(resourcefilters.Named(ResourceNameGPUs), resources...) | ||
if v != nil { | ||
return v.Value, true | ||
} | ||
return 0, false | ||
} | ||
|
||
func Memory(resources ...mesos.Resource) (uint64, bool) { | ||
v := SumScalars(resourcefilters.Named(ResourceNameMem), resources...) | ||
if v != nil { | ||
return uint64(v.Value), true | ||
} | ||
return 0, false | ||
} | ||
|
||
func Disk(resources ...mesos.Resource) (uint64, bool) { | ||
v := SumScalars(resourcefilters.Named(ResourceNameDisk), resources...) | ||
if v != nil { | ||
return uint64(v.Value), true | ||
} | ||
return 0, false | ||
} | ||
|
||
func Ports(resources ...mesos.Resource) (mesos.Ranges, bool) { | ||
v := SumRanges(resourcefilters.Named(ResourceNamePorts), resources...) | ||
if v != nil { | ||
return mesos.Ranges(v.Range), true | ||
} | ||
return nil, false | ||
} | ||
|
||
func Types(resources ...mesos.Resource) map[string]mesos.Value_Type { | ||
m := map[string]mesos.Value_Type{} | ||
for i := range resources { | ||
m[resources[i].GetName()] = resources[i].GetType() | ||
} | ||
return m | ||
} | ||
|
||
func Names(resources ...mesos.Resource) (names []string) { | ||
m := map[string]struct{}{} | ||
for i := range resources { | ||
n := resources[i].GetName() | ||
if _, ok := m[n]; !ok { | ||
m[n] = struct{}{} | ||
names = append(names, n) | ||
} | ||
} | ||
return | ||
} | ||
|
||
func SumAndCompare(expected mesos.Resources, resources ...mesos.Resource) bool { | ||
// from: https://github.com/apache/mesos/blob/master/src/common/resources.cpp | ||
// This is a sanity check to ensure the amount of each type of | ||
// resource does not change. | ||
// TODO(jieyu): Currently, we only check known resource types like | ||
// cpus, mem, disk, ports, etc. We should generalize this. | ||
var ( | ||
c1, c2 = CPUs(expected...) | ||
m1, m2 = Memory(expected...) | ||
d1, d2 = Disk(expected...) | ||
p1, p2 = Ports(expected...) | ||
|
||
c3, c4 = CPUs(resources...) | ||
m3, m4 = Memory(resources...) | ||
d3, d4 = Disk(resources...) | ||
p3, p4 = Ports(resources...) | ||
) | ||
return c1 == c3 && c2 == c4 && | ||
m1 == m3 && m2 == m4 && | ||
d1 == d3 && d2 == d4 && | ||
p1.Equivalent(p3) && p2 == p4 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package resources | ||
|
||
import ( | ||
"github.com/mesos/mesos-go/api/v1/lib" | ||
"github.com/mesos/mesos-go/api/v1/lib/resourcefilters" | ||
) | ||
|
||
func Find(wants mesos.Resources, from ...mesos.Resource) (total mesos.Resources) { | ||
for i := range wants { | ||
found := find(wants[i], from...) | ||
|
||
// each want *must* be found | ||
if len(found) == 0 { | ||
return nil | ||
} | ||
|
||
total.Add(found...) | ||
} | ||
return total | ||
} | ||
|
||
func find(want mesos.Resource, from ...mesos.Resource) mesos.Resources { | ||
var ( | ||
total = mesos.Resources(from).Clone() | ||
remaining = mesos.Resources{want}.Flatten() | ||
found mesos.Resources | ||
predicates = resourcefilters.Filters{ | ||
resourcefilters.ReservedByRole(want.GetRole()), | ||
resourcefilters.Unreserved, | ||
resourcefilters.Any, | ||
} | ||
) | ||
for _, predicate := range predicates { | ||
filtered := resourcefilters.Select(predicate, total...) | ||
for i := range filtered { | ||
// need to flatten to ignore the roles in ContainsAll() | ||
flattened := mesos.Resources{filtered[i]}.Flatten() | ||
if flattened.ContainsAll(remaining) { | ||
// want has been found, return the result | ||
return found.Add(remaining.Flatten( | ||
mesos.RoleName(filtered[i].GetRole()).Assign(), | ||
filtered[i].Reservation.Assign())...) | ||
} | ||
if remaining.ContainsAll(flattened) { | ||
found.Add1(filtered[i]) | ||
total.Subtract1(filtered[i]) | ||
remaining.Subtract(flattened...) | ||
break | ||
} | ||
} | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package resources | ||
|
||
const ( | ||
ResourceNameCPUs = "cpus" | ||
ResourceNameDisk = "disk" | ||
ResourceNameGPUs = "gpus" | ||
ResourceNameMem = "mem" | ||
ResourceNamePorts = "ports" | ||
) |
Oops, something went wrong.