github.com/kaisenlinux/docker@v0.0.0-20230510090727-ea55db55fac7/swarmkit/api/genericresource/validate.go (about) 1 package genericresource 2 3 import ( 4 "fmt" 5 6 "github.com/docker/swarmkit/api" 7 ) 8 9 // ValidateTask validates that the task only uses integers 10 // for generic resources 11 func ValidateTask(resources *api.Resources) error { 12 for _, v := range resources.Generic { 13 if v.GetDiscreteResourceSpec() != nil { 14 continue 15 } 16 17 return fmt.Errorf("invalid argument for resource %s", Kind(v)) 18 } 19 20 return nil 21 } 22 23 // HasEnough returns true if node can satisfy the task's GenericResource request 24 func HasEnough(nodeRes []*api.GenericResource, taskRes *api.GenericResource) (bool, error) { 25 t := taskRes.GetDiscreteResourceSpec() 26 if t == nil { 27 return false, fmt.Errorf("task should only hold Discrete type") 28 } 29 30 if nodeRes == nil { 31 return false, nil 32 } 33 34 nrs := GetResource(t.Kind, nodeRes) 35 if len(nrs) == 0 { 36 return false, nil 37 } 38 39 switch nr := nrs[0].Resource.(type) { 40 case *api.GenericResource_DiscreteResourceSpec: 41 if t.Value > nr.DiscreteResourceSpec.Value { 42 return false, nil 43 } 44 case *api.GenericResource_NamedResourceSpec: 45 if t.Value > int64(len(nrs)) { 46 return false, nil 47 } 48 } 49 50 return true, nil 51 } 52 53 // HasResource checks if there is enough "res" in the "resources" argument 54 func HasResource(res *api.GenericResource, resources []*api.GenericResource) bool { 55 for _, r := range resources { 56 if Kind(res) != Kind(r) { 57 continue 58 } 59 60 switch rtype := r.Resource.(type) { 61 case *api.GenericResource_DiscreteResourceSpec: 62 if res.GetDiscreteResourceSpec() == nil { 63 return false 64 } 65 66 if res.GetDiscreteResourceSpec().Value < rtype.DiscreteResourceSpec.Value { 67 return false 68 } 69 70 return true 71 case *api.GenericResource_NamedResourceSpec: 72 if res.GetNamedResourceSpec() == nil { 73 return false 74 } 75 76 if res.GetNamedResourceSpec().Value != rtype.NamedResourceSpec.Value { 77 continue 78 } 79 80 return true 81 } 82 } 83 84 return false 85 }