filters.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package cluster
  2. import (
  3. "fmt"
  4. "strings"
  5. runconfigopts "github.com/docker/docker/runconfig/opts"
  6. "github.com/docker/engine-api/types/filters"
  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 newListServicesFilters(filter filters.Args) (*swarmapi.ListServicesRequest_Filters, error) {
  42. accepted := map[string]bool{
  43. "name": true,
  44. "id": true,
  45. "label": true,
  46. }
  47. if err := filter.Validate(accepted); err != nil {
  48. return nil, err
  49. }
  50. return &swarmapi.ListServicesRequest_Filters{
  51. NamePrefixes: filter.Get("name"),
  52. IDPrefixes: filter.Get("id"),
  53. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  54. }, nil
  55. }
  56. func newListTasksFilters(filter filters.Args, transformFunc func(filters.Args) error) (*swarmapi.ListTasksRequest_Filters, error) {
  57. accepted := map[string]bool{
  58. "name": true,
  59. "id": true,
  60. "label": true,
  61. "service": true,
  62. "node": true,
  63. "desired-state": true,
  64. }
  65. if err := filter.Validate(accepted); err != nil {
  66. return nil, err
  67. }
  68. if transformFunc != nil {
  69. if err := transformFunc(filter); err != nil {
  70. return nil, err
  71. }
  72. }
  73. f := &swarmapi.ListTasksRequest_Filters{
  74. NamePrefixes: filter.Get("name"),
  75. IDPrefixes: filter.Get("id"),
  76. Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
  77. ServiceIDs: filter.Get("service"),
  78. NodeIDs: filter.Get("node"),
  79. }
  80. for _, s := range filter.Get("desired-state") {
  81. if state, ok := swarmapi.TaskState_value[strings.ToUpper(s)]; ok {
  82. f.DesiredStates = append(f.DesiredStates, swarmapi.TaskState(state))
  83. } else if s != "" {
  84. return nil, fmt.Errorf("Invalid desired-state filter: '%s'", s)
  85. }
  86. }
  87. return f, nil
  88. }