// makeWorkUnits creates a handful of work units within a work spec. // These have keys "available", "pending", "finished", "failed", // "expired", and "retryable", and wind up in the corresponding // states. func makeWorkUnits(spec coordinate.WorkSpec, worker coordinate.Worker) (map[string]coordinate.WorkUnit, error) { result := map[string]coordinate.WorkUnit{ "available": nil, "pending": nil, "finished": nil, "failed": nil, "expired": nil, "retryable": nil, } for key := range result { unit, err := spec.AddWorkUnit(key, map[string]interface{}{}, 0) if err != nil { return nil, err } result[key] = unit // Run the workflow if key == "available" { continue } attempt, err := worker.MakeAttempt(unit, time.Duration(0)) if err != nil { return nil, err } switch key { case "pending": { } // leave it running case "finished": err = attempt.Finish(nil) case "failed": err = attempt.Fail(nil) case "expired": err = attempt.Expire(nil) case "retryable": err = attempt.Retry(nil) } if err != nil { return nil, err } } return result, nil }