github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/requester/discovery/identity.go (about)

     1  package discovery
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/filecoin-project/bacalhau/pkg/model"
     7  	"github.com/filecoin-project/bacalhau/pkg/requester"
     8  	"github.com/filecoin-project/bacalhau/pkg/transport/bprotocol"
     9  	"github.com/libp2p/go-libp2p/core/host"
    10  	"github.com/libp2p/go-libp2p/core/peer"
    11  	"github.com/rs/zerolog/log"
    12  )
    13  
    14  type IdentityNodeDiscovererParams struct {
    15  	Host host.Host
    16  }
    17  
    18  type IdentityNodeDiscoverer struct {
    19  	host host.Host
    20  }
    21  
    22  func NewIdentityNodeDiscoverer(params IdentityNodeDiscovererParams) *IdentityNodeDiscoverer {
    23  	return &IdentityNodeDiscoverer{
    24  		host: params.Host,
    25  	}
    26  }
    27  
    28  func (d *IdentityNodeDiscoverer) FindNodes(ctx context.Context, job model.Job) ([]model.NodeInfo, error) {
    29  	var peers []peer.ID
    30  
    31  	// check local protocols in case the current node is also a compute node
    32  	// peerstore doesn't seem to hold protocols of the current node
    33  	for _, protocol := range d.host.Mux().Protocols() {
    34  		if protocol == bprotocol.AskForBidProtocolID {
    35  			peers = append(peers, d.host.ID())
    36  		}
    37  	}
    38  
    39  	for _, peerID := range d.host.Peerstore().Peers() {
    40  		if peerID == d.host.ID() {
    41  			continue
    42  		}
    43  		supportedProtocols, err := d.host.Peerstore().SupportsProtocols(peerID, bprotocol.AskForBidProtocolID)
    44  		if err != nil {
    45  			log.Ctx(ctx).Warn().Err(err).Msgf("failed to get supported protocols for peer %s", peerID)
    46  			continue
    47  		}
    48  		if len(supportedProtocols) > 0 {
    49  			peers = append(peers, peerID)
    50  		}
    51  	}
    52  
    53  	nodeInfos := make([]model.NodeInfo, len(peers))
    54  	for i, peerID := range peers {
    55  		nodeInfos[i] = model.NodeInfo{
    56  			PeerInfo:        d.host.Peerstore().PeerInfo(peerID),
    57  			NodeType:        model.NodeTypeCompute,
    58  			ComputeNodeInfo: model.ComputeNodeInfo{},
    59  		}
    60  	}
    61  	return nodeInfos, nil
    62  }
    63  
    64  // compile time check that IdentityNodeDiscoverer implements NodeDiscoverer
    65  var _ requester.NodeDiscoverer = (*IdentityNodeDiscoverer)(nil)