diff --git a/cmd/blockchaincmd/add_validator.go b/cmd/blockchaincmd/add_validator.go index 8cec283dd..2c0631e8d 100644 --- a/cmd/blockchaincmd/add_validator.go +++ b/cmd/blockchaincmd/add_validator.go @@ -41,6 +41,7 @@ var ( networkoptions.Devnet, networkoptions.Fuji, networkoptions.Mainnet, + networkoptions.EtnaDevnet, } nodeIDStr string @@ -128,18 +129,25 @@ func addValidator(_ *cobra.Command, args []string) error { return err } + sc, err := app.LoadSidecar(blockchainName) + if err != nil { + return fmt.Errorf("failed to load sidecar: %w", err) + } + + networkOptionsList := networkoptions.GetNetworkFromSidecar(sc, addValidatorSupportedNetworkOptions) network, err := networkoptions.GetNetworkFromCmdLineFlags( app, "", globalNetworkFlags, true, false, - addValidatorSupportedNetworkOptions, + networkOptionsList, "", ) if err != nil { return err } + if network.ClusterName != "" { clusterNameFlagValue = network.ClusterName network = models.ConvertClusterToNetwork(network) @@ -183,10 +191,6 @@ func addValidator(_ *cobra.Command, args []string) error { return err } - sc, err := app.LoadSidecar(blockchainName) - if err != nil { - return fmt.Errorf("failed to load sidecar: %w", err) - } sovereign := sc.Sovereign if sovereign && network.Kind == models.Mainnet { diff --git a/cmd/blockchaincmd/change_weight.go b/cmd/blockchaincmd/change_weight.go index 996d08153..a3fb5a949 100644 --- a/cmd/blockchaincmd/change_weight.go +++ b/cmd/blockchaincmd/change_weight.go @@ -48,24 +48,25 @@ func setWeight(_ *cobra.Command, args []string) error { return err } + sc, err := app.LoadSidecar(blockchainName) + if err != nil { + return fmt.Errorf("failed to load sidecar: %w", err) + } + + networkOptionsList := networkoptions.GetNetworkFromSidecar(sc, removeValidatorSupportedNetworkOptions) network, err := networkoptions.GetNetworkFromCmdLineFlags( app, "", globalNetworkFlags, true, false, - removeValidatorSupportedNetworkOptions, + networkOptionsList, "", ) if err != nil { return err } - sc, err := app.LoadSidecar(blockchainName) - if err != nil { - return err - } - if network.Kind == models.Mainnet && sc.Sovereign { return errNotSupportedOnMainnet } diff --git a/cmd/blockchaincmd/remove_validator.go b/cmd/blockchaincmd/remove_validator.go index 61fc353a9..8a093c2ef 100644 --- a/cmd/blockchaincmd/remove_validator.go +++ b/cmd/blockchaincmd/remove_validator.go @@ -33,6 +33,7 @@ var removeValidatorSupportedNetworkOptions = []networkoptions.NetworkOption{ networkoptions.Devnet, networkoptions.Fuji, networkoptions.Mainnet, + networkoptions.EtnaDevnet, } // avalanche blockchain removeValidator @@ -70,13 +71,19 @@ func removeValidator(_ *cobra.Command, args []string) error { return err } + sc, err := app.LoadSidecar(blockchainName) + if err != nil { + return err + } + + networkOptionsList := networkoptions.GetNetworkFromSidecar(sc, removeValidatorSupportedNetworkOptions) network, err := networkoptions.GetNetworkFromCmdLineFlags( app, "", globalNetworkFlags, true, false, - removeValidatorSupportedNetworkOptions, + networkOptionsList, "", ) if err != nil { @@ -101,11 +108,6 @@ func removeValidator(_ *cobra.Command, args []string) error { } network.HandlePublicNetworkSimulation() - sc, err := app.LoadSidecar(blockchainName) - if err != nil { - return err - } - if sc.Sovereign && network.Kind == models.Mainnet { return errNotSupportedOnMainnet } diff --git a/pkg/networkoptions/network_options.go b/pkg/networkoptions/network_options.go index b07b28211..3d75b94b4 100644 --- a/pkg/networkoptions/network_options.go +++ b/pkg/networkoptions/network_options.go @@ -51,21 +51,22 @@ func (n NetworkOption) String() string { } func NetworkOptionFromString(s string) NetworkOption { - switch s { - case "Mainnet": + switch { + case s == "Mainnet": return Mainnet - case "Fuji Testnet": + case s == "Fuji Testnet": return Fuji - case "Local Network": + case s == "Local Network": return Local - case "Etna Devnet": + case s == "Etna Devnet": return EtnaDevnet - case "Devnet": + case s == "Devnet" || strings.Contains(s, "Devnet"): return Devnet - case "Cluster": + case s == "Cluster" || strings.Contains(s, "Cluster"): return Cluster + default: + return Undefined } - return Undefined } type NetworkFlags struct { @@ -172,6 +173,21 @@ func GetSupportedNetworkOptionsForSubnet( return filteredSupportedNetworkOptions, clusterNames, devnetEndpoints, nil } +func GetNetworkFromSidecar(sc models.Sidecar, defaultOption []NetworkOption) []NetworkOption { + networkOptionsList := []NetworkOption{} + for scNetwork := range sc.Networks { + if NetworkOptionFromString(scNetwork) != Undefined { + networkOptionsList = append(networkOptionsList, NetworkOptionFromString(scNetwork)) + } + } + + // default network options to add validator options + if len(networkOptionsList) == 0 { + networkOptionsList = defaultOption + } + return networkOptionsList +} + func GetNetworkFromCmdLineFlags( app *application.Avalanche, promptStr string, @@ -241,7 +257,8 @@ func GetNetworkFromCmdLineFlags( } } // unsupported option - if networkOption != Undefined && !slices.Contains(supportedNetworkOptions, networkOption) { + // allow cluster because we can extract underlying network from cluster + if networkOption != Undefined && !slices.Contains(supportedNetworkOptions, networkOption) && networkOption != Cluster { errMsg := fmt.Errorf("network flag %s is not supported. use one of %s", networkFlagsMap[networkOption], supportedNetworksFlags) if subnetName != "" { clustersMsg := ""