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 }