github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/compute/bidstrategy/external_http_strategy.go (about)

     1  package bidstrategy
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"fmt"
     7  	"net/http"
     8  
     9  	"github.com/filecoin-project/bacalhau/pkg/model"
    10  	"github.com/rs/zerolog/log"
    11  )
    12  
    13  type ExternalHTTPStrategyParams struct {
    14  	URL string
    15  }
    16  
    17  type ExternalHTTPStrategy struct {
    18  	url string
    19  }
    20  
    21  func NewExternalHTTPStrategy(params ExternalHTTPStrategyParams) *ExternalHTTPStrategy {
    22  	return &ExternalHTTPStrategy{
    23  		url: params.URL,
    24  	}
    25  }
    26  
    27  func (s *ExternalHTTPStrategy) ShouldBid(ctx context.Context, request BidStrategyRequest) (BidStrategyResponse, error) {
    28  	if s.url == "" {
    29  		return newShouldBidResponse(), nil
    30  	}
    31  
    32  	data := getJobSelectionPolicyProbeData(request)
    33  	jsonData, err := model.JSONMarshalWithMax(data)
    34  
    35  	if err != nil {
    36  		return BidStrategyResponse{}, fmt.Errorf("ExternalHTTPStrategy: error marshaling job selection policy probe data: %w", err)
    37  	}
    38  
    39  	body := bytes.NewBuffer(jsonData)
    40  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, s.url, body)
    41  	req.Header.Add("Content-Type", "application/json")
    42  	if err != nil {
    43  		log.Ctx(ctx).Error().Msgf("could not create http request with context: %s", s.url)
    44  	}
    45  	resp, err := http.DefaultClient.Do(req)
    46  	resp.Body.Close()
    47  
    48  	if err != nil {
    49  		return BidStrategyResponse{},
    50  			fmt.Errorf("ExternalHTTPStrategy: error http POST job selection policy probe data: %s %w", s.url, err)
    51  	}
    52  
    53  	if resp.StatusCode == http.StatusOK {
    54  		return newShouldBidResponse(), nil
    55  	}
    56  	return BidStrategyResponse{
    57  		ShouldBid: false,
    58  		Reason:    fmt.Sprintf("url `%s` returned %d status code", s.url, resp.StatusCode),
    59  	}, nil
    60  }
    61  
    62  func (s *ExternalHTTPStrategy) ShouldBidBasedOnUsage(
    63  	_ context.Context, _ BidStrategyRequest, _ model.ResourceUsageData) (BidStrategyResponse, error) {
    64  	return newShouldBidResponse(), nil
    65  }