blob: 2a294c71f09ffa0ee96198f06f3a71974a3b0087 [file] [log] [blame]
package cli
import (
"fmt"
"github.com/urfave/cli/v2"
"google.golang.org/protobuf/encoding/prototext"
"go.skia.org/infra/cabe/go/analyzer"
"go.skia.org/infra/go/sklog"
)
// checkCmd holds the flag values and any internal state necessary for
// executing the `check` subcommand.
type checkCmd struct {
commonCmd
}
// CheckCommand returns a [*cli.Command] for running cabe's analysis precondition checker.
func CheckCommand() *cli.Command {
cmd := &checkCmd{}
return &cli.Command{
Name: "check",
Description: "check runs some diagnostic checks on perf experiment jobs.",
Usage: "cabe check --pinpoint-job <pinpoint-job>",
Flags: cmd.flags(),
Action: cmd.action,
After: cmd.cleanup,
}
}
// action runs diagnostic checks on an experiment.
func (cmd *checkCmd) action(cliCtx *cli.Context) error {
ctx := cliCtx.Context
if err := cmd.dialBackends(ctx); err != nil {
return err
}
var analyzerOpts = []analyzer.Options{
analyzer.WithCASResultReader(cmd.casResultReader),
analyzer.WithSwarmingTaskReader(cmd.swarmingTaskReader),
}
a := analyzer.New(cmd.pinpointJobID, analyzerOpts...)
c := analyzer.NewChecker(analyzer.DefaultCheckerOpts...)
if err := a.RunChecker(ctx, c); err != nil {
sklog.Fatalf("run checker error: %v", err)
return err
}
exSpec := a.ExperimentSpec()
if exSpec != nil {
txt := prototext.MarshalOptions{
Multiline: true,
Indent: " ",
}.Format(exSpec)
fmt.Printf("ExperimentSpec:\n%s\n", txt)
}
findings := c.Findings()
if len(findings) == 0 {
fmt.Printf("Checker returned no findings.\n")
return nil
}
fmt.Printf("Checker returned %d findings\n", len(findings))
for i, finding := range c.Findings() {
fmt.Println(i, finding)
}
return nil
}