blob: c04d6cba9a7dcc3b6b357b19600bae6d6269f65f [file] [log] [blame]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"context"
"log"
"path"
"go.chromium.org/chromiumos/config/go/longrunning"
"go.chromium.org/chromiumos/config/go/test/api"
"go.chromium.org/luci/common/errors"
"google.golang.org/grpc"
"go.chromium.org/chromiumos/lro"
"go.chromium.org/chromiumos/test/execution/cmd/cros-test/internal/common"
)
// ExecutionServiceServer implementation of dut_service.proto
type ExecutionServiceServer struct {
manager *lro.Manager
logger *log.Logger
resultRootDir string
tlwAddr string
metadata *api.TestCaseMetadataList
}
// NewServer creates an execution server.
func NewServer(logger *log.Logger, resultRootDir, tlwAddr string, metadataList *api.TestCaseMetadataList) (*grpc.Server, func()) {
s := &ExecutionServiceServer{
manager: lro.New(),
logger: logger,
resultRootDir: resultRootDir,
tlwAddr: tlwAddr,
metadata: metadataList,
}
server := grpc.NewServer()
var conns []*grpc.ClientConn
closer := func() {
for _, conn := range conns {
conn.Close()
}
conns = nil
}
api.RegisterExecutionServiceServer(server, s)
longrunning.RegisterOperationsServer(server, s.manager)
logger.Println("crostestservice listen to request at ")
return server, closer
}
// RunTests calls the runTests flow in cros-test.
func (s *ExecutionServiceServer) RunTests(ctx context.Context, req *api.CrosTestRequest) (*longrunning.Operation, error) {
op := s.manager.NewOperation()
s.logger.Println("Received api.CacheRequest: ", req)
resultsDir, err := s.loadResultsDir(req)
if err != nil {
return op, errors.Annotate(err, "RunTests: unable to determine results directory path").Err()
}
rspn, err := runTests(ctx, s.logger, resultsDir, s.tlwAddr, s.metadata, req)
if err != nil {
return op, errors.Annotate(err, "RunTests: failed to run test").Err()
}
s.logger.Printf("Test RPC Command was successful")
// Note: We are setting the response on the LRO, rather than writing to a resultJson like CLI mode.
s.manager.SetResult(op.Name, rspn)
return op, nil
}
func (s *ExecutionServiceServer) loadResultsDir(req *api.CrosTestRequest) (string, error) {
_, resultsSubDir, err := common.UnpackMetadata(req)
if err != nil {
return "", err
}
if resultsSubDir == "" {
return s.resultRootDir, nil
}
resultsDir := path.Join(s.resultRootDir, resultsSubDir)
s.logger.Printf("WARNING: overriding default results directory path with %v", resultsDir)
return resultsDir, nil
}