Chromium Code Reviews| Index: appengine/cmd/dm/deps/ensure_graph_data.go |
| diff --git a/appengine/cmd/dm/deps/ensure_graph_data.go b/appengine/cmd/dm/deps/ensure_graph_data.go |
| index 41b198063b6e3a1d91faf7adfdd9e32fde069393..2aa5446d4ae84ba6702db2abfaf52d54caeb1a9e 100644 |
| --- a/appengine/cmd/dm/deps/ensure_graph_data.go |
| +++ b/appengine/cmd/dm/deps/ensure_graph_data.go |
| @@ -5,7 +5,6 @@ |
| package deps |
| import ( |
| - "errors" |
| "fmt" |
| "golang.org/x/net/context" |
| @@ -18,11 +17,12 @@ import ( |
| "github.com/luci/luci-go/common/parallel" |
| "github.com/luci/luci-go/common/stringset" |
| - "github.com/luci/luci-go/common/api/dm/service/v1" |
| + dm "github.com/luci/luci-go/common/api/dm/service/v1" |
| "github.com/luci/luci-go/common/api/dm/template" |
| "github.com/luci/luci-go/appengine/tumble" |
| + "github.com/luci/luci-go/appengine/cmd/dm/distributor" |
| "github.com/luci/luci-go/appengine/cmd/dm/model" |
| "github.com/luci/luci-go/appengine/cmd/dm/mutate" |
| ) |
| @@ -221,7 +221,7 @@ func (d *deps) ensureGraphData(c context.Context, req *dm.EnsureGraphDataReq, ne |
| Auth: req.ForExecution, |
| Quests: newQuests, |
| // Attempts we think are missing |
| - Atmpts: newAttempts, |
| + Attempts: newAttempts, |
| // Deps we think are missing (>= newAttempts) |
| Deps: missingDeps, |
| }) |
| @@ -268,14 +268,28 @@ func renderRequest(c context.Context, req *dm.EnsureGraphDataReq) (rsp *dm.Ensur |
| return true |
| } |
| + dists := map[string]distributor.D{} |
| + |
| newQuests = make(map[string]*model.Quest, len(req.Quest)+len(req.TemplateQuest)) |
| newAttempts = dm.NewAttemptList(nil) |
| + reg := distributor.GetRegistry(c) |
| + |
| // render all quest descriptions |
| for i, qDesc := range req.Quest { |
| - var q *model.Quest |
| - if q, err = model.NewQuest(c, qDesc); err != nil { |
| - err = grpcutil.MaybeLogErr(c, err, codes.InvalidArgument, "bad quest description") |
| + q := model.NewQuest(c, qDesc) |
| + |
| + d, ok := dists[qDesc.DistributorConfigName] |
| + if !ok { |
| + if d, _, err = reg.MakeDistributor(c, qDesc.DistributorConfigName); err != nil { |
| + return |
| + } |
| + dists[qDesc.DistributorConfigName] = d |
| + } |
| + |
| + if err = d.Validate(qDesc.JsonPayload); err != nil { |
| + err = grpcutil.MaybeLogErr(c, err, codes.InvalidArgument, |
| + "JSON payload is invalid for this distributor configuration.") |
| return |
| } |
| @@ -283,7 +297,7 @@ func renderRequest(c context.Context, req *dm.EnsureGraphDataReq) (rsp *dm.Ensur |
| if _, ok := req.Attempts.To[q.ID]; !ok { |
| c = logging.SetFields(c, logging.Fields{"id": q.ID, "idx": i}) |
| err = grpcutil.MaybeLogErr(c, |
| - errors.New("Quest entries must have a matching Attempts entry"), |
| + fmt.Errorf("Quest %d:%q must have a matching Attempts entry", i, q.ID), |
|
dnj (Google)
2016/06/09 18:00:54
Maybe use annotated error?
iannucci
2016/06/15 00:45:58
I will do so in a followup for sure!
|
| codes.InvalidArgument, "no matches") |
| return |
| } |
| @@ -310,13 +324,12 @@ func renderRequest(c context.Context, req *dm.EnsureGraphDataReq) (rsp *dm.Ensur |
| if desc, vers, err = templateFiles.render(c, inst); setTemplateErr(i, err) { |
| continue |
| } |
| - |
| - var q *model.Quest |
| - q, err = model.NewQuest(c, desc) |
| - if setTemplateErr(i, err) { |
| + if setTemplateErr(i, desc.Normalize()) { |
| continue |
| } |
| + q := model.NewQuest(c, desc) |
| + |
| rsp.TemplateIds = append(rsp.TemplateIds, dm.NewQuestID(q.ID)) |
| // if we have any errors going on, might as well skip the rest |
| @@ -347,6 +360,7 @@ func renderRequest(c context.Context, req *dm.EnsureGraphDataReq) (rsp *dm.Ensur |
| func (d *deps) EnsureGraphData(c context.Context, req *dm.EnsureGraphDataReq) (rsp *dm.EnsureGraphDataRsp, err error) { |
| // TODO(riannucci): real non-execution authentication |
| if req.ForExecution != nil { |
| + logging.Fields{"execution": req.ForExecution.Id}.Infof(c, "on behalf of") |
| _, _, err := model.AuthenticateExecution(c, req.ForExecution) |
| if err != nil { |
| return nil, grpcutil.MaybeLogErr(c, err, codes.Unauthenticated, "bad execution auth") |