blob: 121cfd524c7823da27f4602fd74959fdcced411f [file] [log] [blame]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Package implements cros-hpt used for High Performance Tracing while running tests.
package main
import (
"go.chromium.org/chromiumos/test/util/helpers"
"go.chromium.org/chromiumos/test/util/portdiscovery"
"context"
"flag"
"fmt"
"log"
"net"
"os"
"path/filepath"
"time"
"go.chromium.org/chromiumos/config/go/test/api"
"google.golang.org/grpc"
)
const (
defaultRootPath = "/tmp/cros-hpt"
defaultAuthTokenFilePath = "/tmp/cros-hpt/authToken.txt"
defaultPort = 8010
logPath = "log"
// TODO(b/327275996): Replace brya with board in /etc/os-release file on dut.
brya = "brya"
)
var (
now = time.Now().Format("20060102-150405")
workDir = filepath.Join("/tmp/cros-hpt", now)
)
type flags struct {
// Common input params.
logPath string
version bool
port int
authFilePath string
crosDutEndpoint string
projectId string
topicId string
bucket string
artifactsBucket string
}
func startServer(ctx context.Context, args []string) int {
defaultLogDir := filepath.Join(workDir, logPath)
f := flags{}
fs := flag.NewFlagSet("Run cros-hpt", flag.ExitOnError)
fs.StringVar(&f.logPath, logPath, defaultLogDir, fmt.Sprintf("Path to record finder logs. Default value is %s", defaultLogDir))
fs.IntVar(&f.port, "port", defaultPort, fmt.Sprintf("Specify the port for the server. Default value %d.", defaultPort))
fs.StringVar(&f.authFilePath, "authFilePath", defaultAuthTokenFilePath, fmt.Sprintf("Path to auth token file. Default is %s", defaultAuthTokenFilePath))
fs.StringVar(&f.crosDutEndpoint, "crosDutEndpoint", "", fmt.Sprintf("Endpoint for cros dut."))
fs.StringVar(&f.projectId, "projectId", "", fmt.Sprintf("GCP projectID for perf processing pipeline."))
fs.StringVar(&f.topicId, "topicId", "", fmt.Sprintf("GCP pubsub topic for notifying perf processing pipeline about newly available data."))
fs.StringVar(&f.bucket, "bucket", "", fmt.Sprintf("GCS bucket where to upload the zipped perf data."))
fs.StringVar(&f.artifactsBucket, "artifactsBucket", "", fmt.Sprintf("GCS Bucket where hpt artifacts can be found."))
fs.Parse(args)
// Configure log file
logFile, err := helpers.CreateLogFile(f.logPath)
if err != nil {
log.Fatalln("Failed to create log file", err)
return 2
}
defer logFile.Close()
logger := helpers.NewLogger(logFile)
// Read and validate auth token required by vm-provision
authTokenFilePath := defaultAuthTokenFilePath
if f.authFilePath != "" {
authTokenFilePath = f.authFilePath
}
// Set up gRPC connection
conn, err := grpc.Dial(f.crosDutEndpoint, grpc.WithInsecure())
if err != nil {
logger.Fatalln("Failed to connect: ", err)
}
defer conn.Close()
// Create gRPC dut
dut := api.NewDutServiceClient(conn)
l, err := net.Listen("tcp", fmt.Sprintf(":%d", f.port))
if err != nil {
logger.Fatalln("Failed to create a net listener: ", err)
return 2
}
logger.Println("Starting Service on port ", f.port)
perfServer, err := NewServer(ctx, logger, &dut, authTokenFilePath, f.projectId, f.topicId, f.bucket, workDir, f.artifactsBucket)
if err != nil {
logger.Fatal(err)
return 2
}
// Write port number to ~/.cftmeta for go/cft-port-discovery
err = portdiscovery.WriteServiceMetadata("cros-hpt", l.Addr().String(), logger)
if err != nil {
logger.Println("Warning: error when writing to metadata file: ", err)
}
grpcServer := grpc.NewServer()
api.RegisterGenericServiceServer(grpcServer, perfServer)
err = grpcServer.Serve(l)
if err != nil {
logger.Fatalln("Failed to initialize server: ", err)
return 2
}
return 0
}
func mainInternal(ctx context.Context) int {
return startServer(ctx, os.Args[1:])
}
func main() {
os.Exit(mainInternal(context.Background()))
}