blob: d48288f473740d199d63ca9ebb754db1a78d24ac [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 main implements the post-process for finding tests based on tags.
package server
import (
"flag"
"fmt"
"log"
"net"
"os"
"path/filepath"
"time"
"go.chromium.org/chromiumos/test/post_process/cmd/post-process/common"
"go.chromium.org/chromiumos/test/util/portdiscovery"
"go.chromium.org/chromiumos/config/go/test/api"
)
const (
defaultRootPath = "/tmp/filters/%s"
)
// Version is the version info of this command. It is filled in during emerge.
var Version = "<unknown>"
var defaultPort = 0
type args struct {
// Common input params.
logPath string
inputPath string
output string
version bool
// Server mode params
port int
dutendpoint string
}
// startServer is the entry point for running post-process (TestFinderService) in server mode.
func startServer(flagSet *flag.FlagSet, executor func(req *api.InternalTestplan, log *log.Logger) (*api.InternalTestplan, error), name string) error {
a := args{}
t := time.Now()
defaultLogPath := filepath.Join(fmt.Sprintf(defaultRootPath, name), t.Format("20060102-150405"))
flagSet.StringVar(&a.logPath, "log", defaultLogPath, fmt.Sprintf("Path to record finder logs. Default value is %s", defaultLogPath))
flagSet.IntVar(&a.port, "port", defaultPort, fmt.Sprintf("Specify the port for the server. Default value %d.", defaultPort))
flagSet.Parse(os.Args[2:])
logFile, err := common.CreateLogFile(a.logPath)
if err != nil {
return fmt.Errorf("failed to create log file: %s", err)
}
defer logFile.Close()
logger := common.NewLogger(logFile)
l, err := net.Listen("tcp", fmt.Sprintf(":%d", a.port))
if err != nil {
return fmt.Errorf("failed to create a net listener: %s", err)
}
// Write port number to ~/.cftmeta for go/cft-port-discovery
err = portdiscovery.WriteServiceMetadata(name, l.Addr().String(), logger)
if err != nil {
return fmt.Errorf("failed to write metadata port: %s", err)
}
server, closer := NewServer(logger, executor)
defer closer()
err = server.Serve(l)
if err != nil {
return fmt.Errorf("failed to initialize server: %s", err)
}
logger.Println("Starting generic filter service on port ", a.port)
return nil
}
// Server starts the generic filter server.
func Server(executor func(req *api.InternalTestplan, log *log.Logger) (*api.InternalTestplan, error), name string) error {
fs := flag.NewFlagSet("Run generic-filter server", flag.ExitOnError)
return startServer(fs, executor, name)
}
// ServerWithFlagSet starts the generic filter server
// with a custom flagSet extending the default flags.
func ServerWithFlagSet(flagSet *flag.FlagSet, executor func(req *api.InternalTestplan, log *log.Logger) (*api.InternalTestplan, error), name string) error {
return startServer(flagSet, executor, name)
}