| package genericresource |
| |
| import ( |
| "fmt" |
| |
| "github.com/docker/swarmkit/api" |
| ) |
| |
| // ValidateTask validates that the task only uses integers |
| // for generic resources |
| func ValidateTask(resources *api.Resources) error { |
| for _, v := range resources.Generic { |
| if v.GetDiscreteResourceSpec() != nil { |
| continue |
| } |
| |
| return fmt.Errorf("invalid argument for resource %s", Kind(v)) |
| } |
| |
| return nil |
| } |
| |
| // HasEnough returns true if node can satisfy the task's GenericResource request |
| func HasEnough(nodeRes []*api.GenericResource, taskRes *api.GenericResource) (bool, error) { |
| t := taskRes.GetDiscreteResourceSpec() |
| if t == nil { |
| return false, fmt.Errorf("task should only hold Discrete type") |
| } |
| |
| if nodeRes == nil { |
| return false, nil |
| } |
| |
| nrs := GetResource(t.Kind, nodeRes) |
| if len(nrs) == 0 { |
| return false, nil |
| } |
| |
| switch nr := nrs[0].Resource.(type) { |
| case *api.GenericResource_DiscreteResourceSpec: |
| if t.Value > nr.DiscreteResourceSpec.Value { |
| return false, nil |
| } |
| case *api.GenericResource_NamedResourceSpec: |
| if t.Value > int64(len(nrs)) { |
| return false, nil |
| } |
| } |
| |
| return true, nil |
| } |
| |
| // HasResource checks if there is enough "res" in the "resources" argument |
| func HasResource(res *api.GenericResource, resources []*api.GenericResource) bool { |
| for _, r := range resources { |
| if Kind(res) != Kind(r) { |
| continue |
| } |
| |
| switch rtype := r.Resource.(type) { |
| case *api.GenericResource_DiscreteResourceSpec: |
| if res.GetDiscreteResourceSpec() == nil { |
| return false |
| } |
| |
| if res.GetDiscreteResourceSpec().Value < rtype.DiscreteResourceSpec.Value { |
| return false |
| } |
| |
| return true |
| case *api.GenericResource_NamedResourceSpec: |
| if res.GetNamedResourceSpec() == nil { |
| return false |
| } |
| |
| if res.GetNamedResourceSpec().Value != rtype.NamedResourceSpec.Value { |
| continue |
| } |
| |
| return true |
| } |
| } |
| |
| return false |
| } |