From 7c81c7da903884fd34ead687cfcba2ab6848639b Mon Sep 17 00:00:00 2001 From: kira Date: Wed, 10 Jul 2024 04:08:37 -0700 Subject: [PATCH] fix: Multiple network flags should prevent the BN to start (#14169) * Implement Initial Logic * Include check in main.go * Add tests for multiple flags * remove usage of append * remove config/features dependency * Move ValidateNetworkFlags to config/features * Nit * removed NetworkFlags from cmd * remove usage of empty string literal * add comment * add flag validation to prysctl validator-exit --------- Co-authored-by: Manu NALEPA --- cmd/beacon-chain/main.go | 4 +++ cmd/prysmctl/validator/cmd.go | 3 +++ cmd/validator/main.go | 4 +++ config/features/config.go | 24 +++++++++++++++++ config/features/config_test.go | 47 ++++++++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+) diff --git a/cmd/beacon-chain/main.go b/cmd/beacon-chain/main.go index b74f9d5236..19819c8e43 100644 --- a/cmd/beacon-chain/main.go +++ b/cmd/beacon-chain/main.go @@ -212,6 +212,10 @@ func before(ctx *cli.Context) error { return errors.Wrap(err, "failed to set max fd limits") } + if err := features.ValidateNetworkFlags(ctx); err != nil { + return errors.Wrap(err, "provided multiple network flags") + } + return cmd.ValidateNoArgs(ctx) } diff --git a/cmd/prysmctl/validator/cmd.go b/cmd/prysmctl/validator/cmd.go index 54cb99a5e7..fa25ca70df 100644 --- a/cmd/prysmctl/validator/cmd.go +++ b/cmd/prysmctl/validator/cmd.go @@ -175,6 +175,9 @@ var Commands = []*cli.Command{ if err := cmd.LoadFlagsFromConfig(cliCtx, cliCtx.Command.Flags); err != nil { return err } + if err := features.ValidateNetworkFlags(cliCtx); err != nil { + return err + } if err := tos.VerifyTosAcceptedOrPrompt(cliCtx); err != nil { return err } diff --git a/cmd/validator/main.go b/cmd/validator/main.go index c4584f955b..cb0287a60c 100644 --- a/cmd/validator/main.go +++ b/cmd/validator/main.go @@ -193,6 +193,10 @@ func main() { return errors.Wrap(err, "failed to setup debug") } + if err := features.ValidateNetworkFlags(ctx); err != nil { + return errors.Wrap(err, "provided multiple network flags") + } + return cmd.ValidateNoArgs(ctx) }, After: func(ctx *cli.Context) error { diff --git a/config/features/config.go b/config/features/config.go index 925d32a89e..3926af4a2f 100644 --- a/config/features/config.go +++ b/config/features/config.go @@ -20,6 +20,8 @@ The process for implementing new features using this package is as follows: package features import ( + "fmt" + "strings" "sync" "time" @@ -337,3 +339,25 @@ func logDisabled(flag cli.DocGenerationFlag) { } log.WithField(name, flag.GetUsage()).Warn(disabledFeatureFlag) } + +// ValidateNetworkFlags validates provided flags and +// prevents beacon node or validator to start +// if more than one network flag is provided +func ValidateNetworkFlags(ctx *cli.Context) error { + networkFlagsCount := 0 + for _, flag := range NetworkFlags { + if ctx.IsSet(flag.Names()[0]) { + networkFlagsCount++ + if networkFlagsCount > 1 { + // using a forLoop so future addition + // doesn't require changes in this function + var flagNames []string + for _, flag := range NetworkFlags { + flagNames = append(flagNames, "--"+flag.Names()[0]) + } + return fmt.Errorf("cannot use more than one network flag at the same time. Possible network flags are: %s", strings.Join(flagNames, ", ")) + } + } + } + return nil +} diff --git a/config/features/config_test.go b/config/features/config_test.go index 313945c0cc..35ee7dfe5f 100644 --- a/config/features/config_test.go +++ b/config/features/config_test.go @@ -46,3 +46,50 @@ func TestConfigureBeaconConfig(t *testing.T) { c := Get() assert.Equal(t, true, c.EnableSlasher) } + +func TestValidateNetworkFlags(t *testing.T) { + // Define the test cases + tests := []struct { + name string + args []string + wantErr bool + }{ + { + name: "No network flags", + args: []string{"command"}, + wantErr: false, + }, + { + name: "One network flag", + args: []string{"command", "--sepolia"}, + wantErr: false, + }, + { + name: "Two network flags", + args: []string{"command", "--sepolia", "--holesky"}, + wantErr: true, + }, + { + name: "All network flags", + args: []string{"command", "--sepolia", "--holesky", "--mainnet"}, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Create a new CLI app with the ValidateNetworkFlags function as the Before action + app := &cli.App{ + Before: ValidateNetworkFlags, + Action: func(c *cli.Context) error { + return nil + }, + // Set the network flags for the app + Flags: NetworkFlags, + } + err := app.Run(tt.args) + if (err != nil) != tt.wantErr { + t.Errorf("ValidateNetworkFlags() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +}