github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/cmd/bacalhau/simulator.go (about)

     1  package bacalhau
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/filecoin-project/bacalhau/pkg/devstack"
     7  	"github.com/filecoin-project/bacalhau/pkg/jobstore/inmemory"
     8  	"github.com/filecoin-project/bacalhau/pkg/libp2p"
     9  	"github.com/filecoin-project/bacalhau/pkg/node"
    10  	"github.com/filecoin-project/bacalhau/pkg/system"
    11  	"github.com/multiformats/go-multiaddr"
    12  	"github.com/rs/zerolog/log"
    13  	"github.com/spf13/cobra"
    14  )
    15  
    16  func newSimulatorCmd() *cobra.Command {
    17  	return &cobra.Command{
    18  		Use:   "simulator",
    19  		Short: "Run the bacalhau simulator",
    20  		RunE: func(cmd *cobra.Command, args []string) error {
    21  			return runSimulator(cmd)
    22  		},
    23  	}
    24  }
    25  
    26  func runSimulator(cmd *cobra.Command) error {
    27  	ctx := cmd.Context()
    28  	cm := ctx.Value(systemManagerKey).(*system.CleanupManager)
    29  	//Cleanup manager ensures that resources are freed before exiting:
    30  	datastore := inmemory.NewJobStore()
    31  	libp2pHost, err := libp2p.NewHost(9075) //nolint:gomnd
    32  	if err != nil {
    33  		Fatal(cmd, fmt.Sprintf("Error creating libp2p host: %s", err), 1)
    34  	}
    35  	cm.RegisterCallback(libp2pHost.Close)
    36  
    37  	// print out simulator multi-address
    38  	p2pAddr, err := multiaddr.NewMultiaddr("/p2p/" + libp2pHost.ID().String())
    39  	if err != nil {
    40  		Fatal(cmd, fmt.Sprintf("Error creating p2p multiaddr: %s", err), 1)
    41  	}
    42  	fullAddr := libp2pHost.Addrs()[0].Encapsulate(p2pAddr)
    43  	log.Ctx(ctx).Info().Msgf("Simulator reachable at: %s", fullAddr)
    44  	log.Ctx(ctx).Info().Msgf("You can run: bacalhau devstack --simulator-addr \"%s\"", fullAddr)
    45  
    46  	// Create node config from cmd arguments
    47  	nodeConfig := node.NodeConfig{
    48  		CleanupManager:      cm,
    49  		JobStore:            datastore,
    50  		Host:                libp2pHost,
    51  		HostAddress:         "0.0.0.0",
    52  		APIPort:             apiPort,
    53  		ComputeConfig:       node.NewComputeConfigWithDefaults(),
    54  		RequesterNodeConfig: node.NewRequesterConfigWithDefaults(),
    55  		SimulatorNodeID:     libp2pHost.ID().String(),
    56  		IsComputeNode:       true,
    57  		IsRequesterNode:     true,
    58  	}
    59  	node, err := node.NewNode(ctx, nodeConfig, devstack.NewNoopNodeDependencyInjector())
    60  	if err != nil {
    61  		Fatal(cmd, fmt.Sprintf("Error creating node: %s", err), 1)
    62  	}
    63  	// Start node
    64  	err = node.Start(ctx)
    65  	if err != nil {
    66  		Fatal(cmd, fmt.Sprintf("Error starting node: %s", err), 1)
    67  	}
    68  
    69  	<-ctx.Done() // block until killed
    70  	return nil
    71  }