// attemptMap turns a single attempt into the map returned by // GetChildWorkUnits(). func attemptMap(attempt coordinate.Attempt) (map[string]interface{}, error) { // First try to swap out attempt for its work unit's actual // active attempt. workUnit := attempt.WorkUnit() activeAttempt, err := workUnit.ActiveAttempt() if err != nil { return nil, err } if activeAttempt != nil { attempt = activeAttempt } // Collect extra data we need and build the result data, err := attempt.Data() if err != nil { return nil, err } expires, err := attempt.ExpirationTime() if err != nil { return nil, err } result := map[string]interface{}{ "work_spec_name": workUnit.WorkSpec().Name(), "work_unit_key": []byte(workUnit.Name()), "work_unit_data": data, "worker_id": attempt.Worker().Name(), "expires": expires.Unix(), } return result, nil }
func getWorkTuple(attempt coordinate.Attempt) (cborrpc.PythonTuple, error) { data, err := attempt.Data() if err != nil { return cborrpc.PythonTuple{}, err } workUnit := attempt.WorkUnit() return cborrpc.PythonTuple{Items: []interface{}{ workUnit.WorkSpec().Name(), []byte(workUnit.Name()), data, }}, nil }
func (api *restAPI) attemptURLBuilder(namespace coordinate.Namespace, attempt coordinate.Attempt, startTime time.Time, err error) *urlBuilder { unit := attempt.WorkUnit() spec := unit.WorkSpec() worker := attempt.Worker() if err == nil { return buildURLs(api.Router, "namespace", namespace.Name(), "spec", spec.Name(), "unit", unit.Name(), "worker", worker.Name(), "start", startTime.Format(time.RFC3339), ) } return &urlBuilder{Error: err} }
// AttemptMatches checks that two attempts are attempting the same thing. func AttemptMatches(t *testing.T, expected, actual coordinate.Attempt) bool { return (assert.Equal(t, expected.Worker().Name(), actual.Worker().Name()) && assert.Equal(t, expected.WorkUnit().Name(), actual.WorkUnit().Name()) && assert.Equal(t, expected.WorkUnit().WorkSpec().Name(), actual.WorkUnit().WorkSpec().Name())) }
// TestChainingDuplicate tests that work unit chaining still works // even when the same output work unit is generated twice (it should // get retried). func TestChainingDuplicate(t *testing.T) { var ( err error one, two coordinate.WorkSpec attempt coordinate.Attempt ) sts := SimpleTestSetup{ NamespaceName: "TestChainingDuplicate", WorkerName: "worker", } sts.SetUp(t) defer sts.TearDown(t) one, err = sts.Namespace.SetWorkSpec(map[string]interface{}{ "name": "one", "then": "two", "priority": 1, }) if !assert.NoError(t, err) { return } two, err = sts.Namespace.SetWorkSpec(map[string]interface{}{ "name": "two", "priority": 2, }) if !assert.NoError(t, err) { return } _, err = one.AddWorkUnit("a", map[string]interface{}{}, coordinate.WorkUnitMeta{}) assert.NoError(t, err) _, err = one.AddWorkUnit("b", map[string]interface{}{}, coordinate.WorkUnitMeta{}) assert.NoError(t, err) sts.WorkSpec = one attempt = sts.RequestOneAttempt(t) assert.Equal(t, "a", attempt.WorkUnit().Name()) err = attempt.Finish(map[string]interface{}{ "output": []string{"z"}, }) assert.NoError(t, err) sts.WorkSpec = two attempt = sts.RequestOneAttempt(t) assert.Equal(t, "z", attempt.WorkUnit().Name()) err = attempt.Finish(map[string]interface{}{}) assert.NoError(t, err) sts.WorkSpec = one attempt = sts.RequestOneAttempt(t) assert.Equal(t, "b", attempt.WorkUnit().Name()) err = attempt.Finish(map[string]interface{}{ "output": []string{"z"}, }) assert.NoError(t, err) sts.WorkSpec = two attempt = sts.RequestOneAttempt(t) assert.Equal(t, "z", attempt.WorkUnit().Name()) err = attempt.Finish(map[string]interface{}{}) assert.NoError(t, err) sts.RequestNoAttempts(t) }