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 }