diff --git a/cmd/sifgen/main.go b/cmd/sifgen/main.go index e105291878..d8e4f3dbb2 100644 --- a/cmd/sifgen/main.go +++ b/cmd/sifgen/main.go @@ -1,6 +1,7 @@ package main import ( + "context" // Add context import "fmt" "io/ioutil" "log" @@ -56,22 +57,27 @@ func networkCmd() *cobra.Command { } } + + func networkCreateCmd() *cobra.Command { - return &cobra.Command{ + cmd := &cobra.Command{ Use: "create [chain-id] [validator-count] [output-dir] [seed-ip-address] [output-file]", Short: "Create a new network.", - Args: cobra.MinimumNArgs(4), + Args: cobra.MinimumNArgs(5), // Changed to 5 args due to new provider flag Run: func(cmd *cobra.Command, args []string) { bondAmount, _ := cmd.Flags().GetString("bond-amount") mintAmount, _ := cmd.Flags().GetString("mint-amount") keyringBackend, _ := cmd.Flags().GetString("keyring-backend") + cloudProvider, _ := cmd.Flags().GetString("cloud-provider") // Get cloud-provider flag count, _ := strconv.Atoi(args[1]) - network := sifgen.NewSifgen(&args[0]).NewNetwork(keyringBackend) + sifgenInstance := sifgen.NewSifgen(&args[0]) + network := sifgenInstance.NewNetwork(keyringBackend, cloudProvider) // Pass cloudProvider network.BondAmount = bondAmount network.MintAmount = mintAmount - summary, err := network.Build(count, args[2], args[3]) + ctx := context.Background() // Create a new context + summary, err := network.Build(ctx, count, args[2], args[3]) // Pass context to Build if err != nil { log.Fatal(err) } @@ -81,6 +87,8 @@ func networkCreateCmd() *cobra.Command { } }, } + cmd.Flags().String("cloud-provider", "", "Cloud provider to use (e.g., 'gcp')") // Define the flag + return cmd } func networkResetCmd() *cobra.Command { diff --git a/tools/sifgen/common/types/provider.go b/tools/sifgen/common/types/provider.go new file mode 100644 index 0000000000..ee7dd83448 --- /dev/null +++ b/tools/sifgen/common/types/provider.go @@ -0,0 +1,18 @@ + +package types + +import "context" + +type Node struct { + ID string + Name string + IP string + // Add other relevant node properties +} + +// Provider defines the interface for cloud provider interactions. +type Provider interface { + GetNodes(ctx context.Context) ([]Node, error) + CreateNode(ctx context.Context, name string) (*Node, error) + DeleteNode(ctx context.Context, id string) error +} diff --git a/tools/sifgen/network/network.go b/tools/sifgen/network/network.go index 704dea5dcd..bed614e207 100644 --- a/tools/sifgen/network/network.go +++ b/tools/sifgen/network/network.go @@ -1,6 +1,7 @@ package network import ( + "context" // Add context import "crypto/sha256" "fmt" "io/ioutil" @@ -9,6 +10,7 @@ import ( "strings" "github.com/Sifchain/sifnode/tools/sifgen/common" + sifgentypes "github.com/serfersac/sifnode/tools/sifgen/common/types" // Import the common types "github.com/Sifchain/sifnode/tools/sifgen/genesis" "github.com/Sifchain/sifnode/tools/sifgen/network/types" "github.com/Sifchain/sifnode/tools/sifgen/utils" @@ -18,11 +20,23 @@ import ( "gopkg.in/yaml.v3" ) + + type Network struct { ChainID string CLI utils.CLI BondAmount string MintAmount string + Provider sifgentypes.Provider // Add Provider field +} + +// NewNetwork creates a new Network instance. +func NewNetwork(chainID string, provider sifgentypes.Provider) *Network { + return &Network{ + ChainID: chainID, + CLI: utils.NewCLI(chainID, keyring.BackendTest), + Provider: provider, + } } func Reset(chainID, networkDir string) error { @@ -54,14 +68,9 @@ func Reset(chainID, networkDir string) error { return nil } -func NewNetwork(chainID string) *Network { - return &Network{ - ChainID: chainID, - CLI: utils.NewCLI(chainID, keyring.BackendTest), - } -} -func (n *Network) Build(count int, outputDir, seedIPv4Addr string) (*string, error) { + +func (n *Network) Build(ctx context.Context, count int, outputDir, seedIPv4Addr string) (*string, error) { // Added ctx if err := n.CLI.Reset([]string{outputDir}); err != nil { return nil, err } @@ -76,7 +85,21 @@ func (n *Network) Build(count int, outputDir, seedIPv4Addr string) (*string, err } gentxDir := fmt.Sprintf("%s/%s", outputDir, GentxsDir) - validators := n.initValidators(count, outputDir, seedIPv4Addr) + + var validators []*Validator + for i := 0; i < count; i++ { + nodeName := fmt.Sprintf("sifnode-validator-%d", i) + cloudNode, err := n.Provider.CreateNode(ctx, nodeName) // Use n.Provider + if err != nil { + return nil, fmt.Errorf("failed to create cloud node %s: %w", nodeName, err) + } + + validator := NewValidator(outputDir, n.ChainID, i == 0, cloudNode.IP) // Assuming first node is seed + validator.Moniker = cloudNode.Name + validator.IPv4Address = cloudNode.IP + // Set other validator fields from cloudNode if available + validators = append(validators, validator) + } for _, validator := range validators { appDirs := []string{validator.NodeHomeDir} diff --git a/tools/sifgen/sifgen.go b/tools/sifgen/sifgen.go index 5a741d7aa7..aa4243c1f8 100644 --- a/tools/sifgen/sifgen.go +++ b/tools/sifgen/sifgen.go @@ -1,12 +1,14 @@ package sifgen import ( + "context" "fmt" "io/ioutil" "log" "github.com/MakeNowJust/heredoc" - + "github.com/serfersac/sifnode/gcp" // Import the GCP provider + sifgentypes "github.com/serfersac/sifnode/tools/sifgen/common/types" // Import the common types "github.com/Sifchain/sifnode/tools/sifgen/key" "github.com/Sifchain/sifnode/tools/sifgen/network" "github.com/Sifchain/sifnode/tools/sifgen/node" @@ -15,12 +17,27 @@ import ( type Sifgen struct { chainID *string + providers map[string]sifgentypes.Provider } func NewSifgen(chainID *string) Sifgen { - return Sifgen{ + s := Sifgen{ chainID: chainID, + providers: make(map[string]sifgentypes.Provider), + } + // Register GCP provider + ctx := context.Background() // Use a background context for initial provider setup + gcpProvider, err := gcp.NewGCPProvider(ctx, "sifchain-devnet-307421", "asia-east1-a") // TODO: Make projectID and zone configurable + if err != nil { + log.Fatalf("Failed to create GCP provider: %v", err) } + s.RegisterProvider("gcp", gcpProvider) + return s +} + +// RegisterProvider registers a new cloud provider. +func (s *Sifgen) RegisterProvider(name string, provider sifgentypes.Provider) { + s.providers[name] = provider } func (s Sifgen) NewNetwork(keyringBackend string) *network.Network { @@ -30,9 +47,16 @@ func (s Sifgen) NewNetwork(keyringBackend string) *network.Network { } } -func (s Sifgen) NetworkCreate(count int, outputDir, startingIPAddress string, outputFile string) { +func (s Sifgen) NetworkCreate(ctx context.Context, count int, outputDir, startingIPAddress, providerName, outputFile string) { + provider, ok := s.providers[providerName] + if !ok { + log.Fatalf("Provider '%s' not found", providerName) + } + net := network.NewNetwork(*s.chainID) - summary, err := net.Build(count, outputDir, startingIPAddress) + // Assuming net.Build can take a provider to create nodes + // This part needs further integration with the existing network.Build logic + summary, err := net.Build(ctx, count, outputDir, startingIPAddress, provider) if err != nil { log.Fatal(err) return