From 32e5b56aefdf92c44b646d1aa437f3b1ce8e64b8 Mon Sep 17 00:00:00 2001 From: Lars T Hansen Date: Tue, 7 Jan 2025 08:36:16 +0100 Subject: [PATCH] Add HostAnalysisArgs --- code/sonalyze/cmd/args.go | 51 ++++++++++++++++++++++++++++++++ code/sonalyze/cmd/gpus/gpus.go | 29 +++--------------- code/sonalyze/cmd/sacct/sacct.go | 28 +++--------------- code/sonalyze/cmd/top/top.go | 30 +++---------------- 4 files changed, 63 insertions(+), 75 deletions(-) diff --git a/code/sonalyze/cmd/args.go b/code/sonalyze/cmd/args.go index c2beb161..1e438cc2 100644 --- a/code/sonalyze/cmd/args.go +++ b/code/sonalyze/cmd/args.go @@ -524,6 +524,57 @@ func (s *SampleAnalysisArgs) Validate() error { ) } +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Shared for analysis commands that work on sonar per-host data. +// +// Almost SampleAnalysisArgs, but HostArgs instead of RecordFilterArgs + +type HostAnalysisArgs struct { + DevArgs + SourceArgs + QueryArgs + HostArgs + ConfigFileArgs + VerboseArgs +} + +func (sa *HostAnalysisArgs) HostAnalysisFlags() *HostAnalysisArgs { + return sa +} + +func (s *HostAnalysisArgs) Add(fs *CLI) { + s.DevArgs.Add(fs) + s.SourceArgs.Add(fs) + s.QueryArgs.Add(fs) + s.HostArgs.Add(fs) + s.ConfigFileArgs.Add(fs) + s.VerboseArgs.Add(fs) +} + +func (s *HostAnalysisArgs) ReifyForRemote(x *ArgReifier) error { + // We don't forward s.Verbose, it's mostly useful locally, and ideally sonalyzed should redact + // it on the remote end to avoid revealing internal data (it does not, and indeed would require + // the argument to be named "verbose" to work). + return errors.Join( + s.DevArgs.ReifyForRemote(x), + s.SourceArgs.ReifyForRemote(x), + s.QueryArgs.ReifyForRemote(x), + s.HostArgs.ReifyForRemote(x), + s.ConfigFileArgs.ReifyForRemote(x), + ) +} + +func (s *HostAnalysisArgs) Validate() error { + return errors.Join( + s.DevArgs.Validate(), + s.SourceArgs.Validate(), + s.QueryArgs.Validate(), + s.HostArgs.Validate(), + s.ConfigFileArgs.Validate(), + s.VerboseArgs.Validate(), + ) +} + /////////////////////////////////////////////////////////////////////////////////////////////////// // // Format arguments - same logic for most consumers. diff --git a/code/sonalyze/cmd/gpus/gpus.go b/code/sonalyze/cmd/gpus/gpus.go index 0b794703..8e126160 100644 --- a/code/sonalyze/cmd/gpus/gpus.go +++ b/code/sonalyze/cmd/gpus/gpus.go @@ -59,14 +59,8 @@ DEFAULTS default ELBAT*/ type GpuCommand struct /* implements AnalysisCommand */ { - // Almost SharedArgs, but HostArgs instead of RecordFilterArgs - DevArgs - SourceArgs - QueryArgs - HostArgs - VerboseArgs + HostAnalysisArgs FormatArgs - ConfigFileArgs Gpu int } @@ -74,42 +68,27 @@ type GpuCommand struct /* implements AnalysisCommand */ { var _ = AnalysisCommand((*GpuCommand)(nil)) func (gc *GpuCommand) Add(fs *CLI) { - gc.DevArgs.Add(fs) - gc.SourceArgs.Add(fs) - gc.QueryArgs.Add(fs) - gc.HostArgs.Add(fs) - gc.VerboseArgs.Add(fs) + gc.HostAnalysisArgs.Add(fs) gc.FormatArgs.Add(fs) - gc.ConfigFileArgs.Add(fs) fs.Group("record-filter") fs.IntVar(&gc.Gpu, "gpu", -1, "Select single GPU") } func (gc *GpuCommand) Validate() error { return errors.Join( - gc.DevArgs.Validate(), - gc.SourceArgs.Validate(), - gc.QueryArgs.Validate(), - gc.HostArgs.Validate(), - gc.VerboseArgs.Validate(), - gc.ConfigFileArgs.Validate(), + gc.HostAnalysisArgs.Validate(), ValidateFormatArgs( &gc.FormatArgs, gpuDefaultFields, gpuFormatters, gpuAliases, DefaultFixed), ) } func (gc *GpuCommand) ReifyForRemote(x *ArgReifier) error { - // gc.Verbose is not reified, as for SharedArgs. if gc.Gpu != -1 { x.IntUnchecked("gpu", gc.Gpu) } return errors.Join( - gc.DevArgs.ReifyForRemote(x), - gc.SourceArgs.ReifyForRemote(x), - gc.QueryArgs.ReifyForRemote(x), - gc.HostArgs.ReifyForRemote(x), + gc.HostAnalysisArgs.ReifyForRemote(x), gc.FormatArgs.ReifyForRemote(x), - gc.ConfigFileArgs.ReifyForRemote(x), ) } diff --git a/code/sonalyze/cmd/sacct/sacct.go b/code/sonalyze/cmd/sacct/sacct.go index 4ebb341a..c8c41f69 100644 --- a/code/sonalyze/cmd/sacct/sacct.go +++ b/code/sonalyze/cmd/sacct/sacct.go @@ -16,13 +16,7 @@ const ( ) type SacctCommand struct /* implements AnalysisCommand */ { - // Almost SharedArgs, but HostArgs instead of RecordFilterArgs - DevArgs - SourceArgs - QueryArgs - HostArgs - VerboseArgs - ConfigFileArgs + HostAnalysisArgs FormatArgs // Selections @@ -57,12 +51,7 @@ type SacctCommand struct /* implements AnalysisCommand */ { var _ = AnalysisCommand((*SacctCommand)(nil)) func (sc *SacctCommand) Add(fs *CLI) { - sc.DevArgs.Add(fs) - sc.SourceArgs.Add(fs) - sc.QueryArgs.Add(fs) - sc.HostArgs.Add(fs) - sc.VerboseArgs.Add(fs) - sc.ConfigFileArgs.Add(fs) + sc.HostAnalysisArgs.Add(fs) sc.FormatArgs.Add(fs) fs.Group("job-filter") @@ -117,11 +106,7 @@ func (sc *SacctCommand) ReifyForRemote(x *ArgReifier) error { x.Bool("array", sc.Array) x.Bool("het", sc.Het) return errors.Join( - sc.DevArgs.ReifyForRemote(x), - sc.SourceArgs.ReifyForRemote(x), - sc.QueryArgs.ReifyForRemote(x), - sc.HostArgs.ReifyForRemote(x), - sc.ConfigFileArgs.ReifyForRemote(x), + sc.HostAnalysisArgs.ReifyForRemote(x), sc.FormatArgs.ReifyForRemote(x), ) } @@ -129,12 +114,7 @@ func (sc *SacctCommand) ReifyForRemote(x *ArgReifier) error { func (sc *SacctCommand) Validate() error { var e1, e7, e8, e9 error e1 = errors.Join( - sc.DevArgs.Validate(), - sc.SourceArgs.Validate(), - sc.QueryArgs.Validate(), - sc.HostArgs.Validate(), - sc.VerboseArgs.Validate(), - sc.ConfigFileArgs.Validate(), + sc.HostAnalysisArgs.Validate(), ValidateFormatArgs( &sc.FormatArgs, sacctDefaultFields, sacctFormatters, sacctAliases, DefaultFixed), ) diff --git a/code/sonalyze/cmd/top/top.go b/code/sonalyze/cmd/top/top.go index cecc1bfd..4c92d869 100644 --- a/code/sonalyze/cmd/top/top.go +++ b/code/sonalyze/cmd/top/top.go @@ -19,7 +19,6 @@ package top import ( "bufio" _ "embed" - "errors" "fmt" "io" "slices" @@ -35,12 +34,7 @@ import ( ) type TopCommand struct /* implements AnalysisCommand */ { - // Almost SharedArgs, but HostArgs instead of RecordFilterArgs - DevArgs - SourceArgs - HostArgs - VerboseArgs - ConfigFileArgs + HostAnalysisArgs } var _ = AnalysisCommand((*TopCommand)(nil)) @@ -53,31 +47,15 @@ func (tc *TopCommand) Summary(out io.Writer) { } func (tc *TopCommand) Add(fs *CLI) { - tc.DevArgs.Add(fs) - tc.SourceArgs.Add(fs) - tc.HostArgs.Add(fs) - tc.VerboseArgs.Add(fs) - tc.ConfigFileArgs.Add(fs) + tc.HostAnalysisArgs.Add(fs) } func (tc *TopCommand) Validate() error { - var e1, e2, e3, e4, e5 error - e1 = tc.DevArgs.Validate() - e2 = tc.SourceArgs.Validate() - e3 = tc.HostArgs.Validate() - e4 = tc.VerboseArgs.Validate() - e5 = tc.ConfigFileArgs.Validate() - return errors.Join(e1, e2, e3, e4, e5) + return tc.HostAnalysisArgs.Validate() } func (tc *TopCommand) ReifyForRemote(x *ArgReifier) error { - // tc.Verbose is not reified, as for SharedArgs. - return errors.Join( - tc.DevArgs.ReifyForRemote(x), - tc.SourceArgs.ReifyForRemote(x), - tc.HostArgs.ReifyForRemote(x), - tc.ConfigFileArgs.ReifyForRemote(x), - ) + return tc.HostAnalysisArgs.ReifyForRemote(x) } func (tc *TopCommand) MaybeFormatHelp() *FormatHelp {