validate.go 1.8 KB

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