github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/worker/gclient/factory.go (about)

     1  package gclient
     2  
     3  import (
     4  	"net/http"
     5  	"time"
     6  
     7  	"code.cloudfoundry.org/garden/routes"
     8  	"code.cloudfoundry.org/lager"
     9  	"github.com/pf-qiu/concourse/v6/atc/worker/gclient/connection"
    10  	"github.com/pf-qiu/concourse/v6/atc/worker/transport"
    11  	"github.com/concourse/retryhttp"
    12  	"github.com/tedsuo/rata"
    13  )
    14  
    15  type gardenClientFactory struct {
    16  	db                         transport.TransportDB
    17  	logger                     lager.Logger
    18  	workerName                 string
    19  	workerHost                 *string
    20  	retryBackOffFactory        retryhttp.BackOffFactory
    21  	streamClientRequestTimeout time.Duration
    22  }
    23  
    24  func NewGardenClientFactory(
    25  	db transport.TransportDB,
    26  	logger lager.Logger,
    27  	workerName string,
    28  	workerHost *string,
    29  	retryBackOffFactory retryhttp.BackOffFactory,
    30  	streamClientRequestTimeout time.Duration,
    31  ) *gardenClientFactory {
    32  	return &gardenClientFactory{
    33  		db:                         db,
    34  		logger:                     logger,
    35  		workerName:                 workerName,
    36  		workerHost:                 workerHost,
    37  		retryBackOffFactory:        retryBackOffFactory,
    38  		streamClientRequestTimeout: streamClientRequestTimeout,
    39  	}
    40  }
    41  
    42  func (gcf *gardenClientFactory) NewClient() Client {
    43  	retryer := &transport.UnreachableWorkerRetryer{
    44  		DelegateRetryer: &retryhttp.DefaultRetryer{},
    45  	}
    46  
    47  	streamClient := &http.Client{
    48  		Transport: &retryhttp.RetryRoundTripper{
    49  			Logger:         gcf.logger.Session("retryable-http-client"),
    50  			BackOffFactory: gcf.retryBackOffFactory,
    51  			RoundTripper:   transport.NewGardenRoundTripper(gcf.workerName, gcf.workerHost, gcf.db, &http.Transport{DisableKeepAlives: true}),
    52  			Retryer:        retryer,
    53  		},
    54  		Timeout: gcf.streamClientRequestTimeout,
    55  	}
    56  
    57  	hijackableClient := &retryhttp.RetryHijackableClient{
    58  		Logger:           gcf.logger.Session("retry-hijackable-client"),
    59  		BackOffFactory:   gcf.retryBackOffFactory,
    60  		HijackableClient: transport.NewHijackableClient(gcf.workerName, gcf.db, retryhttp.DefaultHijackableClient),
    61  		Retryer:          retryer,
    62  	}
    63  
    64  	// the request generator's address doesn't matter because it's overwritten by the worker lookup clients
    65  	hijackStreamer := &transport.WorkerHijackStreamer{
    66  		HttpClient:       streamClient,
    67  		HijackableClient: hijackableClient,
    68  		Req:              rata.NewRequestGenerator("http://127.0.0.1:8080", routes.Routes),
    69  	}
    70  
    71  	return NewClient(NewRetryableConnection(connection.NewWithHijacker(hijackStreamer, gcf.logger)))
    72  }
    73  
    74  // Do not try any client method that requires hijack functionality (streaming logs)!
    75  func BasicGardenClientWithRequestTimeout(logger lager.Logger, requestTimeout time.Duration, address string) Client {
    76  	streamClient := &http.Client{
    77  		Timeout: requestTimeout,
    78  	}
    79  
    80  	streamer := &transport.WorkerHijackStreamer{
    81  		HttpClient:       streamClient,
    82  		HijackableClient: nil,
    83  		Req:              rata.NewRequestGenerator(address, routes.Routes),
    84  	}
    85  
    86  	return NewClient(connection.NewWithHijacker(streamer, logger))
    87  }