// getRunnableAndDeadSlots returns two maps of slots. The first contains slots // that have at least one task with a desired state above NEW and lesser or // equal to RUNNING. The second is for slots that only contain tasks with a // desired state above RUNNING. func getRunnableAndDeadSlots(s *store.MemoryStore, serviceID string) (map[uint64]slot, map[uint64]slot, error) { var ( tasks []*api.Task err error ) s.View(func(tx store.ReadTx) { tasks, err = store.FindTasks(tx, store.ByServiceID(serviceID)) }) if err != nil { return nil, nil, err } runningSlots := make(map[uint64]slot) for _, t := range tasks { if t.DesiredState <= api.TaskStateRunning { runningSlots[t.Slot] = append(runningSlots[t.Slot], t) } } deadSlots := make(map[uint64]slot) for _, t := range tasks { if _, exists := runningSlots[t.Slot]; !exists { deadSlots[t.Slot] = append(deadSlots[t.Slot], t) } } return runningSlots, deadSlots, nil }
func deleteServiceTasks(ctx context.Context, s *store.MemoryStore, service *api.Service) { var ( tasks []*api.Task err error ) s.View(func(tx store.ReadTx) { tasks, err = store.FindTasks(tx, store.ByServiceID(service.ID)) }) if err != nil { log.G(ctx).WithError(err).Errorf("failed to list tasks") return } _, err = s.Batch(func(batch *store.Batch) error { for _, t := range tasks { err := batch.Update(func(tx store.Tx) error { if err := store.DeleteTask(tx, t.ID); err != nil { log.G(ctx).WithError(err).Errorf("failed to delete task") } return nil }) if err != nil { return err } } return nil }) if err != nil { log.G(ctx).WithError(err).Errorf("task search transaction failed") } }
func isValidEndpoint(t assert.TestingT, s *store.MemoryStore, task *api.Task) bool { if task.ServiceID != "" { var service *api.Service s.View(func(tx store.ReadTx) { service = store.GetService(tx, task.ServiceID) }) if service == nil { return true } return assert.Equal(t, service.Endpoint, task.Endpoint) } return true }
func getRunnableServiceTasks(t *testing.T, s *store.MemoryStore, service *api.Service) []*api.Task { var ( err error tasks []*api.Task ) s.View(func(tx store.ReadTx) { tasks, err = store.FindTasks(tx, store.ByServiceID(service.ID)) }) assert.NoError(t, err) runnable := []*api.Task{} for _, task := range tasks { if task.DesiredState == api.TaskStateRunning { runnable = append(runnable, task) } } return runnable }
// getRunnableSlots returns a map of slots that have at least one task with // a desired state above NEW and lesser or equal to RUNNING. func getRunnableSlots(s *store.MemoryStore, serviceID string) (map[uint64]slot, error) { var ( tasks []*api.Task err error ) s.View(func(tx store.ReadTx) { tasks, err = store.FindTasks(tx, store.ByServiceID(serviceID)) }) if err != nil { return nil, err } runningSlots := make(map[uint64]slot) for _, t := range tasks { // Technically the check below could just be // t.DesiredState <= api.TaskStateRunning, but ignoring tasks // with DesiredState == NEW simplifies the drainer unit tests. if t.DesiredState > api.TaskStateNew && t.DesiredState <= api.TaskStateRunning { runningSlots[t.Slot] = append(runningSlots[t.Slot], t) } } return runningSlots, nil }