blob: 212153970d2ae80febc6271e4fd25bbaad964558 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"context"
"strconv"
"go.chromium.org/luci/common/errors"
"go.chromium.org/luci/common/logging"
ds "go.chromium.org/luci/gae/service/datastore"
"go.chromium.org/luci/grpc/grpcutil"
tricium "infra/tricium/api/v1"
"infra/tricium/appengine/common/config"
"infra/tricium/appengine/common/track"
)
// ProjectProgress implements Tricium.ProjectProgress.
func (r *TriciumServer) ProjectProgress(c context.Context, req *tricium.ProjectProgressRequest) (res *tricium.ProjectProgressResponse, err error) {
defer func() {
err = grpcutil.GRPCifyAndLogErr(c, err)
}()
project, err := validateProjectProgressRequest(c, req)
if err != nil {
return nil, err
}
logging.Fields{
"project": project,
}.Infof(c, "Request validated.")
runProgress, err := projectProgress(c, project, config.LuciConfigServer)
if err != nil {
return nil, err
}
return &tricium.ProjectProgressResponse{
RunProgress: runProgress,
}, nil
}
func validateProjectProgressRequest(c context.Context, req *tricium.ProjectProgressRequest) (string, error) {
if req.Project == "" {
return "", errors.New("missing Tricium project", grpcutil.InvalidArgumentTag)
}
return req.Project, nil
}
func projectProgress(c context.Context, project string, cp config.ProviderAPI) ([]*tricium.RunProgress, error) {
var runProgress []*tricium.RunProgress
var requests []*track.AnalyzeRequest
if err := ds.GetAll(c, ds.NewQuery("AnalyzeRequest").Eq("Project", project), &requests); err != nil {
return nil, errors.Annotate(err, "failed to get AnalyzeRequests").
Tag(grpcutil.InternalTag).Err()
}
for _, r := range requests {
key := ds.KeyForObj(c, r)
res := &track.AnalyzeRequestResult{ID: 1, Parent: key}
if err := ds.Get(c, res); err != nil {
return nil, errors.Annotate(err, "failed to get AnalyzeRequestResult").
Tag(grpcutil.InternalTag).Err()
}
var functionResults []*track.FunctionRunResult
if err := ds.GetAll(c, ds.NewQuery("FunctionRunResult").Ancestor(key), &functionResults); err != nil {
return nil, errors.Annotate(err, "failed to get FunctionRunResult").
Tag(grpcutil.InternalTag).Err()
}
numComments := 0
for _, ar := range functionResults {
numComments += ar.NumComments
}
runProgress = append(runProgress, &tricium.RunProgress{
RunId: strconv.FormatInt(r.ID, 10),
State: res.State,
NumComments: int32(numComments),
})
}
return runProgress, nil
}