filters.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. }
  54. if err := filter.Validate(accepted); err != nil {
  55. return nil, err
  56. }
  57. if transformFunc != nil {
  58. if err := transformFunc(filter); err != nil {
  59. return nil, err
  60. }
  61. }
  62. f := &swarmapi.ListTasksRequest_Filters{
  63. NamePrefixes: filter.Get("name"),
  64. IDPrefixes: filter.Get("id"),
  65. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  66. ServiceIDs: filter.Get("service"),
  67. NodeIDs: filter.Get("node"),
  68. UpToDate: len(filter.Get("_up-to-date")) != 0,
  69. }
  70. for _, s := range filter.Get("desired-state") {
  71. if state, ok := swarmapi.TaskState_value[strings.ToUpper(s)]; ok {
  72. f.DesiredStates = append(f.DesiredStates, swarmapi.TaskState(state))
  73. } else if s != "" {
  74. return nil, fmt.Errorf("Invalid desired-state filter: '%s'", s)
  75. }
  76. }
  77. return f, nil
  78. }
  79. func newListSecretsFilters(filter filters.Args) (*swarmapi.ListSecretsRequest_Filters, error) {
  80. accepted := map[string]bool{
  81. "names": true,
  82. "name": true,
  83. "id": true,
  84. "label": true,
  85. }
  86. if err := filter.Validate(accepted); err != nil {
  87. return nil, err
  88. }
  89. return &swarmapi.ListSecretsRequest_Filters{
  90. Names: filter.Get("names"),
  91. NamePrefixes: filter.Get("name"),
  92. IDPrefixes: filter.Get("id"),
  93. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  94. }, nil
  95. }
  96. func newListConfigsFilters(filter filters.Args) (*swarmapi.ListConfigsRequest_Filters, error) {
  97. accepted := map[string]bool{
  98. "name": true,
  99. "id": true,
  100. "label": true,
  101. }
  102. if err := filter.Validate(accepted); err != nil {
  103. return nil, err
  104. }
  105. return &swarmapi.ListConfigsRequest_Filters{
  106. NamePrefixes: filter.Get("name"),
  107. IDPrefixes: filter.Get("id"),
  108. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  109. }, nil
  110. }