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  }