mirror of
https://github.com/moby/moby.git
synced 2026-07-15 12:01:27 +00:00
- https://github.com/docker/swarmkit/pull/2266 (support for templating Node.Hostname in docker executor) - https://github.com/docker/swarmkit/pull/2281 (change restore action on objects to be update, not delete/create) - https://github.com/docker/swarmkit/pull/2285 (extend watch queue with timeout and size limit) - https://github.com/docker/swarmkit/pull/2253 (version-aware failure tracking in the scheduler) - https://github.com/docker/swarmkit/pull/2275 (update containerd and port executor to container client library) - https://github.com/docker/swarmkit/pull/2292 (rename some generic resources) - https://github.com/docker/swarmkit/pull/2300 (limit the size of the external CA response) - https://github.com/docker/swarmkit/pull/2301 (delete global tasks when the node running them is deleted) Minor cleanups, dependency bumps, and vendoring: - https://github.com/docker/swarmkit/pull/2271 - https://github.com/docker/swarmkit/pull/2279 - https://github.com/docker/swarmkit/pull/2283 - https://github.com/docker/swarmkit/pull/2282 - https://github.com/docker/swarmkit/pull/2274 - https://github.com/docker/swarmkit/pull/2296 (dependency bump of etcd, go-winio) Signed-off-by: Ying Li <ying.li@docker.com>
85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
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
|
|
}
|