filters.go 3.6 KB

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