filters.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package cluster
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/docker/docker/api/types/filters"
  6. runconfigopts "github.com/docker/docker/runconfig/opts"
  7. swarmapi "github.com/docker/swarmkit/api"
  8. )
  9. func newListNodesFilters(filter filters.Args) (*swarmapi.ListNodesRequest_Filters, error) {
  10. accepted := map[string]bool{
  11. "name": true,
  12. "id": true,
  13. "label": true,
  14. "role": true,
  15. "membership": true,
  16. }
  17. if err := filter.Validate(accepted); err != nil {
  18. return nil, err
  19. }
  20. f := &swarmapi.ListNodesRequest_Filters{
  21. NamePrefixes: filter.Get("name"),
  22. IDPrefixes: filter.Get("id"),
  23. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  24. }
  25. for _, r := range filter.Get("role") {
  26. if role, ok := swarmapi.NodeRole_value[strings.ToUpper(r)]; ok {
  27. f.Roles = append(f.Roles, swarmapi.NodeRole(role))
  28. } else if r != "" {
  29. return nil, fmt.Errorf("Invalid role filter: '%s'", r)
  30. }
  31. }
  32. for _, a := range filter.Get("membership") {
  33. if membership, ok := swarmapi.NodeSpec_Membership_value[strings.ToUpper(a)]; ok {
  34. f.Memberships = append(f.Memberships, swarmapi.NodeSpec_Membership(membership))
  35. } else if a != "" {
  36. return nil, fmt.Errorf("Invalid membership filter: '%s'", a)
  37. }
  38. }
  39. return f, nil
  40. }
  41. func newListTasksFilters(filter filters.Args, transformFunc func(filters.Args) error) (*swarmapi.ListTasksRequest_Filters, error) {
  42. accepted := map[string]bool{
  43. "name": true,
  44. "id": true,
  45. "label": true,
  46. "service": true,
  47. "node": true,
  48. "desired-state": true,
  49. // UpToDate is not meant to be exposed to users. It's for
  50. // internal use in checking create/update progress. Therefore,
  51. // we prefix it with a '_'.
  52. "_up-to-date": true,
  53. "runtime": true,
  54. }
  55. if err := filter.Validate(accepted); err != nil {
  56. return nil, err
  57. }
  58. if transformFunc != nil {
  59. if err := transformFunc(filter); err != nil {
  60. return nil, err
  61. }
  62. }
  63. f := &swarmapi.ListTasksRequest_Filters{
  64. NamePrefixes: filter.Get("name"),
  65. IDPrefixes: filter.Get("id"),
  66. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  67. ServiceIDs: filter.Get("service"),
  68. NodeIDs: filter.Get("node"),
  69. UpToDate: len(filter.Get("_up-to-date")) != 0,
  70. Runtimes: filter.Get("runtime"),
  71. }
  72. for _, s := range filter.Get("desired-state") {
  73. if state, ok := swarmapi.TaskState_value[strings.ToUpper(s)]; ok {
  74. f.DesiredStates = append(f.DesiredStates, swarmapi.TaskState(state))
  75. } else if s != "" {
  76. return nil, fmt.Errorf("Invalid desired-state filter: '%s'", s)
  77. }
  78. }
  79. return f, nil
  80. }
  81. func newListSecretsFilters(filter filters.Args) (*swarmapi.ListSecretsRequest_Filters, error) {
  82. accepted := map[string]bool{
  83. "names": true,
  84. "name": true,
  85. "id": true,
  86. "label": true,
  87. }
  88. if err := filter.Validate(accepted); err != nil {
  89. return nil, err
  90. }
  91. return &swarmapi.ListSecretsRequest_Filters{
  92. Names: filter.Get("names"),
  93. NamePrefixes: filter.Get("name"),
  94. IDPrefixes: filter.Get("id"),
  95. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  96. }, nil
  97. }
  98. func newListConfigsFilters(filter filters.Args) (*swarmapi.ListConfigsRequest_Filters, error) {
  99. accepted := map[string]bool{
  100. "name": true,
  101. "id": true,
  102. "label": true,
  103. }
  104. if err := filter.Validate(accepted); err != nil {
  105. return nil, err
  106. }
  107. return &swarmapi.ListConfigsRequest_Filters{
  108. NamePrefixes: filter.Get("name"),
  109. IDPrefixes: filter.Get("id"),
  110. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  111. }, nil
  112. }