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 }