helpers.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package genericresource
  2. import (
  3. "github.com/docker/swarmkit/api"
  4. )
  5. // NewSet creates a set object
  6. func NewSet(key string, vals ...string) []*api.GenericResource {
  7. rs := make([]*api.GenericResource, 0, len(vals))
  8. for _, v := range vals {
  9. rs = append(rs, NewString(key, v))
  10. }
  11. return rs
  12. }
  13. // NewString creates a String resource
  14. func NewString(key, val string) *api.GenericResource {
  15. return &api.GenericResource{
  16. Resource: &api.GenericResource_NamedResourceSpec{
  17. NamedResourceSpec: &api.NamedGenericResource{
  18. Kind: key,
  19. Value: val,
  20. },
  21. },
  22. }
  23. }
  24. // NewDiscrete creates a Discrete resource
  25. func NewDiscrete(key string, val int64) *api.GenericResource {
  26. return &api.GenericResource{
  27. Resource: &api.GenericResource_DiscreteResourceSpec{
  28. DiscreteResourceSpec: &api.DiscreteGenericResource{
  29. Kind: key,
  30. Value: val,
  31. },
  32. },
  33. }
  34. }
  35. // GetResource returns resources from the "resources" parameter matching the kind key
  36. func GetResource(kind string, resources []*api.GenericResource) []*api.GenericResource {
  37. var res []*api.GenericResource
  38. for _, r := range resources {
  39. if Kind(r) != kind {
  40. continue
  41. }
  42. res = append(res, r)
  43. }
  44. return res
  45. }
  46. // ConsumeNodeResources removes "res" from nodeAvailableResources
  47. func ConsumeNodeResources(nodeAvailableResources *[]*api.GenericResource, res []*api.GenericResource) {
  48. if nodeAvailableResources == nil {
  49. return
  50. }
  51. w := 0
  52. loop:
  53. for _, na := range *nodeAvailableResources {
  54. for _, r := range res {
  55. if Kind(na) != Kind(r) {
  56. continue
  57. }
  58. if remove(na, r) {
  59. continue loop
  60. }
  61. // If this wasn't the right element then
  62. // we need to continue
  63. }
  64. (*nodeAvailableResources)[w] = na
  65. w++
  66. }
  67. *nodeAvailableResources = (*nodeAvailableResources)[:w]
  68. }
  69. // Returns true if the element is to be removed from the list
  70. func remove(na, r *api.GenericResource) bool {
  71. switch tr := r.Resource.(type) {
  72. case *api.GenericResource_DiscreteResourceSpec:
  73. if na.GetDiscreteResourceSpec() == nil {
  74. return false // Type change, ignore
  75. }
  76. na.GetDiscreteResourceSpec().Value -= tr.DiscreteResourceSpec.Value
  77. if na.GetDiscreteResourceSpec().Value <= 0 {
  78. return true
  79. }
  80. case *api.GenericResource_NamedResourceSpec:
  81. if na.GetNamedResourceSpec() == nil {
  82. return false // Type change, ignore
  83. }
  84. if tr.NamedResourceSpec.Value != na.GetNamedResourceSpec().Value {
  85. return false // not the right item, ignore
  86. }
  87. return true
  88. }
  89. return false
  90. }