github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/worker/db_worker_provider.go (about) 1 package worker 2 3 import ( 4 "net/http" 5 "time" 6 7 "code.cloudfoundry.org/clock" 8 "code.cloudfoundry.org/lager" 9 bclient "github.com/concourse/baggageclaim/client" 10 "github.com/pf-qiu/concourse/v6/atc/db" 11 "github.com/pf-qiu/concourse/v6/atc/db/lock" 12 "github.com/pf-qiu/concourse/v6/atc/worker/gclient" 13 "github.com/pf-qiu/concourse/v6/atc/worker/transport" 14 "github.com/concourse/retryhttp" 15 "github.com/cppforlife/go-semi-semantic/version" 16 ) 17 18 type dbWorkerProvider struct { 19 lockFactory lock.LockFactory 20 retryBackOffFactory retryhttp.BackOffFactory 21 resourceFetcher Fetcher 22 imageFactory ImageFactory 23 dbResourceCacheFactory db.ResourceCacheFactory 24 dbResourceConfigFactory db.ResourceConfigFactory 25 dbWorkerBaseResourceTypeFactory db.WorkerBaseResourceTypeFactory 26 dbTaskCacheFactory db.TaskCacheFactory 27 dbWorkerTaskCacheFactory db.WorkerTaskCacheFactory 28 dbVolumeRepository db.VolumeRepository 29 dbTeamFactory db.TeamFactory 30 dbWorkerFactory db.WorkerFactory 31 workerVersion version.Version 32 baggageclaimResponseHeaderTimeout time.Duration 33 gardenRequestTimeout time.Duration 34 } 35 36 func NewDBWorkerProvider( 37 lockFactory lock.LockFactory, 38 retryBackOffFactory retryhttp.BackOffFactory, 39 fetcher Fetcher, 40 imageFactory ImageFactory, 41 dbResourceCacheFactory db.ResourceCacheFactory, 42 dbResourceConfigFactory db.ResourceConfigFactory, 43 dbWorkerBaseResourceTypeFactory db.WorkerBaseResourceTypeFactory, 44 dbTaskCacheFactory db.TaskCacheFactory, 45 dbWorkerTaskCacheFactory db.WorkerTaskCacheFactory, 46 dbVolumeRepository db.VolumeRepository, 47 dbTeamFactory db.TeamFactory, 48 workerFactory db.WorkerFactory, 49 workerVersion version.Version, 50 baggageclaimResponseHeaderTimeout, gardenRequestTimeout time.Duration, 51 ) WorkerProvider { 52 return &dbWorkerProvider{ 53 lockFactory: lockFactory, 54 retryBackOffFactory: retryBackOffFactory, 55 resourceFetcher: fetcher, 56 imageFactory: imageFactory, 57 dbResourceCacheFactory: dbResourceCacheFactory, 58 dbResourceConfigFactory: dbResourceConfigFactory, 59 dbWorkerBaseResourceTypeFactory: dbWorkerBaseResourceTypeFactory, 60 dbTaskCacheFactory: dbTaskCacheFactory, 61 dbWorkerTaskCacheFactory: dbWorkerTaskCacheFactory, 62 dbVolumeRepository: dbVolumeRepository, 63 dbTeamFactory: dbTeamFactory, 64 dbWorkerFactory: workerFactory, 65 workerVersion: workerVersion, 66 baggageclaimResponseHeaderTimeout: baggageclaimResponseHeaderTimeout, 67 gardenRequestTimeout: gardenRequestTimeout, 68 } 69 } 70 71 func (provider *dbWorkerProvider) RunningWorkers(logger lager.Logger) ([]Worker, error) { 72 savedWorkers, err := provider.dbWorkerFactory.Workers() 73 if err != nil { 74 return nil, err 75 } 76 77 buildContainersCountPerWorker, err := provider.dbWorkerFactory.BuildContainersCountPerWorker() 78 if err != nil { 79 return nil, err 80 } 81 82 workers := []Worker{} 83 84 for _, savedWorker := range savedWorkers { 85 if savedWorker.State() != db.WorkerStateRunning { 86 continue 87 } 88 89 workerLog := logger.Session("running-worker") 90 worker := provider.NewGardenWorker( 91 workerLog, 92 savedWorker, 93 buildContainersCountPerWorker[savedWorker.Name()], 94 ) 95 if !worker.IsVersionCompatible(workerLog, provider.workerVersion) { 96 continue 97 } 98 99 workers = append(workers, worker) 100 } 101 102 return workers, nil 103 } 104 105 func (provider *dbWorkerProvider) FindWorkersForContainerByOwner( 106 logger lager.Logger, 107 owner db.ContainerOwner, 108 ) ([]Worker, error) { 109 logger = logger.Session("worker-for-container") 110 dbWorkers, err := provider.dbWorkerFactory.FindWorkersForContainerByOwner(owner) 111 if err != nil { 112 return nil, err 113 } 114 115 var workers []Worker 116 for _, w := range dbWorkers { 117 worker := provider.NewGardenWorker(logger, w, 0) 118 if worker.IsVersionCompatible(logger, provider.workerVersion) { 119 workers = append(workers, worker) 120 } 121 } 122 123 return workers, nil 124 } 125 126 func (provider *dbWorkerProvider) FindWorkerForContainer( 127 logger lager.Logger, 128 teamID int, 129 handle string, 130 ) (Worker, bool, error) { 131 logger = logger.Session("worker-for-container") 132 team := provider.dbTeamFactory.GetByID(teamID) 133 134 dbWorker, found, err := team.FindWorkerForContainer(handle) 135 if err != nil { 136 return nil, false, err 137 } 138 139 if !found { 140 return nil, false, nil 141 } 142 143 worker := provider.NewGardenWorker(logger, dbWorker, 0) 144 if !worker.IsVersionCompatible(logger, provider.workerVersion) { 145 return nil, false, nil 146 } 147 return worker, true, err 148 } 149 150 func (provider *dbWorkerProvider) FindWorkerForVolume( 151 logger lager.Logger, 152 teamID int, 153 handle string, 154 ) (Worker, bool, error) { 155 logger = logger.Session("worker-for-volume") 156 team := provider.dbTeamFactory.GetByID(teamID) 157 158 dbWorker, found, err := team.FindWorkerForVolume(handle) 159 if err != nil { 160 return nil, false, err 161 } 162 163 if !found { 164 return nil, false, nil 165 } 166 167 worker := provider.NewGardenWorker(logger, dbWorker, 0) 168 if !worker.IsVersionCompatible(logger, provider.workerVersion) { 169 return nil, false, nil 170 } 171 return worker, true, err 172 } 173 174 func (provider *dbWorkerProvider) NewGardenWorker(logger lager.Logger, savedWorker db.Worker, buildContainersCount int) Worker { 175 gcf := gclient.NewGardenClientFactory( 176 provider.dbWorkerFactory, 177 logger.Session("garden-connection"), 178 savedWorker.Name(), 179 savedWorker.GardenAddr(), 180 provider.retryBackOffFactory, 181 provider.gardenRequestTimeout, 182 ) 183 184 gClient := gcf.NewClient() 185 186 bClient := bclient.New("", transport.NewBaggageclaimRoundTripper( 187 savedWorker.Name(), 188 savedWorker.BaggageclaimURL(), 189 provider.dbWorkerFactory, 190 &http.Transport{ 191 DisableKeepAlives: true, 192 ResponseHeaderTimeout: provider.baggageclaimResponseHeaderTimeout, 193 }, 194 )) 195 196 volumeClient := NewVolumeClient( 197 bClient, 198 savedWorker, 199 clock.NewClock(), 200 provider.lockFactory, 201 provider.dbVolumeRepository, 202 provider.dbWorkerBaseResourceTypeFactory, 203 provider.dbTaskCacheFactory, 204 provider.dbWorkerTaskCacheFactory, 205 ) 206 207 return NewGardenWorker( 208 gClient, 209 provider.dbVolumeRepository, 210 volumeClient, 211 provider.imageFactory, 212 provider.resourceFetcher, 213 provider.dbTeamFactory, 214 savedWorker, 215 provider.dbResourceCacheFactory, 216 buildContainersCount, 217 ) 218 }