github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/engine/step_factory.go (about)

     1  package engine
     2  
     3  import (
     4  	"crypto/sha1"
     5  	"fmt"
     6  	"path/filepath"
     7  	"time"
     8  
     9  	"github.com/pf-qiu/concourse/v6/atc"
    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/exec"
    13  	"github.com/pf-qiu/concourse/v6/atc/resource"
    14  	"github.com/pf-qiu/concourse/v6/atc/worker"
    15  )
    16  
    17  type coreStepFactory struct {
    18  	pool                  worker.Pool
    19  	client                worker.Client
    20  	resourceFactory       resource.ResourceFactory
    21  	teamFactory           db.TeamFactory
    22  	buildFactory          db.BuildFactory
    23  	resourceCacheFactory  db.ResourceCacheFactory
    24  	resourceConfigFactory db.ResourceConfigFactory
    25  	defaultLimits         atc.ContainerLimits
    26  	strategy              worker.ContainerPlacementStrategy
    27  	lockFactory           lock.LockFactory
    28  	defaultCheckTimeout   time.Duration
    29  }
    30  
    31  func NewCoreStepFactory(
    32  	pool worker.Pool,
    33  	client worker.Client,
    34  	resourceFactory resource.ResourceFactory,
    35  	teamFactory db.TeamFactory,
    36  	buildFactory db.BuildFactory,
    37  	resourceCacheFactory db.ResourceCacheFactory,
    38  	resourceConfigFactory db.ResourceConfigFactory,
    39  	defaultLimits atc.ContainerLimits,
    40  	strategy worker.ContainerPlacementStrategy,
    41  	lockFactory lock.LockFactory,
    42  	defaultCheckTimeout time.Duration,
    43  ) CoreStepFactory {
    44  	return &coreStepFactory{
    45  		pool:                  pool,
    46  		client:                client,
    47  		resourceFactory:       resourceFactory,
    48  		teamFactory:           teamFactory,
    49  		buildFactory:          buildFactory,
    50  		resourceCacheFactory:  resourceCacheFactory,
    51  		resourceConfigFactory: resourceConfigFactory,
    52  		defaultLimits:         defaultLimits,
    53  		strategy:              strategy,
    54  		lockFactory:           lockFactory,
    55  		defaultCheckTimeout:   defaultCheckTimeout,
    56  	}
    57  }
    58  
    59  func (factory *coreStepFactory) GetStep(
    60  	plan atc.Plan,
    61  	stepMetadata exec.StepMetadata,
    62  	containerMetadata db.ContainerMetadata,
    63  	delegateFactory DelegateFactory,
    64  ) exec.Step {
    65  	containerMetadata.WorkingDirectory = resource.ResourcesDir("get")
    66  
    67  	getStep := exec.NewGetStep(
    68  		plan.ID,
    69  		*plan.Get,
    70  		stepMetadata,
    71  		containerMetadata,
    72  		factory.resourceFactory,
    73  		factory.resourceCacheFactory,
    74  		factory.strategy,
    75  		delegateFactory,
    76  		factory.client,
    77  	)
    78  
    79  	getStep = exec.LogError(getStep, delegateFactory)
    80  	if atc.EnableBuildRerunWhenWorkerDisappears {
    81  		getStep = exec.RetryError(getStep, delegateFactory)
    82  	}
    83  	return getStep
    84  }
    85  
    86  func (factory *coreStepFactory) PutStep(
    87  	plan atc.Plan,
    88  	stepMetadata exec.StepMetadata,
    89  	containerMetadata db.ContainerMetadata,
    90  	delegateFactory DelegateFactory,
    91  ) exec.Step {
    92  	containerMetadata.WorkingDirectory = resource.ResourcesDir("put")
    93  
    94  	putStep := exec.NewPutStep(
    95  		plan.ID,
    96  		*plan.Put,
    97  		stepMetadata,
    98  		containerMetadata,
    99  		factory.resourceFactory,
   100  		factory.resourceConfigFactory,
   101  		factory.strategy,
   102  		factory.client,
   103  		delegateFactory,
   104  	)
   105  
   106  	putStep = exec.LogError(putStep, delegateFactory)
   107  	if atc.EnableBuildRerunWhenWorkerDisappears {
   108  		putStep = exec.RetryError(putStep, delegateFactory)
   109  	}
   110  	return putStep
   111  }
   112  
   113  func (factory *coreStepFactory) CheckStep(
   114  	plan atc.Plan,
   115  	stepMetadata exec.StepMetadata,
   116  	containerMetadata db.ContainerMetadata,
   117  	delegateFactory DelegateFactory,
   118  ) exec.Step {
   119  	containerMetadata.WorkingDirectory = resource.ResourcesDir("check")
   120  	// TODO (runtime/#4957): Placement Strategy should be abstracted out from step factory or step level concern
   121  	checkStep := exec.NewCheckStep(
   122  		plan.ID,
   123  		*plan.Check,
   124  		stepMetadata,
   125  		factory.resourceFactory,
   126  		factory.resourceConfigFactory,
   127  		containerMetadata,
   128  		worker.NewRandomPlacementStrategy(),
   129  		factory.pool,
   130  		delegateFactory,
   131  		factory.client,
   132  		factory.defaultCheckTimeout,
   133  	)
   134  
   135  	checkStep = exec.LogError(checkStep, delegateFactory)
   136  	if atc.EnableBuildRerunWhenWorkerDisappears {
   137  		checkStep = exec.RetryError(checkStep, delegateFactory)
   138  	}
   139  	return checkStep
   140  }
   141  
   142  func (factory *coreStepFactory) TaskStep(
   143  	plan atc.Plan,
   144  	stepMetadata exec.StepMetadata,
   145  	containerMetadata db.ContainerMetadata,
   146  	delegateFactory DelegateFactory,
   147  ) exec.Step {
   148  	sum := sha1.Sum([]byte(plan.Task.Name))
   149  	containerMetadata.WorkingDirectory = filepath.Join("/tmp", "build", fmt.Sprintf("%x", sum[:4]))
   150  
   151  	taskStep := exec.NewTaskStep(
   152  		plan.ID,
   153  		*plan.Task,
   154  		factory.defaultLimits,
   155  		stepMetadata,
   156  		containerMetadata,
   157  		factory.strategy,
   158  		factory.client,
   159  		delegateFactory,
   160  		factory.lockFactory,
   161  	)
   162  
   163  	taskStep = exec.LogError(taskStep, delegateFactory)
   164  	if atc.EnableBuildRerunWhenWorkerDisappears {
   165  		taskStep = exec.RetryError(taskStep, delegateFactory)
   166  	}
   167  	return taskStep
   168  }
   169  
   170  func (factory *coreStepFactory) SetPipelineStep(
   171  	plan atc.Plan,
   172  	stepMetadata exec.StepMetadata,
   173  	delegateFactory DelegateFactory,
   174  ) exec.Step {
   175  	spStep := exec.NewSetPipelineStep(
   176  		plan.ID,
   177  		*plan.SetPipeline,
   178  		stepMetadata,
   179  		delegateFactory,
   180  		factory.teamFactory,
   181  		factory.buildFactory,
   182  		factory.client,
   183  		delegateFactory.policyChecker,
   184  	)
   185  
   186  	spStep = exec.LogError(spStep, delegateFactory)
   187  	if atc.EnableBuildRerunWhenWorkerDisappears {
   188  		spStep = exec.RetryError(spStep, delegateFactory)
   189  	}
   190  	return spStep
   191  }
   192  
   193  func (factory *coreStepFactory) LoadVarStep(
   194  	plan atc.Plan,
   195  	stepMetadata exec.StepMetadata,
   196  	delegateFactory DelegateFactory,
   197  ) exec.Step {
   198  	loadVarStep := exec.NewLoadVarStep(
   199  		plan.ID,
   200  		*plan.LoadVar,
   201  		stepMetadata,
   202  		delegateFactory,
   203  		factory.client,
   204  	)
   205  
   206  	loadVarStep = exec.LogError(loadVarStep, delegateFactory)
   207  	if atc.EnableBuildRerunWhenWorkerDisappears {
   208  		loadVarStep = exec.RetryError(loadVarStep, delegateFactory)
   209  	}
   210  	return loadVarStep
   211  }
   212  
   213  func (factory *coreStepFactory) ArtifactInputStep(
   214  	plan atc.Plan,
   215  	build db.Build,
   216  ) exec.Step {
   217  	return exec.NewArtifactInputStep(plan, build, factory.client)
   218  }
   219  
   220  func (factory *coreStepFactory) ArtifactOutputStep(
   221  	plan atc.Plan,
   222  	build db.Build,
   223  ) exec.Step {
   224  	return exec.NewArtifactOutputStep(plan, build, factory.client)
   225  }