task.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package controlapi
  2. import (
  3. "github.com/docker/swarmkit/api"
  4. "github.com/docker/swarmkit/manager/state/store"
  5. "golang.org/x/net/context"
  6. "google.golang.org/grpc"
  7. "google.golang.org/grpc/codes"
  8. )
  9. // GetTask returns a Task given a TaskID.
  10. // - Returns `InvalidArgument` if TaskID is not provided.
  11. // - Returns `NotFound` if the Task is not found.
  12. func (s *Server) GetTask(ctx context.Context, request *api.GetTaskRequest) (*api.GetTaskResponse, error) {
  13. if request.TaskID == "" {
  14. return nil, grpc.Errorf(codes.InvalidArgument, errInvalidArgument.Error())
  15. }
  16. var task *api.Task
  17. s.store.View(func(tx store.ReadTx) {
  18. task = store.GetTask(tx, request.TaskID)
  19. })
  20. if task == nil {
  21. return nil, grpc.Errorf(codes.NotFound, "task %s not found", request.TaskID)
  22. }
  23. return &api.GetTaskResponse{
  24. Task: task,
  25. }, nil
  26. }
  27. // RemoveTask removes a Task referenced by TaskID.
  28. // - Returns `InvalidArgument` if TaskID is not provided.
  29. // - Returns `NotFound` if the Task is not found.
  30. // - Returns an error if the deletion fails.
  31. func (s *Server) RemoveTask(ctx context.Context, request *api.RemoveTaskRequest) (*api.RemoveTaskResponse, error) {
  32. if request.TaskID == "" {
  33. return nil, grpc.Errorf(codes.InvalidArgument, errInvalidArgument.Error())
  34. }
  35. err := s.store.Update(func(tx store.Tx) error {
  36. return store.DeleteTask(tx, request.TaskID)
  37. })
  38. if err != nil {
  39. if err == store.ErrNotExist {
  40. return nil, grpc.Errorf(codes.NotFound, "task %s not found", request.TaskID)
  41. }
  42. return nil, err
  43. }
  44. return &api.RemoveTaskResponse{}, nil
  45. }
  46. func filterTasks(candidates []*api.Task, filters ...func(*api.Task) bool) []*api.Task {
  47. result := []*api.Task{}
  48. for _, c := range candidates {
  49. match := true
  50. for _, f := range filters {
  51. if !f(c) {
  52. match = false
  53. break
  54. }
  55. }
  56. if match {
  57. result = append(result, c)
  58. }
  59. }
  60. return result
  61. }
  62. // ListTasks returns a list of all tasks.
  63. func (s *Server) ListTasks(ctx context.Context, request *api.ListTasksRequest) (*api.ListTasksResponse, error) {
  64. var (
  65. tasks []*api.Task
  66. err error
  67. )
  68. s.store.View(func(tx store.ReadTx) {
  69. switch {
  70. case request.Filters != nil && len(request.Filters.Names) > 0:
  71. tasks, err = store.FindTasks(tx, buildFilters(store.ByName, request.Filters.Names))
  72. case request.Filters != nil && len(request.Filters.NamePrefixes) > 0:
  73. tasks, err = store.FindTasks(tx, buildFilters(store.ByNamePrefix, request.Filters.NamePrefixes))
  74. case request.Filters != nil && len(request.Filters.IDPrefixes) > 0:
  75. tasks, err = store.FindTasks(tx, buildFilters(store.ByIDPrefix, request.Filters.IDPrefixes))
  76. case request.Filters != nil && len(request.Filters.ServiceIDs) > 0:
  77. tasks, err = store.FindTasks(tx, buildFilters(store.ByServiceID, request.Filters.ServiceIDs))
  78. case request.Filters != nil && len(request.Filters.NodeIDs) > 0:
  79. tasks, err = store.FindTasks(tx, buildFilters(store.ByNodeID, request.Filters.NodeIDs))
  80. case request.Filters != nil && len(request.Filters.DesiredStates) > 0:
  81. filters := make([]store.By, 0, len(request.Filters.DesiredStates))
  82. for _, v := range request.Filters.DesiredStates {
  83. filters = append(filters, store.ByDesiredState(v))
  84. }
  85. tasks, err = store.FindTasks(tx, store.Or(filters...))
  86. default:
  87. tasks, err = store.FindTasks(tx, store.All)
  88. }
  89. })
  90. if err != nil {
  91. return nil, err
  92. }
  93. if request.Filters != nil {
  94. tasks = filterTasks(tasks,
  95. func(e *api.Task) bool {
  96. return filterContains(store.TaskName(e), request.Filters.Names)
  97. },
  98. func(e *api.Task) bool {
  99. return filterContainsPrefix(store.TaskName(e), request.Filters.NamePrefixes)
  100. },
  101. func(e *api.Task) bool {
  102. return filterContainsPrefix(e.ID, request.Filters.IDPrefixes)
  103. },
  104. func(e *api.Task) bool {
  105. return filterMatchLabels(e.ServiceAnnotations.Labels, request.Filters.Labels)
  106. },
  107. func(e *api.Task) bool {
  108. return filterContains(e.ServiceID, request.Filters.ServiceIDs)
  109. },
  110. func(e *api.Task) bool {
  111. return filterContains(e.NodeID, request.Filters.NodeIDs)
  112. },
  113. func(e *api.Task) bool {
  114. if len(request.Filters.DesiredStates) == 0 {
  115. return true
  116. }
  117. for _, c := range request.Filters.DesiredStates {
  118. if c == e.DesiredState {
  119. return true
  120. }
  121. }
  122. return false
  123. },
  124. )
  125. }
  126. return &api.ListTasksResponse{
  127. Tasks: tasks,
  128. }, nil
  129. }