Merge branch 'master' into issue/3872

Signed-off-by: Jamie Klassen <cklassen@pivotal.io>
This commit is contained in:
Jamie Klassen 2019-06-25 10:29:12 -04:00
commit 48740aaf19
153 changed files with 4842 additions and 3654 deletions

View File

@ -1339,8 +1339,21 @@ var _ = Describe("Builds API", func() {
BeforeEach(func() { BeforeEach(func() {
fakeJob.PublicReturns(true) fakeJob.PublicReturns(true)
}) })
It("returns 200", func() { Context("and the build has a plan", func() {
Expect(response.StatusCode).To(Equal(http.StatusOK)) BeforeEach(func() {
build.HasPlanReturns(true)
})
It("returns 200", func() {
Expect(response.StatusCode).To(Equal(http.StatusOK))
})
})
Context("and the build has no plan", func() {
BeforeEach(func() {
build.HasPlanReturns(false)
})
It("returns 404", func() {
Expect(response.StatusCode).To(Equal(http.StatusNotFound))
})
}) })
}) })
@ -1364,6 +1377,7 @@ var _ = Describe("Builds API", func() {
Context("when the build returns a plan", func() { Context("when the build returns a plan", func() {
BeforeEach(func() { BeforeEach(func() {
build.HasPlanReturns(true)
build.PublicPlanReturns(plan) build.PublicPlanReturns(plan)
build.SchemaReturns("some-schema") build.SchemaReturns("some-schema")
}) })
@ -1386,6 +1400,20 @@ var _ = Describe("Builds API", func() {
}`)) }`))
}) })
}) })
Context("when the build has no plan", func() {
BeforeEach(func() {
build.HasPlanReturns(false)
})
It("returns no Content-Type header", func() {
Expect(response.Header.Get("Content-Type")).To(Equal(""))
})
It("returns not found", func() {
Expect(response.StatusCode).To(Equal(http.StatusNotFound))
})
})
}) })
}) })

View File

@ -12,6 +12,10 @@ func (s *Server) GetBuildPlan(build db.Build) http.Handler {
hLog := s.logger.Session("get-build-plan") hLog := s.logger.Session("get-build-plan")
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !build.HasPlan() {
w.WriteHeader(http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
err := json.NewEncoder(w).Encode(atc.PublicBuildPlan{ err := json.NewEncoder(w).Encode(atc.PublicBuildPlan{
Schema: build.Schema(), Schema: build.Schema(),

View File

@ -362,7 +362,7 @@ var _ = Describe("Containers API", func() {
_, err := client.Do(req) _, err := client.Do(req)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
_, pipelineName, resourceName, secretManager := dbTeam.FindCheckContainersArgsForCall(0) pipelineName, resourceName, secretManager := dbTeam.FindCheckContainersArgsForCall(0)
Expect(pipelineName).To(Equal("some-pipeline")) Expect(pipelineName).To(Equal("some-pipeline"))
Expect(resourceName).To(Equal("some-resource")) Expect(resourceName).To(Equal("some-resource"))
Expect(secretManager).To(Equal(fakeSecretManager)) Expect(secretManager).To(Equal(fakeSecretManager))

View File

@ -32,7 +32,7 @@ func (s *Server) ListContainers(team db.Team) http.Handler {
hLog.Debug("listing-containers") hLog.Debug("listing-containers")
containers, checkContainersExpiresAt, err := containerLocator.Locate(hLog) containers, checkContainersExpiresAt, err := containerLocator.Locate()
if err != nil { if err != nil {
hLog.Error("failed-to-find-containers", err) hLog.Error("failed-to-find-containers", err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
@ -56,7 +56,7 @@ func (s *Server) ListContainers(team db.Team) http.Handler {
} }
type containerLocator interface { type containerLocator interface {
Locate(logger lager.Logger) ([]db.Container, map[int]time.Time, error) Locate() ([]db.Container, map[int]time.Time, error)
} }
func createContainerLocatorFromRequest(team db.Team, r *http.Request, secretManager creds.Secrets) (containerLocator, error) { func createContainerLocatorFromRequest(team db.Team, r *http.Request, secretManager creds.Secrets) (containerLocator, error) {
@ -126,8 +126,8 @@ type allContainersLocator struct {
team db.Team team db.Team
} }
func (l *allContainersLocator) Locate(logger lager.Logger) ([]db.Container, map[int]time.Time, error) { func (l *allContainersLocator) Locate() ([]db.Container, map[int]time.Time, error) {
containers, err := l.team.Containers(logger) containers, err := l.team.Containers()
return containers, nil, err return containers, nil, err
} }
@ -138,8 +138,8 @@ type checkContainerLocator struct {
secretManager creds.Secrets secretManager creds.Secrets
} }
func (l *checkContainerLocator) Locate(logger lager.Logger) ([]db.Container, map[int]time.Time, error) { func (l *checkContainerLocator) Locate() ([]db.Container, map[int]time.Time, error) {
return l.team.FindCheckContainers(logger, l.pipelineName, l.resourceName, l.secretManager) return l.team.FindCheckContainers(l.pipelineName, l.resourceName, l.secretManager)
} }
type stepContainerLocator struct { type stepContainerLocator struct {
@ -147,7 +147,7 @@ type stepContainerLocator struct {
metadata db.ContainerMetadata metadata db.ContainerMetadata
} }
func (l *stepContainerLocator) Locate(logger lager.Logger) ([]db.Container, map[int]time.Time, error) { func (l *stepContainerLocator) Locate() ([]db.Container, map[int]time.Time, error) {
containers, err := l.team.FindContainersByMetadata(l.metadata) containers, err := l.team.FindContainersByMetadata(l.metadata)
return containers, nil, err return containers, nil, err
} }

View File

@ -48,7 +48,6 @@ import (
"github.com/concourse/concourse/skymarshal/skycmd" "github.com/concourse/concourse/skymarshal/skycmd"
"github.com/concourse/concourse/skymarshal/storage" "github.com/concourse/concourse/skymarshal/storage"
"github.com/concourse/concourse/web" "github.com/concourse/concourse/web"
"github.com/concourse/concourse/web/indexhandler"
"github.com/concourse/flag" "github.com/concourse/flag"
"github.com/concourse/retryhttp" "github.com/concourse/retryhttp"
"github.com/cppforlife/go-semi-semantic/version" "github.com/cppforlife/go-semi-semantic/version"
@ -562,7 +561,7 @@ func (cmd *RunCommand) constructAPIMembers(
cmd.BaggageclaimResponseHeaderTimeout, cmd.BaggageclaimResponseHeaderTimeout,
) )
pool := worker.NewPool(workerProvider) pool := worker.NewPool(clock.NewClock(), lockFactory, workerProvider)
workerClient := worker.NewClient(pool, workerProvider) workerClient := worker.NewClient(pool, workerProvider)
checkContainerStrategy := worker.NewRandomPlacementStrategy() checkContainerStrategy := worker.NewRandomPlacementStrategy()
@ -611,7 +610,6 @@ func (cmd *RunCommand) constructAPIMembers(
return nil, err return nil, err
} }
indexhandler.ClusterName = cmd.Server.ClusterName
webHandler, err := webHandler(logger) webHandler, err := webHandler(logger)
if err != nil { if err != nil {
return nil, err return nil, err
@ -741,7 +739,7 @@ func (cmd *RunCommand) constructBackendMembers(
cmd.BaggageclaimResponseHeaderTimeout, cmd.BaggageclaimResponseHeaderTimeout,
) )
pool := worker.NewPool(workerProvider) pool := worker.NewPool(clock.NewClock(), lockFactory, workerProvider)
workerClient := worker.NewClient(pool, workerProvider) workerClient := worker.NewClient(pool, workerProvider)
defaultLimits, err := cmd.parseDefaultLimits() defaultLimits, err := cmd.parseDefaultLimits()

View File

@ -43,8 +43,8 @@ func (bt *Tracker) Track() {
"job": build.JobName(), "job": build.JobName(),
}) })
engineBuild := bt.engine.LookupBuild(btLog, build) engineBuild := bt.engine.NewBuild(build)
go engineBuild.Resume(btLog) go engineBuild.Run(btLog)
} }
} }

View File

@ -1,7 +1,6 @@
package builds_test package builds_test
import ( import (
"code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
@ -37,7 +36,7 @@ var _ = Describe("Tracker", func() {
Describe("Track", func() { Describe("Track", func() {
var inFlightBuilds []*dbfakes.FakeBuild var inFlightBuilds []*dbfakes.FakeBuild
var engineBuilds []*enginefakes.FakeBuild var engineBuilds []*enginefakes.FakeRunnable
BeforeEach(func() { BeforeEach(func() {
inFlightBuilds = []*dbfakes.FakeBuild{ inFlightBuilds = []*dbfakes.FakeBuild{
@ -53,9 +52,9 @@ var _ = Describe("Tracker", func() {
fakeBuildFactory.GetAllStartedBuildsReturns(returnedBuilds, nil) fakeBuildFactory.GetAllStartedBuildsReturns(returnedBuilds, nil)
engineBuilds = []*enginefakes.FakeBuild{} engineBuilds = []*enginefakes.FakeRunnable{}
fakeEngine.LookupBuildStub = func(logger lager.Logger, build db.Build) engine.Build { fakeEngine.NewBuildStub = func(build db.Build) engine.Runnable {
engineBuild := new(enginefakes.FakeBuild) engineBuild := new(enginefakes.FakeRunnable)
engineBuilds = append(engineBuilds, engineBuild) engineBuilds = append(engineBuilds, engineBuild)
return engineBuild return engineBuild
} }
@ -64,9 +63,9 @@ var _ = Describe("Tracker", func() {
It("resumes all currently in-flight builds", func() { It("resumes all currently in-flight builds", func() {
tracker.Track() tracker.Track()
Eventually(engineBuilds[0].ResumeCallCount).Should(Equal(1)) Eventually(engineBuilds[0].RunCallCount).Should(Equal(1))
Eventually(engineBuilds[1].ResumeCallCount).Should(Equal(1)) Eventually(engineBuilds[1].RunCallCount).Should(Equal(1))
Eventually(engineBuilds[2].ResumeCallCount).Should(Equal(1)) Eventually(engineBuilds[2].RunCallCount).Should(Equal(1))
}) })
}) })

View File

@ -43,3 +43,24 @@ func (types VersionedResourceTypes) Without(name string) VersionedResourceTypes
return newTypes return newTypes
} }
func (types VersionedResourceTypes) Evaluate() (atc.VersionedResourceTypes, error) {
var rawTypes atc.VersionedResourceTypes
for _, t := range types {
source, err := t.Source.Evaluate()
if err != nil {
return nil, err
}
resourceType := t.ResourceType
resourceType.Source = source
rawTypes = append(rawTypes, atc.VersionedResourceType{
ResourceType: resourceType,
Version: t.Version,
})
}
return rawTypes, nil
}

View File

@ -11,7 +11,6 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db/encryption" "github.com/concourse/concourse/atc/db/encryption"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
"github.com/concourse/concourse/atc/event" "github.com/concourse/concourse/atc/event"
@ -67,6 +66,7 @@ type Build interface {
Schema() string Schema() string
PrivatePlan() atc.Plan PrivatePlan() atc.Plan
PublicPlan() *json.RawMessage PublicPlan() *json.RawMessage
HasPlan() bool
Status() BuildStatus Status() BuildStatus
StartTime() time.Time StartTime() time.Time
CreateTime() time.Time CreateTime() time.Time
@ -95,7 +95,7 @@ type Build interface {
Artifacts() ([]WorkerArtifact, error) Artifacts() ([]WorkerArtifact, error)
Artifact(artifactID int) (WorkerArtifact, error) Artifact(artifactID int) (WorkerArtifact, error)
SaveOutput(lager.Logger, string, atc.Source, creds.VersionedResourceTypes, atc.Version, ResourceConfigMetadataFields, string, string) error SaveOutput(string, atc.Source, atc.VersionedResourceTypes, atc.Version, ResourceConfigMetadataFields, string, string) error
UseInputs(inputs []BuildInput) error UseInputs(inputs []BuildInput) error
Resources() ([]BuildInput, []BuildOutput, error) Resources() ([]BuildInput, []BuildOutput, error)
@ -170,6 +170,7 @@ func (b *build) IsManuallyTriggered() bool { return b.isManuallyTriggered }
func (b *build) Schema() string { return b.schema } func (b *build) Schema() string { return b.schema }
func (b *build) PrivatePlan() atc.Plan { return b.privatePlan } func (b *build) PrivatePlan() atc.Plan { return b.privatePlan }
func (b *build) PublicPlan() *json.RawMessage { return b.publicPlan } func (b *build) PublicPlan() *json.RawMessage { return b.publicPlan }
func (b *build) HasPlan() bool { return string(*b.publicPlan) != "{}" }
func (b *build) CreateTime() time.Time { return b.createTime } func (b *build) CreateTime() time.Time { return b.createTime }
func (b *build) StartTime() time.Time { return b.startTime } func (b *build) StartTime() time.Time { return b.startTime }
func (b *build) EndTime() time.Time { return b.endTime } func (b *build) EndTime() time.Time { return b.endTime }
@ -634,9 +635,29 @@ func (b *build) Preparation() (BuildPreparation, bool, error) {
missingInputReasons := MissingInputReasons{} missingInputReasons := MissingInputReasons{}
if found { if found {
inputsSatisfiedStatus = BuildPreparationStatusNotBlocking inputsSatisfiedStatus = BuildPreparationStatusNotBlocking
for _, buildInput := range nextBuildInputs {
inputs[buildInput.Name] = BuildPreparationStatusNotBlocking if b.IsManuallyTriggered() {
for _, buildInput := range nextBuildInputs {
resource, _, err := pipeline.ResourceByID(buildInput.ResourceID)
if err != nil {
return BuildPreparation{}, false, err
}
// input is blocking if its last check time is before build create time
if resource.LastCheckEndTime().Before(b.CreateTime()) {
inputs[buildInput.Name] = BuildPreparationStatusBlocking
missingInputReasons.RegisterNoResourceCheckFinished(buildInput.Name)
inputsSatisfiedStatus = BuildPreparationStatusBlocking
} else {
inputs[buildInput.Name] = BuildPreparationStatusNotBlocking
}
}
} else {
for _, buildInput := range nextBuildInputs {
inputs[buildInput.Name] = BuildPreparationStatusNotBlocking
}
} }
} else { } else {
buildInputs, err := job.GetIndependentBuildInputs() buildInputs, err := job.GetIndependentBuildInputs()
@ -808,10 +829,9 @@ func (b *build) Artifacts() ([]WorkerArtifact, error) {
} }
func (b *build) SaveOutput( func (b *build) SaveOutput(
logger lager.Logger,
resourceType string, resourceType string,
source atc.Source, source atc.Source,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
version atc.Version, version atc.Version,
metadata ResourceConfigMetadataFields, metadata ResourceConfigMetadataFields,
outputName string, outputName string,
@ -854,7 +874,7 @@ func (b *build) SaveOutput(
return err return err
} }
resourceConfig, err := resourceConfigDescriptor.findOrCreate(logger, tx, b.lockFactory, b.conn) resourceConfig, err := resourceConfigDescriptor.findOrCreate(tx, b.lockFactory, b.conn)
if err != nil { if err != nil {
return err return err
} }

View File

@ -15,6 +15,7 @@ type MissingInputReasons map[string]string
const ( const (
NoVersionsSatisfiedPassedConstraints string = "no versions satisfy passed constraints" NoVersionsSatisfiedPassedConstraints string = "no versions satisfy passed constraints"
NoVersionsAvailable string = "no versions available" NoVersionsAvailable string = "no versions available"
NoResourceCheckFinished string = "checking for latest available versions"
PinnedVersionUnavailable string = "pinned version %s is not available" PinnedVersionUnavailable string = "pinned version %s is not available"
) )
@ -26,6 +27,10 @@ func (mir MissingInputReasons) RegisterNoVersions(inputName string) {
mir[inputName] = NoVersionsAvailable mir[inputName] = NoVersionsAvailable
} }
func (mir MissingInputReasons) RegisterNoResourceCheckFinished(inputName string) {
mir[inputName] = NoResourceCheckFinished
}
func (mir MissingInputReasons) RegisterPinnedVersionUnavailable(inputName string, version string) { func (mir MissingInputReasons) RegisterPinnedVersionUnavailable(inputName string, version string) {
mir[inputName] = fmt.Sprintf(PinnedVersionUnavailable, version) mir[inputName] = fmt.Sprintf(PinnedVersionUnavailable, version)
} }

View File

@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/algorithm" "github.com/concourse/concourse/atc/db/algorithm"
"github.com/concourse/concourse/atc/event" "github.com/concourse/concourse/atc/event"
@ -24,6 +23,13 @@ var _ = Describe("Build", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
It("has no plan on creation", func() {
var err error
build, err := team.CreateOneOffBuild()
Expect(err).ToNot(HaveOccurred())
Expect(build.HasPlan()).To(BeFalse())
})
Describe("Reload", func() { Describe("Reload", func() {
It("updates the model", func() { It("updates the model", func() {
build, err := team.CreateOneOffBuild() build, err := team.CreateOneOffBuild()
@ -157,6 +163,7 @@ var _ = Describe("Build", func() {
found, err := build.Reload() found, err := build.Reload()
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
Expect(build.HasPlan()).To(BeTrue())
Expect(build.PublicPlan()).To(Equal(plan.Public())) Expect(build.PublicPlan()).To(Equal(plan.Public()))
}) })
}) })
@ -407,7 +414,7 @@ var _ = Describe("Build", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "explicit-source"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{"some": "explicit-source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -416,7 +423,7 @@ var _ = Describe("Build", func() {
build, err := job.CreateBuild() build, err := job.CreateBuild()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build.SaveOutput(logger, "some-type", atc.Source{"some": "explicit-source"}, creds.VersionedResourceTypes{}, atc.Version{"some": "version"}, []db.ResourceConfigMetadataField{ err = build.SaveOutput("some-type", atc.Source{"some": "explicit-source"}, atc.VersionedResourceTypes{}, atc.Version{"some": "version"}, []db.ResourceConfigMetadataField{
{ {
Name: "meta1", Name: "meta1",
Value: "data1", Value: "data1",
@ -457,7 +464,7 @@ var _ = Describe("Build", func() {
build, err := job.CreateBuild() build, err := job.CreateBuild()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build.SaveOutput(logger, "some-type", atc.Source{"some": "explicit-source"}, creds.VersionedResourceTypes{}, atc.Version{"some": "version"}, []db.ResourceConfigMetadataField{ err = build.SaveOutput("some-type", atc.Source{"some": "explicit-source"}, atc.VersionedResourceTypes{}, atc.Version{"some": "version"}, []db.ResourceConfigMetadataField{
{ {
Name: "meta1", Name: "meta1",
Value: "data1", Value: "data1",
@ -539,10 +546,10 @@ var _ = Describe("Build", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfigScope1, err = resource1.SetResourceConfig(logger, atc.Source{"some": "source-1"}, creds.VersionedResourceTypes{}) resourceConfigScope1, err = resource1.SetResourceConfig(atc.Source{"some": "source-1"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
_, err = resource2.SetResourceConfig(logger, atc.Source{"some": "source-2"}, creds.VersionedResourceTypes{}) _, err = resource2.SetResourceConfig(atc.Source{"some": "source-2"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfigScope1.SaveVersions([]atc.Version{ err = resourceConfigScope1.SaveVersions([]atc.Version{
@ -552,7 +559,7 @@ var _ = Describe("Build", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
// This version should not be returned by the Resources method because it has a check order of 0 // This version should not be returned by the Resources method because it has a check order of 0
created, err := resource1.SaveUncheckedVersion(atc.Version{"ver": "not-returned"}, nil, resourceConfigScope1.ResourceConfig(), creds.VersionedResourceTypes{}) created, err := resource1.SaveUncheckedVersion(atc.Version{"ver": "not-returned"}, nil, resourceConfigScope1.ResourceConfig(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(created).To(BeTrue()) Expect(created).To(BeTrue())
}) })
@ -572,7 +579,7 @@ var _ = Describe("Build", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// save explicit output from 'put' // save explicit output from 'put'
err = build.SaveOutput(logger, "some-type", atc.Source{"some": "source-2"}, creds.VersionedResourceTypes{}, atc.Version{"ver": "2"}, nil, "some-output-name", "some-other-resource") err = build.SaveOutput("some-type", atc.Source{"some": "source-2"}, atc.VersionedResourceTypes{}, atc.Version{"ver": "2"}, nil, "some-output-name", "some-other-resource")
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
inputs, outputs, err := build.Resources() inputs, outputs, err := build.Resources()
@ -751,6 +758,14 @@ var _ = Describe("Build", func() {
}) })
Context("when inputs are satisfied", func() { Context("when inputs are satisfied", func() {
var (
resourceConfigScope db.ResourceConfigScope
resource db.Resource
found bool
rcv db.ResourceConfigVersion
err error
)
BeforeEach(func() { BeforeEach(func() {
setupTx, err := dbConn.Begin() setupTx, err := dbConn.Begin()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -763,109 +778,148 @@ var _ = Describe("Build", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resource, found, err := pipeline.Resource("some-resource") resource, found, err = pipeline.Resource("some-resource")
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfigScope, err := resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = resourceConfigScope.SaveVersions([]atc.Version{{"version": "v5"}}) err = resourceConfigScope.SaveVersions([]atc.Version{{"version": "v5"}})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
rcv, found, err := resourceConfigScope.FindVersion(atc.Version{"version": "v5"}) rcv, found, err = resourceConfigScope.FindVersion(atc.Version{"version": "v5"})
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = job.SaveNextInputMapping(algorithm.InputMapping{
"some-input": {VersionID: rcv.ID(), ResourceID: resource.ID(), FirstOccurrence: true},
})
Expect(err).NotTo(HaveOccurred())
expectedBuildPrep.Inputs = map[string]db.BuildPreparationStatus{
"some-input": db.BuildPreparationStatusNotBlocking,
}
}) })
Context("when the build is started", func() { Context("when resource check finished after build created", func() {
BeforeEach(func() { BeforeEach(func() {
started, err := build.Start(atc.Plan{}) updated, err := resourceConfigScope.UpdateLastCheckEndTime()
Expect(started).To(BeTrue()) Expect(err).NotTo(HaveOccurred())
Expect(updated).To(BeTrue())
reloaded, err := resource.Reload()
Expect(err).NotTo(HaveOccurred())
Expect(reloaded).To(BeTrue())
lastCheckEndTime := resource.LastCheckEndTime()
Expect(lastCheckEndTime.IsZero()).To(BeFalse())
err = job.SaveNextInputMapping(algorithm.InputMapping{
"some-input": {VersionID: rcv.ID(), ResourceID: resource.ID(), FirstOccurrence: true},
})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
stillExists, err := build.Reload() expectedBuildPrep.Inputs = map[string]db.BuildPreparationStatus{
Expect(stillExists).To(BeTrue()) "some-input": db.BuildPreparationStatusNotBlocking,
Expect(err).NotTo(HaveOccurred()) }
expectedBuildPrep.Inputs = map[string]db.BuildPreparationStatus{}
}) })
It("returns build preparation", func() { Context("when the build is started", func() {
buildPrep, found, err := build.Preparation() BeforeEach(func() {
Expect(err).NotTo(HaveOccurred()) started, err := build.Start(atc.Plan{})
Expect(found).To(BeTrue()) Expect(started).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep)) Expect(err).NotTo(HaveOccurred())
stillExists, err := build.Reload()
Expect(stillExists).To(BeTrue())
Expect(err).NotTo(HaveOccurred())
expectedBuildPrep.Inputs = map[string]db.BuildPreparationStatus{}
})
It("returns build preparation", func() {
buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep))
})
})
Context("when pipeline is paused", func() {
BeforeEach(func() {
err := pipeline.Pause()
Expect(err).NotTo(HaveOccurred())
expectedBuildPrep.PausedPipeline = db.BuildPreparationStatusBlocking
})
It("returns build preparation with paused pipeline", func() {
buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep))
})
})
Context("when job is paused", func() {
BeforeEach(func() {
err := job.Pause()
Expect(err).NotTo(HaveOccurred())
expectedBuildPrep.PausedJob = db.BuildPreparationStatusBlocking
})
It("returns build preparation with paused pipeline", func() {
buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep))
})
})
Context("when max running builds is reached", func() {
BeforeEach(func() {
err := job.SetMaxInFlightReached(true)
Expect(err).NotTo(HaveOccurred())
expectedBuildPrep.MaxRunningBuilds = db.BuildPreparationStatusBlocking
})
It("returns build preparation with max in flight reached", func() {
buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep))
})
})
Context("when max running builds is de-reached", func() {
BeforeEach(func() {
err := job.SetMaxInFlightReached(true)
Expect(err).NotTo(HaveOccurred())
err = job.SetMaxInFlightReached(false)
Expect(err).NotTo(HaveOccurred())
})
It("returns build preparation with max in flight not reached", func() {
buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep))
})
}) })
}) })
Context("when pipeline is paused", func() { Context("when no resource check finished after build created", func() {
BeforeEach(func() { BeforeEach(func() {
err := pipeline.Pause() err = job.SaveNextInputMapping(algorithm.InputMapping{
"some-input": {VersionID: rcv.ID(), ResourceID: resource.ID(), FirstOccurrence: true},
})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
expectedBuildPrep.PausedPipeline = db.BuildPreparationStatusBlocking expectedBuildPrep.Inputs = map[string]db.BuildPreparationStatus{
"some-input": db.BuildPreparationStatusBlocking,
}
expectedBuildPrep.InputsSatisfied = db.BuildPreparationStatusBlocking
expectedBuildPrep.MissingInputReasons = db.MissingInputReasons{
"some-input": db.NoResourceCheckFinished,
}
}) })
It("returns build preparation with paused pipeline", func() { It("returns build preparation with missing input reason", func() {
buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep))
})
})
Context("when job is paused", func() {
BeforeEach(func() {
err := job.Pause()
Expect(err).NotTo(HaveOccurred())
expectedBuildPrep.PausedJob = db.BuildPreparationStatusBlocking
})
It("returns build preparation with paused pipeline", func() {
buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep))
})
})
Context("when max running builds is reached", func() {
BeforeEach(func() {
err := job.SetMaxInFlightReached(true)
Expect(err).NotTo(HaveOccurred())
expectedBuildPrep.MaxRunningBuilds = db.BuildPreparationStatusBlocking
})
It("returns build preparation with max in flight reached", func() {
buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue())
Expect(buildPrep).To(Equal(expectedBuildPrep))
})
})
Context("when max running builds is de-reached", func() {
BeforeEach(func() {
err := job.SetMaxInFlightReached(true)
Expect(err).NotTo(HaveOccurred())
err = job.SetMaxInFlightReached(false)
Expect(err).NotTo(HaveOccurred())
})
It("returns build preparation with max in flight not reached", func() {
buildPrep, found, err := build.Preparation() buildPrep, found, err := build.Preparation()
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
@ -876,6 +930,23 @@ var _ = Describe("Build", func() {
Context("when inputs are not satisfied", func() { Context("when inputs are not satisfied", func() {
BeforeEach(func() { BeforeEach(func() {
pipeline, _, err = team.SavePipeline("some-pipeline", atc.Config{
Resources: atc.ResourceConfigs{
{
Name: "some-resource",
Type: "some-type",
Source: atc.Source{
"source-config": "some-value",
},
},
},
Jobs: atc.JobConfigs{
{
Name: "some-job",
},
},
}, db.ConfigVersion(2), db.PipelineUnpaused)
Expect(err).ToNot(HaveOccurred())
expectedBuildPrep.InputsSatisfied = db.BuildPreparationStatusBlocking expectedBuildPrep.InputsSatisfied = db.BuildPreparationStatusBlocking
}) })
@ -945,7 +1016,7 @@ var _ = Describe("Build", func() {
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
resourceConfig6, err := resource6.SetResourceConfig(logger, atc.Source{"some": "source-6"}, creds.VersionedResourceTypes{}) resourceConfig6, err := resource6.SetResourceConfig(atc.Source{"some": "source-6"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = resourceConfig6.SaveVersions([]atc.Version{{"version": "v6"}}) err = resourceConfig6.SaveVersions([]atc.Version{{"version": "v6"}})
@ -959,7 +1030,7 @@ var _ = Describe("Build", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfig1, err := resource1.SetResourceConfig(logger, atc.Source{"some": "source-1"}, creds.VersionedResourceTypes{}) resourceConfig1, err := resource1.SetResourceConfig(atc.Source{"some": "source-1"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = resourceConfig1.SaveVersions([]atc.Version{{"version": "v1"}}) err = resourceConfig1.SaveVersions([]atc.Version{{"version": "v1"}})
@ -1117,7 +1188,7 @@ var _ = Describe("Build", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfig, err := resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfig, err := resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfig.SaveVersions([]atc.Version{atc.Version{"some": "version"}}) err = resourceConfig.SaveVersions([]atc.Version{atc.Version{"some": "version"}})
@ -1149,7 +1220,7 @@ var _ = Describe("Build", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfig, err := resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfig, err := resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfig.SaveVersions([]atc.Version{atc.Version{"some": "weird-version"}}) err = resourceConfig.SaveVersions([]atc.Version{atc.Version{"some": "weird-version"}})
@ -1170,7 +1241,7 @@ var _ = Describe("Build", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
weirdRC, err := weirdResource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) weirdRC, err := weirdResource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = weirdRC.SaveVersions([]atc.Version{atc.Version{"weird": "version"}}) err = weirdRC.SaveVersions([]atc.Version{atc.Version{"weird": "version"}})

View File

@ -5,7 +5,6 @@ import (
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -25,8 +24,8 @@ var _ = Describe("ContainerOwner", func() {
) )
ownerExpiries = db.ContainerOwnerExpiries{ ownerExpiries = db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 5 * time.Minute, Max: 5 * time.Minute,
} }
BeforeEach(func() { BeforeEach(func() {
@ -41,12 +40,12 @@ var _ = Describe("ContainerOwner", func() {
worker, err = workerFactory.SaveWorker(workerPayload, 0) worker, err = workerFactory.SaveWorker(workerPayload, 0)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig(logger, resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig(
defaultWorkerResourceType.Type, defaultWorkerResourceType.Type,
atc.Source{ atc.Source{
"some-type": "source", "some-type": "source",
}, },
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })

View File

@ -5,7 +5,6 @@ import (
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/lib/pq" "github.com/lib/pq"
@ -22,17 +21,16 @@ var _ = Describe("ContainerRepository", func() {
) )
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
BeforeEach(func() { BeforeEach(func() {
var err error var err error
resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig( resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-base-resource-type", "some-base-resource-type",
atc.Source{"some": "source"}, atc.Source{"some": "source"},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())

View File

@ -8,7 +8,6 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
) )
@ -123,6 +122,16 @@ type FakeBuild struct {
finishReturnsOnCall map[int]struct { finishReturnsOnCall map[int]struct {
result1 error result1 error
} }
HasPlanStub func() bool
hasPlanMutex sync.RWMutex
hasPlanArgsForCall []struct {
}
hasPlanReturns struct {
result1 bool
}
hasPlanReturnsOnCall map[int]struct {
result1 bool
}
IDStub func() int IDStub func() int
iDMutex sync.RWMutex iDMutex sync.RWMutex
iDArgsForCall []struct { iDArgsForCall []struct {
@ -371,17 +380,16 @@ type FakeBuild struct {
saveImageResourceVersionReturnsOnCall map[int]struct { saveImageResourceVersionReturnsOnCall map[int]struct {
result1 error result1 error
} }
SaveOutputStub func(lager.Logger, string, atc.Source, creds.VersionedResourceTypes, atc.Version, db.ResourceConfigMetadataFields, string, string) error SaveOutputStub func(string, atc.Source, atc.VersionedResourceTypes, atc.Version, db.ResourceConfigMetadataFields, string, string) error
saveOutputMutex sync.RWMutex saveOutputMutex sync.RWMutex
saveOutputArgsForCall []struct { saveOutputArgsForCall []struct {
arg1 lager.Logger arg1 string
arg2 string arg2 atc.Source
arg3 atc.Source arg3 atc.VersionedResourceTypes
arg4 creds.VersionedResourceTypes arg4 atc.Version
arg5 atc.Version arg5 db.ResourceConfigMetadataFields
arg6 db.ResourceConfigMetadataFields arg6 string
arg7 string arg7 string
arg8 string
} }
saveOutputReturns struct { saveOutputReturns struct {
result1 error result1 error
@ -1023,6 +1031,58 @@ func (fake *FakeBuild) FinishReturnsOnCall(i int, result1 error) {
}{result1} }{result1}
} }
func (fake *FakeBuild) HasPlan() bool {
fake.hasPlanMutex.Lock()
ret, specificReturn := fake.hasPlanReturnsOnCall[len(fake.hasPlanArgsForCall)]
fake.hasPlanArgsForCall = append(fake.hasPlanArgsForCall, struct {
}{})
fake.recordInvocation("HasPlan", []interface{}{})
fake.hasPlanMutex.Unlock()
if fake.HasPlanStub != nil {
return fake.HasPlanStub()
}
if specificReturn {
return ret.result1
}
fakeReturns := fake.hasPlanReturns
return fakeReturns.result1
}
func (fake *FakeBuild) HasPlanCallCount() int {
fake.hasPlanMutex.RLock()
defer fake.hasPlanMutex.RUnlock()
return len(fake.hasPlanArgsForCall)
}
func (fake *FakeBuild) HasPlanCalls(stub func() bool) {
fake.hasPlanMutex.Lock()
defer fake.hasPlanMutex.Unlock()
fake.HasPlanStub = stub
}
func (fake *FakeBuild) HasPlanReturns(result1 bool) {
fake.hasPlanMutex.Lock()
defer fake.hasPlanMutex.Unlock()
fake.HasPlanStub = nil
fake.hasPlanReturns = struct {
result1 bool
}{result1}
}
func (fake *FakeBuild) HasPlanReturnsOnCall(i int, result1 bool) {
fake.hasPlanMutex.Lock()
defer fake.hasPlanMutex.Unlock()
fake.HasPlanStub = nil
if fake.hasPlanReturnsOnCall == nil {
fake.hasPlanReturnsOnCall = make(map[int]struct {
result1 bool
})
}
fake.hasPlanReturnsOnCall[i] = struct {
result1 bool
}{result1}
}
func (fake *FakeBuild) ID() int { func (fake *FakeBuild) ID() int {
fake.iDMutex.Lock() fake.iDMutex.Lock()
ret, specificReturn := fake.iDReturnsOnCall[len(fake.iDArgsForCall)] ret, specificReturn := fake.iDReturnsOnCall[len(fake.iDArgsForCall)]
@ -2259,23 +2319,22 @@ func (fake *FakeBuild) SaveImageResourceVersionReturnsOnCall(i int, result1 erro
}{result1} }{result1}
} }
func (fake *FakeBuild) SaveOutput(arg1 lager.Logger, arg2 string, arg3 atc.Source, arg4 creds.VersionedResourceTypes, arg5 atc.Version, arg6 db.ResourceConfigMetadataFields, arg7 string, arg8 string) error { func (fake *FakeBuild) SaveOutput(arg1 string, arg2 atc.Source, arg3 atc.VersionedResourceTypes, arg4 atc.Version, arg5 db.ResourceConfigMetadataFields, arg6 string, arg7 string) error {
fake.saveOutputMutex.Lock() fake.saveOutputMutex.Lock()
ret, specificReturn := fake.saveOutputReturnsOnCall[len(fake.saveOutputArgsForCall)] ret, specificReturn := fake.saveOutputReturnsOnCall[len(fake.saveOutputArgsForCall)]
fake.saveOutputArgsForCall = append(fake.saveOutputArgsForCall, struct { fake.saveOutputArgsForCall = append(fake.saveOutputArgsForCall, struct {
arg1 lager.Logger arg1 string
arg2 string arg2 atc.Source
arg3 atc.Source arg3 atc.VersionedResourceTypes
arg4 creds.VersionedResourceTypes arg4 atc.Version
arg5 atc.Version arg5 db.ResourceConfigMetadataFields
arg6 db.ResourceConfigMetadataFields arg6 string
arg7 string arg7 string
arg8 string }{arg1, arg2, arg3, arg4, arg5, arg6, arg7})
}{arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8}) fake.recordInvocation("SaveOutput", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6, arg7})
fake.recordInvocation("SaveOutput", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8})
fake.saveOutputMutex.Unlock() fake.saveOutputMutex.Unlock()
if fake.SaveOutputStub != nil { if fake.SaveOutputStub != nil {
return fake.SaveOutputStub(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) return fake.SaveOutputStub(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
} }
if specificReturn { if specificReturn {
return ret.result1 return ret.result1
@ -2290,17 +2349,17 @@ func (fake *FakeBuild) SaveOutputCallCount() int {
return len(fake.saveOutputArgsForCall) return len(fake.saveOutputArgsForCall)
} }
func (fake *FakeBuild) SaveOutputCalls(stub func(lager.Logger, string, atc.Source, creds.VersionedResourceTypes, atc.Version, db.ResourceConfigMetadataFields, string, string) error) { func (fake *FakeBuild) SaveOutputCalls(stub func(string, atc.Source, atc.VersionedResourceTypes, atc.Version, db.ResourceConfigMetadataFields, string, string) error) {
fake.saveOutputMutex.Lock() fake.saveOutputMutex.Lock()
defer fake.saveOutputMutex.Unlock() defer fake.saveOutputMutex.Unlock()
fake.SaveOutputStub = stub fake.SaveOutputStub = stub
} }
func (fake *FakeBuild) SaveOutputArgsForCall(i int) (lager.Logger, string, atc.Source, creds.VersionedResourceTypes, atc.Version, db.ResourceConfigMetadataFields, string, string) { func (fake *FakeBuild) SaveOutputArgsForCall(i int) (string, atc.Source, atc.VersionedResourceTypes, atc.Version, db.ResourceConfigMetadataFields, string, string) {
fake.saveOutputMutex.RLock() fake.saveOutputMutex.RLock()
defer fake.saveOutputMutex.RUnlock() defer fake.saveOutputMutex.RUnlock()
argsForCall := fake.saveOutputArgsForCall[i] argsForCall := fake.saveOutputArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6, argsForCall.arg7, argsForCall.arg8 return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6, argsForCall.arg7
} }
func (fake *FakeBuild) SaveOutputReturns(result1 error) { func (fake *FakeBuild) SaveOutputReturns(result1 error) {
@ -2910,6 +2969,8 @@ func (fake *FakeBuild) Invocations() map[string][][]interface{} {
defer fake.eventsMutex.RUnlock() defer fake.eventsMutex.RUnlock()
fake.finishMutex.RLock() fake.finishMutex.RLock()
defer fake.finishMutex.RUnlock() defer fake.finishMutex.RUnlock()
fake.hasPlanMutex.RLock()
defer fake.hasPlanMutex.RUnlock()
fake.iDMutex.RLock() fake.iDMutex.RLock()
defer fake.iDMutex.RUnlock() defer fake.iDMutex.RUnlock()
fake.interceptibleMutex.RLock() fake.interceptibleMutex.RLock()

View File

@ -5,9 +5,7 @@ import (
"sync" "sync"
"time" "time"
"code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
) )
@ -262,13 +260,13 @@ type FakeResource struct {
result2 bool result2 bool
result3 error result3 error
} }
SaveUncheckedVersionStub func(atc.Version, db.ResourceConfigMetadataFields, db.ResourceConfig, creds.VersionedResourceTypes) (bool, error) SaveUncheckedVersionStub func(atc.Version, db.ResourceConfigMetadataFields, db.ResourceConfig, atc.VersionedResourceTypes) (bool, error)
saveUncheckedVersionMutex sync.RWMutex saveUncheckedVersionMutex sync.RWMutex
saveUncheckedVersionArgsForCall []struct { saveUncheckedVersionArgsForCall []struct {
arg1 atc.Version arg1 atc.Version
arg2 db.ResourceConfigMetadataFields arg2 db.ResourceConfigMetadataFields
arg3 db.ResourceConfig arg3 db.ResourceConfig
arg4 creds.VersionedResourceTypes arg4 atc.VersionedResourceTypes
} }
saveUncheckedVersionReturns struct { saveUncheckedVersionReturns struct {
result1 bool result1 bool
@ -300,12 +298,11 @@ type FakeResource struct {
setPinCommentReturnsOnCall map[int]struct { setPinCommentReturnsOnCall map[int]struct {
result1 error result1 error
} }
SetResourceConfigStub func(lager.Logger, atc.Source, creds.VersionedResourceTypes) (db.ResourceConfigScope, error) SetResourceConfigStub func(atc.Source, atc.VersionedResourceTypes) (db.ResourceConfigScope, error)
setResourceConfigMutex sync.RWMutex setResourceConfigMutex sync.RWMutex
setResourceConfigArgsForCall []struct { setResourceConfigArgsForCall []struct {
arg1 lager.Logger arg1 atc.Source
arg2 atc.Source arg2 atc.VersionedResourceTypes
arg3 creds.VersionedResourceTypes
} }
setResourceConfigReturns struct { setResourceConfigReturns struct {
result1 db.ResourceConfigScope result1 db.ResourceConfigScope
@ -365,6 +362,20 @@ type FakeResource struct {
unpinVersionReturnsOnCall map[int]struct { unpinVersionReturnsOnCall map[int]struct {
result1 error result1 error
} }
UpdateMetadataStub func(atc.Version, db.ResourceConfigMetadataFields) (bool, error)
updateMetadataMutex sync.RWMutex
updateMetadataArgsForCall []struct {
arg1 atc.Version
arg2 db.ResourceConfigMetadataFields
}
updateMetadataReturns struct {
result1 bool
result2 error
}
updateMetadataReturnsOnCall map[int]struct {
result1 bool
result2 error
}
VersionsStub func(db.Page) ([]atc.ResourceVersion, db.Pagination, bool, error) VersionsStub func(db.Page) ([]atc.ResourceVersion, db.Pagination, bool, error)
versionsMutex sync.RWMutex versionsMutex sync.RWMutex
versionsArgsForCall []struct { versionsArgsForCall []struct {
@ -1685,14 +1696,14 @@ func (fake *FakeResource) ResourceConfigVersionIDReturnsOnCall(i int, result1 in
}{result1, result2, result3} }{result1, result2, result3}
} }
func (fake *FakeResource) SaveUncheckedVersion(arg1 atc.Version, arg2 db.ResourceConfigMetadataFields, arg3 db.ResourceConfig, arg4 creds.VersionedResourceTypes) (bool, error) { func (fake *FakeResource) SaveUncheckedVersion(arg1 atc.Version, arg2 db.ResourceConfigMetadataFields, arg3 db.ResourceConfig, arg4 atc.VersionedResourceTypes) (bool, error) {
fake.saveUncheckedVersionMutex.Lock() fake.saveUncheckedVersionMutex.Lock()
ret, specificReturn := fake.saveUncheckedVersionReturnsOnCall[len(fake.saveUncheckedVersionArgsForCall)] ret, specificReturn := fake.saveUncheckedVersionReturnsOnCall[len(fake.saveUncheckedVersionArgsForCall)]
fake.saveUncheckedVersionArgsForCall = append(fake.saveUncheckedVersionArgsForCall, struct { fake.saveUncheckedVersionArgsForCall = append(fake.saveUncheckedVersionArgsForCall, struct {
arg1 atc.Version arg1 atc.Version
arg2 db.ResourceConfigMetadataFields arg2 db.ResourceConfigMetadataFields
arg3 db.ResourceConfig arg3 db.ResourceConfig
arg4 creds.VersionedResourceTypes arg4 atc.VersionedResourceTypes
}{arg1, arg2, arg3, arg4}) }{arg1, arg2, arg3, arg4})
fake.recordInvocation("SaveUncheckedVersion", []interface{}{arg1, arg2, arg3, arg4}) fake.recordInvocation("SaveUncheckedVersion", []interface{}{arg1, arg2, arg3, arg4})
fake.saveUncheckedVersionMutex.Unlock() fake.saveUncheckedVersionMutex.Unlock()
@ -1712,13 +1723,13 @@ func (fake *FakeResource) SaveUncheckedVersionCallCount() int {
return len(fake.saveUncheckedVersionArgsForCall) return len(fake.saveUncheckedVersionArgsForCall)
} }
func (fake *FakeResource) SaveUncheckedVersionCalls(stub func(atc.Version, db.ResourceConfigMetadataFields, db.ResourceConfig, creds.VersionedResourceTypes) (bool, error)) { func (fake *FakeResource) SaveUncheckedVersionCalls(stub func(atc.Version, db.ResourceConfigMetadataFields, db.ResourceConfig, atc.VersionedResourceTypes) (bool, error)) {
fake.saveUncheckedVersionMutex.Lock() fake.saveUncheckedVersionMutex.Lock()
defer fake.saveUncheckedVersionMutex.Unlock() defer fake.saveUncheckedVersionMutex.Unlock()
fake.SaveUncheckedVersionStub = stub fake.SaveUncheckedVersionStub = stub
} }
func (fake *FakeResource) SaveUncheckedVersionArgsForCall(i int) (atc.Version, db.ResourceConfigMetadataFields, db.ResourceConfig, creds.VersionedResourceTypes) { func (fake *FakeResource) SaveUncheckedVersionArgsForCall(i int) (atc.Version, db.ResourceConfigMetadataFields, db.ResourceConfig, atc.VersionedResourceTypes) {
fake.saveUncheckedVersionMutex.RLock() fake.saveUncheckedVersionMutex.RLock()
defer fake.saveUncheckedVersionMutex.RUnlock() defer fake.saveUncheckedVersionMutex.RUnlock()
argsForCall := fake.saveUncheckedVersionArgsForCall[i] argsForCall := fake.saveUncheckedVersionArgsForCall[i]
@ -1871,18 +1882,17 @@ func (fake *FakeResource) SetPinCommentReturnsOnCall(i int, result1 error) {
}{result1} }{result1}
} }
func (fake *FakeResource) SetResourceConfig(arg1 lager.Logger, arg2 atc.Source, arg3 creds.VersionedResourceTypes) (db.ResourceConfigScope, error) { func (fake *FakeResource) SetResourceConfig(arg1 atc.Source, arg2 atc.VersionedResourceTypes) (db.ResourceConfigScope, error) {
fake.setResourceConfigMutex.Lock() fake.setResourceConfigMutex.Lock()
ret, specificReturn := fake.setResourceConfigReturnsOnCall[len(fake.setResourceConfigArgsForCall)] ret, specificReturn := fake.setResourceConfigReturnsOnCall[len(fake.setResourceConfigArgsForCall)]
fake.setResourceConfigArgsForCall = append(fake.setResourceConfigArgsForCall, struct { fake.setResourceConfigArgsForCall = append(fake.setResourceConfigArgsForCall, struct {
arg1 lager.Logger arg1 atc.Source
arg2 atc.Source arg2 atc.VersionedResourceTypes
arg3 creds.VersionedResourceTypes }{arg1, arg2})
}{arg1, arg2, arg3}) fake.recordInvocation("SetResourceConfig", []interface{}{arg1, arg2})
fake.recordInvocation("SetResourceConfig", []interface{}{arg1, arg2, arg3})
fake.setResourceConfigMutex.Unlock() fake.setResourceConfigMutex.Unlock()
if fake.SetResourceConfigStub != nil { if fake.SetResourceConfigStub != nil {
return fake.SetResourceConfigStub(arg1, arg2, arg3) return fake.SetResourceConfigStub(arg1, arg2)
} }
if specificReturn { if specificReturn {
return ret.result1, ret.result2 return ret.result1, ret.result2
@ -1897,17 +1907,17 @@ func (fake *FakeResource) SetResourceConfigCallCount() int {
return len(fake.setResourceConfigArgsForCall) return len(fake.setResourceConfigArgsForCall)
} }
func (fake *FakeResource) SetResourceConfigCalls(stub func(lager.Logger, atc.Source, creds.VersionedResourceTypes) (db.ResourceConfigScope, error)) { func (fake *FakeResource) SetResourceConfigCalls(stub func(atc.Source, atc.VersionedResourceTypes) (db.ResourceConfigScope, error)) {
fake.setResourceConfigMutex.Lock() fake.setResourceConfigMutex.Lock()
defer fake.setResourceConfigMutex.Unlock() defer fake.setResourceConfigMutex.Unlock()
fake.SetResourceConfigStub = stub fake.SetResourceConfigStub = stub
} }
func (fake *FakeResource) SetResourceConfigArgsForCall(i int) (lager.Logger, atc.Source, creds.VersionedResourceTypes) { func (fake *FakeResource) SetResourceConfigArgsForCall(i int) (atc.Source, atc.VersionedResourceTypes) {
fake.setResourceConfigMutex.RLock() fake.setResourceConfigMutex.RLock()
defer fake.setResourceConfigMutex.RUnlock() defer fake.setResourceConfigMutex.RUnlock()
argsForCall := fake.setResourceConfigArgsForCall[i] argsForCall := fake.setResourceConfigArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 return argsForCall.arg1, argsForCall.arg2
} }
func (fake *FakeResource) SetResourceConfigReturns(result1 db.ResourceConfigScope, result2 error) { func (fake *FakeResource) SetResourceConfigReturns(result1 db.ResourceConfigScope, result2 error) {
@ -2196,6 +2206,70 @@ func (fake *FakeResource) UnpinVersionReturnsOnCall(i int, result1 error) {
}{result1} }{result1}
} }
func (fake *FakeResource) UpdateMetadata(arg1 atc.Version, arg2 db.ResourceConfigMetadataFields) (bool, error) {
fake.updateMetadataMutex.Lock()
ret, specificReturn := fake.updateMetadataReturnsOnCall[len(fake.updateMetadataArgsForCall)]
fake.updateMetadataArgsForCall = append(fake.updateMetadataArgsForCall, struct {
arg1 atc.Version
arg2 db.ResourceConfigMetadataFields
}{arg1, arg2})
fake.recordInvocation("UpdateMetadata", []interface{}{arg1, arg2})
fake.updateMetadataMutex.Unlock()
if fake.UpdateMetadataStub != nil {
return fake.UpdateMetadataStub(arg1, arg2)
}
if specificReturn {
return ret.result1, ret.result2
}
fakeReturns := fake.updateMetadataReturns
return fakeReturns.result1, fakeReturns.result2
}
func (fake *FakeResource) UpdateMetadataCallCount() int {
fake.updateMetadataMutex.RLock()
defer fake.updateMetadataMutex.RUnlock()
return len(fake.updateMetadataArgsForCall)
}
func (fake *FakeResource) UpdateMetadataCalls(stub func(atc.Version, db.ResourceConfigMetadataFields) (bool, error)) {
fake.updateMetadataMutex.Lock()
defer fake.updateMetadataMutex.Unlock()
fake.UpdateMetadataStub = stub
}
func (fake *FakeResource) UpdateMetadataArgsForCall(i int) (atc.Version, db.ResourceConfigMetadataFields) {
fake.updateMetadataMutex.RLock()
defer fake.updateMetadataMutex.RUnlock()
argsForCall := fake.updateMetadataArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2
}
func (fake *FakeResource) UpdateMetadataReturns(result1 bool, result2 error) {
fake.updateMetadataMutex.Lock()
defer fake.updateMetadataMutex.Unlock()
fake.UpdateMetadataStub = nil
fake.updateMetadataReturns = struct {
result1 bool
result2 error
}{result1, result2}
}
func (fake *FakeResource) UpdateMetadataReturnsOnCall(i int, result1 bool, result2 error) {
fake.updateMetadataMutex.Lock()
defer fake.updateMetadataMutex.Unlock()
fake.UpdateMetadataStub = nil
if fake.updateMetadataReturnsOnCall == nil {
fake.updateMetadataReturnsOnCall = make(map[int]struct {
result1 bool
result2 error
})
}
fake.updateMetadataReturnsOnCall[i] = struct {
result1 bool
result2 error
}{result1, result2}
}
func (fake *FakeResource) Versions(arg1 db.Page) ([]atc.ResourceVersion, db.Pagination, bool, error) { func (fake *FakeResource) Versions(arg1 db.Page) ([]atc.ResourceVersion, db.Pagination, bool, error) {
fake.versionsMutex.Lock() fake.versionsMutex.Lock()
ret, specificReturn := fake.versionsReturnsOnCall[len(fake.versionsArgsForCall)] ret, specificReturn := fake.versionsReturnsOnCall[len(fake.versionsArgsForCall)]
@ -2386,6 +2460,8 @@ func (fake *FakeResource) Invocations() map[string][][]interface{} {
defer fake.typeMutex.RUnlock() defer fake.typeMutex.RUnlock()
fake.unpinVersionMutex.RLock() fake.unpinVersionMutex.RLock()
defer fake.unpinVersionMutex.RUnlock() defer fake.unpinVersionMutex.RUnlock()
fake.updateMetadataMutex.RLock()
defer fake.updateMetadataMutex.RUnlock()
fake.versionsMutex.RLock() fake.versionsMutex.RLock()
defer fake.versionsMutex.RUnlock() defer fake.versionsMutex.RUnlock()
fake.webhookTokenMutex.RLock() fake.webhookTokenMutex.RLock()

View File

@ -4,23 +4,20 @@ package dbfakes
import ( import (
"sync" "sync"
"code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
) )
type FakeResourceCacheFactory struct { type FakeResourceCacheFactory struct {
FindOrCreateResourceCacheStub func(lager.Logger, db.ResourceCacheUser, string, atc.Version, atc.Source, atc.Params, creds.VersionedResourceTypes) (db.UsedResourceCache, error) FindOrCreateResourceCacheStub func(db.ResourceCacheUser, string, atc.Version, atc.Source, atc.Params, atc.VersionedResourceTypes) (db.UsedResourceCache, error)
findOrCreateResourceCacheMutex sync.RWMutex findOrCreateResourceCacheMutex sync.RWMutex
findOrCreateResourceCacheArgsForCall []struct { findOrCreateResourceCacheArgsForCall []struct {
arg1 lager.Logger arg1 db.ResourceCacheUser
arg2 db.ResourceCacheUser arg2 string
arg3 string arg3 atc.Version
arg4 atc.Version arg4 atc.Source
arg5 atc.Source arg5 atc.Params
arg6 atc.Params arg6 atc.VersionedResourceTypes
arg7 creds.VersionedResourceTypes
} }
findOrCreateResourceCacheReturns struct { findOrCreateResourceCacheReturns struct {
result1 db.UsedResourceCache result1 db.UsedResourceCache
@ -59,22 +56,21 @@ type FakeResourceCacheFactory struct {
invocationsMutex sync.RWMutex invocationsMutex sync.RWMutex
} }
func (fake *FakeResourceCacheFactory) FindOrCreateResourceCache(arg1 lager.Logger, arg2 db.ResourceCacheUser, arg3 string, arg4 atc.Version, arg5 atc.Source, arg6 atc.Params, arg7 creds.VersionedResourceTypes) (db.UsedResourceCache, error) { func (fake *FakeResourceCacheFactory) FindOrCreateResourceCache(arg1 db.ResourceCacheUser, arg2 string, arg3 atc.Version, arg4 atc.Source, arg5 atc.Params, arg6 atc.VersionedResourceTypes) (db.UsedResourceCache, error) {
fake.findOrCreateResourceCacheMutex.Lock() fake.findOrCreateResourceCacheMutex.Lock()
ret, specificReturn := fake.findOrCreateResourceCacheReturnsOnCall[len(fake.findOrCreateResourceCacheArgsForCall)] ret, specificReturn := fake.findOrCreateResourceCacheReturnsOnCall[len(fake.findOrCreateResourceCacheArgsForCall)]
fake.findOrCreateResourceCacheArgsForCall = append(fake.findOrCreateResourceCacheArgsForCall, struct { fake.findOrCreateResourceCacheArgsForCall = append(fake.findOrCreateResourceCacheArgsForCall, struct {
arg1 lager.Logger arg1 db.ResourceCacheUser
arg2 db.ResourceCacheUser arg2 string
arg3 string arg3 atc.Version
arg4 atc.Version arg4 atc.Source
arg5 atc.Source arg5 atc.Params
arg6 atc.Params arg6 atc.VersionedResourceTypes
arg7 creds.VersionedResourceTypes }{arg1, arg2, arg3, arg4, arg5, arg6})
}{arg1, arg2, arg3, arg4, arg5, arg6, arg7}) fake.recordInvocation("FindOrCreateResourceCache", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6})
fake.recordInvocation("FindOrCreateResourceCache", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6, arg7})
fake.findOrCreateResourceCacheMutex.Unlock() fake.findOrCreateResourceCacheMutex.Unlock()
if fake.FindOrCreateResourceCacheStub != nil { if fake.FindOrCreateResourceCacheStub != nil {
return fake.FindOrCreateResourceCacheStub(arg1, arg2, arg3, arg4, arg5, arg6, arg7) return fake.FindOrCreateResourceCacheStub(arg1, arg2, arg3, arg4, arg5, arg6)
} }
if specificReturn { if specificReturn {
return ret.result1, ret.result2 return ret.result1, ret.result2
@ -89,17 +85,17 @@ func (fake *FakeResourceCacheFactory) FindOrCreateResourceCacheCallCount() int {
return len(fake.findOrCreateResourceCacheArgsForCall) return len(fake.findOrCreateResourceCacheArgsForCall)
} }
func (fake *FakeResourceCacheFactory) FindOrCreateResourceCacheCalls(stub func(lager.Logger, db.ResourceCacheUser, string, atc.Version, atc.Source, atc.Params, creds.VersionedResourceTypes) (db.UsedResourceCache, error)) { func (fake *FakeResourceCacheFactory) FindOrCreateResourceCacheCalls(stub func(db.ResourceCacheUser, string, atc.Version, atc.Source, atc.Params, atc.VersionedResourceTypes) (db.UsedResourceCache, error)) {
fake.findOrCreateResourceCacheMutex.Lock() fake.findOrCreateResourceCacheMutex.Lock()
defer fake.findOrCreateResourceCacheMutex.Unlock() defer fake.findOrCreateResourceCacheMutex.Unlock()
fake.FindOrCreateResourceCacheStub = stub fake.FindOrCreateResourceCacheStub = stub
} }
func (fake *FakeResourceCacheFactory) FindOrCreateResourceCacheArgsForCall(i int) (lager.Logger, db.ResourceCacheUser, string, atc.Version, atc.Source, atc.Params, creds.VersionedResourceTypes) { func (fake *FakeResourceCacheFactory) FindOrCreateResourceCacheArgsForCall(i int) (db.ResourceCacheUser, string, atc.Version, atc.Source, atc.Params, atc.VersionedResourceTypes) {
fake.findOrCreateResourceCacheMutex.RLock() fake.findOrCreateResourceCacheMutex.RLock()
defer fake.findOrCreateResourceCacheMutex.RUnlock() defer fake.findOrCreateResourceCacheMutex.RUnlock()
argsForCall := fake.findOrCreateResourceCacheArgsForCall[i] argsForCall := fake.findOrCreateResourceCacheArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6, argsForCall.arg7 return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6
} }
func (fake *FakeResourceCacheFactory) FindOrCreateResourceCacheReturns(result1 db.UsedResourceCache, result2 error) { func (fake *FakeResourceCacheFactory) FindOrCreateResourceCacheReturns(result1 db.UsedResourceCache, result2 error) {

View File

@ -4,9 +4,7 @@ package dbfakes
import ( import (
"sync" "sync"
"code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
) )
@ -21,13 +19,12 @@ type FakeResourceConfigFactory struct {
cleanUnreferencedConfigsReturnsOnCall map[int]struct { cleanUnreferencedConfigsReturnsOnCall map[int]struct {
result1 error result1 error
} }
FindOrCreateResourceConfigStub func(lager.Logger, string, atc.Source, creds.VersionedResourceTypes) (db.ResourceConfig, error) FindOrCreateResourceConfigStub func(string, atc.Source, atc.VersionedResourceTypes) (db.ResourceConfig, error)
findOrCreateResourceConfigMutex sync.RWMutex findOrCreateResourceConfigMutex sync.RWMutex
findOrCreateResourceConfigArgsForCall []struct { findOrCreateResourceConfigArgsForCall []struct {
arg1 lager.Logger arg1 string
arg2 string arg2 atc.Source
arg3 atc.Source arg3 atc.VersionedResourceTypes
arg4 creds.VersionedResourceTypes
} }
findOrCreateResourceConfigReturns struct { findOrCreateResourceConfigReturns struct {
result1 db.ResourceConfig result1 db.ResourceConfig
@ -108,19 +105,18 @@ func (fake *FakeResourceConfigFactory) CleanUnreferencedConfigsReturnsOnCall(i i
}{result1} }{result1}
} }
func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfig(arg1 lager.Logger, arg2 string, arg3 atc.Source, arg4 creds.VersionedResourceTypes) (db.ResourceConfig, error) { func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfig(arg1 string, arg2 atc.Source, arg3 atc.VersionedResourceTypes) (db.ResourceConfig, error) {
fake.findOrCreateResourceConfigMutex.Lock() fake.findOrCreateResourceConfigMutex.Lock()
ret, specificReturn := fake.findOrCreateResourceConfigReturnsOnCall[len(fake.findOrCreateResourceConfigArgsForCall)] ret, specificReturn := fake.findOrCreateResourceConfigReturnsOnCall[len(fake.findOrCreateResourceConfigArgsForCall)]
fake.findOrCreateResourceConfigArgsForCall = append(fake.findOrCreateResourceConfigArgsForCall, struct { fake.findOrCreateResourceConfigArgsForCall = append(fake.findOrCreateResourceConfigArgsForCall, struct {
arg1 lager.Logger arg1 string
arg2 string arg2 atc.Source
arg3 atc.Source arg3 atc.VersionedResourceTypes
arg4 creds.VersionedResourceTypes }{arg1, arg2, arg3})
}{arg1, arg2, arg3, arg4}) fake.recordInvocation("FindOrCreateResourceConfig", []interface{}{arg1, arg2, arg3})
fake.recordInvocation("FindOrCreateResourceConfig", []interface{}{arg1, arg2, arg3, arg4})
fake.findOrCreateResourceConfigMutex.Unlock() fake.findOrCreateResourceConfigMutex.Unlock()
if fake.FindOrCreateResourceConfigStub != nil { if fake.FindOrCreateResourceConfigStub != nil {
return fake.FindOrCreateResourceConfigStub(arg1, arg2, arg3, arg4) return fake.FindOrCreateResourceConfigStub(arg1, arg2, arg3)
} }
if specificReturn { if specificReturn {
return ret.result1, ret.result2 return ret.result1, ret.result2
@ -135,17 +131,17 @@ func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfigCallCount() int
return len(fake.findOrCreateResourceConfigArgsForCall) return len(fake.findOrCreateResourceConfigArgsForCall)
} }
func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfigCalls(stub func(lager.Logger, string, atc.Source, creds.VersionedResourceTypes) (db.ResourceConfig, error)) { func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfigCalls(stub func(string, atc.Source, atc.VersionedResourceTypes) (db.ResourceConfig, error)) {
fake.findOrCreateResourceConfigMutex.Lock() fake.findOrCreateResourceConfigMutex.Lock()
defer fake.findOrCreateResourceConfigMutex.Unlock() defer fake.findOrCreateResourceConfigMutex.Unlock()
fake.FindOrCreateResourceConfigStub = stub fake.FindOrCreateResourceConfigStub = stub
} }
func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfigArgsForCall(i int) (lager.Logger, string, atc.Source, creds.VersionedResourceTypes) { func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfigArgsForCall(i int) (string, atc.Source, atc.VersionedResourceTypes) {
fake.findOrCreateResourceConfigMutex.RLock() fake.findOrCreateResourceConfigMutex.RLock()
defer fake.findOrCreateResourceConfigMutex.RUnlock() defer fake.findOrCreateResourceConfigMutex.RUnlock()
argsForCall := fake.findOrCreateResourceConfigArgsForCall[i] argsForCall := fake.findOrCreateResourceConfigArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
} }
func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfigReturns(result1 db.ResourceConfig, result2 error) { func (fake *FakeResourceConfigFactory) FindOrCreateResourceConfigReturns(result1 db.ResourceConfig, result2 error) {

View File

@ -12,11 +12,10 @@ import (
) )
type FakeResourceConfigScope struct { type FakeResourceConfigScope struct {
AcquireResourceCheckingLockStub func(lager.Logger, time.Duration) (lock.Lock, bool, error) AcquireResourceCheckingLockStub func(lager.Logger) (lock.Lock, bool, error)
acquireResourceCheckingLockMutex sync.RWMutex acquireResourceCheckingLockMutex sync.RWMutex
acquireResourceCheckingLockArgsForCall []struct { acquireResourceCheckingLockArgsForCall []struct {
arg1 lager.Logger arg1 lager.Logger
arg2 time.Duration
} }
acquireResourceCheckingLockReturns struct { acquireResourceCheckingLockReturns struct {
result1 lock.Lock result1 lock.Lock
@ -149,17 +148,16 @@ type FakeResourceConfigScope struct {
invocationsMutex sync.RWMutex invocationsMutex sync.RWMutex
} }
func (fake *FakeResourceConfigScope) AcquireResourceCheckingLock(arg1 lager.Logger, arg2 time.Duration) (lock.Lock, bool, error) { func (fake *FakeResourceConfigScope) AcquireResourceCheckingLock(arg1 lager.Logger) (lock.Lock, bool, error) {
fake.acquireResourceCheckingLockMutex.Lock() fake.acquireResourceCheckingLockMutex.Lock()
ret, specificReturn := fake.acquireResourceCheckingLockReturnsOnCall[len(fake.acquireResourceCheckingLockArgsForCall)] ret, specificReturn := fake.acquireResourceCheckingLockReturnsOnCall[len(fake.acquireResourceCheckingLockArgsForCall)]
fake.acquireResourceCheckingLockArgsForCall = append(fake.acquireResourceCheckingLockArgsForCall, struct { fake.acquireResourceCheckingLockArgsForCall = append(fake.acquireResourceCheckingLockArgsForCall, struct {
arg1 lager.Logger arg1 lager.Logger
arg2 time.Duration }{arg1})
}{arg1, arg2}) fake.recordInvocation("AcquireResourceCheckingLock", []interface{}{arg1})
fake.recordInvocation("AcquireResourceCheckingLock", []interface{}{arg1, arg2})
fake.acquireResourceCheckingLockMutex.Unlock() fake.acquireResourceCheckingLockMutex.Unlock()
if fake.AcquireResourceCheckingLockStub != nil { if fake.AcquireResourceCheckingLockStub != nil {
return fake.AcquireResourceCheckingLockStub(arg1, arg2) return fake.AcquireResourceCheckingLockStub(arg1)
} }
if specificReturn { if specificReturn {
return ret.result1, ret.result2, ret.result3 return ret.result1, ret.result2, ret.result3
@ -174,17 +172,17 @@ func (fake *FakeResourceConfigScope) AcquireResourceCheckingLockCallCount() int
return len(fake.acquireResourceCheckingLockArgsForCall) return len(fake.acquireResourceCheckingLockArgsForCall)
} }
func (fake *FakeResourceConfigScope) AcquireResourceCheckingLockCalls(stub func(lager.Logger, time.Duration) (lock.Lock, bool, error)) { func (fake *FakeResourceConfigScope) AcquireResourceCheckingLockCalls(stub func(lager.Logger) (lock.Lock, bool, error)) {
fake.acquireResourceCheckingLockMutex.Lock() fake.acquireResourceCheckingLockMutex.Lock()
defer fake.acquireResourceCheckingLockMutex.Unlock() defer fake.acquireResourceCheckingLockMutex.Unlock()
fake.AcquireResourceCheckingLockStub = stub fake.AcquireResourceCheckingLockStub = stub
} }
func (fake *FakeResourceConfigScope) AcquireResourceCheckingLockArgsForCall(i int) (lager.Logger, time.Duration) { func (fake *FakeResourceConfigScope) AcquireResourceCheckingLockArgsForCall(i int) lager.Logger {
fake.acquireResourceCheckingLockMutex.RLock() fake.acquireResourceCheckingLockMutex.RLock()
defer fake.acquireResourceCheckingLockMutex.RUnlock() defer fake.acquireResourceCheckingLockMutex.RUnlock()
argsForCall := fake.acquireResourceCheckingLockArgsForCall[i] argsForCall := fake.acquireResourceCheckingLockArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2 return argsForCall.arg1
} }
func (fake *FakeResourceConfigScope) AcquireResourceCheckingLockReturns(result1 lock.Lock, result2 bool, result3 error) { func (fake *FakeResourceConfigScope) AcquireResourceCheckingLockReturns(result1 lock.Lock, result2 bool, result3 error) {

View File

@ -4,9 +4,7 @@ package dbfakes
import ( import (
"sync" "sync"
"code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
) )
@ -104,12 +102,11 @@ type FakeResourceType struct {
setCheckSetupErrorReturnsOnCall map[int]struct { setCheckSetupErrorReturnsOnCall map[int]struct {
result1 error result1 error
} }
SetResourceConfigStub func(lager.Logger, atc.Source, creds.VersionedResourceTypes) (db.ResourceConfigScope, error) SetResourceConfigStub func(atc.Source, atc.VersionedResourceTypes) (db.ResourceConfigScope, error)
setResourceConfigMutex sync.RWMutex setResourceConfigMutex sync.RWMutex
setResourceConfigArgsForCall []struct { setResourceConfigArgsForCall []struct {
arg1 lager.Logger arg1 atc.Source
arg2 atc.Source arg2 atc.VersionedResourceTypes
arg3 creds.VersionedResourceTypes
} }
setResourceConfigReturns struct { setResourceConfigReturns struct {
result1 db.ResourceConfigScope result1 db.ResourceConfigScope
@ -652,18 +649,17 @@ func (fake *FakeResourceType) SetCheckSetupErrorReturnsOnCall(i int, result1 err
}{result1} }{result1}
} }
func (fake *FakeResourceType) SetResourceConfig(arg1 lager.Logger, arg2 atc.Source, arg3 creds.VersionedResourceTypes) (db.ResourceConfigScope, error) { func (fake *FakeResourceType) SetResourceConfig(arg1 atc.Source, arg2 atc.VersionedResourceTypes) (db.ResourceConfigScope, error) {
fake.setResourceConfigMutex.Lock() fake.setResourceConfigMutex.Lock()
ret, specificReturn := fake.setResourceConfigReturnsOnCall[len(fake.setResourceConfigArgsForCall)] ret, specificReturn := fake.setResourceConfigReturnsOnCall[len(fake.setResourceConfigArgsForCall)]
fake.setResourceConfigArgsForCall = append(fake.setResourceConfigArgsForCall, struct { fake.setResourceConfigArgsForCall = append(fake.setResourceConfigArgsForCall, struct {
arg1 lager.Logger arg1 atc.Source
arg2 atc.Source arg2 atc.VersionedResourceTypes
arg3 creds.VersionedResourceTypes }{arg1, arg2})
}{arg1, arg2, arg3}) fake.recordInvocation("SetResourceConfig", []interface{}{arg1, arg2})
fake.recordInvocation("SetResourceConfig", []interface{}{arg1, arg2, arg3})
fake.setResourceConfigMutex.Unlock() fake.setResourceConfigMutex.Unlock()
if fake.SetResourceConfigStub != nil { if fake.SetResourceConfigStub != nil {
return fake.SetResourceConfigStub(arg1, arg2, arg3) return fake.SetResourceConfigStub(arg1, arg2)
} }
if specificReturn { if specificReturn {
return ret.result1, ret.result2 return ret.result1, ret.result2
@ -678,17 +674,17 @@ func (fake *FakeResourceType) SetResourceConfigCallCount() int {
return len(fake.setResourceConfigArgsForCall) return len(fake.setResourceConfigArgsForCall)
} }
func (fake *FakeResourceType) SetResourceConfigCalls(stub func(lager.Logger, atc.Source, creds.VersionedResourceTypes) (db.ResourceConfigScope, error)) { func (fake *FakeResourceType) SetResourceConfigCalls(stub func(atc.Source, atc.VersionedResourceTypes) (db.ResourceConfigScope, error)) {
fake.setResourceConfigMutex.Lock() fake.setResourceConfigMutex.Lock()
defer fake.setResourceConfigMutex.Unlock() defer fake.setResourceConfigMutex.Unlock()
fake.SetResourceConfigStub = stub fake.SetResourceConfigStub = stub
} }
func (fake *FakeResourceType) SetResourceConfigArgsForCall(i int) (lager.Logger, atc.Source, creds.VersionedResourceTypes) { func (fake *FakeResourceType) SetResourceConfigArgsForCall(i int) (atc.Source, atc.VersionedResourceTypes) {
fake.setResourceConfigMutex.RLock() fake.setResourceConfigMutex.RLock()
defer fake.setResourceConfigMutex.RUnlock() defer fake.setResourceConfigMutex.RUnlock()
argsForCall := fake.setResourceConfigArgsForCall[i] argsForCall := fake.setResourceConfigArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 return argsForCall.arg1, argsForCall.arg2
} }
func (fake *FakeResourceType) SetResourceConfigReturns(result1 db.ResourceConfigScope, result2 error) { func (fake *FakeResourceType) SetResourceConfigReturns(result1 db.ResourceConfigScope, result2 error) {

View File

@ -5,7 +5,6 @@ import (
"sync" "sync"
"time" "time"
"code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
@ -62,10 +61,9 @@ type FakeTeam struct {
result2 db.Pagination result2 db.Pagination
result3 error result3 error
} }
ContainersStub func(lager.Logger) ([]db.Container, error) ContainersStub func() ([]db.Container, error)
containersMutex sync.RWMutex containersMutex sync.RWMutex
containersArgsForCall []struct { containersArgsForCall []struct {
arg1 lager.Logger
} }
containersReturns struct { containersReturns struct {
result1 []db.Container result1 []db.Container
@ -110,13 +108,12 @@ type FakeTeam struct {
deleteReturnsOnCall map[int]struct { deleteReturnsOnCall map[int]struct {
result1 error result1 error
} }
FindCheckContainersStub func(lager.Logger, string, string, creds.Secrets) ([]db.Container, map[int]time.Time, error) FindCheckContainersStub func(string, string, creds.Secrets) ([]db.Container, map[int]time.Time, error)
findCheckContainersMutex sync.RWMutex findCheckContainersMutex sync.RWMutex
findCheckContainersArgsForCall []struct { findCheckContainersArgsForCall []struct {
arg1 lager.Logger arg1 string
arg2 string arg2 string
arg3 string arg3 creds.Secrets
arg4 creds.Secrets
} }
findCheckContainersReturns struct { findCheckContainersReturns struct {
result1 []db.Container result1 []db.Container
@ -646,16 +643,15 @@ func (fake *FakeTeam) BuildsWithTimeReturnsOnCall(i int, result1 []db.Build, res
}{result1, result2, result3} }{result1, result2, result3}
} }
func (fake *FakeTeam) Containers(arg1 lager.Logger) ([]db.Container, error) { func (fake *FakeTeam) Containers() ([]db.Container, error) {
fake.containersMutex.Lock() fake.containersMutex.Lock()
ret, specificReturn := fake.containersReturnsOnCall[len(fake.containersArgsForCall)] ret, specificReturn := fake.containersReturnsOnCall[len(fake.containersArgsForCall)]
fake.containersArgsForCall = append(fake.containersArgsForCall, struct { fake.containersArgsForCall = append(fake.containersArgsForCall, struct {
arg1 lager.Logger }{})
}{arg1}) fake.recordInvocation("Containers", []interface{}{})
fake.recordInvocation("Containers", []interface{}{arg1})
fake.containersMutex.Unlock() fake.containersMutex.Unlock()
if fake.ContainersStub != nil { if fake.ContainersStub != nil {
return fake.ContainersStub(arg1) return fake.ContainersStub()
} }
if specificReturn { if specificReturn {
return ret.result1, ret.result2 return ret.result1, ret.result2
@ -670,19 +666,12 @@ func (fake *FakeTeam) ContainersCallCount() int {
return len(fake.containersArgsForCall) return len(fake.containersArgsForCall)
} }
func (fake *FakeTeam) ContainersCalls(stub func(lager.Logger) ([]db.Container, error)) { func (fake *FakeTeam) ContainersCalls(stub func() ([]db.Container, error)) {
fake.containersMutex.Lock() fake.containersMutex.Lock()
defer fake.containersMutex.Unlock() defer fake.containersMutex.Unlock()
fake.ContainersStub = stub fake.ContainersStub = stub
} }
func (fake *FakeTeam) ContainersArgsForCall(i int) lager.Logger {
fake.containersMutex.RLock()
defer fake.containersMutex.RUnlock()
argsForCall := fake.containersArgsForCall[i]
return argsForCall.arg1
}
func (fake *FakeTeam) ContainersReturns(result1 []db.Container, result2 error) { func (fake *FakeTeam) ContainersReturns(result1 []db.Container, result2 error) {
fake.containersMutex.Lock() fake.containersMutex.Lock()
defer fake.containersMutex.Unlock() defer fake.containersMutex.Unlock()
@ -879,19 +868,18 @@ func (fake *FakeTeam) DeleteReturnsOnCall(i int, result1 error) {
}{result1} }{result1}
} }
func (fake *FakeTeam) FindCheckContainers(arg1 lager.Logger, arg2 string, arg3 string, arg4 creds.Secrets) ([]db.Container, map[int]time.Time, error) { func (fake *FakeTeam) FindCheckContainers(arg1 string, arg2 string, arg3 creds.Secrets) ([]db.Container, map[int]time.Time, error) {
fake.findCheckContainersMutex.Lock() fake.findCheckContainersMutex.Lock()
ret, specificReturn := fake.findCheckContainersReturnsOnCall[len(fake.findCheckContainersArgsForCall)] ret, specificReturn := fake.findCheckContainersReturnsOnCall[len(fake.findCheckContainersArgsForCall)]
fake.findCheckContainersArgsForCall = append(fake.findCheckContainersArgsForCall, struct { fake.findCheckContainersArgsForCall = append(fake.findCheckContainersArgsForCall, struct {
arg1 lager.Logger arg1 string
arg2 string arg2 string
arg3 string arg3 creds.Secrets
arg4 creds.Secrets }{arg1, arg2, arg3})
}{arg1, arg2, arg3, arg4}) fake.recordInvocation("FindCheckContainers", []interface{}{arg1, arg2, arg3})
fake.recordInvocation("FindCheckContainers", []interface{}{arg1, arg2, arg3, arg4})
fake.findCheckContainersMutex.Unlock() fake.findCheckContainersMutex.Unlock()
if fake.FindCheckContainersStub != nil { if fake.FindCheckContainersStub != nil {
return fake.FindCheckContainersStub(arg1, arg2, arg3, arg4) return fake.FindCheckContainersStub(arg1, arg2, arg3)
} }
if specificReturn { if specificReturn {
return ret.result1, ret.result2, ret.result3 return ret.result1, ret.result2, ret.result3
@ -906,17 +894,17 @@ func (fake *FakeTeam) FindCheckContainersCallCount() int {
return len(fake.findCheckContainersArgsForCall) return len(fake.findCheckContainersArgsForCall)
} }
func (fake *FakeTeam) FindCheckContainersCalls(stub func(lager.Logger, string, string, creds.Secrets) ([]db.Container, map[int]time.Time, error)) { func (fake *FakeTeam) FindCheckContainersCalls(stub func(string, string, creds.Secrets) ([]db.Container, map[int]time.Time, error)) {
fake.findCheckContainersMutex.Lock() fake.findCheckContainersMutex.Lock()
defer fake.findCheckContainersMutex.Unlock() defer fake.findCheckContainersMutex.Unlock()
fake.FindCheckContainersStub = stub fake.FindCheckContainersStub = stub
} }
func (fake *FakeTeam) FindCheckContainersArgsForCall(i int) (lager.Logger, string, string, creds.Secrets) { func (fake *FakeTeam) FindCheckContainersArgsForCall(i int) (string, string, creds.Secrets) {
fake.findCheckContainersMutex.RLock() fake.findCheckContainersMutex.RLock()
defer fake.findCheckContainersMutex.RUnlock() defer fake.findCheckContainersMutex.RUnlock()
argsForCall := fake.findCheckContainersArgsForCall[i] argsForCall := fake.findCheckContainersArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
} }
func (fake *FakeTeam) FindCheckContainersReturns(result1 []db.Container, result2 map[int]time.Time, result3 error) { func (fake *FakeTeam) FindCheckContainersReturns(result1 []db.Container, result2 map[int]time.Time, result3 error) {

View File

@ -94,17 +94,17 @@ type FakeWorker struct {
expiresAtReturnsOnCall map[int]struct { expiresAtReturnsOnCall map[int]struct {
result1 time.Time result1 time.Time
} }
FindContainerOnWorkerStub func(db.ContainerOwner) (db.CreatingContainer, db.CreatedContainer, error) FindContainerStub func(db.ContainerOwner) (db.CreatingContainer, db.CreatedContainer, error)
findContainerOnWorkerMutex sync.RWMutex findContainerMutex sync.RWMutex
findContainerOnWorkerArgsForCall []struct { findContainerArgsForCall []struct {
arg1 db.ContainerOwner arg1 db.ContainerOwner
} }
findContainerOnWorkerReturns struct { findContainerReturns struct {
result1 db.CreatingContainer result1 db.CreatingContainer
result2 db.CreatedContainer result2 db.CreatedContainer
result3 error result3 error
} }
findContainerOnWorkerReturnsOnCall map[int]struct { findContainerReturnsOnCall map[int]struct {
result1 db.CreatingContainer result1 db.CreatingContainer
result2 db.CreatedContainer result2 db.CreatedContainer
result3 error result3 error
@ -727,66 +727,66 @@ func (fake *FakeWorker) ExpiresAtReturnsOnCall(i int, result1 time.Time) {
}{result1} }{result1}
} }
func (fake *FakeWorker) FindContainerOnWorker(arg1 db.ContainerOwner) (db.CreatingContainer, db.CreatedContainer, error) { func (fake *FakeWorker) FindContainer(arg1 db.ContainerOwner) (db.CreatingContainer, db.CreatedContainer, error) {
fake.findContainerOnWorkerMutex.Lock() fake.findContainerMutex.Lock()
ret, specificReturn := fake.findContainerOnWorkerReturnsOnCall[len(fake.findContainerOnWorkerArgsForCall)] ret, specificReturn := fake.findContainerReturnsOnCall[len(fake.findContainerArgsForCall)]
fake.findContainerOnWorkerArgsForCall = append(fake.findContainerOnWorkerArgsForCall, struct { fake.findContainerArgsForCall = append(fake.findContainerArgsForCall, struct {
arg1 db.ContainerOwner arg1 db.ContainerOwner
}{arg1}) }{arg1})
fake.recordInvocation("FindContainerOnWorker", []interface{}{arg1}) fake.recordInvocation("FindContainer", []interface{}{arg1})
fake.findContainerOnWorkerMutex.Unlock() fake.findContainerMutex.Unlock()
if fake.FindContainerOnWorkerStub != nil { if fake.FindContainerStub != nil {
return fake.FindContainerOnWorkerStub(arg1) return fake.FindContainerStub(arg1)
} }
if specificReturn { if specificReturn {
return ret.result1, ret.result2, ret.result3 return ret.result1, ret.result2, ret.result3
} }
fakeReturns := fake.findContainerOnWorkerReturns fakeReturns := fake.findContainerReturns
return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3
} }
func (fake *FakeWorker) FindContainerOnWorkerCallCount() int { func (fake *FakeWorker) FindContainerCallCount() int {
fake.findContainerOnWorkerMutex.RLock() fake.findContainerMutex.RLock()
defer fake.findContainerOnWorkerMutex.RUnlock() defer fake.findContainerMutex.RUnlock()
return len(fake.findContainerOnWorkerArgsForCall) return len(fake.findContainerArgsForCall)
} }
func (fake *FakeWorker) FindContainerOnWorkerCalls(stub func(db.ContainerOwner) (db.CreatingContainer, db.CreatedContainer, error)) { func (fake *FakeWorker) FindContainerCalls(stub func(db.ContainerOwner) (db.CreatingContainer, db.CreatedContainer, error)) {
fake.findContainerOnWorkerMutex.Lock() fake.findContainerMutex.Lock()
defer fake.findContainerOnWorkerMutex.Unlock() defer fake.findContainerMutex.Unlock()
fake.FindContainerOnWorkerStub = stub fake.FindContainerStub = stub
} }
func (fake *FakeWorker) FindContainerOnWorkerArgsForCall(i int) db.ContainerOwner { func (fake *FakeWorker) FindContainerArgsForCall(i int) db.ContainerOwner {
fake.findContainerOnWorkerMutex.RLock() fake.findContainerMutex.RLock()
defer fake.findContainerOnWorkerMutex.RUnlock() defer fake.findContainerMutex.RUnlock()
argsForCall := fake.findContainerOnWorkerArgsForCall[i] argsForCall := fake.findContainerArgsForCall[i]
return argsForCall.arg1 return argsForCall.arg1
} }
func (fake *FakeWorker) FindContainerOnWorkerReturns(result1 db.CreatingContainer, result2 db.CreatedContainer, result3 error) { func (fake *FakeWorker) FindContainerReturns(result1 db.CreatingContainer, result2 db.CreatedContainer, result3 error) {
fake.findContainerOnWorkerMutex.Lock() fake.findContainerMutex.Lock()
defer fake.findContainerOnWorkerMutex.Unlock() defer fake.findContainerMutex.Unlock()
fake.FindContainerOnWorkerStub = nil fake.FindContainerStub = nil
fake.findContainerOnWorkerReturns = struct { fake.findContainerReturns = struct {
result1 db.CreatingContainer result1 db.CreatingContainer
result2 db.CreatedContainer result2 db.CreatedContainer
result3 error result3 error
}{result1, result2, result3} }{result1, result2, result3}
} }
func (fake *FakeWorker) FindContainerOnWorkerReturnsOnCall(i int, result1 db.CreatingContainer, result2 db.CreatedContainer, result3 error) { func (fake *FakeWorker) FindContainerReturnsOnCall(i int, result1 db.CreatingContainer, result2 db.CreatedContainer, result3 error) {
fake.findContainerOnWorkerMutex.Lock() fake.findContainerMutex.Lock()
defer fake.findContainerOnWorkerMutex.Unlock() defer fake.findContainerMutex.Unlock()
fake.FindContainerOnWorkerStub = nil fake.FindContainerStub = nil
if fake.findContainerOnWorkerReturnsOnCall == nil { if fake.findContainerReturnsOnCall == nil {
fake.findContainerOnWorkerReturnsOnCall = make(map[int]struct { fake.findContainerReturnsOnCall = make(map[int]struct {
result1 db.CreatingContainer result1 db.CreatingContainer
result2 db.CreatedContainer result2 db.CreatedContainer
result3 error result3 error
}) })
} }
fake.findContainerOnWorkerReturnsOnCall[i] = struct { fake.findContainerReturnsOnCall[i] = struct {
result1 db.CreatingContainer result1 db.CreatingContainer
result2 db.CreatedContainer result2 db.CreatedContainer
result3 error result3 error
@ -1757,8 +1757,8 @@ func (fake *FakeWorker) Invocations() map[string][][]interface{} {
defer fake.ephemeralMutex.RUnlock() defer fake.ephemeralMutex.RUnlock()
fake.expiresAtMutex.RLock() fake.expiresAtMutex.RLock()
defer fake.expiresAtMutex.RUnlock() defer fake.expiresAtMutex.RUnlock()
fake.findContainerOnWorkerMutex.RLock() fake.findContainerMutex.RLock()
defer fake.findContainerOnWorkerMutex.RUnlock() defer fake.findContainerMutex.RUnlock()
fake.gardenAddrMutex.RLock() fake.gardenAddrMutex.RLock()
defer fake.gardenAddrMutex.RUnlock() defer fake.gardenAddrMutex.RUnlock()
fake.hTTPProxyURLMutex.RLock() fake.hTTPProxyURLMutex.RLock()

View File

@ -4,7 +4,6 @@ import (
"time" "time"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/algorithm" "github.com/concourse/concourse/atc/db/algorithm"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -747,7 +746,7 @@ var _ = Describe("Job", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfigScope.SaveVersions([]atc.Version{ err = resourceConfigScope.SaveVersions([]atc.Version{
@ -763,7 +762,7 @@ var _ = Describe("Job", func() {
Name: "name1", Name: "name1",
Value: "value1", Value: "value1",
}, },
}, resourceConfigScope.ResourceConfig(), creds.VersionedResourceTypes{}) }, resourceConfigScope.ResourceConfig(), atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
reversions, _, found, err := resource.Versions(db.Page{Limit: 3}) reversions, _, found, err := resource.Versions(db.Page{Limit: 3})
@ -927,7 +926,7 @@ var _ = Describe("Job", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfigScope.SaveVersions([]atc.Version{ err = resourceConfigScope.SaveVersions([]atc.Version{
@ -943,7 +942,7 @@ var _ = Describe("Job", func() {
Name: "name1", Name: "name1",
Value: "value1", Value: "value1",
}, },
}, resourceConfigScope.ResourceConfig(), creds.VersionedResourceTypes{}) }, resourceConfigScope.ResourceConfig(), atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
reversions, _, found, err := resource.Versions(db.Page{Limit: 3}) reversions, _, found, err := resource.Versions(db.Page{Limit: 3})

View File

@ -44,8 +44,8 @@ func NewVolumeCreatingLockID(volumeID int) LockID {
return LockID{LockTypeVolumeCreating, volumeID} return LockID{LockTypeVolumeCreating, volumeID}
} }
func NewContainerCreatingLockID(containerID int) LockID { func NewContainerCreatingLockID() LockID {
return LockID{LockTypeContainerCreating, containerID} return LockID{LockTypeContainerCreating}
} }
func NewDatabaseMigrationLockID() LockID { func NewDatabaseMigrationLockID() LockID {

View File

@ -5,7 +5,6 @@ import (
"time" "time"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/algorithm" "github.com/concourse/concourse/atc/db/algorithm"
"github.com/concourse/concourse/atc/event" "github.com/concourse/concourse/atc/event"
@ -405,13 +404,13 @@ var _ = Describe("Pipeline", func() {
otherPipelineResource, _, err = otherDBPipeline.Resource(otherResourceName) otherPipelineResource, _, err = otherDBPipeline.Resource(otherResourceName)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{"source-config": "some-value"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{"source-config": "some-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
otherResourceConfigScope, err = otherPipelineResource.SetResourceConfig(logger, atc.Source{"other-source-config": "some-other-value"}, creds.VersionedResourceTypes{}) otherResourceConfigScope, err = otherPipelineResource.SetResourceConfig(atc.Source{"other-source-config": "some-other-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
_, err = reallyOtherResource.SetResourceConfig(logger, atc.Source{"source-config": "some-really-other-value"}, creds.VersionedResourceTypes{}) _, err = reallyOtherResource.SetResourceConfig(atc.Source{"source-config": "some-really-other-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -553,7 +552,7 @@ var _ = Describe("Pipeline", func() {
build1DB, err := aJob.CreateBuild() build1DB, err := aJob.CreateBuild()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build1DB.SaveOutput(logger, "some-type", atc.Source{"source-config": "some-value"}, creds.VersionedResourceTypes{}, atc.Version{"version": "1"}, nil, "some-output-name", "some-resource") err = build1DB.SaveOutput("some-type", atc.Source{"source-config": "some-value"}, atc.VersionedResourceTypes{}, atc.Version{"version": "1"}, nil, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build1DB.Finish(db.BuildStatusSucceeded) err = build1DB.Finish(db.BuildStatusSucceeded)
@ -600,7 +599,7 @@ var _ = Describe("Pipeline", func() {
build2DB, err := aJob.CreateBuild() build2DB, err := aJob.CreateBuild()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build2DB.SaveOutput(logger, "some-type", atc.Source{"source-config": "some-value"}, creds.VersionedResourceTypes{}, atc.Version{"version": "1"}, nil, "some-output-name", "some-resource") err = build2DB.SaveOutput("some-type", atc.Source{"source-config": "some-value"}, atc.VersionedResourceTypes{}, atc.Version{"version": "1"}, nil, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build2DB.Finish(db.BuildStatusFailed) err = build2DB.Finish(db.BuildStatusFailed)
@ -649,7 +648,7 @@ var _ = Describe("Pipeline", func() {
otherPipelineBuild, err := anotherJob.CreateBuild() otherPipelineBuild, err := anotherJob.CreateBuild()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = otherPipelineBuild.SaveOutput(logger, "some-type", atc.Source{"other-source-config": "some-other-value"}, creds.VersionedResourceTypes{}, atc.Version{"version": "1"}, nil, "some-output-name", "some-other-resource") err = otherPipelineBuild.SaveOutput("some-type", atc.Source{"other-source-config": "some-other-value"}, atc.VersionedResourceTypes{}, atc.Version{"version": "1"}, nil, "some-output-name", "some-other-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = otherPipelineBuild.Finish(db.BuildStatusSucceeded) err = otherPipelineBuild.Finish(db.BuildStatusSucceeded)
@ -883,7 +882,7 @@ var _ = Describe("Pipeline", func() {
}) })
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build.SaveOutput(logger, "some-type", atc.Source{"source-config": "some-value"}, creds.VersionedResourceTypes{}, atc.Version(beforeVR.Version()), nil, "some-output-name", "some-resource") err = build.SaveOutput("some-type", atc.Source{"source-config": "some-value"}, atc.VersionedResourceTypes{}, atc.Version(beforeVR.Version()), nil, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
versions, _, found, err := resource.Versions(db.Page{Limit: 10}) versions, _, found, err := resource.Versions(db.Page{Limit: 10})
@ -906,7 +905,7 @@ var _ = Describe("Pipeline", func() {
savedResource, _, err := dbPipeline.Resource("some-resource") savedResource, _, err := dbPipeline.Resource("some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = savedResource.SetResourceConfig(logger, atc.Source{"source-config": "some-value"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = savedResource.SetResourceConfig(atc.Source{"source-config": "some-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
savedVR, found, err := resourceConfigScope.LatestVersion() savedVR, found, err := resourceConfigScope.LatestVersion()
@ -966,7 +965,7 @@ var _ = Describe("Pipeline", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{"some-source": "some-value"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{"some-source": "some-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -992,7 +991,7 @@ var _ = Describe("Pipeline", func() {
ResourceID: resource.ID(), ResourceID: resource.ID(),
} }
err = build1.SaveOutput(logger, "some-type", atc.Source{"some-source": "some-value"}, creds.VersionedResourceTypes{}, atc.Version{"version": "disabled"}, nil, "some-output-name", "some-resource") err = build1.SaveOutput("some-type", atc.Source{"some-source": "some-value"}, atc.VersionedResourceTypes{}, atc.Version{"version": "disabled"}, nil, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfigScope.SaveVersions([]atc.Version{{"version": "enabled"}}) err = resourceConfigScope.SaveVersions([]atc.Version{{"version": "enabled"}})
@ -1019,7 +1018,7 @@ var _ = Describe("Pipeline", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build1.SaveOutput(logger, "some-type", atc.Source{"some-source": "some-value"}, creds.VersionedResourceTypes{}, atc.Version{"version": "other-enabled"}, nil, "some-output-name", "some-resource") err = build1.SaveOutput("some-type", atc.Source{"some-source": "some-value"}, atc.VersionedResourceTypes{}, atc.Version{"version": "other-enabled"}, nil, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = build1.Finish(db.BuildStatusSucceeded) err = build1.Finish(db.BuildStatusSucceeded)
@ -1105,7 +1104,7 @@ var _ = Describe("Pipeline", func() {
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
By("populating resource versions") By("populating resource versions")
@ -1135,7 +1134,7 @@ var _ = Describe("Pipeline", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
By("populating build outputs") By("populating build outputs")
err = build.SaveOutput(logger, "some-type", atc.Source{"some": "source"}, creds.VersionedResourceTypes{}, atc.Version{"key": "value"}, nil, "some-output-name", "some-resource") err = build.SaveOutput("some-type", atc.Source{"some": "source"}, atc.VersionedResourceTypes{}, atc.Version{"key": "value"}, nil, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
By("populating build events") By("populating build events")
@ -1221,7 +1220,7 @@ var _ = Describe("Pipeline", func() {
savedResource, _, err = pipeline.Resource("some-resource") savedResource, _, err = pipeline.Resource("some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = savedResource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = savedResource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfigScope.SaveVersions([]atc.Version{{"version": "1"}}) err = resourceConfigScope.SaveVersions([]atc.Version{{"version": "1"}})
@ -1233,7 +1232,7 @@ var _ = Describe("Pipeline", func() {
}) })
It("will cache VersionsDB if no change has occured", func() { It("will cache VersionsDB if no change has occured", func() {
err := build.SaveOutput(logger, "some-type", atc.Source{"some": "source"}, creds.VersionedResourceTypes{}, atc.Version(savedVR.Version()), nil, "some-output-name", "some-resource") err := build.SaveOutput("some-type", atc.Source{"some": "source"}, atc.VersionedResourceTypes{}, atc.Version(savedVR.Version()), nil, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
versionsDB, err := pipeline.LoadVersionsDB() versionsDB, err := pipeline.LoadVersionsDB()
@ -1294,7 +1293,7 @@ var _ = Describe("Pipeline", func() {
otherSavedResource, _, err := otherPipeline.Resource("some-other-resource") otherSavedResource, _, err := otherPipeline.Resource("some-other-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
otherResourceConfigScope, err := otherSavedResource.SetResourceConfig(logger, atc.Source{"some-source": "some-other-value"}, creds.VersionedResourceTypes{}) otherResourceConfigScope, err := otherSavedResource.SetResourceConfig(atc.Source{"some-source": "some-other-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
otherResourceConfigScope.SaveVersions([]atc.Version{{"version": "1"}}) otherResourceConfigScope.SaveVersions([]atc.Version{{"version": "1"}})
@ -1307,7 +1306,7 @@ var _ = Describe("Pipeline", func() {
versionsDB, err := pipeline.LoadVersionsDB() versionsDB, err := pipeline.LoadVersionsDB()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = otherBuild.SaveOutput(logger, "some-type", atc.Source{"some-source": "some-other-value"}, creds.VersionedResourceTypes{}, atc.Version(otherSavedVR.Version()), nil, "some-output-name", "some-other-resource") err = otherBuild.SaveOutput("some-type", atc.Source{"some-source": "some-other-value"}, atc.VersionedResourceTypes{}, atc.Version(otherSavedVR.Version()), nil, "some-output-name", "some-other-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
cachedVersionsDB, err := pipeline.LoadVersionsDB() cachedVersionsDB, err := pipeline.LoadVersionsDB()
@ -1330,10 +1329,10 @@ var _ = Describe("Pipeline", func() {
otherResource, _, err := pipeline.Resource("some-other-resource") otherResource, _, err := pipeline.Resource("some-other-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
otherResourceConfigScope, err = otherResource.SetResourceConfig(logger, atc.Source{"some": "other-source"}, creds.VersionedResourceTypes{}) otherResourceConfigScope, err = otherResource.SetResourceConfig(atc.Source{"some": "other-source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -1369,7 +1368,7 @@ var _ = Describe("Pipeline", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
By("creating a new version but not updating the check order yet") By("creating a new version but not updating the check order yet")
created, err := resource.SaveUncheckedVersion(atc.Version{"version": "1"}, nil, resourceConfigScope.ResourceConfig(), creds.VersionedResourceTypes{}) created, err := resource.SaveUncheckedVersion(atc.Version{"version": "1"}, nil, resourceConfigScope.ResourceConfig(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(created).To(BeTrue()) Expect(created).To(BeTrue())
@ -1397,7 +1396,7 @@ var _ = Describe("Pipeline", func() {
otherPipelineResource, _, err := otherPipeline.Resource("some-other-resource") otherPipelineResource, _, err := otherPipeline.Resource("some-other-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
otherPipelineResourceConfig, err := otherPipelineResource.SetResourceConfig(logger, atc.Source{"some-source": "some-other-value"}, creds.VersionedResourceTypes{}) otherPipelineResourceConfig, err := otherPipelineResource.SetResourceConfig(atc.Source{"some-source": "some-other-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = otherPipelineResourceConfig.SaveVersions([]atc.Version{{"version": "1"}}) err = otherPipelineResourceConfig.SaveVersions([]atc.Version{{"version": "1"}})
@ -1695,7 +1694,7 @@ var _ = Describe("Pipeline", func() {
resource, _, err = pipeline.Resource("some-resource") resource, _, err = pipeline.Resource("some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfigScope.SaveVersions([]atc.Version{atc.Version{"version": "v1"}}) err = resourceConfigScope.SaveVersions([]atc.Version{atc.Version{"version": "v1"}})
@ -1829,7 +1828,7 @@ var _ = Describe("Pipeline", func() {
resource, _, err = pipeline.Resource("some-resource") resource, _, err = pipeline.Resource("some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfigScope, err = resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceConfigScope.SaveVersions([]atc.Version{ err = resourceConfigScope.SaveVersions([]atc.Version{
@ -1838,7 +1837,7 @@ var _ = Describe("Pipeline", func() {
}) })
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = dbBuild.SaveOutput(logger, "some-type", atc.Source{"some": "source"}, creds.VersionedResourceTypes{}, atc.Version{"version": "v1"}, []db.ResourceConfigMetadataField{ err = dbBuild.SaveOutput("some-type", atc.Source{"some": "source"}, atc.VersionedResourceTypes{}, atc.Version{"version": "v1"}, []db.ResourceConfigMetadataField{
{ {
Name: "some", Name: "some",
Value: "value", Value: "value",
@ -1850,7 +1849,7 @@ var _ = Describe("Pipeline", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
err = dbSecondBuild.SaveOutput(logger, "some-type", atc.Source{"some": "source"}, creds.VersionedResourceTypes{}, atc.Version{"version": "v1"}, []db.ResourceConfigMetadataField{ err = dbSecondBuild.SaveOutput("some-type", atc.Source{"some": "source"}, atc.VersionedResourceTypes{}, atc.Version{"version": "v1"}, []db.ResourceConfigMetadataField{
{ {
Name: "some", Name: "some",
Value: "value", Value: "value",
@ -1858,7 +1857,7 @@ var _ = Describe("Pipeline", func() {
}, "some-output-name", "some-resource") }, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = dbSecondBuild.SaveOutput(logger, "some-type", atc.Source{"some": "source"}, creds.VersionedResourceTypes{}, atc.Version{"version": "v3"}, nil, "some-output-name", "some-resource") err = dbSecondBuild.SaveOutput("some-type", atc.Source{"some": "source"}, atc.VersionedResourceTypes{}, atc.Version{"version": "v3"}, nil, "some-output-name", "some-resource")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
rcv1, found, err := resourceConfigScope.FindVersion(atc.Version{"version": "v1"}) rcv1, found, err := resourceConfigScope.FindVersion(atc.Version{"version": "v1"})
@ -2037,7 +2036,7 @@ var _ = Describe("Pipeline", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resourceTypeScope, err := resourceType.SetResourceConfig(logger, atc.Source{"some": "type-source"}, creds.VersionedResourceTypes{}) resourceTypeScope, err := resourceType.SetResourceConfig(atc.Source{"some": "type-source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceTypeScope.SaveVersions([]atc.Version{ err = resourceTypeScope.SaveVersions([]atc.Version{
@ -2046,7 +2045,7 @@ var _ = Describe("Pipeline", func() {
}) })
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
otherResourceTypeScope, err := otherResourceType.SetResourceConfig(logger, atc.Source{"some": "other-type-source"}, creds.VersionedResourceTypes{}) otherResourceTypeScope, err := otherResourceType.SetResourceConfig(atc.Source{"some": "other-type-source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = otherResourceTypeScope.SaveVersions([]atc.Version{ err = otherResourceTypeScope.SaveVersions([]atc.Version{
@ -2088,7 +2087,7 @@ var _ = Describe("Pipeline", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfig, err := resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceConfig, err := resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
version := atc.Version{"version": "1"} version := atc.Version{"version": "1"}

View File

@ -8,10 +8,8 @@ import (
"strconv" "strconv"
"time" "time"
"code.cloudfoundry.org/lager"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
"github.com/lib/pq" "github.com/lib/pq"
) )
@ -47,7 +45,8 @@ type Resource interface {
ResourceConfigVersionID(atc.Version) (int, bool, error) ResourceConfigVersionID(atc.Version) (int, bool, error)
Versions(page Page) ([]atc.ResourceVersion, Pagination, bool, error) Versions(page Page) ([]atc.ResourceVersion, Pagination, bool, error)
SaveUncheckedVersion(atc.Version, ResourceConfigMetadataFields, ResourceConfig, creds.VersionedResourceTypes) (bool, error) SaveUncheckedVersion(atc.Version, ResourceConfigMetadataFields, ResourceConfig, atc.VersionedResourceTypes) (bool, error)
UpdateMetadata(atc.Version, ResourceConfigMetadataFields) (bool, error)
EnableVersion(rcvID int) error EnableVersion(rcvID int) error
DisableVersion(rcvID int) error DisableVersion(rcvID int) error
@ -55,7 +54,7 @@ type Resource interface {
PinVersion(rcvID int) error PinVersion(rcvID int) error
UnpinVersion() error UnpinVersion() error
SetResourceConfig(lager.Logger, atc.Source, creds.VersionedResourceTypes) (ResourceConfigScope, error) SetResourceConfig(atc.Source, atc.VersionedResourceTypes) (ResourceConfigScope, error)
SetCheckSetupError(error) error SetCheckSetupError(error) error
NotifyScan() error NotifyScan() error
@ -177,7 +176,7 @@ func (r *resource) Reload() (bool, error) {
return true, nil return true, nil
} }
func (r *resource) SetResourceConfig(logger lager.Logger, source atc.Source, resourceTypes creds.VersionedResourceTypes) (ResourceConfigScope, error) { func (r *resource) SetResourceConfig(source atc.Source, resourceTypes atc.VersionedResourceTypes) (ResourceConfigScope, error) {
resourceConfigDescriptor, err := constructResourceConfigDescriptor(r.type_, source, resourceTypes) resourceConfigDescriptor, err := constructResourceConfigDescriptor(r.type_, source, resourceTypes)
if err != nil { if err != nil {
return nil, err return nil, err
@ -190,7 +189,7 @@ func (r *resource) SetResourceConfig(logger lager.Logger, source atc.Source, res
defer Rollback(tx) defer Rollback(tx)
resourceConfig, err := resourceConfigDescriptor.findOrCreate(logger, tx, r.lockFactory, r.conn) resourceConfig, err := resourceConfigDescriptor.findOrCreate(tx, r.lockFactory, r.conn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -275,7 +274,7 @@ func (r *resource) SetCheckSetupError(cause error) error {
// index for the pipeline because we want to ignore these versions until the // index for the pipeline because we want to ignore these versions until the
// check orders get updated. The bumping of the index will be done in // check orders get updated. The bumping of the index will be done in
// SaveOutput for the put step. // SaveOutput for the put step.
func (r *resource) SaveUncheckedVersion(version atc.Version, metadata ResourceConfigMetadataFields, resourceConfig ResourceConfig, resourceTypes creds.VersionedResourceTypes) (bool, error) { func (r *resource) SaveUncheckedVersion(version atc.Version, metadata ResourceConfigMetadataFields, resourceConfig ResourceConfig, resourceTypes atc.VersionedResourceTypes) (bool, error) {
tx, err := r.conn.Begin() tx, err := r.conn.Begin()
if err != nil { if err != nil {
return false, err return false, err
@ -296,6 +295,37 @@ func (r *resource) SaveUncheckedVersion(version atc.Version, metadata ResourceCo
return newVersion, tx.Commit() return newVersion, tx.Commit()
} }
func (r *resource) UpdateMetadata(version atc.Version, metadata ResourceConfigMetadataFields) (bool, error) {
versionJSON, err := json.Marshal(version)
if err != nil {
return false, err
}
metadataJSON, err := json.Marshal(metadata)
if err != nil {
return false, err
}
_, err = psql.Update("resource_config_versions").
Set("metadata", string(metadataJSON)).
Where(sq.Eq{
"resource_config_scope_id": r.ResourceConfigScopeID(),
}).
Where(sq.Expr(
"version_md5 = md5(?)", versionJSON,
)).
RunWith(r.conn).
Exec()
if err != nil {
if err == sql.ErrNoRows {
return false, nil
}
return false, err
}
return true, nil
}
func (r *resource) ResourceConfigVersionID(version atc.Version) (int, bool, error) { func (r *resource) ResourceConfigVersionID(version atc.Version) (int, bool, error) {
requestedVersion, err := json.Marshal(version) requestedVersion, err := json.Marshal(version)
if err != nil { if err != nil {

View File

@ -7,8 +7,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"code.cloudfoundry.org/lager"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
@ -43,12 +41,11 @@ func (cache *ResourceCacheDescriptor) find(tx Tx, lockFactory lock.LockFactory,
} }
func (cache *ResourceCacheDescriptor) findOrCreate( func (cache *ResourceCacheDescriptor) findOrCreate(
logger lager.Logger,
tx Tx, tx Tx,
lockFactory lock.LockFactory, lockFactory lock.LockFactory,
conn Conn, conn Conn,
) (UsedResourceCache, error) { ) (UsedResourceCache, error) {
resourceConfig, err := cache.ResourceConfigDescriptor.findOrCreate(logger, tx, lockFactory, conn) resourceConfig, err := cache.ResourceConfigDescriptor.findOrCreate(tx, lockFactory, conn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -98,7 +95,6 @@ func (cache *ResourceCacheDescriptor) findOrCreate(
} }
func (cache *ResourceCacheDescriptor) use( func (cache *ResourceCacheDescriptor) use(
logger lager.Logger,
tx Tx, tx Tx,
rc UsedResourceCache, rc UsedResourceCache,
user ResourceCacheUser, user ResourceCacheUser,

View File

@ -4,10 +4,8 @@ import (
"database/sql" "database/sql"
"encoding/json" "encoding/json"
"code.cloudfoundry.org/lager"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
) )
@ -15,13 +13,12 @@ import (
type ResourceCacheFactory interface { type ResourceCacheFactory interface {
FindOrCreateResourceCache( FindOrCreateResourceCache(
logger lager.Logger,
resourceCacheUser ResourceCacheUser, resourceCacheUser ResourceCacheUser,
resourceTypeName string, resourceTypeName string,
version atc.Version, version atc.Version,
source atc.Source, source atc.Source,
params atc.Params, params atc.Params,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
) (UsedResourceCache, error) ) (UsedResourceCache, error)
// changing resource cache to interface to allow updates on object is not feasible. // changing resource cache to interface to allow updates on object is not feasible.
@ -45,13 +42,12 @@ func NewResourceCacheFactory(conn Conn, lockFactory lock.LockFactory) ResourceCa
} }
func (f *resourceCacheFactory) FindOrCreateResourceCache( func (f *resourceCacheFactory) FindOrCreateResourceCache(
logger lager.Logger,
resourceCacheUser ResourceCacheUser, resourceCacheUser ResourceCacheUser,
resourceTypeName string, resourceTypeName string,
version atc.Version, version atc.Version,
source atc.Source, source atc.Source,
params atc.Params, params atc.Params,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
) (UsedResourceCache, error) { ) (UsedResourceCache, error) {
resourceConfigDescriptor, err := constructResourceConfigDescriptor(resourceTypeName, source, resourceTypes) resourceConfigDescriptor, err := constructResourceConfigDescriptor(resourceTypeName, source, resourceTypes)
if err != nil { if err != nil {
@ -71,12 +67,12 @@ func (f *resourceCacheFactory) FindOrCreateResourceCache(
defer Rollback(tx) defer Rollback(tx)
usedResourceCache, err := resourceCache.findOrCreate(logger, tx, f.lockFactory, f.conn) usedResourceCache, err := resourceCache.findOrCreate(tx, f.lockFactory, f.conn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = resourceCache.use(logger, tx, usedResourceCache, resourceCacheUser) err = resourceCache.use(tx, usedResourceCache, resourceCacheUser)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -8,9 +8,7 @@ import (
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -71,7 +69,7 @@ var _ = Describe("ResourceCacheFactory", func() {
Name: "some-type-type", Name: "some-type-type",
Type: "some-base-type", Type: "some-base-type",
Source: atc.Source{ Source: atc.Source{
"some-type-type": "((source-param))", "some-type-type": "some-secret-sauce",
}, },
}, },
Version: atc.Version{"some-type-type": "version"}, Version: atc.Version{"some-type-type": "version"},
@ -119,7 +117,6 @@ var _ = Describe("ResourceCacheFactory", func() {
Describe("FindOrCreateResourceCache", func() { Describe("FindOrCreateResourceCache", func() {
It("creates resource cache in database", func() { It("creates resource cache in database", func() {
usedResourceCache, err := resourceCacheFactory.FindOrCreateResourceCache( usedResourceCache, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -127,14 +124,11 @@ var _ = Describe("ResourceCacheFactory", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{
template.StaticVariables{"source-param": "some-secret-sauce"}, resourceType1,
atc.VersionedResourceTypes{ resourceType2,
resourceType1, resourceType3,
resourceType2, },
resourceType3,
},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(usedResourceCache.Version()).To(Equal(atc.Version{"some": "version"})) Expect(usedResourceCache.Version()).To(Equal(atc.Version{"some": "version"}))
@ -200,7 +194,6 @@ var _ = Describe("ResourceCacheFactory", func() {
It("returns an error if base resource type does not exist", func() { It("returns an error if base resource type does not exist", func() {
_, err := resourceCacheFactory.FindOrCreateResourceCache( _, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-type-using-bogus-base-type", "some-type-using-bogus-base-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -208,13 +201,10 @@ var _ = Describe("ResourceCacheFactory", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{
template.StaticVariables{"source-param": "some-secret-sauce"}, resourceType1,
atc.VersionedResourceTypes{ resourceTypeUsingBogusBaseType,
resourceType1, },
resourceTypeUsingBogusBaseType,
},
),
) )
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
Expect(err).To(Equal(db.BaseResourceTypeNotFoundError{Name: "some-bogus-base-type"})) Expect(err).To(Equal(db.BaseResourceTypeNotFoundError{Name: "some-bogus-base-type"}))
@ -222,7 +212,6 @@ var _ = Describe("ResourceCacheFactory", func() {
It("allows a base resource type to be overridden using itself", func() { It("allows a base resource type to be overridden using itself", func() {
usedResourceCache, err := resourceCacheFactory.FindOrCreateResourceCache( usedResourceCache, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-image-type", "some-image-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -230,12 +219,9 @@ var _ = Describe("ResourceCacheFactory", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{
template.StaticVariables{"source-param": "some-secret-sauce"}, resourceTypeOverridingBaseType,
atc.VersionedResourceTypes{ },
resourceTypeOverridingBaseType,
},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -286,13 +272,12 @@ var _ = Describe("ResourceCacheFactory", func() {
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
_, err := resourceCacheFactory.FindOrCreateResourceCache( _, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-base-resource-type", "some-base-resource-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
atc.Source{"some": "source"}, atc.Source{"some": "source"},
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
} }

View File

@ -4,9 +4,7 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/algorithm" "github.com/concourse/concourse/atc/db/algorithm"
@ -175,15 +173,11 @@ var _ = Describe("ResourceCacheLifecycle", func() {
BeforeEach(func() { BeforeEach(func() {
var err error var err error
resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig( resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-base-resource-type", "some-base-resource-type",
atc.Source{ atc.Source{
"some": "source", "some": "source",
}, },
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{},
template.StaticVariables{"source-param": "some-secret-sauce"},
atc.VersionedResourceTypes{},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -230,26 +224,22 @@ var _ = Describe("ResourceCacheLifecycle", func() {
Context("when the cache is for a custom resource type", func() { Context("when the cache is for a custom resource type", func() {
It("does not remove the cache if the type is still configured", func() { It("does not remove the cache if the type is still configured", func() {
_, err := resourceConfigFactory.FindOrCreateResourceConfig( _, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-type", "some-type",
atc.Source{ atc.Source{
"some": "source", "some": "source",
}, },
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{
template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceType{
atc.VersionedResourceTypes{ ResourceType: atc.ResourceType{
atc.VersionedResourceType{ Name: "some-type",
ResourceType: atc.ResourceType{ Type: "some-base-resource-type",
Name: "some-type", Source: atc.Source{
Type: "some-base-resource-type", "some": "source",
Source: atc.Source{
"some": "source",
},
}, },
Version: atc.Version{"showme": "whatyougot"},
}, },
Version: atc.Version{"showme": "whatyougot"},
}, },
), },
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -262,26 +252,22 @@ var _ = Describe("ResourceCacheLifecycle", func() {
It("removes the cache if the type is no longer configured", func() { It("removes the cache if the type is no longer configured", func() {
_, err := resourceConfigFactory.FindOrCreateResourceConfig( _, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-type", "some-type",
atc.Source{ atc.Source{
"some": "source", "some": "source",
}, },
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{
template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceType{
atc.VersionedResourceTypes{ ResourceType: atc.ResourceType{
atc.VersionedResourceType{ Name: "some-type",
ResourceType: atc.ResourceType{ Type: "some-base-resource-type",
Name: "some-type", Source: atc.Source{
Type: "some-base-resource-type", "some": "source",
Source: atc.Source{
"some": "source",
},
}, },
Version: atc.Version{"showme": "whatyougot"},
}, },
Version: atc.Version{"showme": "whatyougot"},
}, },
), },
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -306,12 +292,8 @@ var _ = Describe("ResourceCacheLifecycle", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err := defaultResource.SetResourceConfig( resourceConfigScope, err := defaultResource.SetResourceConfig(
logger,
atc.Source{"some": "source"}, atc.Source{"some": "source"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{},
template.StaticVariables{"source-param": "some-secret-sauce"},
atc.VersionedResourceTypes{},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -372,7 +354,6 @@ func countResourceCaches() int {
func createResourceCacheWithUser(resourceCacheUser db.ResourceCacheUser) db.UsedResourceCache { func createResourceCacheWithUser(resourceCacheUser db.ResourceCacheUser) db.UsedResourceCache {
usedResourceCache, err := resourceCacheFactory.FindOrCreateResourceCache( usedResourceCache, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
resourceCacheUser, resourceCacheUser,
"some-base-resource-type", "some-base-resource-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -380,10 +361,7 @@ func createResourceCacheWithUser(resourceCacheUser db.ResourceCacheUser) db.Used
"some": "source", "some": "source",
}, },
atc.Params{"some": fmt.Sprintf("param-%d", time.Now().UnixNano())}, atc.Params{"some": fmt.Sprintf("param-%d", time.Now().UnixNano())},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{},
template.StaticVariables{"source-param": "some-secret-sauce"},
atc.VersionedResourceTypes{},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())

View File

@ -2,9 +2,7 @@ package db_test
import ( import (
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/lib/pq" "github.com/lib/pq"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -42,7 +40,6 @@ var _ = Describe("ResourceCache", func() {
It("can be created and used", func() { It("can be created and used", func() {
urc, err := resourceCacheFactory.FindOrCreateResourceCache( urc, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-worker-resource-type", "some-worker-resource-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -50,10 +47,7 @@ var _ = Describe("ResourceCache", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{},
template.StaticVariables{"source-param": "some-secret-sauce"},
atc.VersionedResourceTypes{},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(urc.ID()).ToNot(BeZero()) Expect(urc.ID()).ToNot(BeZero())
@ -70,7 +64,6 @@ var _ = Describe("ResourceCache", func() {
BeforeEach(func() { BeforeEach(func() {
var err error var err error
existingResourceCache, err = resourceCacheFactory.FindOrCreateResourceCache( existingResourceCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-worker-resource-type", "some-worker-resource-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -78,17 +71,13 @@ var _ = Describe("ResourceCache", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{},
template.StaticVariables{"source-param": "some-secret-sauce"},
atc.VersionedResourceTypes{},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
It("returns the same used resource cache", func() { It("returns the same used resource cache", func() {
urc, err := resourceCacheFactory.FindOrCreateResourceCache( urc, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-worker-resource-type", "some-worker-resource-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -96,10 +85,7 @@ var _ = Describe("ResourceCache", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{},
template.StaticVariables{"source-param": "some-secret-sauce"},
atc.VersionedResourceTypes{},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(urc.ID()).To(Equal(existingResourceCache.ID())) Expect(urc.ID()).To(Equal(existingResourceCache.ID()))
@ -127,7 +113,6 @@ var _ = Describe("ResourceCache", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
urc, err = resourceCacheFactory.FindOrCreateResourceCache( urc, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForContainer(container.ID()), db.ForContainer(container.ID()),
"some-worker-resource-type", "some-worker-resource-type",
atc.Version{"some-type": "version"}, atc.Version{"some-type": "version"},
@ -135,9 +120,7 @@ var _ = Describe("ResourceCache", func() {
"cache": "source", "cache": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes(template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceTypes{},
atc.VersionedResourceTypes{},
),
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -156,7 +139,6 @@ var _ = Describe("ResourceCache", func() {
BeforeEach(func() { BeforeEach(func() {
var err error var err error
existingResourceCache, err = resourceCacheFactory.FindOrCreateResourceCache( existingResourceCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForContainer(container.ID()), db.ForContainer(container.ID()),
"some-worker-resource-type", "some-worker-resource-type",
atc.Version{"some-type": "version"}, atc.Version{"some-type": "version"},
@ -164,9 +146,7 @@ var _ = Describe("ResourceCache", func() {
"cache": "source", "cache": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes(template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceTypes{},
atc.VersionedResourceTypes{},
),
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })

View File

@ -6,11 +6,8 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"code.cloudfoundry.org/lager"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
) )
@ -126,7 +123,7 @@ func (r *resourceConfig) FindResourceConfigScopeByID(resourceConfigScopeID int,
lockFactory: r.lockFactory}, true, nil lockFactory: r.lockFactory}, true, nil
} }
func (r *ResourceConfigDescriptor) findOrCreate(logger lager.Logger, tx Tx, lockFactory lock.LockFactory, conn Conn) (ResourceConfig, error) { func (r *ResourceConfigDescriptor) findOrCreate(tx Tx, lockFactory lock.LockFactory, conn Conn) (ResourceConfig, error) {
rc := &resourceConfig{ rc := &resourceConfig{
lockFactory: lockFactory, lockFactory: lockFactory,
conn: conn, conn: conn,
@ -137,7 +134,7 @@ func (r *ResourceConfigDescriptor) findOrCreate(logger lager.Logger, tx Tx, lock
if r.CreatedByResourceCache != nil { if r.CreatedByResourceCache != nil {
parentColumnName = "resource_cache_id" parentColumnName = "resource_cache_id"
resourceCache, err := r.CreatedByResourceCache.findOrCreate(logger, tx, lockFactory, conn) resourceCache, err := r.CreatedByResourceCache.findOrCreate(tx, lockFactory, conn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -284,7 +281,7 @@ func (r *ResourceConfigDescriptor) findWithParentID(tx Tx, parentColumnName stri
return id, true, nil return id, true, nil
} }
func findOrCreateResourceConfigScope(tx Tx, conn Conn, lockFactory lock.LockFactory, resourceConfig ResourceConfig, resource Resource, resourceTypes creds.VersionedResourceTypes) (ResourceConfigScope, error) { func findOrCreateResourceConfigScope(tx Tx, conn Conn, lockFactory lock.LockFactory, resourceConfig ResourceConfig, resource Resource, resourceTypes atc.VersionedResourceTypes) (ResourceConfigScope, error) {
var unique bool var unique bool
var uniqueResource Resource var uniqueResource Resource
var resourceID *int var resourceID *int

View File

@ -5,7 +5,6 @@ import (
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -23,13 +22,13 @@ var _ = Describe("ResourceConfigCheckSessionLifecycle", func() {
Describe("CleanInactiveResourceConfigCheckSessions", func() { Describe("CleanInactiveResourceConfigCheckSessions", func() {
expiry := db.ContainerOwnerExpiries{ expiry := db.ContainerOwnerExpiries{
Min: 1 * time.Minute, Min: 1 * time.Minute,
Max: 1 * time.Minute, Max: 1 * time.Minute,
} }
Context("for resources", func() { Context("for resources", func() {
findOrCreateSessionForDefaultResource := func() int { findOrCreateSessionForDefaultResource := func() int {
resourceConfigScope, err := defaultResource.SetResourceConfig(logger, defaultResource.Source(), creds.VersionedResourceTypes{}) resourceConfigScope, err := defaultResource.SetResourceConfig(defaultResource.Source(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
owner := db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), expiry) owner := db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), expiry)
@ -123,9 +122,9 @@ var _ = Describe("ResourceConfigCheckSessionLifecycle", func() {
Context("for resource types", func() { Context("for resource types", func() {
findOrCreateSessionForDefaultResourceType := func() int { findOrCreateSessionForDefaultResourceType := func() int {
resourceConfigScope, err := defaultResourceType.SetResourceConfig(logger, resourceConfigScope, err := defaultResourceType.SetResourceConfig(
defaultResourceType.Source(), defaultResourceType.Source(),
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())

View File

@ -5,10 +5,8 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"code.cloudfoundry.org/lager"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
"github.com/lib/pq" "github.com/lib/pq"
) )
@ -25,10 +23,9 @@ func (e ErrCustomResourceTypeVersionNotFound) Error() string {
type ResourceConfigFactory interface { type ResourceConfigFactory interface {
FindOrCreateResourceConfig( FindOrCreateResourceConfig(
logger lager.Logger,
resourceType string, resourceType string,
source atc.Source, source atc.Source,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
) (ResourceConfig, error) ) (ResourceConfig, error)
FindResourceConfigByID(int) (ResourceConfig, bool, error) FindResourceConfigByID(int) (ResourceConfig, bool, error)
@ -73,10 +70,9 @@ func (f *resourceConfigFactory) FindResourceConfigByID(resourceConfigID int) (Re
} }
func (f *resourceConfigFactory) FindOrCreateResourceConfig( func (f *resourceConfigFactory) FindOrCreateResourceConfig(
logger lager.Logger,
resourceType string, resourceType string,
source atc.Source, source atc.Source,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
) (ResourceConfig, error) { ) (ResourceConfig, error) {
resourceConfigDescriptor, err := constructResourceConfigDescriptor(resourceType, source, resourceTypes) resourceConfigDescriptor, err := constructResourceConfigDescriptor(resourceType, source, resourceTypes)
@ -90,7 +86,7 @@ func (f *resourceConfigFactory) FindOrCreateResourceConfig(
} }
defer Rollback(tx) defer Rollback(tx)
resourceConfig, err := resourceConfigDescriptor.findOrCreate(logger, tx, f.lockFactory, f.conn) resourceConfig, err := resourceConfigDescriptor.findOrCreate(tx, f.lockFactory, f.conn)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -109,7 +105,7 @@ func (f *resourceConfigFactory) FindOrCreateResourceConfig(
func constructResourceConfigDescriptor( func constructResourceConfigDescriptor(
resourceTypeName string, resourceTypeName string,
source atc.Source, source atc.Source,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
) (ResourceConfigDescriptor, error) { ) (ResourceConfigDescriptor, error) {
resourceConfigDescriptor := ResourceConfigDescriptor{ resourceConfigDescriptor := ResourceConfigDescriptor{
Source: source, Source: source,
@ -117,14 +113,9 @@ func constructResourceConfigDescriptor(
customType, found := resourceTypes.Lookup(resourceTypeName) customType, found := resourceTypes.Lookup(resourceTypeName)
if found { if found {
source, err := customType.Source.Evaluate()
if err != nil {
return ResourceConfigDescriptor{}, err
}
customTypeResourceConfig, err := constructResourceConfigDescriptor( customTypeResourceConfig, err := constructResourceConfigDescriptor(
customType.Type, customType.Type,
source, customType.Source,
resourceTypes.Without(customType.Name), resourceTypes.Without(customType.Name),
) )
if err != nil { if err != nil {

View File

@ -3,9 +3,7 @@ package db_test
import ( import (
"sync" "sync"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
@ -62,7 +60,7 @@ var _ = Describe("ResourceConfigFactory", func() {
defer wg.Done() defer wg.Done()
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
_, err := resourceConfigFactory.FindOrCreateResourceConfig(logger, "some-base-resource-type", atc.Source{"some": "unique-source"}, creds.VersionedResourceTypes{}) _, err := resourceConfigFactory.FindOrCreateResourceConfig("some-base-resource-type", atc.Source{"some": "unique-source"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
} }
}() }()
@ -100,7 +98,7 @@ var _ = Describe("ResourceConfigFactory", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
createdResourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig(logger, "base-resource-type-name", atc.Source{}, creds.VersionedResourceTypes{}) createdResourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig("base-resource-type-name", atc.Source{}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(createdResourceConfig).ToNot(BeNil()) Expect(createdResourceConfig).ToNot(BeNil())
@ -120,7 +118,7 @@ var _ = Describe("ResourceConfigFactory", func() {
pipelineResourceTypes, err := defaultPipeline.ResourceTypes() pipelineResourceTypes, err := defaultPipeline.ResourceTypes()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
createdResourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig(logger, "some-type", atc.Source{}, creds.NewVersionedResourceTypes(template.StaticVariables{}, pipelineResourceTypes.Deserialize())) createdResourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig("some-type", atc.Source{}, pipelineResourceTypes.Deserialize())
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(createdResourceConfig).ToNot(BeNil()) Expect(createdResourceConfig).ToNot(BeNil())

View File

@ -34,7 +34,6 @@ type ResourceConfigScope interface {
AcquireResourceCheckingLock( AcquireResourceCheckingLock(
logger lager.Logger, logger lager.Logger,
interval time.Duration,
) (lock.Lock, bool, error) ) (lock.Lock, bool, error)
UpdateLastCheckStartTime( UpdateLastCheckStartTime(
@ -181,7 +180,6 @@ func (r *resourceConfigScope) SetCheckError(cause error) error {
func (r *resourceConfigScope) AcquireResourceCheckingLock( func (r *resourceConfigScope) AcquireResourceCheckingLock(
logger lager.Logger, logger lager.Logger,
interval time.Duration,
) (lock.Lock, bool, error) { ) (lock.Lock, bool, error) {
return r.lockFactory.Acquire( return r.lockFactory.Acquire(
logger, logger,

View File

@ -3,9 +3,7 @@ package db_test
import ( import (
"time" "time"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -44,7 +42,7 @@ var _ = Describe("Resource Config Scope", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) resourceScope, err = resource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -202,9 +200,8 @@ var _ = Describe("Resource Config Scope", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = someResource.SetResourceConfig( resourceConfigScope, err = someResource.SetResourceConfig(
logger,
someResource.Source(), someResource.Source(),
creds.NewVersionedResourceTypes(template.StaticVariables{}, pipelineResourceTypes.Deserialize()), pipelineResourceTypes.Deserialize(),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -282,9 +279,8 @@ var _ = Describe("Resource Config Scope", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = someResource.SetResourceConfig( resourceConfigScope, err = someResource.SetResourceConfig(
logger,
someResource.Source(), someResource.Source(),
creds.NewVersionedResourceTypes(template.StaticVariables{}, pipelineResourceTypes.Deserialize()), pipelineResourceTypes.Deserialize(),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -317,9 +313,8 @@ var _ = Describe("Resource Config Scope", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = someResource.SetResourceConfig( resourceConfigScope, err = someResource.SetResourceConfig(
logger,
someResource.Source(), someResource.Source(),
creds.NewVersionedResourceTypes(template.StaticVariables{}, pipelineResourceTypes.Deserialize()), pipelineResourceTypes.Deserialize(),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -331,7 +326,7 @@ var _ = Describe("Resource Config Scope", func() {
BeforeEach(func() { BeforeEach(func() {
var err error var err error
var acquired bool var acquired bool
lock, acquired, err = resourceConfigScope.AcquireResourceCheckingLock(logger, 1*time.Second) lock, acquired, err = resourceConfigScope.AcquireResourceCheckingLock(logger)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(acquired).To(BeTrue()) Expect(acquired).To(BeTrue())
}) })
@ -341,7 +336,7 @@ var _ = Describe("Resource Config Scope", func() {
}) })
It("does not get the lock", func() { It("does not get the lock", func() {
_, acquired, err := resourceConfigScope.AcquireResourceCheckingLock(logger, 1*time.Second) _, acquired, err := resourceConfigScope.AcquireResourceCheckingLock(logger)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(acquired).To(BeFalse()) Expect(acquired).To(BeFalse())
}) })
@ -353,7 +348,7 @@ var _ = Describe("Resource Config Scope", func() {
}) })
It("gets the lock", func() { It("gets the lock", func() {
lock, acquired, err := resourceConfigScope.AcquireResourceCheckingLock(logger, 1*time.Second) lock, acquired, err := resourceConfigScope.AcquireResourceCheckingLock(logger)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(acquired).To(BeTrue()) Expect(acquired).To(BeTrue())
@ -365,12 +360,12 @@ var _ = Describe("Resource Config Scope", func() {
Context("when there has not been a check recently", func() { Context("when there has not been a check recently", func() {
It("gets and keeps the lock and stops others from periodically getting it", func() { It("gets and keeps the lock and stops others from periodically getting it", func() {
lock, acquired, err := resourceConfigScope.AcquireResourceCheckingLock(logger, 1*time.Second) lock, acquired, err := resourceConfigScope.AcquireResourceCheckingLock(logger)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(acquired).To(BeTrue()) Expect(acquired).To(BeTrue())
Consistently(func() bool { Consistently(func() bool {
_, acquired, err = resourceConfigScope.AcquireResourceCheckingLock(logger, 1*time.Second) _, acquired, err = resourceConfigScope.AcquireResourceCheckingLock(logger)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
return acquired return acquired
@ -381,7 +376,7 @@ var _ = Describe("Resource Config Scope", func() {
time.Sleep(time.Second) time.Sleep(time.Second)
lock, acquired, err = resourceConfigScope.AcquireResourceCheckingLock(logger, 1*time.Second) lock, acquired, err = resourceConfigScope.AcquireResourceCheckingLock(logger)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(acquired).To(BeTrue()) Expect(acquired).To(BeTrue())

View File

@ -2,7 +2,6 @@ package db_test
import ( import (
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -12,7 +11,7 @@ import (
var _ = Describe("ResourceConfig", func() { var _ = Describe("ResourceConfig", func() {
Describe("FindResourceConfigScopeByID", func() { Describe("FindResourceConfigScopeByID", func() {
var pipeline db.Pipeline var pipeline db.Pipeline
var resourceTypes creds.VersionedResourceTypes var resourceTypes atc.VersionedResourceTypes
BeforeEach(func() { BeforeEach(func() {
atc.EnableGlobalResources = true atc.EnableGlobalResources = true
@ -38,7 +37,7 @@ var _ = Describe("ResourceConfig", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(created).To(BeTrue()) Expect(created).To(BeTrue())
resourceTypes = creds.VersionedResourceTypes{} resourceTypes = atc.VersionedResourceTypes{}
}) })
Context("when a shared resource config scope exists", func() { Context("when a shared resource config scope exists", func() {
@ -64,7 +63,7 @@ var _ = Describe("ResourceConfig", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
scope, err = resource.SetResourceConfig(logger, atc.Source{"some": "repository"}, resourceTypes) scope, err = resource.SetResourceConfig(atc.Source{"some": "repository"}, resourceTypes)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -101,7 +100,7 @@ var _ = Describe("ResourceConfig", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
scope, err = resource.SetResourceConfig(logger, atc.Source{"some": "repository"}, resourceTypes) scope, err = resource.SetResourceConfig(atc.Source{"some": "repository"}, resourceTypes)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -133,7 +132,7 @@ var _ = Describe("ResourceConfig", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig(logger, "some-type", atc.Source{"some": "repository"}, resourceTypes) resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig("some-type", atc.Source{"some": "repository"}, resourceTypes)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
var found bool var found bool

View File

@ -4,9 +4,7 @@ import (
"errors" "errors"
"strconv" "strconv"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/algorithm" "github.com/concourse/concourse/atc/db/algorithm"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -138,7 +136,7 @@ var _ = Describe("Resource", func() {
versionsDB, err = pipeline.LoadVersionsDB() versionsDB, err = pipeline.LoadVersionsDB()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceScope, err = resource.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = resourceScope.SetCheckError(errors.New("oops")) err = resourceScope.SetCheckError(errors.New("oops"))
@ -165,7 +163,7 @@ var _ = Describe("Resource", func() {
}) })
It("does not bump the cache index", func() { It("does not bump the cache index", func() {
resourceScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceScope, err = resource.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
cachedVersionsDB, err := pipeline.LoadVersionsDB() cachedVersionsDB, err := pipeline.LoadVersionsDB()
@ -278,7 +276,7 @@ var _ = Describe("Resource", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resourceScope1, err = resource1.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceScope1, err = resource1.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = resourceScope1.SetCheckError(errors.New("oops")) err = resourceScope1.SetCheckError(errors.New("oops"))
@ -303,7 +301,7 @@ var _ = Describe("Resource", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceScope2, err = resource2.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceScope2, err = resource2.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
found, err = resource2.Reload() found, err = resource2.Reload()
@ -348,7 +346,7 @@ var _ = Describe("Resource", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resourceScope1, err = resource1.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceScope1, err = resource1.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
found, err = resource1.Reload() found, err = resource1.Reload()
@ -369,7 +367,7 @@ var _ = Describe("Resource", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceScope2, err = resource2.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceScope2, err = resource2.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
found, err = resource2.Reload() found, err = resource2.Reload()
@ -416,7 +414,7 @@ var _ = Describe("Resource", func() {
resourceTypes, err = pipeline.ResourceTypes() resourceTypes, err = pipeline.ResourceTypes()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceScope1, err = resource1.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.NewVersionedResourceTypes(template.StaticVariables{}, resourceTypes.Deserialize())) resourceScope1, err = resource1.SetResourceConfig(atc.Source{"some": "repository"}, resourceTypes.Deserialize())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
found, err = resource1.Reload() found, err = resource1.Reload()
@ -438,7 +436,7 @@ var _ = Describe("Resource", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceScope2, err = resource2.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.NewVersionedResourceTypes(template.StaticVariables{}, resourceTypes.Deserialize())) resourceScope2, err = resource2.SetResourceConfig(atc.Source{"some": "repository"}, resourceTypes.Deserialize())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
found, err = resource2.Reload() found, err = resource2.Reload()
@ -470,7 +468,7 @@ var _ = Describe("Resource", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
newResourceConfigScope, err = resource1.SetResourceConfig(logger, atc.Source{"some": "other-repo"}, creds.NewVersionedResourceTypes(template.StaticVariables{}, resourceTypes.Deserialize())) newResourceConfigScope, err = resource1.SetResourceConfig(atc.Source{"some": "other-repo"}, resourceTypes.Deserialize())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
found, err = resource1.Reload() found, err = resource1.Reload()
@ -505,7 +503,7 @@ var _ = Describe("Resource", func() {
resourceTypes, err = newPipeline.ResourceTypes() resourceTypes, err = newPipeline.ResourceTypes()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
newResourceConfigScope, err = resource1.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.NewVersionedResourceTypes(template.StaticVariables{}, resourceTypes.Deserialize())) newResourceConfigScope, err = resource1.SetResourceConfig(atc.Source{"some": "repository"}, resourceTypes.Deserialize())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
found, err = resource1.Reload() found, err = resource1.Reload()
@ -555,10 +553,10 @@ var _ = Describe("Resource", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
_, err = resource1.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) _, err = resource1.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
_, err = resource2.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) _, err = resource2.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
found, err = resource1.Reload() found, err = resource1.Reload()
@ -664,7 +662,7 @@ var _ = Describe("Resource", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resourceScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceScope, err = resource.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceScope.SaveVersions([]atc.Version{version}) err = resourceScope.SaveVersions([]atc.Version{version})
@ -685,7 +683,7 @@ var _ = Describe("Resource", func() {
Context("when the check order is 0", func() { Context("when the check order is 0", func() {
BeforeEach(func() { BeforeEach(func() {
version = atc.Version{"version": "2"} version = atc.Version{"version": "2"}
created, err := resource.SaveUncheckedVersion(version, nil, resourceScope.ResourceConfig(), creds.VersionedResourceTypes{}) created, err := resource.SaveUncheckedVersion(version, nil, resourceScope.ResourceConfig(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(created).To(BeTrue()) Expect(created).To(BeTrue())
}) })
@ -710,7 +708,7 @@ var _ = Describe("Resource", func() {
_, err = brt.FindOrCreate(setupTx, false) _, err = brt.FindOrCreate(setupTx, false)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
_, err = resourceConfigFactory.FindOrCreateResourceConfig(logger, "registry-image", atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) _, err = resourceConfigFactory.FindOrCreateResourceConfig("registry-image", atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -748,7 +746,7 @@ var _ = Describe("Resource", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "other-repository"}, creds.VersionedResourceTypes{}) resourceScope, err = resource.SetResourceConfig(atc.Source{"some": "other-repository"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
originalVersionSlice = []atc.Version{ originalVersionSlice = []atc.Version{
@ -789,6 +787,10 @@ var _ = Describe("Resource", func() {
resourceVersions = append(resourceVersions, resourceVersion) resourceVersions = append(resourceVersions, resourceVersion)
} }
reloaded, err := resource.Reload()
Expect(err).ToNot(HaveOccurred())
Expect(reloaded).To(BeTrue())
}) })
Context("with no since/until", func() { Context("with no since/until", func() {
@ -861,7 +863,7 @@ var _ = Describe("Resource", func() {
metadata := []db.ResourceConfigMetadataField{{Name: "name1", Value: "value1"}} metadata := []db.ResourceConfigMetadataField{{Name: "name1", Value: "value1"}}
// save metadata // save metadata
_, err := resource.SaveUncheckedVersion(atc.Version(resourceVersions[9].Version), metadata, resourceScope.ResourceConfig(), creds.VersionedResourceTypes{}) _, err := resource.SaveUncheckedVersion(atc.Version(resourceVersions[9].Version), metadata, resourceScope.ResourceConfig(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -889,6 +891,27 @@ var _ = Describe("Resource", func() {
Expect(historyPage).To(ConsistOf([]atc.ResourceVersion{resourceVersions[9]})) Expect(historyPage).To(ConsistOf([]atc.ResourceVersion{resourceVersions[9]}))
}) })
}) })
Context("when the version metadata is updated", func() {
var metadata db.ResourceConfigMetadataFields
BeforeEach(func() {
metadata = []db.ResourceConfigMetadataField{{Name: "name1", Value: "value1"}}
updated, err := resource.UpdateMetadata(resourceVersions[9].Version, metadata)
Expect(err).ToNot(HaveOccurred())
Expect(updated).To(BeTrue())
})
It("returns a version with metadata updated", func() {
historyPage, _, found, err := resource.Versions(db.Page{Limit: 1})
Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue())
Expect(len(historyPage)).To(Equal(1))
Expect(historyPage[0].Version).To(Equal(resourceVersions[9].Version))
Expect(historyPage[0].Metadata).To(Equal([]atc.MetadataField{{Name: "name1", Value: "value1"}}))
})
})
}) })
Context("when check orders are different than versions ids", func() { Context("when check orders are different than versions ids", func() {
@ -911,7 +934,7 @@ var _ = Describe("Resource", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceScope, err = resource.SetResourceConfig(logger, atc.Source{"some": "other-repository"}, creds.VersionedResourceTypes{}) resourceScope, err = resource.SetResourceConfig(atc.Source{"some": "other-repository"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
originalVersionSlice := []atc.Version{ originalVersionSlice := []atc.Version{
@ -1044,10 +1067,10 @@ var _ = Describe("Resource", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceScope, err := resource.SetResourceConfig(logger, atc.Source{"some": "other-repository"}, creds.VersionedResourceTypes{}) resourceScope, err := resource.SetResourceConfig(atc.Source{"some": "other-repository"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
created, err := resource.SaveUncheckedVersion(atc.Version{"version": "not-returned"}, nil, resourceScope.ResourceConfig(), creds.VersionedResourceTypes{}) created, err := resource.SaveUncheckedVersion(atc.Version{"version": "not-returned"}, nil, resourceScope.ResourceConfig(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(created).To(BeTrue()) Expect(created).To(BeTrue())
}) })
@ -1084,7 +1107,7 @@ var _ = Describe("Resource", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resourceScope, err := resource.SetResourceConfig(logger, atc.Source{"some": "other-repository"}, creds.VersionedResourceTypes{}) resourceScope, err := resource.SetResourceConfig(atc.Source{"some": "other-repository"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceScope.SaveVersions([]atc.Version{ err = resourceScope.SaveVersions([]atc.Version{
@ -1168,7 +1191,7 @@ var _ = Describe("Resource", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resourceScope, err := resource.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceScope, err := resource.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = resourceScope.SaveVersions([]atc.Version{ err = resourceScope.SaveVersions([]atc.Version{

View File

@ -6,10 +6,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"code.cloudfoundry.org/lager"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
) )
@ -36,7 +34,7 @@ type ResourceType interface {
CheckError() error CheckError() error
UniqueVersionHistory() bool UniqueVersionHistory() bool
SetResourceConfig(lager.Logger, atc.Source, creds.VersionedResourceTypes) (ResourceConfigScope, error) SetResourceConfig(atc.Source, atc.VersionedResourceTypes) (ResourceConfigScope, error)
SetCheckSetupError(error) error SetCheckSetupError(error) error
Version() atc.Version Version() atc.Version
@ -146,7 +144,7 @@ func (t *resourceType) Reload() (bool, error) {
return true, nil return true, nil
} }
func (t *resourceType) SetResourceConfig(logger lager.Logger, source atc.Source, resourceTypes creds.VersionedResourceTypes) (ResourceConfigScope, error) { func (t *resourceType) SetResourceConfig(source atc.Source, resourceTypes atc.VersionedResourceTypes) (ResourceConfigScope, error) {
resourceConfigDescriptor, err := constructResourceConfigDescriptor(t.type_, source, resourceTypes) resourceConfigDescriptor, err := constructResourceConfigDescriptor(t.type_, source, resourceTypes)
if err != nil { if err != nil {
return nil, err return nil, err
@ -159,7 +157,7 @@ func (t *resourceType) SetResourceConfig(logger lager.Logger, source atc.Source,
defer Rollback(tx) defer Rollback(tx)
resourceConfig, err := resourceConfigDescriptor.findOrCreate(logger, tx, t.lockFactory, t.conn) resourceConfig, err := resourceConfigDescriptor.findOrCreate(tx, t.lockFactory, t.conn)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -4,7 +4,6 @@ import (
"errors" "errors"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
@ -202,7 +201,7 @@ var _ = Describe("ResourceType", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
resourceTypeScope, err = resourceType.SetResourceConfig(logger, atc.Source{"some": "repository"}, creds.VersionedResourceTypes{}) resourceTypeScope, err = resourceType.SetResourceConfig(atc.Source{"some": "repository"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })

View File

@ -7,7 +7,6 @@ import (
"fmt" "fmt"
"time" "time"
"code.cloudfoundry.org/lager"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc/creds"
@ -54,12 +53,12 @@ type Team interface {
Workers() ([]Worker, error) Workers() ([]Worker, error)
FindVolumeForWorkerArtifact(int) (CreatedVolume, bool, error) FindVolumeForWorkerArtifact(int) (CreatedVolume, bool, error)
Containers(lager.Logger) ([]Container, error) Containers() ([]Container, error)
IsCheckContainer(string) (bool, error) IsCheckContainer(string) (bool, error)
IsContainerWithinTeam(string, bool) (bool, error) IsContainerWithinTeam(string, bool) (bool, error)
FindContainerByHandle(string) (Container, bool, error) FindContainerByHandle(string) (Container, bool, error)
FindCheckContainers(lager.Logger, string, string, creds.Secrets) ([]Container, map[int]time.Time, error) FindCheckContainers(string, string, creds.Secrets) ([]Container, map[int]time.Time, error)
FindContainersByMetadata(ContainerMetadata) ([]Container, error) FindContainersByMetadata(ContainerMetadata) ([]Container, error)
FindCreatedContainerByHandle(string) (CreatedContainer, bool, error) FindCreatedContainerByHandle(string) (CreatedContainer, bool, error)
FindWorkerForContainer(handle string) (Worker, bool, error) FindWorkerForContainer(handle string) (Worker, bool, error)
@ -152,9 +151,7 @@ func (t *team) FindWorkerForVolume(handle string) (Worker, bool, error) {
})) }))
} }
func (t *team) Containers( func (t *team) Containers() ([]Container, error) {
logger lager.Logger,
) ([]Container, error) {
rows, err := selectContainers("c"). rows, err := selectContainers("c").
Join("workers w ON c.worker_name = w.name"). Join("workers w ON c.worker_name = w.name").
Join("resource_config_check_sessions rccs ON rccs.id = c.resource_config_check_session_id"). Join("resource_config_check_sessions rccs ON rccs.id = c.resource_config_check_session_id").
@ -808,7 +805,7 @@ func (t *team) UpdateProviderAuth(auth atc.TeamAuth) error {
return tx.Commit() return tx.Commit()
} }
func (t *team) FindCheckContainers(logger lager.Logger, pipelineName string, resourceName string, secretManager creds.Secrets) ([]Container, map[int]time.Time, error) { func (t *team) FindCheckContainers(pipelineName string, resourceName string, secretManager creds.Secrets) ([]Container, map[int]time.Time, error) {
pipeline, found, err := t.Pipeline(pipelineName) pipeline, found, err := t.Pipeline(pipelineName)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -839,12 +836,16 @@ func (t *team) FindCheckContainers(logger lager.Logger, pipelineName string, res
return nil, nil, err return nil, nil, err
} }
resourceTypes, err := creds.NewVersionedResourceTypes(variables, versionedResourceTypes).Evaluate()
if err != nil {
return nil, nil, err
}
resourceConfigFactory := NewResourceConfigFactory(t.conn, t.lockFactory) resourceConfigFactory := NewResourceConfigFactory(t.conn, t.lockFactory)
resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig( resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
resource.Type(), resource.Type(),
source, source,
creds.NewVersionedResourceTypes(variables, versionedResourceTypes), resourceTypes,
) )
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -903,8 +904,8 @@ func (t *team) FindCheckContainers(logger lager.Logger, pipelineName string, res
} }
type UpdateName struct { type UpdateName struct {
OldName string OldName string
NewName string NewName string
} }
func (t *team) updateName(tx Tx, jobs []atc.JobConfig, pipelineID int) error { func (t *team) updateName(tx Tx, jobs []atc.JobConfig, pipelineID int) error {
@ -916,7 +917,7 @@ func (t *team) updateName(tx Tx, jobs []atc.JobConfig, pipelineID int) error {
err := psql.Select("COUNT(*) as count"). err := psql.Select("COUNT(*) as count").
From("jobs"). From("jobs").
Where(sq.Eq{ Where(sq.Eq{
"name": job.OldName, "name": job.OldName,
"pipeline_id": pipelineID}). "pipeline_id": pipelineID}).
RunWith(tx). RunWith(tx).
QueryRow(). QueryRow().
@ -947,9 +948,9 @@ func (t *team) updateName(tx Tx, jobs []atc.JobConfig, pipelineID int) error {
for _, updateName := range jobsToUpdate { for _, updateName := range jobsToUpdate {
_, err := psql.Delete("jobs"). _, err := psql.Delete("jobs").
Where(sq.Eq{ Where(sq.Eq{
"name": updateName.NewName, "name": updateName.NewName,
"pipeline_id": pipelineID, "pipeline_id": pipelineID,
"active": false}). "active": false}).
RunWith(tx). RunWith(tx).
Exec() Exec()
if err != nil { if err != nil {
@ -985,10 +986,10 @@ func checkCyclic(jobNames []UpdateName, curr string, visited map[int]bool) bool
func sortUpdateNames(jobNames []UpdateName) []UpdateName { func sortUpdateNames(jobNames []UpdateName) []UpdateName {
newMap := make(map[string]int) newMap := make(map[string]int)
for i, job := range jobNames { for i, job := range jobNames {
newMap[job.NewName] = i+1 newMap[job.NewName] = i + 1
if newMap[job.OldName] != 0 { if newMap[job.OldName] != 0 {
index := newMap[job.OldName]-1 index := newMap[job.OldName] - 1
tempJob := jobNames[index] tempJob := jobNames[index]
jobNames[index] = job jobNames[index] = job

View File

@ -6,9 +6,7 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/creds/credsfakes" "github.com/concourse/concourse/atc/creds/credsfakes"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/event" "github.com/concourse/concourse/atc/event"
@ -430,14 +428,14 @@ var _ = Describe("Team", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
pipelineResourceTypes, err := defaultPipeline.ResourceTypes() pipelineResourceTypes, err := defaultPipeline.ResourceTypes()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfigScope, err = defaultResource.SetResourceConfig(logger, defaultResource.Source(), creds.NewVersionedResourceTypes(template.StaticVariables{}, pipelineResourceTypes.Deserialize())) resourceConfigScope, err = defaultResource.SetResourceConfig(defaultResource.Source(), pipelineResourceTypes.Deserialize())
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceContainer, err = defaultWorker.CreateContainer( resourceContainer, err = defaultWorker.CreateContainer(
@ -448,7 +446,7 @@ var _ = Describe("Team", func() {
}) })
It("finds all the containers", func() { It("finds all the containers", func() {
containers, err := defaultTeam.Containers(logger) containers, err := defaultTeam.Containers()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(HaveLen(2)) Expect(containers).To(HaveLen(2))
@ -456,7 +454,7 @@ var _ = Describe("Team", func() {
}) })
It("does not find containers for other teams", func() { It("does not find containers for other teams", func() {
containers, err := otherTeam.Containers(logger) containers, err := otherTeam.Containers()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(BeEmpty()) Expect(containers).To(BeEmpty())
}) })
@ -479,11 +477,11 @@ var _ = Describe("Team", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
resourceConfigScope, err = defaultResource.SetResourceConfig(logger, defaultResource.Source(), creds.VersionedResourceTypes{}) resourceConfigScope, err = defaultResource.SetResourceConfig(defaultResource.Source(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceContainer, err = worker.CreateContainer( resourceContainer, err = worker.CreateContainer(
@ -496,7 +494,7 @@ var _ = Describe("Team", func() {
}) })
It("finds the container", func() { It("finds the container", func() {
containers, err := defaultTeam.Containers(logger) containers, err := defaultTeam.Containers()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(HaveLen(1)) Expect(containers).To(HaveLen(1))
@ -557,11 +555,11 @@ var _ = Describe("Team", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
resourceConfigScope, err = otherResource.SetResourceConfig(logger, otherResource.Source(), creds.VersionedResourceTypes{}) resourceConfigScope, err = otherResource.SetResourceConfig(otherResource.Source(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resource2Container, err = worker.CreateContainer( resource2Container, err = worker.CreateContainer(
@ -574,7 +572,7 @@ var _ = Describe("Team", func() {
}) })
It("returns the container only from the team", func() { It("returns the container only from the team", func() {
containers, err := otherTeam.Containers(logger) containers, err := otherTeam.Containers()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(HaveLen(1)) Expect(containers).To(HaveLen(1))
@ -589,11 +587,11 @@ var _ = Describe("Team", func() {
BeforeEach(func() { BeforeEach(func() {
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
resourceConfigScope, err := defaultResource.SetResourceConfig(logger, defaultResource.Source(), creds.VersionedResourceTypes{}) resourceConfigScope, err := defaultResource.SetResourceConfig(defaultResource.Source(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
globalResourceContainer, err = defaultWorker.CreateContainer( globalResourceContainer, err = defaultWorker.CreateContainer(
@ -606,7 +604,7 @@ var _ = Describe("Team", func() {
}) })
It("returns the container only from the team worker and global worker", func() { It("returns the container only from the team worker and global worker", func() {
containers, err := defaultTeam.Containers(logger) containers, err := defaultTeam.Containers()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(HaveLen(2)) Expect(containers).To(HaveLen(2))
@ -620,11 +618,11 @@ var _ = Describe("Team", func() {
BeforeEach(func() { BeforeEach(func() {
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
resourceConfigScope, err := defaultResourceType.SetResourceConfig(logger, defaultResourceType.Source(), creds.VersionedResourceTypes{}) resourceConfigScope, err := defaultResourceType.SetResourceConfig(defaultResourceType.Source(), atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceContainer, err = defaultWorker.CreateContainer( resourceContainer, err = defaultWorker.CreateContainer(
@ -637,7 +635,7 @@ var _ = Describe("Team", func() {
}) })
It("finds the container", func() { It("finds the container", func() {
containers, err := defaultTeam.Containers(logger) containers, err := defaultTeam.Containers()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(HaveLen(1)) Expect(containers).To(HaveLen(1))
@ -1773,7 +1771,7 @@ var _ = Describe("Team", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
rc, err := resource.SetResourceConfig(logger, atc.Source{"source-config": "some-value"}, creds.VersionedResourceTypes{}) rc, err := resource.SetResourceConfig(atc.Source{"source-config": "some-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = rc.SaveVersions([]atc.Version{ err = rc.SaveVersions([]atc.Version{
@ -1827,7 +1825,7 @@ var _ = Describe("Team", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(setupTx.Commit()).To(Succeed()) Expect(setupTx.Commit()).To(Succeed())
rc, err := resource.SetResourceConfig(logger, atc.Source{"source-config": "some-value"}, creds.VersionedResourceTypes{}) rc, err := resource.SetResourceConfig(atc.Source{"source-config": "some-value"}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = rc.SaveVersions([]atc.Version{ err = rc.SaveVersions([]atc.Version{
@ -2579,12 +2577,11 @@ var _ = Describe("Team", func() {
Describe("FindCheckContainers", func() { Describe("FindCheckContainers", func() {
var ( var (
fakeSecretManager *credsfakes.FakeSecrets fakeSecretManager *credsfakes.FakeSecrets
variables creds.Variables
) )
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
BeforeEach(func() { BeforeEach(func() {
@ -2603,10 +2600,9 @@ var _ = Describe("Team", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig( resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig(
logger,
defaultResource.Type(), defaultResource.Type(),
defaultResource.Source(), defaultResource.Source(),
creds.NewVersionedResourceTypes(variables, pipelineResourceTypes.Deserialize()), pipelineResourceTypes.Deserialize(),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -2618,7 +2614,7 @@ var _ = Describe("Team", func() {
}) })
It("returns check container for resource", func() { It("returns check container for resource", func() {
containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers(logger, "default-pipeline", "some-resource", fakeSecretManager) containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers("default-pipeline", "some-resource", fakeSecretManager)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(HaveLen(1)) Expect(containers).To(HaveLen(1))
Expect(containers[0].ID()).To(Equal(resourceContainer.ID())) Expect(containers[0].ID()).To(Equal(resourceContainer.ID()))
@ -2654,21 +2650,20 @@ var _ = Describe("Team", func() {
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig( resourceConfig, err = resourceConfigFactory.FindOrCreateResourceConfig(
logger,
otherResource.Type(), otherResource.Type(),
otherResource.Source(), otherResource.Source(),
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
otherResourceContainer, _, err = defaultWorker.FindContainerOnWorker( otherResourceContainer, _, err = defaultWorker.FindContainer(
db.NewResourceConfigCheckSessionContainerOwner(resourceConfig, expiries), db.NewResourceConfigCheckSessionContainerOwner(resourceConfig, expiries),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
It("returns the same check container", func() { It("returns the same check container", func() {
containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers(logger, "other-pipeline", "some-resource", fakeSecretManager) containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers("other-pipeline", "some-resource", fakeSecretManager)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(HaveLen(1)) Expect(containers).To(HaveLen(1))
Expect(containers[0].ID()).To(Equal(otherResourceContainer.ID())) Expect(containers[0].ID()).To(Equal(otherResourceContainer.ID()))
@ -2681,7 +2676,7 @@ var _ = Describe("Team", func() {
Context("when check container does not exist", func() { Context("when check container does not exist", func() {
It("returns empty list", func() { It("returns empty list", func() {
containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers(logger, "default-pipeline", "some-resource", fakeSecretManager) containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers("default-pipeline", "some-resource", fakeSecretManager)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(BeEmpty()) Expect(containers).To(BeEmpty())
Expect(checkContainersExpiresAt).To(BeEmpty()) Expect(checkContainersExpiresAt).To(BeEmpty())
@ -2691,7 +2686,7 @@ var _ = Describe("Team", func() {
Context("when resource does not exist", func() { Context("when resource does not exist", func() {
It("returns empty list", func() { It("returns empty list", func() {
containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers(logger, "default-pipeline", "non-existent-resource", fakeSecretManager) containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers("default-pipeline", "non-existent-resource", fakeSecretManager)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(BeEmpty()) Expect(containers).To(BeEmpty())
Expect(checkContainersExpiresAt).To(BeEmpty()) Expect(checkContainersExpiresAt).To(BeEmpty())
@ -2701,7 +2696,7 @@ var _ = Describe("Team", func() {
Context("when pipeline does not exist", func() { Context("when pipeline does not exist", func() {
It("returns empty list", func() { It("returns empty list", func() {
containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers(logger, "non-existent-pipeline", "some-resource", fakeSecretManager) containers, checkContainersExpiresAt, err := defaultTeam.FindCheckContainers("non-existent-pipeline", "some-resource", fakeSecretManager)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(containers).To(BeEmpty()) Expect(containers).To(BeEmpty())
Expect(checkContainersExpiresAt).To(BeEmpty()) Expect(checkContainersExpiresAt).To(BeEmpty())
@ -2713,15 +2708,14 @@ var _ = Describe("Team", func() {
Context("when the container is a check container", func() { Context("when the container is a check container", func() {
var resourceContainer db.Container var resourceContainer db.Container
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
BeforeEach(func() { BeforeEach(func() {
resourceConfigScope, err := defaultResource.SetResourceConfig( resourceConfigScope, err := defaultResource.SetResourceConfig(
logger,
defaultResource.Source(), defaultResource.Source(),
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())

View File

@ -4,9 +4,7 @@ import (
"time" "time"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/lib/pq" "github.com/lib/pq"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -26,7 +24,6 @@ var _ = Describe("VolumeFactory", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
usedResourceCache, err = resourceCacheFactory.FindOrCreateResourceCache( usedResourceCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -34,21 +31,18 @@ var _ = Describe("VolumeFactory", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{
template.StaticVariables{}, atc.VersionedResourceType{
atc.VersionedResourceTypes{ ResourceType: atc.ResourceType{
atc.VersionedResourceType{ Name: "some-type",
ResourceType: atc.ResourceType{ Type: "some-base-resource-type",
Name: "some-type", Source: atc.Source{
Type: "some-base-resource-type", "some-type": "source",
Source: atc.Source{
"some-type": "source",
},
}, },
Version: atc.Version{"some-type": "version"},
}, },
Version: atc.Version{"some-type": "version"},
}, },
), },
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -493,7 +487,6 @@ var _ = Describe("VolumeFactory", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
usedResourceCache, err = resourceCacheFactory.FindOrCreateResourceCache( usedResourceCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -501,21 +494,18 @@ var _ = Describe("VolumeFactory", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{
template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceType{
atc.VersionedResourceTypes{ ResourceType: atc.ResourceType{
atc.VersionedResourceType{ Name: "some-type",
ResourceType: atc.ResourceType{ Type: "some-base-resource-type",
Name: "some-type", Source: atc.Source{
Type: "some-base-resource-type", "some-type": "source",
Source: atc.Source{
"some-type": "source",
},
}, },
Version: atc.Version{"some-type": "version"},
}, },
Version: atc.Version{"some-type": "version"},
}, },
), },
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })

View File

@ -3,9 +3,7 @@ package db_test
import ( import (
"time" "time"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
@ -17,11 +15,11 @@ var _ = Describe("Volume", func() {
BeforeEach(func() { BeforeEach(func() {
expiries := db.ContainerOwnerExpiries{ expiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig(logger, "some-base-resource-type", atc.Source{}, creds.VersionedResourceTypes{}) resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig("some-base-resource-type", atc.Source{}, atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
defaultCreatingContainer, err = defaultWorker.CreateContainer(db.NewResourceConfigCheckSessionContainerOwner(resourceConfig, expiries), db.ContainerMetadata{Type: "check"}) defaultCreatingContainer, err = defaultWorker.CreateContainer(db.NewResourceConfigCheckSessionContainerOwner(resourceConfig, expiries), db.ContainerMetadata{Type: "check"})
@ -188,7 +186,6 @@ var _ = Describe("Volume", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceCache, err = resourceCacheFactory.FindOrCreateResourceCache( resourceCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -196,21 +193,18 @@ var _ = Describe("Volume", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes( atc.VersionedResourceTypes{
template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceType{
atc.VersionedResourceTypes{ ResourceType: atc.ResourceType{
atc.VersionedResourceType{ Name: "some-type",
ResourceType: atc.ResourceType{ Type: "some-base-resource-type",
Name: "some-type", Source: atc.Source{
Type: "some-base-resource-type", "some-type": "source",
Source: atc.Source{
"some-type": "source",
},
}, },
Version: atc.Version{"some-type": "version"},
}, },
Version: atc.Version{"some-type": "version"},
}, },
), },
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -414,24 +408,22 @@ var _ = Describe("Volume", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceCache, err := resourceCacheFactory.FindOrCreateResourceCache( resourceCache, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
atc.Source{"some": "source"}, atc.Source{"some": "source"},
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes(template.StaticVariables{"source-param": "some-secret-sauce"},
atc.VersionedResourceTypes{ atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "some-type", Name: "some-type",
Type: "some-base-resource-type", Type: "some-base-resource-type",
Source: atc.Source{"some-type": "((source-param))"}, Source: atc.Source{"some-type": "((source-param))"},
},
Version: atc.Version{"some-custom-type": "version"},
}, },
Version: atc.Version{"some-custom-type": "version"},
}, },
), },
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -543,24 +535,21 @@ var _ = Describe("Volume", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
usedResourceCache, err := resourceCacheFactory.FindOrCreateResourceCache( usedResourceCache, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
atc.Source{"some": "source"}, atc.Source{"some": "source"},
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes(template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceTypes{
atc.VersionedResourceTypes{ {
{ ResourceType: atc.ResourceType{
ResourceType: atc.ResourceType{ Name: "some-type",
Name: "some-type", Type: "some-base-resource-type",
Type: "some-base-resource-type", Source: atc.Source{"some-type": "source"},
Source: atc.Source{"some-type": "source"},
},
Version: atc.Version{"some-custom-type": "version"},
}, },
Version: atc.Version{"some-custom-type": "version"},
}, },
), },
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())

View File

@ -67,7 +67,7 @@ type Worker interface {
Prune() error Prune() error
Delete() error Delete() error
FindContainerOnWorker(owner ContainerOwner) (CreatingContainer, CreatedContainer, error) FindContainer(owner ContainerOwner) (CreatingContainer, CreatedContainer, error)
CreateContainer(owner ContainerOwner, meta ContainerMetadata) (CreatingContainer, error) CreateContainer(owner ContainerOwner, meta ContainerMetadata) (CreatingContainer, error)
} }
@ -255,7 +255,7 @@ func (worker *worker) ResourceCerts() (*UsedWorkerResourceCerts, bool, error) {
return nil, false, nil return nil, false, nil
} }
func (worker *worker) FindContainerOnWorker(owner ContainerOwner) (CreatingContainer, CreatedContainer, error) { func (worker *worker) FindContainer(owner ContainerOwner) (CreatingContainer, CreatedContainer, error) {
ownerQuery, found, err := owner.Find(worker.conn) ownerQuery, found, err := owner.Find(worker.conn)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@ -5,7 +5,6 @@ import (
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
@ -566,8 +565,8 @@ var _ = Describe("WorkerFactory", func() {
BeforeEach(func() { BeforeEach(func() {
ownerExpiries := db.ContainerOwnerExpiries{ ownerExpiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 5 * time.Minute, Max: 5 * time.Minute,
} }
var err error var err error
@ -624,7 +623,7 @@ var _ = Describe("WorkerFactory", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
rcs, err := otherResource.SetResourceConfig(logger, atc.Source{"some": "source"}, creds.VersionedResourceTypes{}) rcs, err := otherResource.SetResourceConfig(atc.Source{"some": "source"}, atc.VersionedResourceTypes{})
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
owner = db.NewResourceConfigCheckSessionContainerOwner(rcs.ResourceConfig(), ownerExpiries) owner = db.NewResourceConfigCheckSessionContainerOwner(rcs.ResourceConfig(), ownerExpiries)

View File

@ -2,7 +2,6 @@ package db_test
import ( import (
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -18,13 +17,12 @@ var _ = Describe("WorkerResourceCache", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceCache, err := resourceCacheFactory.FindOrCreateResourceCache( resourceCache, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-base-resource-type", "some-base-resource-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
atc.Source{"some": "source"}, atc.Source{"some": "source"},
atc.Params{}, atc.Params{},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -82,13 +80,12 @@ var _ = Describe("WorkerResourceCache", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceCache, err := resourceCacheFactory.FindOrCreateResourceCache( resourceCache, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-base-resource-type", "some-base-resource-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
atc.Source{"some": "source"}, atc.Source{"some": "source"},
atc.Params{}, atc.Params{},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -133,13 +130,12 @@ var _ = Describe("WorkerResourceCache", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
resourceCache, err := resourceCacheFactory.FindOrCreateResourceCache( resourceCache, err := resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(build.ID()), db.ForBuild(build.ID()),
"some-bogus-resource-type", "some-bogus-resource-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
atc.Source{"some": "source"}, atc.Source{"some": "source"},
atc.Params{}, atc.Params{},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())

View File

@ -6,7 +6,6 @@ import (
"time" "time"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
. "github.com/concourse/concourse/atc/db" . "github.com/concourse/concourse/atc/db"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -206,7 +205,7 @@ var _ = Describe("Worker", func() {
}) })
}) })
Describe("FindContainerOnWorker/CreateContainer", func() { Describe("FindContainer/CreateContainer", func() {
var ( var (
containerMetadata ContainerMetadata containerMetadata ContainerMetadata
containerOwner ContainerOwner containerOwner ContainerOwner
@ -217,8 +216,8 @@ var _ = Describe("Worker", func() {
) )
expiries := ContainerOwnerExpiries{ expiries := ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 1 * time.Hour, Max: 1 * time.Hour,
} }
BeforeEach(func() { BeforeEach(func() {
@ -237,10 +236,9 @@ var _ = Describe("Worker", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig( resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-resource-type", "some-resource-type",
atc.Source{"some": "source"}, atc.Source{"some": "source"},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -249,7 +247,7 @@ var _ = Describe("Worker", func() {
JustBeforeEach(func() { JustBeforeEach(func() {
var err error var err error
foundCreatingContainer, foundCreatedContainer, err = worker.FindContainerOnWorker(containerOwner) foundCreatingContainer, foundCreatedContainer, err = worker.FindContainer(containerOwner)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })

View File

@ -2,7 +2,6 @@ package builder
import ( import (
"errors" "errors"
"fmt"
"strconv" "strconv"
"strings" "strings"
@ -16,9 +15,9 @@ const supportedSchema = "exec.v2"
//go:generate counterfeiter . StepFactory //go:generate counterfeiter . StepFactory
type StepFactory interface { type StepFactory interface {
GetStep(atc.Plan, db.Build, exec.StepMetadata, db.ContainerMetadata, exec.GetDelegate) exec.Step GetStep(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.GetDelegate) exec.Step
PutStep(atc.Plan, db.Build, exec.StepMetadata, db.ContainerMetadata, exec.PutDelegate) exec.Step PutStep(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.PutDelegate) exec.Step
TaskStep(atc.Plan, db.Build, db.ContainerMetadata, exec.TaskDelegate) exec.Step TaskStep(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.TaskDelegate) exec.Step
ArtifactInputStep(atc.Plan, db.Build, exec.BuildStepDelegate) exec.Step ArtifactInputStep(atc.Plan, db.Build, exec.BuildStepDelegate) exec.Step
ArtifactOutputStep(atc.Plan, db.Build, exec.BuildStepDelegate) exec.Step ArtifactOutputStep(atc.Plan, db.Build, exec.BuildStepDelegate) exec.Step
} }
@ -254,7 +253,6 @@ func (builder *stepBuilder) buildGetStep(build db.Build, plan atc.Plan) exec.Ste
return builder.stepFactory.GetStep( return builder.stepFactory.GetStep(
plan, plan,
build,
stepMetadata, stepMetadata,
containerMetadata, containerMetadata,
builder.delegateFactory.GetDelegate(build, plan.ID), builder.delegateFactory.GetDelegate(build, plan.ID),
@ -277,7 +275,6 @@ func (builder *stepBuilder) buildPutStep(build db.Build, plan atc.Plan) exec.Ste
return builder.stepFactory.PutStep( return builder.stepFactory.PutStep(
plan, plan,
build,
stepMetadata, stepMetadata,
containerMetadata, containerMetadata,
builder.delegateFactory.PutDelegate(build, plan.ID), builder.delegateFactory.PutDelegate(build, plan.ID),
@ -293,9 +290,14 @@ func (builder *stepBuilder) buildTaskStep(build db.Build, plan atc.Plan) exec.St
plan.Attempts, plan.Attempts,
) )
stepMetadata := builder.stepMetadata(
build,
builder.externalURL,
)
return builder.stepFactory.TaskStep( return builder.stepFactory.TaskStep(
plan, plan,
build, stepMetadata,
containerMetadata, containerMetadata,
builder.delegateFactory.TaskDelegate(build, plan.ID), builder.delegateFactory.TaskDelegate(build, plan.ID),
) )
@ -349,49 +351,16 @@ func (builder *stepBuilder) containerMetadata(
func (builder *stepBuilder) stepMetadata( func (builder *stepBuilder) stepMetadata(
build db.Build, build db.Build,
externalURL string, externalURL string,
) StepMetadata { ) exec.StepMetadata {
return StepMetadata{ return exec.StepMetadata{
BuildID: build.ID(), BuildID: build.ID(),
BuildName: build.Name(), BuildName: build.Name(),
JobName: build.JobName(), TeamID: build.TeamID(),
PipelineName: build.PipelineName(),
TeamName: build.TeamName(), TeamName: build.TeamName(),
JobID: build.JobID(),
JobName: build.JobName(),
PipelineID: build.PipelineID(),
PipelineName: build.PipelineName(),
ExternalURL: externalURL, ExternalURL: externalURL,
} }
} }
type StepMetadata struct {
BuildID int
PipelineName string
JobName string
BuildName string
ExternalURL string
TeamName string
}
func (metadata StepMetadata) Env() []string {
env := []string{fmt.Sprintf("BUILD_ID=%d", metadata.BuildID)}
if metadata.PipelineName != "" {
env = append(env, "BUILD_PIPELINE_NAME="+metadata.PipelineName)
}
if metadata.JobName != "" {
env = append(env, "BUILD_JOB_NAME="+metadata.JobName)
}
if metadata.BuildName != "" {
env = append(env, "BUILD_NAME="+metadata.BuildName)
}
if metadata.ExternalURL != "" {
env = append(env, "ATC_EXTERNAL_URL="+metadata.ExternalURL)
}
if metadata.TeamName != "" {
env = append(env, "BUILD_TEAM_NAME="+metadata.TeamName)
}
return env
}

View File

@ -58,7 +58,7 @@ var _ = Describe("Builder", func() {
fakeBuild *dbfakes.FakeBuild fakeBuild *dbfakes.FakeBuild
expectedPlan atc.Plan expectedPlan atc.Plan
expectedMetadata builder.StepMetadata expectedMetadata exec.StepMetadata
) )
BeforeEach(func() { BeforeEach(func() {
@ -72,12 +72,15 @@ var _ = Describe("Builder", func() {
fakeBuild.TeamNameReturns("some-team") fakeBuild.TeamNameReturns("some-team")
fakeBuild.TeamIDReturns(1111) fakeBuild.TeamIDReturns(1111)
expectedMetadata = builder.StepMetadata{ expectedMetadata = exec.StepMetadata{
BuildID: 4444, BuildID: 4444,
BuildName: "42", BuildName: "42",
JobName: "some-job", TeamID: 1111,
PipelineName: "some-pipeline",
TeamName: "some-team", TeamName: "some-team",
JobID: 3333,
JobName: "some-job",
PipelineID: 2222,
PipelineName: "some-pipeline",
ExternalURL: "http://example.com", ExternalURL: "http://example.com",
} }
}) })
@ -146,8 +149,7 @@ var _ = Describe("Builder", func() {
Context("constructing outputs", func() { Context("constructing outputs", func() {
It("constructs the put correctly", func() { It("constructs the put correctly", func() {
plan, build, stepMetadata, containerMetadata, _ := fakeStepFactory.PutStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.PutStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(putPlan)) Expect(plan).To(Equal(putPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -161,8 +163,7 @@ var _ = Describe("Builder", func() {
BuildName: "42", BuildName: "42",
})) }))
plan, build, stepMetadata, containerMetadata, _ = fakeStepFactory.PutStepArgsForCall(1) plan, stepMetadata, containerMetadata, _ = fakeStepFactory.PutStepArgsForCall(1)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(otherPutPlan)) Expect(plan).To(Equal(otherPutPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -222,8 +223,7 @@ var _ = Describe("Builder", func() {
Context("constructing outputs", func() { Context("constructing outputs", func() {
It("constructs the put correctly", func() { It("constructs the put correctly", func() {
plan, build, stepMetadata, containerMetadata, _ := fakeStepFactory.PutStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.PutStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(putPlan)) Expect(plan).To(Equal(putPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -237,8 +237,7 @@ var _ = Describe("Builder", func() {
BuildName: "42", BuildName: "42",
})) }))
plan, build, stepMetadata, containerMetadata, _ = fakeStepFactory.PutStepArgsForCall(1) plan, stepMetadata, containerMetadata, _ = fakeStepFactory.PutStepArgsForCall(1)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(otherPutPlan)) Expect(plan).To(Equal(otherPutPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -314,8 +313,7 @@ var _ = Describe("Builder", func() {
}) })
It("constructs the first get correctly", func() { It("constructs the first get correctly", func() {
plan, build, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
expectedPlan := getPlan expectedPlan := getPlan
expectedPlan.Attempts = []int{1} expectedPlan.Attempts = []int{1}
Expect(plan).To(Equal(expectedPlan)) Expect(plan).To(Equal(expectedPlan))
@ -334,8 +332,7 @@ var _ = Describe("Builder", func() {
}) })
It("constructs the second get correctly", func() { It("constructs the second get correctly", func() {
plan, build, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(1) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(1)
Expect(build).To(Equal(fakeBuild))
expectedPlan := getPlan expectedPlan := getPlan
expectedPlan.Attempts = []int{3} expectedPlan.Attempts = []int{3}
Expect(plan).To(Equal(expectedPlan)) Expect(plan).To(Equal(expectedPlan))
@ -358,11 +355,11 @@ var _ = Describe("Builder", func() {
}) })
It("constructs nested steps correctly", func() { It("constructs nested steps correctly", func() {
plan, build, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
expectedPlan := taskPlan expectedPlan := taskPlan
expectedPlan.Attempts = []int{2, 1} expectedPlan.Attempts = []int{2, 1}
Expect(plan).To(Equal(expectedPlan)) Expect(plan).To(Equal(expectedPlan))
Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeTask, Type: db.ContainerTypeTask,
StepName: "some-task", StepName: "some-task",
@ -375,11 +372,11 @@ var _ = Describe("Builder", func() {
Attempt: "2.1", Attempt: "2.1",
})) }))
plan, build, containerMetadata, _ = fakeStepFactory.TaskStepArgsForCall(1) plan, stepMetadata, containerMetadata, _ = fakeStepFactory.TaskStepArgsForCall(1)
Expect(build).To(Equal(fakeBuild))
expectedPlan = taskPlan expectedPlan = taskPlan
expectedPlan.Attempts = []int{2, 2} expectedPlan.Attempts = []int{2, 2}
Expect(plan).To(Equal(expectedPlan)) Expect(plan).To(Equal(expectedPlan))
Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeTask, Type: db.ContainerTypeTask,
StepName: "some-task", StepName: "some-task",
@ -474,8 +471,7 @@ var _ = Describe("Builder", func() {
}) })
It("constructs inputs correctly", func() { It("constructs inputs correctly", func() {
plan, dBuild, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0)
Expect(dBuild).To(Equal(fakeBuild))
Expect(plan).To(Equal(expectedPlan)) Expect(plan).To(Equal(expectedPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -502,9 +498,9 @@ var _ = Describe("Builder", func() {
}) })
It("constructs tasks correctly", func() { It("constructs tasks correctly", func() {
plan, build, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(expectedPlan)) Expect(plan).To(Equal(expectedPlan))
Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeTask, Type: db.ContainerTypeTask,
StepName: "some-task", StepName: "some-task",
@ -551,8 +547,7 @@ var _ = Describe("Builder", func() {
}) })
It("constructs the put correctly", func() { It("constructs the put correctly", func() {
plan, build, stepMetadata, containerMetadata, _ := fakeStepFactory.PutStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.PutStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(putPlan)) Expect(plan).To(Equal(putPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -568,8 +563,7 @@ var _ = Describe("Builder", func() {
}) })
It("constructs the dependent get correctly", func() { It("constructs the dependent get correctly", func() {
plan, build, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(dependentGetPlan)) Expect(plan).To(Equal(dependentGetPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -634,8 +628,7 @@ var _ = Describe("Builder", func() {
It("constructs the step correctly", func() { It("constructs the step correctly", func() {
Expect(fakeStepFactory.GetStepCallCount()).To(Equal(1)) Expect(fakeStepFactory.GetStepCallCount()).To(Equal(1))
plan, build, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(inputPlan)) Expect(plan).To(Equal(inputPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -652,9 +645,9 @@ var _ = Describe("Builder", func() {
It("constructs the completion hook correctly", func() { It("constructs the completion hook correctly", func() {
Expect(fakeStepFactory.TaskStepCallCount()).To(Equal(4)) Expect(fakeStepFactory.TaskStepCallCount()).To(Equal(4))
plan, build, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(2) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(2)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(completionTaskPlan)) Expect(plan).To(Equal(completionTaskPlan))
Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
PipelineID: 2222, PipelineID: 2222,
PipelineName: "some-pipeline", PipelineName: "some-pipeline",
@ -669,9 +662,9 @@ var _ = Describe("Builder", func() {
It("constructs the failure hook correctly", func() { It("constructs the failure hook correctly", func() {
Expect(fakeStepFactory.TaskStepCallCount()).To(Equal(4)) Expect(fakeStepFactory.TaskStepCallCount()).To(Equal(4))
plan, build, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(failureTaskPlan)) Expect(plan).To(Equal(failureTaskPlan))
Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
PipelineID: 2222, PipelineID: 2222,
PipelineName: "some-pipeline", PipelineName: "some-pipeline",
@ -686,9 +679,9 @@ var _ = Describe("Builder", func() {
It("constructs the success hook correctly", func() { It("constructs the success hook correctly", func() {
Expect(fakeStepFactory.TaskStepCallCount()).To(Equal(4)) Expect(fakeStepFactory.TaskStepCallCount()).To(Equal(4))
plan, build, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(1) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(1)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(successTaskPlan)) Expect(plan).To(Equal(successTaskPlan))
Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
PipelineID: 2222, PipelineID: 2222,
PipelineName: "some-pipeline", PipelineName: "some-pipeline",
@ -703,9 +696,9 @@ var _ = Describe("Builder", func() {
It("constructs the next step correctly", func() { It("constructs the next step correctly", func() {
Expect(fakeStepFactory.TaskStepCallCount()).To(Equal(4)) Expect(fakeStepFactory.TaskStepCallCount()).To(Equal(4))
plan, build, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(3) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.TaskStepArgsForCall(3)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(nextTaskPlan)) Expect(plan).To(Equal(nextTaskPlan))
Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
PipelineID: 2222, PipelineID: 2222,
PipelineName: "some-pipeline", PipelineName: "some-pipeline",
@ -735,8 +728,7 @@ var _ = Describe("Builder", func() {
It("constructs the step correctly", func() { It("constructs the step correctly", func() {
Expect(fakeStepFactory.GetStepCallCount()).To(Equal(1)) Expect(fakeStepFactory.GetStepCallCount()).To(Equal(1))
plan, build, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0) plan, stepMetadata, containerMetadata, _ := fakeStepFactory.GetStepArgsForCall(0)
Expect(build).To(Equal(fakeBuild))
Expect(plan).To(Equal(inputPlan)) Expect(plan).To(Equal(inputPlan))
Expect(stepMetadata).To(Equal(expectedMetadata)) Expect(stepMetadata).To(Equal(expectedMetadata))
Expect(containerMetadata).To(Equal(db.ContainerMetadata{ Expect(containerMetadata).To(Equal(db.ContainerMetadata{
@ -755,46 +747,4 @@ var _ = Describe("Builder", func() {
}) })
}) })
Describe("StepMetadata", func() {
var stepMetadata builder.StepMetadata
Describe("Env", func() {
Context("when populating fields", func() {
BeforeEach(func() {
stepMetadata = builder.StepMetadata{
BuildID: 1,
PipelineName: "some-pipeline-name",
JobName: "some-job-name",
BuildName: "42",
ExternalURL: "http://www.example.com",
TeamName: "some-team",
}
})
It("returns the specified values", func() {
Expect(stepMetadata.Env()).To(Equal([]string{
"BUILD_ID=1",
"BUILD_PIPELINE_NAME=some-pipeline-name",
"BUILD_JOB_NAME=some-job-name",
"BUILD_NAME=42",
"ATC_EXTERNAL_URL=http://www.example.com",
"BUILD_TEAM_NAME=some-team",
}))
})
})
Context("when fields are empty", func() {
BeforeEach(func() {
stepMetadata = builder.StepMetadata{
BuildID: 1,
}
})
It("does not include fields that are not set", func() {
Expect(stepMetadata.Env()).To(Equal([]string{
"BUILD_ID=1",
}))
})
})
})
})
}) })

View File

@ -37,14 +37,13 @@ type FakeStepFactory struct {
artifactOutputStepReturnsOnCall map[int]struct { artifactOutputStepReturnsOnCall map[int]struct {
result1 exec.Step result1 exec.Step
} }
GetStepStub func(atc.Plan, db.Build, exec.StepMetadata, db.ContainerMetadata, exec.GetDelegate) exec.Step GetStepStub func(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.GetDelegate) exec.Step
getStepMutex sync.RWMutex getStepMutex sync.RWMutex
getStepArgsForCall []struct { getStepArgsForCall []struct {
arg1 atc.Plan arg1 atc.Plan
arg2 db.Build arg2 exec.StepMetadata
arg3 exec.StepMetadata arg3 db.ContainerMetadata
arg4 db.ContainerMetadata arg4 exec.GetDelegate
arg5 exec.GetDelegate
} }
getStepReturns struct { getStepReturns struct {
result1 exec.Step result1 exec.Step
@ -52,14 +51,13 @@ type FakeStepFactory struct {
getStepReturnsOnCall map[int]struct { getStepReturnsOnCall map[int]struct {
result1 exec.Step result1 exec.Step
} }
PutStepStub func(atc.Plan, db.Build, exec.StepMetadata, db.ContainerMetadata, exec.PutDelegate) exec.Step PutStepStub func(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.PutDelegate) exec.Step
putStepMutex sync.RWMutex putStepMutex sync.RWMutex
putStepArgsForCall []struct { putStepArgsForCall []struct {
arg1 atc.Plan arg1 atc.Plan
arg2 db.Build arg2 exec.StepMetadata
arg3 exec.StepMetadata arg3 db.ContainerMetadata
arg4 db.ContainerMetadata arg4 exec.PutDelegate
arg5 exec.PutDelegate
} }
putStepReturns struct { putStepReturns struct {
result1 exec.Step result1 exec.Step
@ -67,11 +65,11 @@ type FakeStepFactory struct {
putStepReturnsOnCall map[int]struct { putStepReturnsOnCall map[int]struct {
result1 exec.Step result1 exec.Step
} }
TaskStepStub func(atc.Plan, db.Build, db.ContainerMetadata, exec.TaskDelegate) exec.Step TaskStepStub func(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.TaskDelegate) exec.Step
taskStepMutex sync.RWMutex taskStepMutex sync.RWMutex
taskStepArgsForCall []struct { taskStepArgsForCall []struct {
arg1 atc.Plan arg1 atc.Plan
arg2 db.Build arg2 exec.StepMetadata
arg3 db.ContainerMetadata arg3 db.ContainerMetadata
arg4 exec.TaskDelegate arg4 exec.TaskDelegate
} }
@ -209,20 +207,19 @@ func (fake *FakeStepFactory) ArtifactOutputStepReturnsOnCall(i int, result1 exec
}{result1} }{result1}
} }
func (fake *FakeStepFactory) GetStep(arg1 atc.Plan, arg2 db.Build, arg3 exec.StepMetadata, arg4 db.ContainerMetadata, arg5 exec.GetDelegate) exec.Step { func (fake *FakeStepFactory) GetStep(arg1 atc.Plan, arg2 exec.StepMetadata, arg3 db.ContainerMetadata, arg4 exec.GetDelegate) exec.Step {
fake.getStepMutex.Lock() fake.getStepMutex.Lock()
ret, specificReturn := fake.getStepReturnsOnCall[len(fake.getStepArgsForCall)] ret, specificReturn := fake.getStepReturnsOnCall[len(fake.getStepArgsForCall)]
fake.getStepArgsForCall = append(fake.getStepArgsForCall, struct { fake.getStepArgsForCall = append(fake.getStepArgsForCall, struct {
arg1 atc.Plan arg1 atc.Plan
arg2 db.Build arg2 exec.StepMetadata
arg3 exec.StepMetadata arg3 db.ContainerMetadata
arg4 db.ContainerMetadata arg4 exec.GetDelegate
arg5 exec.GetDelegate }{arg1, arg2, arg3, arg4})
}{arg1, arg2, arg3, arg4, arg5}) fake.recordInvocation("GetStep", []interface{}{arg1, arg2, arg3, arg4})
fake.recordInvocation("GetStep", []interface{}{arg1, arg2, arg3, arg4, arg5})
fake.getStepMutex.Unlock() fake.getStepMutex.Unlock()
if fake.GetStepStub != nil { if fake.GetStepStub != nil {
return fake.GetStepStub(arg1, arg2, arg3, arg4, arg5) return fake.GetStepStub(arg1, arg2, arg3, arg4)
} }
if specificReturn { if specificReturn {
return ret.result1 return ret.result1
@ -237,17 +234,17 @@ func (fake *FakeStepFactory) GetStepCallCount() int {
return len(fake.getStepArgsForCall) return len(fake.getStepArgsForCall)
} }
func (fake *FakeStepFactory) GetStepCalls(stub func(atc.Plan, db.Build, exec.StepMetadata, db.ContainerMetadata, exec.GetDelegate) exec.Step) { func (fake *FakeStepFactory) GetStepCalls(stub func(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.GetDelegate) exec.Step) {
fake.getStepMutex.Lock() fake.getStepMutex.Lock()
defer fake.getStepMutex.Unlock() defer fake.getStepMutex.Unlock()
fake.GetStepStub = stub fake.GetStepStub = stub
} }
func (fake *FakeStepFactory) GetStepArgsForCall(i int) (atc.Plan, db.Build, exec.StepMetadata, db.ContainerMetadata, exec.GetDelegate) { func (fake *FakeStepFactory) GetStepArgsForCall(i int) (atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.GetDelegate) {
fake.getStepMutex.RLock() fake.getStepMutex.RLock()
defer fake.getStepMutex.RUnlock() defer fake.getStepMutex.RUnlock()
argsForCall := fake.getStepArgsForCall[i] argsForCall := fake.getStepArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4
} }
func (fake *FakeStepFactory) GetStepReturns(result1 exec.Step) { func (fake *FakeStepFactory) GetStepReturns(result1 exec.Step) {
@ -273,20 +270,19 @@ func (fake *FakeStepFactory) GetStepReturnsOnCall(i int, result1 exec.Step) {
}{result1} }{result1}
} }
func (fake *FakeStepFactory) PutStep(arg1 atc.Plan, arg2 db.Build, arg3 exec.StepMetadata, arg4 db.ContainerMetadata, arg5 exec.PutDelegate) exec.Step { func (fake *FakeStepFactory) PutStep(arg1 atc.Plan, arg2 exec.StepMetadata, arg3 db.ContainerMetadata, arg4 exec.PutDelegate) exec.Step {
fake.putStepMutex.Lock() fake.putStepMutex.Lock()
ret, specificReturn := fake.putStepReturnsOnCall[len(fake.putStepArgsForCall)] ret, specificReturn := fake.putStepReturnsOnCall[len(fake.putStepArgsForCall)]
fake.putStepArgsForCall = append(fake.putStepArgsForCall, struct { fake.putStepArgsForCall = append(fake.putStepArgsForCall, struct {
arg1 atc.Plan arg1 atc.Plan
arg2 db.Build arg2 exec.StepMetadata
arg3 exec.StepMetadata arg3 db.ContainerMetadata
arg4 db.ContainerMetadata arg4 exec.PutDelegate
arg5 exec.PutDelegate }{arg1, arg2, arg3, arg4})
}{arg1, arg2, arg3, arg4, arg5}) fake.recordInvocation("PutStep", []interface{}{arg1, arg2, arg3, arg4})
fake.recordInvocation("PutStep", []interface{}{arg1, arg2, arg3, arg4, arg5})
fake.putStepMutex.Unlock() fake.putStepMutex.Unlock()
if fake.PutStepStub != nil { if fake.PutStepStub != nil {
return fake.PutStepStub(arg1, arg2, arg3, arg4, arg5) return fake.PutStepStub(arg1, arg2, arg3, arg4)
} }
if specificReturn { if specificReturn {
return ret.result1 return ret.result1
@ -301,17 +297,17 @@ func (fake *FakeStepFactory) PutStepCallCount() int {
return len(fake.putStepArgsForCall) return len(fake.putStepArgsForCall)
} }
func (fake *FakeStepFactory) PutStepCalls(stub func(atc.Plan, db.Build, exec.StepMetadata, db.ContainerMetadata, exec.PutDelegate) exec.Step) { func (fake *FakeStepFactory) PutStepCalls(stub func(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.PutDelegate) exec.Step) {
fake.putStepMutex.Lock() fake.putStepMutex.Lock()
defer fake.putStepMutex.Unlock() defer fake.putStepMutex.Unlock()
fake.PutStepStub = stub fake.PutStepStub = stub
} }
func (fake *FakeStepFactory) PutStepArgsForCall(i int) (atc.Plan, db.Build, exec.StepMetadata, db.ContainerMetadata, exec.PutDelegate) { func (fake *FakeStepFactory) PutStepArgsForCall(i int) (atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.PutDelegate) {
fake.putStepMutex.RLock() fake.putStepMutex.RLock()
defer fake.putStepMutex.RUnlock() defer fake.putStepMutex.RUnlock()
argsForCall := fake.putStepArgsForCall[i] argsForCall := fake.putStepArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4
} }
func (fake *FakeStepFactory) PutStepReturns(result1 exec.Step) { func (fake *FakeStepFactory) PutStepReturns(result1 exec.Step) {
@ -337,12 +333,12 @@ func (fake *FakeStepFactory) PutStepReturnsOnCall(i int, result1 exec.Step) {
}{result1} }{result1}
} }
func (fake *FakeStepFactory) TaskStep(arg1 atc.Plan, arg2 db.Build, arg3 db.ContainerMetadata, arg4 exec.TaskDelegate) exec.Step { func (fake *FakeStepFactory) TaskStep(arg1 atc.Plan, arg2 exec.StepMetadata, arg3 db.ContainerMetadata, arg4 exec.TaskDelegate) exec.Step {
fake.taskStepMutex.Lock() fake.taskStepMutex.Lock()
ret, specificReturn := fake.taskStepReturnsOnCall[len(fake.taskStepArgsForCall)] ret, specificReturn := fake.taskStepReturnsOnCall[len(fake.taskStepArgsForCall)]
fake.taskStepArgsForCall = append(fake.taskStepArgsForCall, struct { fake.taskStepArgsForCall = append(fake.taskStepArgsForCall, struct {
arg1 atc.Plan arg1 atc.Plan
arg2 db.Build arg2 exec.StepMetadata
arg3 db.ContainerMetadata arg3 db.ContainerMetadata
arg4 exec.TaskDelegate arg4 exec.TaskDelegate
}{arg1, arg2, arg3, arg4}) }{arg1, arg2, arg3, arg4})
@ -364,13 +360,13 @@ func (fake *FakeStepFactory) TaskStepCallCount() int {
return len(fake.taskStepArgsForCall) return len(fake.taskStepArgsForCall)
} }
func (fake *FakeStepFactory) TaskStepCalls(stub func(atc.Plan, db.Build, db.ContainerMetadata, exec.TaskDelegate) exec.Step) { func (fake *FakeStepFactory) TaskStepCalls(stub func(atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.TaskDelegate) exec.Step) {
fake.taskStepMutex.Lock() fake.taskStepMutex.Lock()
defer fake.taskStepMutex.Unlock() defer fake.taskStepMutex.Unlock()
fake.TaskStepStub = stub fake.TaskStepStub = stub
} }
func (fake *FakeStepFactory) TaskStepArgsForCall(i int) (atc.Plan, db.Build, db.ContainerMetadata, exec.TaskDelegate) { func (fake *FakeStepFactory) TaskStepArgsForCall(i int) (atc.Plan, exec.StepMetadata, db.ContainerMetadata, exec.TaskDelegate) {
fake.taskStepMutex.RLock() fake.taskStepMutex.RLock()
defer fake.taskStepMutex.RUnlock() defer fake.taskStepMutex.RUnlock()
argsForCall := fake.taskStepArgsForCall[i] argsForCall := fake.taskStepArgsForCall[i]

View File

@ -95,6 +95,44 @@ func (d *getDelegate) Finished(logger lager.Logger, exitStatus exec.ExitStatus,
logger.Info("finished", lager.Data{"exit-status": exitStatus}) logger.Info("finished", lager.Data{"exit-status": exitStatus})
} }
func (d *getDelegate) UpdateVersion(log lager.Logger, plan atc.GetPlan, info exec.VersionInfo) {
logger := log.WithData(lager.Data{
"pipeline-name": d.build.PipelineName(),
"pipeline-id": d.build.PipelineID()},
)
pipeline, found, err := d.build.Pipeline()
if err != nil {
logger.Error("failed-to-find-pipeline", err)
return
}
if !found {
logger.Debug("pipeline-not-found")
return
}
resource, found, err := pipeline.Resource(plan.Resource)
if err != nil {
logger.Error("failed-to-find-resource", err)
return
}
if !found {
logger.Debug("resource-not-found")
return
}
_, err = resource.UpdateMetadata(
info.Version,
db.NewResourceConfigMetadataFields(info.Metadata),
)
if err != nil {
logger.Error("failed-to-save-resource-config-version-metadata", err)
return
}
}
func NewPutDelegate(build db.Build, planID atc.PlanID, clock clock.Clock) exec.PutDelegate { func NewPutDelegate(build db.Build, planID atc.PlanID, clock clock.Clock) exec.PutDelegate {
return &putDelegate{ return &putDelegate{
BuildStepDelegate: NewBuildStepDelegate(build, planID, clock), BuildStepDelegate: NewBuildStepDelegate(build, planID, clock),
@ -155,6 +193,29 @@ func (d *putDelegate) Finished(logger lager.Logger, exitStatus exec.ExitStatus,
logger.Info("finished", lager.Data{"exit-status": exitStatus, "version-info": info}) logger.Info("finished", lager.Data{"exit-status": exitStatus, "version-info": info})
} }
func (d *putDelegate) SaveOutput(log lager.Logger, plan atc.PutPlan, source atc.Source, resourceTypes atc.VersionedResourceTypes, info exec.VersionInfo) {
logger := log.WithData(lager.Data{
"step": plan.Name,
"resource": plan.Resource,
"resource-type": plan.Type,
"version": info.Version,
})
err := d.build.SaveOutput(
plan.Type,
source,
resourceTypes,
info.Version,
db.NewResourceConfigMetadataFields(info.Metadata),
plan.Name,
plan.Resource,
)
if err != nil {
logger.Error("failed-to-save-output", err)
return
}
}
func NewTaskDelegate(build db.Build, planID atc.PlanID, clock clock.Clock) exec.TaskDelegate { func NewTaskDelegate(build db.Build, planID atc.PlanID, clock clock.Clock) exec.TaskDelegate {
return &taskDelegate{ return &taskDelegate{
BuildStepDelegate: NewBuildStepDelegate(build, planID, clock), BuildStepDelegate: NewBuildStepDelegate(build, planID, clock),

View File

@ -9,6 +9,7 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
"github.com/concourse/concourse/atc/engine/builder" "github.com/concourse/concourse/atc/engine/builder"
"github.com/concourse/concourse/atc/event" "github.com/concourse/concourse/atc/event"
@ -20,15 +21,19 @@ import (
var _ = Describe("DelegateFactory", func() { var _ = Describe("DelegateFactory", func() {
var ( var (
logger *lagertest.TestLogger logger *lagertest.TestLogger
fakeBuild *dbfakes.FakeBuild fakeBuild *dbfakes.FakeBuild
fakeClock *fakeclock.FakeClock fakePipeline *dbfakes.FakePipeline
fakeResource *dbfakes.FakeResource
fakeClock *fakeclock.FakeClock
) )
BeforeEach(func() { BeforeEach(func() {
logger = lagertest.NewTestLogger("test") logger = lagertest.NewTestLogger("test")
fakeBuild = new(dbfakes.FakeBuild) fakeBuild = new(dbfakes.FakeBuild)
fakePipeline = new(dbfakes.FakePipeline)
fakeResource = new(dbfakes.FakeResource)
fakeClock = fakeclock.NewFakeClock(time.Unix(123456789, 0)) fakeClock = fakeclock.NewFakeClock(time.Unix(123456789, 0))
}) })
@ -64,6 +69,82 @@ var _ = Describe("DelegateFactory", func() {
})) }))
}) })
}) })
Describe("UpdateVersion", func() {
JustBeforeEach(func() {
plan := atc.GetPlan{Resource: "some-resource"}
delegate.UpdateVersion(logger, plan, info)
})
Context("when retrieving the pipeline fails", func() {
BeforeEach(func() {
fakeBuild.PipelineReturns(nil, false, errors.New("nope"))
})
It("doesn't update the metadata", func() {
Expect(fakeResource.UpdateMetadataCallCount()).To(Equal(0))
})
})
Context("when retrieving the pipeline succeeds", func() {
Context("when the pipeline is not found", func() {
BeforeEach(func() {
fakeBuild.PipelineReturns(nil, false, nil)
})
It("doesn't update the metadata", func() {
Expect(fakeResource.UpdateMetadataCallCount()).To(Equal(0))
})
})
Context("when the pipeline is found", func() {
BeforeEach(func() {
fakeBuild.PipelineReturns(fakePipeline, true, nil)
})
Context("when retrieving the resource fails", func() {
BeforeEach(func() {
fakePipeline.ResourceReturns(nil, false, errors.New("nope"))
})
It("doesn't update the metadata", func() {
Expect(fakeResource.UpdateMetadataCallCount()).To(Equal(0))
})
})
Context("when retrieving the resource succeeds", func() {
It("retrives the resource by name", func() {
Expect(fakePipeline.ResourceArgsForCall(0)).To(Equal("some-resource"))
})
Context("when the resource is not found", func() {
BeforeEach(func() {
fakePipeline.ResourceReturns(nil, false, nil)
})
It("doesn't update the metadata", func() {
Expect(fakeResource.UpdateMetadataCallCount()).To(Equal(0))
})
})
Context("when the resource is found", func() {
BeforeEach(func() {
fakePipeline.ResourceReturns(fakeResource, true, nil)
})
It("updates the metadata", func() {
Expect(fakeResource.UpdateMetadataCallCount()).To(Equal(1))
version, metadata := fakeResource.UpdateMetadataArgsForCall(0)
Expect(version).To(Equal(info.Version))
Expect(metadata).To(Equal(db.NewResourceConfigMetadataFields(info.Metadata)))
})
})
})
})
})
})
}) })
Describe("PutDelegate", func() { Describe("PutDelegate", func() {
@ -98,6 +179,36 @@ var _ = Describe("DelegateFactory", func() {
})) }))
}) })
}) })
Describe("SaveOutput", func() {
var plan atc.PutPlan
var source atc.Source
var resourceTypes atc.VersionedResourceTypes
JustBeforeEach(func() {
plan = atc.PutPlan{
Name: "some-name",
Type: "some-type",
Resource: "some-resource",
}
source = atc.Source{"some": "source"}
resourceTypes = atc.VersionedResourceTypes{}
delegate.SaveOutput(logger, plan, source, resourceTypes, info)
})
It("saves the build output", func() {
Expect(fakeBuild.SaveOutputCallCount()).To(Equal(1))
resourceType, sourceArg, resourceTypesArg, version, metadata, name, resource := fakeBuild.SaveOutputArgsForCall(0)
Expect(resourceType).To(Equal(plan.Type))
Expect(sourceArg).To(Equal(source))
Expect(resourceTypesArg).To(Equal(resourceTypes))
Expect(version).To(Equal(info.Version))
Expect(metadata).To(Equal(db.NewResourceConfigMetadataFields(info.Metadata)))
Expect(name).To(Equal(plan.Name))
Expect(resource).To(Equal(plan.Resource))
})
})
}) })
Describe("TaskDelegate", func() { Describe("TaskDelegate", func() {

View File

@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"path/filepath" "path/filepath"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
@ -52,39 +51,23 @@ func NewStepFactory(
func (factory *stepFactory) GetStep( func (factory *stepFactory) GetStep(
plan atc.Plan, plan atc.Plan,
build db.Build,
stepMetadata exec.StepMetadata, stepMetadata exec.StepMetadata,
workerMetadata db.ContainerMetadata, containerMetadata db.ContainerMetadata,
delegate exec.GetDelegate, delegate exec.GetDelegate,
) exec.Step { ) exec.Step {
workerMetadata.WorkingDirectory = resource.ResourcesDir("get") containerMetadata.WorkingDirectory = resource.ResourcesDir("get")
variables := creds.NewVariables(factory.secretManager, build.TeamName(), build.PipelineName())
getStep := exec.NewGetStep( getStep := exec.NewGetStep(
build,
plan.Get.Name,
plan.Get.Type,
plan.Get.Resource,
creds.NewSource(variables, plan.Get.Source),
creds.NewParams(variables, plan.Get.Params),
exec.NewVersionSourceFromPlan(plan.Get),
plan.Get.Tags,
delegate,
factory.resourceFetcher,
build.TeamID(),
build.ID(),
plan.ID, plan.ID,
workerMetadata, *plan.Get,
factory.resourceCacheFactory,
stepMetadata, stepMetadata,
containerMetadata,
creds.NewVersionedResourceTypes(variables, plan.Get.VersionedResourceTypes), factory.secretManager,
factory.resourceFetcher,
factory.resourceCacheFactory,
factory.strategy, factory.strategy,
factory.pool, factory.pool,
delegate,
) )
return exec.LogError(getStep, delegate) return exec.LogError(getStep, delegate)
@ -92,50 +75,23 @@ func (factory *stepFactory) GetStep(
func (factory *stepFactory) PutStep( func (factory *stepFactory) PutStep(
plan atc.Plan, plan atc.Plan,
build db.Build,
stepMetadata exec.StepMetadata, stepMetadata exec.StepMetadata,
workerMetadata db.ContainerMetadata, containerMetadata db.ContainerMetadata,
delegate exec.PutDelegate, delegate exec.PutDelegate,
) exec.Step { ) exec.Step {
workerMetadata.WorkingDirectory = resource.ResourcesDir("put") containerMetadata.WorkingDirectory = resource.ResourcesDir("put")
variables := creds.NewVariables(factory.secretManager, build.TeamName(), build.PipelineName())
var putInputs exec.PutInputs
if plan.Put.Inputs == nil {
// Put step defaults to all inputs if not specified
putInputs = exec.NewAllInputs()
} else if plan.Put.Inputs.All {
putInputs = exec.NewAllInputs()
} else {
// Covers both cases where inputs are specified and when there are no
// inputs specified and "all" field is given a false boolean, which will
// result in no inputs attached
putInputs = exec.NewSpecificInputs(plan.Put.Inputs.Specified)
}
putStep := exec.NewPutStep( putStep := exec.NewPutStep(
build,
plan.Put.Name,
plan.Put.Type,
plan.Put.Resource,
creds.NewSource(variables, plan.Put.Source),
creds.NewParams(variables, plan.Put.Params),
plan.Put.Tags,
putInputs,
delegate,
factory.pool,
factory.resourceConfigFactory,
plan.ID, plan.ID,
workerMetadata, *plan.Put,
stepMetadata, stepMetadata,
containerMetadata,
creds.NewVersionedResourceTypes(variables, plan.Put.VersionedResourceTypes), factory.secretManager,
factory.strategy,
factory.resourceFactory, factory.resourceFactory,
factory.resourceConfigFactory,
factory.strategy,
factory.pool,
delegate,
) )
return exec.LogError(putStep, delegate) return exec.LogError(putStep, delegate)
@ -143,66 +99,23 @@ func (factory *stepFactory) PutStep(
func (factory *stepFactory) TaskStep( func (factory *stepFactory) TaskStep(
plan atc.Plan, plan atc.Plan,
build db.Build, stepMetadata exec.StepMetadata,
containerMetadata db.ContainerMetadata, containerMetadata db.ContainerMetadata,
delegate exec.TaskDelegate, delegate exec.TaskDelegate,
) exec.Step { ) exec.Step {
sum := sha1.Sum([]byte(plan.Task.Name)) sum := sha1.Sum([]byte(plan.Task.Name))
workingDirectory := filepath.Join("/tmp", "build", fmt.Sprintf("%x", sum[:4])) containerMetadata.WorkingDirectory = filepath.Join("/tmp", "build", fmt.Sprintf("%x", sum[:4]))
containerMetadata.WorkingDirectory = workingDirectory
credMgrVariables := creds.NewVariables(factory.secretManager, build.TeamName(), build.PipelineName())
var taskConfigSource exec.TaskConfigSource
var taskVars []template.Variables
if plan.Task.ConfigPath != "" {
// external task - construct a source which reads it from file
taskConfigSource = exec.FileConfigSource{ConfigPath: plan.Task.ConfigPath}
// for interpolation - use 'vars' from the pipeline, and then fill remaining with cred mgr variables
taskVars = []template.Variables{template.StaticVariables(plan.Task.Vars), credMgrVariables}
} else {
// embedded task - first we take it
taskConfigSource = exec.StaticConfigSource{Config: plan.Task.Config}
// for interpolation - use just cred mgr variables
taskVars = []template.Variables{credMgrVariables}
}
// override params
taskConfigSource = &exec.OverrideParamsConfigSource{ConfigSource: taskConfigSource, Params: plan.Task.Params}
// interpolate template vars
taskConfigSource = exec.InterpolateTemplateConfigSource{ConfigSource: taskConfigSource, Vars: taskVars}
// validate
taskConfigSource = exec.ValidatingConfigSource{ConfigSource: taskConfigSource}
taskStep := exec.NewTaskStep( taskStep := exec.NewTaskStep(
exec.Privileged(plan.Task.Privileged),
taskConfigSource,
plan.Task.Tags,
plan.Task.InputMapping,
plan.Task.OutputMapping,
workingDirectory,
plan.Task.ImageArtifactName,
delegate,
factory.pool,
build.TeamID(),
build.ID(),
build.JobID(),
plan.Task.Name,
plan.ID, plan.ID,
containerMetadata, *plan.Task,
creds.NewVersionedResourceTypes(credMgrVariables, plan.Task.VersionedResourceTypes),
factory.defaultLimits, factory.defaultLimits,
stepMetadata,
containerMetadata,
factory.secretManager,
factory.strategy, factory.strategy,
factory.pool,
delegate,
) )
return exec.LogError(taskStep, delegate) return exec.LogError(taskStep, delegate)

View File

@ -16,14 +16,14 @@ import (
//go:generate counterfeiter . Engine //go:generate counterfeiter . Engine
type Engine interface { type Engine interface {
LookupBuild(lager.Logger, db.Build) Build NewBuild(db.Build) Runnable
ReleaseAll(lager.Logger) ReleaseAll(lager.Logger)
} }
//go:generate counterfeiter . Build //go:generate counterfeiter . Runnable
type Build interface { type Runnable interface {
Resume(lager.Logger) Run(logger lager.Logger)
} }
//go:generate counterfeiter . StepBuilder //go:generate counterfeiter . StepBuilder
@ -50,7 +50,19 @@ type engine struct {
waitGroup *sync.WaitGroup waitGroup *sync.WaitGroup
} }
func (engine *engine) LookupBuild(logger lager.Logger, build db.Build) Build { func (engine *engine) ReleaseAll(logger lager.Logger) {
logger.Info("calling-release-on-builds")
close(engine.release)
logger.Info("waiting-on-builds")
engine.waitGroup.Wait()
logger.Info("finished-waiting-on-builds")
}
func (engine *engine) NewBuild(build db.Build) Runnable {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
@ -65,18 +77,6 @@ func (engine *engine) LookupBuild(logger lager.Logger, build db.Build) Build {
) )
} }
func (engine *engine) ReleaseAll(logger lager.Logger) {
logger.Info("calling-release-on-builds")
close(engine.release)
logger.Info("waiting-on-builds")
engine.waitGroup.Wait()
logger.Info("finished-waiting-on-builds")
}
func NewBuild( func NewBuild(
ctx context.Context, ctx context.Context,
cancel func(), cancel func(),
@ -85,8 +85,8 @@ func NewBuild(
release chan bool, release chan bool,
trackedStates *sync.Map, trackedStates *sync.Map,
waitGroup *sync.WaitGroup, waitGroup *sync.WaitGroup,
) Build { ) Runnable {
return &execBuild{ return &engineBuild{
ctx: ctx, ctx: ctx,
cancel: cancel, cancel: cancel,
@ -99,7 +99,7 @@ func NewBuild(
} }
} }
type execBuild struct { type engineBuild struct {
ctx context.Context ctx context.Context
cancel func() cancel func()
@ -111,17 +111,17 @@ type execBuild struct {
waitGroup *sync.WaitGroup waitGroup *sync.WaitGroup
} }
func (build *execBuild) Resume(logger lager.Logger) { func (b *engineBuild) Run(logger lager.Logger) {
build.waitGroup.Add(1) b.waitGroup.Add(1)
defer build.waitGroup.Done() defer b.waitGroup.Done()
logger = logger.WithData(lager.Data{ logger = logger.WithData(lager.Data{
"build": build.build.ID(), "build": b.build.ID(),
"pipeline": build.build.PipelineName(), "pipeline": b.build.PipelineName(),
"job": build.build.JobName(), "job": b.build.JobName(),
}) })
lock, acquired, err := build.build.AcquireTrackingLock(logger, time.Minute) lock, acquired, err := b.build.AcquireTrackingLock(logger, time.Minute)
if err != nil { if err != nil {
logger.Error("failed-to-get-lock", err) logger.Error("failed-to-get-lock", err)
return return
@ -134,7 +134,7 @@ func (build *execBuild) Resume(logger lager.Logger) {
defer lock.Release() defer lock.Release()
found, err := build.build.Reload() found, err := b.build.Reload()
if err != nil { if err != nil {
logger.Error("failed-to-load-build-from-db", err) logger.Error("failed-to-load-build-from-db", err)
return return
@ -145,12 +145,12 @@ func (build *execBuild) Resume(logger lager.Logger) {
return return
} }
if !build.build.IsRunning() { if !b.build.IsRunning() {
logger.Info("build-already-finished") logger.Info("build-already-finished")
return return
} }
notifier, err := build.build.AbortNotifier() notifier, err := b.build.AbortNotifier()
if err != nil { if err != nil {
logger.Error("failed-to-listen-for-aborts", err) logger.Error("failed-to-listen-for-aborts", err)
return return
@ -158,19 +158,19 @@ func (build *execBuild) Resume(logger lager.Logger) {
defer notifier.Close() defer notifier.Close()
step, err := build.builder.BuildStep(build.build) step, err := b.builder.BuildStep(b.build)
if err != nil { if err != nil {
logger.Error("failed-to-build-step", err) logger.Error("failed-to-build-step", err)
return return
} }
build.trackStarted(logger) b.trackStarted(logger)
defer build.trackFinished(logger) defer b.trackFinished(logger)
logger.Info("running") logger.Info("running")
state := build.runState() state := b.runState()
defer build.clearRunState() defer b.clearRunState()
noleak := make(chan bool) noleak := make(chan bool)
defer close(noleak) defer close(noleak)
@ -180,62 +180,62 @@ func (build *execBuild) Resume(logger lager.Logger) {
case <-noleak: case <-noleak:
case <-notifier.Notify(): case <-notifier.Notify():
logger.Info("aborting") logger.Info("aborting")
build.cancel() b.cancel()
} }
}() }()
done := make(chan error) done := make(chan error)
go func() { go func() {
ctx := lagerctx.NewContext(build.ctx, logger) ctx := lagerctx.NewContext(b.ctx, logger)
done <- step.Run(ctx, state) done <- step.Run(ctx, state)
}() }()
select { select {
case <-build.release: case <-b.release:
logger.Info("releasing") logger.Info("releasing")
case err = <-done: case err = <-done:
build.finish(logger.Session("finish"), err, step.Succeeded()) b.finish(logger.Session("finish"), err, step.Succeeded())
} }
} }
func (build *execBuild) finish(logger lager.Logger, err error, succeeded bool) { func (b *engineBuild) finish(logger lager.Logger, err error, succeeded bool) {
if err == context.Canceled { if err == context.Canceled {
build.saveStatus(logger, atc.StatusAborted) b.saveStatus(logger, atc.StatusAborted)
logger.Info("aborted") logger.Info("aborted")
} else if err != nil { } else if err != nil {
build.saveStatus(logger, atc.StatusErrored) b.saveStatus(logger, atc.StatusErrored)
logger.Info("errored", lager.Data{"error": err.Error()}) logger.Info("errored", lager.Data{"error": err.Error()})
} else if succeeded { } else if succeeded {
build.saveStatus(logger, atc.StatusSucceeded) b.saveStatus(logger, atc.StatusSucceeded)
logger.Info("succeeded") logger.Info("succeeded")
} else { } else {
build.saveStatus(logger, atc.StatusFailed) b.saveStatus(logger, atc.StatusFailed)
logger.Info("failed") logger.Info("failed")
} }
} }
func (build *execBuild) saveStatus(logger lager.Logger, status atc.BuildStatus) { func (b *engineBuild) saveStatus(logger lager.Logger, status atc.BuildStatus) {
if err := build.build.Finish(db.BuildStatus(status)); err != nil { if err := b.build.Finish(db.BuildStatus(status)); err != nil {
logger.Error("failed-to-finish-build", err) logger.Error("failed-to-finish-build", err)
} }
} }
func (build *execBuild) trackStarted(logger lager.Logger) { func (b *engineBuild) trackStarted(logger lager.Logger) {
metric.BuildStarted{ metric.BuildStarted{
PipelineName: build.build.PipelineName(), PipelineName: b.build.PipelineName(),
JobName: build.build.JobName(), JobName: b.build.JobName(),
BuildName: build.build.Name(), BuildName: b.build.Name(),
BuildID: build.build.ID(), BuildID: b.build.ID(),
TeamName: build.build.TeamName(), TeamName: b.build.TeamName(),
}.Emit(logger) }.Emit(logger)
} }
func (build *execBuild) trackFinished(logger lager.Logger) { func (b *engineBuild) trackFinished(logger lager.Logger) {
found, err := build.build.Reload() found, err := b.build.Reload()
if err != nil { if err != nil {
logger.Error("failed-to-load-build-from-db", err) logger.Error("failed-to-load-build-from-db", err)
return return
@ -246,24 +246,24 @@ func (build *execBuild) trackFinished(logger lager.Logger) {
return return
} }
if !build.build.IsRunning() { if !b.build.IsRunning() {
metric.BuildFinished{ metric.BuildFinished{
PipelineName: build.build.PipelineName(), PipelineName: b.build.PipelineName(),
JobName: build.build.JobName(), JobName: b.build.JobName(),
BuildName: build.build.Name(), BuildName: b.build.Name(),
BuildID: build.build.ID(), BuildID: b.build.ID(),
BuildStatus: build.build.Status(), BuildStatus: b.build.Status(),
BuildDuration: build.build.EndTime().Sub(build.build.StartTime()), BuildDuration: b.build.EndTime().Sub(b.build.StartTime()),
TeamName: build.build.TeamName(), TeamName: b.build.TeamName(),
}.Emit(logger) }.Emit(logger)
} }
} }
func (build *execBuild) runState() exec.RunState { func (build *engineBuild) runState() exec.RunState {
existingState, _ := build.trackedStates.LoadOrStore(build.build.ID(), exec.NewRunState()) existingState, _ := build.trackedStates.LoadOrStore(build.build.ID(), exec.NewRunState())
return existingState.(exec.RunState) return existingState.(exec.RunState)
} }
func (build *execBuild) clearRunState() { func (build *engineBuild) clearRunState() {
build.trackedStates.Delete(build.build.ID()) build.trackedStates.Delete(build.build.ID())
} }

View File

@ -22,26 +22,20 @@ import (
var _ = Describe("Engine", func() { var _ = Describe("Engine", func() {
var ( var (
logger lager.Logger
fakeBuild *dbfakes.FakeBuild fakeBuild *dbfakes.FakeBuild
fakeStepBuilder *enginefakes.FakeStepBuilder fakeStepBuilder *enginefakes.FakeStepBuilder
) )
BeforeEach(func() { BeforeEach(func() {
logger = lagertest.NewTestLogger("test")
fakeBuild = new(dbfakes.FakeBuild) fakeBuild = new(dbfakes.FakeBuild)
fakeBuild.IDReturns(128) fakeBuild.IDReturns(128)
fakeStepBuilder = new(enginefakes.FakeStepBuilder) fakeStepBuilder = new(enginefakes.FakeStepBuilder)
}) })
Describe("LookupBuild", func() { Describe("NewBuild", func() {
var ( var (
build Build build Runnable
err error
engine Engine engine Engine
) )
@ -50,12 +44,12 @@ var _ = Describe("Engine", func() {
}) })
JustBeforeEach(func() { JustBeforeEach(func() {
build = engine.LookupBuild(logger, fakeBuild) build = engine.NewBuild(fakeBuild)
}) })
It("succeeds", func() { // It("succeeds", func() {
Expect(err).NotTo(HaveOccurred()) // Expect(err).NotTo(HaveOccurred())
}) // })
It("returns a build", func() { It("returns a build", func() {
Expect(build).NotTo(BeNil()) Expect(build).NotTo(BeNil())
@ -64,7 +58,7 @@ var _ = Describe("Engine", func() {
Describe("Build", func() { Describe("Build", func() {
var ( var (
build Build build Runnable
release chan bool release chan bool
cancel chan bool cancel chan bool
waitGroup *sync.WaitGroup waitGroup *sync.WaitGroup
@ -89,7 +83,7 @@ var _ = Describe("Engine", func() {
) )
}) })
Describe("Resume", func() { Describe("Run", func() {
var logger lager.Logger var logger lager.Logger
BeforeEach(func() { BeforeEach(func() {
@ -97,7 +91,7 @@ var _ = Describe("Engine", func() {
}) })
JustBeforeEach(func() { JustBeforeEach(func() {
build.Resume(logger) build.Run(logger)
}) })
Context("when acquiring the lock succeeds", func() { Context("when acquiring the lock succeeds", func() {

View File

@ -1,76 +0,0 @@
// Code generated by counterfeiter. DO NOT EDIT.
package enginefakes
import (
"sync"
"code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc/engine"
)
type FakeBuild struct {
ResumeStub func(lager.Logger)
resumeMutex sync.RWMutex
resumeArgsForCall []struct {
arg1 lager.Logger
}
invocations map[string][][]interface{}
invocationsMutex sync.RWMutex
}
func (fake *FakeBuild) Resume(arg1 lager.Logger) {
fake.resumeMutex.Lock()
fake.resumeArgsForCall = append(fake.resumeArgsForCall, struct {
arg1 lager.Logger
}{arg1})
fake.recordInvocation("Resume", []interface{}{arg1})
fake.resumeMutex.Unlock()
if fake.ResumeStub != nil {
fake.ResumeStub(arg1)
}
}
func (fake *FakeBuild) ResumeCallCount() int {
fake.resumeMutex.RLock()
defer fake.resumeMutex.RUnlock()
return len(fake.resumeArgsForCall)
}
func (fake *FakeBuild) ResumeCalls(stub func(lager.Logger)) {
fake.resumeMutex.Lock()
defer fake.resumeMutex.Unlock()
fake.ResumeStub = stub
}
func (fake *FakeBuild) ResumeArgsForCall(i int) lager.Logger {
fake.resumeMutex.RLock()
defer fake.resumeMutex.RUnlock()
argsForCall := fake.resumeArgsForCall[i]
return argsForCall.arg1
}
func (fake *FakeBuild) Invocations() map[string][][]interface{} {
fake.invocationsMutex.RLock()
defer fake.invocationsMutex.RUnlock()
fake.resumeMutex.RLock()
defer fake.resumeMutex.RUnlock()
copiedInvocations := map[string][][]interface{}{}
for key, value := range fake.invocations {
copiedInvocations[key] = value
}
return copiedInvocations
}
func (fake *FakeBuild) recordInvocation(key string, args []interface{}) {
fake.invocationsMutex.Lock()
defer fake.invocationsMutex.Unlock()
if fake.invocations == nil {
fake.invocations = map[string][][]interface{}{}
}
if fake.invocations[key] == nil {
fake.invocations[key] = [][]interface{}{}
}
fake.invocations[key] = append(fake.invocations[key], args)
}
var _ engine.Build = new(FakeBuild)

View File

@ -10,17 +10,16 @@ import (
) )
type FakeEngine struct { type FakeEngine struct {
LookupBuildStub func(lager.Logger, db.Build) engine.Build NewBuildStub func(db.Build) engine.Runnable
lookupBuildMutex sync.RWMutex newBuildMutex sync.RWMutex
lookupBuildArgsForCall []struct { newBuildArgsForCall []struct {
arg1 lager.Logger arg1 db.Build
arg2 db.Build
} }
lookupBuildReturns struct { newBuildReturns struct {
result1 engine.Build result1 engine.Runnable
} }
lookupBuildReturnsOnCall map[int]struct { newBuildReturnsOnCall map[int]struct {
result1 engine.Build result1 engine.Runnable
} }
ReleaseAllStub func(lager.Logger) ReleaseAllStub func(lager.Logger)
releaseAllMutex sync.RWMutex releaseAllMutex sync.RWMutex
@ -31,64 +30,63 @@ type FakeEngine struct {
invocationsMutex sync.RWMutex invocationsMutex sync.RWMutex
} }
func (fake *FakeEngine) LookupBuild(arg1 lager.Logger, arg2 db.Build) engine.Build { func (fake *FakeEngine) NewBuild(arg1 db.Build) engine.Runnable {
fake.lookupBuildMutex.Lock() fake.newBuildMutex.Lock()
ret, specificReturn := fake.lookupBuildReturnsOnCall[len(fake.lookupBuildArgsForCall)] ret, specificReturn := fake.newBuildReturnsOnCall[len(fake.newBuildArgsForCall)]
fake.lookupBuildArgsForCall = append(fake.lookupBuildArgsForCall, struct { fake.newBuildArgsForCall = append(fake.newBuildArgsForCall, struct {
arg1 lager.Logger arg1 db.Build
arg2 db.Build }{arg1})
}{arg1, arg2}) fake.recordInvocation("NewBuild", []interface{}{arg1})
fake.recordInvocation("LookupBuild", []interface{}{arg1, arg2}) fake.newBuildMutex.Unlock()
fake.lookupBuildMutex.Unlock() if fake.NewBuildStub != nil {
if fake.LookupBuildStub != nil { return fake.NewBuildStub(arg1)
return fake.LookupBuildStub(arg1, arg2)
} }
if specificReturn { if specificReturn {
return ret.result1 return ret.result1
} }
fakeReturns := fake.lookupBuildReturns fakeReturns := fake.newBuildReturns
return fakeReturns.result1 return fakeReturns.result1
} }
func (fake *FakeEngine) LookupBuildCallCount() int { func (fake *FakeEngine) NewBuildCallCount() int {
fake.lookupBuildMutex.RLock() fake.newBuildMutex.RLock()
defer fake.lookupBuildMutex.RUnlock() defer fake.newBuildMutex.RUnlock()
return len(fake.lookupBuildArgsForCall) return len(fake.newBuildArgsForCall)
} }
func (fake *FakeEngine) LookupBuildCalls(stub func(lager.Logger, db.Build) engine.Build) { func (fake *FakeEngine) NewBuildCalls(stub func(db.Build) engine.Runnable) {
fake.lookupBuildMutex.Lock() fake.newBuildMutex.Lock()
defer fake.lookupBuildMutex.Unlock() defer fake.newBuildMutex.Unlock()
fake.LookupBuildStub = stub fake.NewBuildStub = stub
} }
func (fake *FakeEngine) LookupBuildArgsForCall(i int) (lager.Logger, db.Build) { func (fake *FakeEngine) NewBuildArgsForCall(i int) db.Build {
fake.lookupBuildMutex.RLock() fake.newBuildMutex.RLock()
defer fake.lookupBuildMutex.RUnlock() defer fake.newBuildMutex.RUnlock()
argsForCall := fake.lookupBuildArgsForCall[i] argsForCall := fake.newBuildArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2 return argsForCall.arg1
} }
func (fake *FakeEngine) LookupBuildReturns(result1 engine.Build) { func (fake *FakeEngine) NewBuildReturns(result1 engine.Runnable) {
fake.lookupBuildMutex.Lock() fake.newBuildMutex.Lock()
defer fake.lookupBuildMutex.Unlock() defer fake.newBuildMutex.Unlock()
fake.LookupBuildStub = nil fake.NewBuildStub = nil
fake.lookupBuildReturns = struct { fake.newBuildReturns = struct {
result1 engine.Build result1 engine.Runnable
}{result1} }{result1}
} }
func (fake *FakeEngine) LookupBuildReturnsOnCall(i int, result1 engine.Build) { func (fake *FakeEngine) NewBuildReturnsOnCall(i int, result1 engine.Runnable) {
fake.lookupBuildMutex.Lock() fake.newBuildMutex.Lock()
defer fake.lookupBuildMutex.Unlock() defer fake.newBuildMutex.Unlock()
fake.LookupBuildStub = nil fake.NewBuildStub = nil
if fake.lookupBuildReturnsOnCall == nil { if fake.newBuildReturnsOnCall == nil {
fake.lookupBuildReturnsOnCall = make(map[int]struct { fake.newBuildReturnsOnCall = make(map[int]struct {
result1 engine.Build result1 engine.Runnable
}) })
} }
fake.lookupBuildReturnsOnCall[i] = struct { fake.newBuildReturnsOnCall[i] = struct {
result1 engine.Build result1 engine.Runnable
}{result1} }{result1}
} }
@ -126,8 +124,8 @@ func (fake *FakeEngine) ReleaseAllArgsForCall(i int) lager.Logger {
func (fake *FakeEngine) Invocations() map[string][][]interface{} { func (fake *FakeEngine) Invocations() map[string][][]interface{} {
fake.invocationsMutex.RLock() fake.invocationsMutex.RLock()
defer fake.invocationsMutex.RUnlock() defer fake.invocationsMutex.RUnlock()
fake.lookupBuildMutex.RLock() fake.newBuildMutex.RLock()
defer fake.lookupBuildMutex.RUnlock() defer fake.newBuildMutex.RUnlock()
fake.releaseAllMutex.RLock() fake.releaseAllMutex.RLock()
defer fake.releaseAllMutex.RUnlock() defer fake.releaseAllMutex.RUnlock()
copiedInvocations := map[string][][]interface{}{} copiedInvocations := map[string][][]interface{}{}

View File

@ -0,0 +1,76 @@
// Code generated by counterfeiter. DO NOT EDIT.
package enginefakes
import (
"sync"
"code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc/engine"
)
type FakeRunnable struct {
RunStub func(lager.Logger)
runMutex sync.RWMutex
runArgsForCall []struct {
arg1 lager.Logger
}
invocations map[string][][]interface{}
invocationsMutex sync.RWMutex
}
func (fake *FakeRunnable) Run(arg1 lager.Logger) {
fake.runMutex.Lock()
fake.runArgsForCall = append(fake.runArgsForCall, struct {
arg1 lager.Logger
}{arg1})
fake.recordInvocation("Run", []interface{}{arg1})
fake.runMutex.Unlock()
if fake.RunStub != nil {
fake.RunStub(arg1)
}
}
func (fake *FakeRunnable) RunCallCount() int {
fake.runMutex.RLock()
defer fake.runMutex.RUnlock()
return len(fake.runArgsForCall)
}
func (fake *FakeRunnable) RunCalls(stub func(lager.Logger)) {
fake.runMutex.Lock()
defer fake.runMutex.Unlock()
fake.RunStub = stub
}
func (fake *FakeRunnable) RunArgsForCall(i int) lager.Logger {
fake.runMutex.RLock()
defer fake.runMutex.RUnlock()
argsForCall := fake.runArgsForCall[i]
return argsForCall.arg1
}
func (fake *FakeRunnable) Invocations() map[string][][]interface{} {
fake.invocationsMutex.RLock()
defer fake.invocationsMutex.RUnlock()
fake.runMutex.RLock()
defer fake.runMutex.RUnlock()
copiedInvocations := map[string][][]interface{}{}
for key, value := range fake.invocations {
copiedInvocations[key] = value
}
return copiedInvocations
}
func (fake *FakeRunnable) recordInvocation(key string, args []interface{}) {
fake.invocationsMutex.Lock()
defer fake.invocationsMutex.Unlock()
if fake.invocations == nil {
fake.invocations = map[string][][]interface{}{}
}
if fake.invocations[key] == nil {
fake.invocations[key] = [][]interface{}{}
}
fake.invocations[key] = append(fake.invocations[key], args)
}
var _ engine.Runnable = new(FakeRunnable)

View File

@ -6,6 +6,7 @@ import (
"sync" "sync"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/exec" "github.com/concourse/concourse/atc/exec"
) )
@ -40,6 +41,13 @@ type FakeGetDelegate struct {
initializingArgsForCall []struct { initializingArgsForCall []struct {
arg1 lager.Logger arg1 lager.Logger
} }
SaveVersionStub func(lager.Logger, string, exec.VersionInfo)
saveVersionMutex sync.RWMutex
saveVersionArgsForCall []struct {
arg1 lager.Logger
arg2 string
arg3 exec.VersionInfo
}
StartingStub func(lager.Logger) StartingStub func(lager.Logger)
startingMutex sync.RWMutex startingMutex sync.RWMutex
startingArgsForCall []struct { startingArgsForCall []struct {
@ -65,6 +73,13 @@ type FakeGetDelegate struct {
stdoutReturnsOnCall map[int]struct { stdoutReturnsOnCall map[int]struct {
result1 io.Writer result1 io.Writer
} }
UpdateVersionStub func(lager.Logger, atc.GetPlan, exec.VersionInfo)
updateVersionMutex sync.RWMutex
updateVersionArgsForCall []struct {
arg1 lager.Logger
arg2 atc.GetPlan
arg3 exec.VersionInfo
}
invocations map[string][][]interface{} invocations map[string][][]interface{}
invocationsMutex sync.RWMutex invocationsMutex sync.RWMutex
} }
@ -225,6 +240,39 @@ func (fake *FakeGetDelegate) InitializingArgsForCall(i int) lager.Logger {
return argsForCall.arg1 return argsForCall.arg1
} }
func (fake *FakeGetDelegate) SaveVersion(arg1 lager.Logger, arg2 string, arg3 exec.VersionInfo) {
fake.saveVersionMutex.Lock()
fake.saveVersionArgsForCall = append(fake.saveVersionArgsForCall, struct {
arg1 lager.Logger
arg2 string
arg3 exec.VersionInfo
}{arg1, arg2, arg3})
fake.recordInvocation("SaveVersion", []interface{}{arg1, arg2, arg3})
fake.saveVersionMutex.Unlock()
if fake.SaveVersionStub != nil {
fake.SaveVersionStub(arg1, arg2, arg3)
}
}
func (fake *FakeGetDelegate) SaveVersionCallCount() int {
fake.saveVersionMutex.RLock()
defer fake.saveVersionMutex.RUnlock()
return len(fake.saveVersionArgsForCall)
}
func (fake *FakeGetDelegate) SaveVersionCalls(stub func(lager.Logger, string, exec.VersionInfo)) {
fake.saveVersionMutex.Lock()
defer fake.saveVersionMutex.Unlock()
fake.SaveVersionStub = stub
}
func (fake *FakeGetDelegate) SaveVersionArgsForCall(i int) (lager.Logger, string, exec.VersionInfo) {
fake.saveVersionMutex.RLock()
defer fake.saveVersionMutex.RUnlock()
argsForCall := fake.saveVersionArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
}
func (fake *FakeGetDelegate) Starting(arg1 lager.Logger) { func (fake *FakeGetDelegate) Starting(arg1 lager.Logger) {
fake.startingMutex.Lock() fake.startingMutex.Lock()
fake.startingArgsForCall = append(fake.startingArgsForCall, struct { fake.startingArgsForCall = append(fake.startingArgsForCall, struct {
@ -360,6 +408,39 @@ func (fake *FakeGetDelegate) StdoutReturnsOnCall(i int, result1 io.Writer) {
}{result1} }{result1}
} }
func (fake *FakeGetDelegate) UpdateVersion(arg1 lager.Logger, arg2 atc.GetPlan, arg3 exec.VersionInfo) {
fake.updateVersionMutex.Lock()
fake.updateVersionArgsForCall = append(fake.updateVersionArgsForCall, struct {
arg1 lager.Logger
arg2 atc.GetPlan
arg3 exec.VersionInfo
}{arg1, arg2, arg3})
fake.recordInvocation("UpdateVersion", []interface{}{arg1, arg2, arg3})
fake.updateVersionMutex.Unlock()
if fake.UpdateVersionStub != nil {
fake.UpdateVersionStub(arg1, arg2, arg3)
}
}
func (fake *FakeGetDelegate) UpdateVersionCallCount() int {
fake.updateVersionMutex.RLock()
defer fake.updateVersionMutex.RUnlock()
return len(fake.updateVersionArgsForCall)
}
func (fake *FakeGetDelegate) UpdateVersionCalls(stub func(lager.Logger, atc.GetPlan, exec.VersionInfo)) {
fake.updateVersionMutex.Lock()
defer fake.updateVersionMutex.Unlock()
fake.UpdateVersionStub = stub
}
func (fake *FakeGetDelegate) UpdateVersionArgsForCall(i int) (lager.Logger, atc.GetPlan, exec.VersionInfo) {
fake.updateVersionMutex.RLock()
defer fake.updateVersionMutex.RUnlock()
argsForCall := fake.updateVersionArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
}
func (fake *FakeGetDelegate) Invocations() map[string][][]interface{} { func (fake *FakeGetDelegate) Invocations() map[string][][]interface{} {
fake.invocationsMutex.RLock() fake.invocationsMutex.RLock()
defer fake.invocationsMutex.RUnlock() defer fake.invocationsMutex.RUnlock()
@ -371,12 +452,16 @@ func (fake *FakeGetDelegate) Invocations() map[string][][]interface{} {
defer fake.imageVersionDeterminedMutex.RUnlock() defer fake.imageVersionDeterminedMutex.RUnlock()
fake.initializingMutex.RLock() fake.initializingMutex.RLock()
defer fake.initializingMutex.RUnlock() defer fake.initializingMutex.RUnlock()
fake.saveVersionMutex.RLock()
defer fake.saveVersionMutex.RUnlock()
fake.startingMutex.RLock() fake.startingMutex.RLock()
defer fake.startingMutex.RUnlock() defer fake.startingMutex.RUnlock()
fake.stderrMutex.RLock() fake.stderrMutex.RLock()
defer fake.stderrMutex.RUnlock() defer fake.stderrMutex.RUnlock()
fake.stdoutMutex.RLock() fake.stdoutMutex.RLock()
defer fake.stdoutMutex.RUnlock() defer fake.stdoutMutex.RUnlock()
fake.updateVersionMutex.RLock()
defer fake.updateVersionMutex.RUnlock()
copiedInvocations := map[string][][]interface{}{} copiedInvocations := map[string][][]interface{}{}
for key, value := range fake.invocations { for key, value := range fake.invocations {
copiedInvocations[key] = value copiedInvocations[key] = value

View File

@ -6,6 +6,7 @@ import (
"sync" "sync"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/exec" "github.com/concourse/concourse/atc/exec"
) )
@ -40,6 +41,15 @@ type FakePutDelegate struct {
initializingArgsForCall []struct { initializingArgsForCall []struct {
arg1 lager.Logger arg1 lager.Logger
} }
SaveOutputStub func(lager.Logger, atc.PutPlan, atc.Source, atc.VersionedResourceTypes, exec.VersionInfo)
saveOutputMutex sync.RWMutex
saveOutputArgsForCall []struct {
arg1 lager.Logger
arg2 atc.PutPlan
arg3 atc.Source
arg4 atc.VersionedResourceTypes
arg5 exec.VersionInfo
}
StartingStub func(lager.Logger) StartingStub func(lager.Logger)
startingMutex sync.RWMutex startingMutex sync.RWMutex
startingArgsForCall []struct { startingArgsForCall []struct {
@ -225,6 +235,41 @@ func (fake *FakePutDelegate) InitializingArgsForCall(i int) lager.Logger {
return argsForCall.arg1 return argsForCall.arg1
} }
func (fake *FakePutDelegate) SaveOutput(arg1 lager.Logger, arg2 atc.PutPlan, arg3 atc.Source, arg4 atc.VersionedResourceTypes, arg5 exec.VersionInfo) {
fake.saveOutputMutex.Lock()
fake.saveOutputArgsForCall = append(fake.saveOutputArgsForCall, struct {
arg1 lager.Logger
arg2 atc.PutPlan
arg3 atc.Source
arg4 atc.VersionedResourceTypes
arg5 exec.VersionInfo
}{arg1, arg2, arg3, arg4, arg5})
fake.recordInvocation("SaveOutput", []interface{}{arg1, arg2, arg3, arg4, arg5})
fake.saveOutputMutex.Unlock()
if fake.SaveOutputStub != nil {
fake.SaveOutputStub(arg1, arg2, arg3, arg4, arg5)
}
}
func (fake *FakePutDelegate) SaveOutputCallCount() int {
fake.saveOutputMutex.RLock()
defer fake.saveOutputMutex.RUnlock()
return len(fake.saveOutputArgsForCall)
}
func (fake *FakePutDelegate) SaveOutputCalls(stub func(lager.Logger, atc.PutPlan, atc.Source, atc.VersionedResourceTypes, exec.VersionInfo)) {
fake.saveOutputMutex.Lock()
defer fake.saveOutputMutex.Unlock()
fake.SaveOutputStub = stub
}
func (fake *FakePutDelegate) SaveOutputArgsForCall(i int) (lager.Logger, atc.PutPlan, atc.Source, atc.VersionedResourceTypes, exec.VersionInfo) {
fake.saveOutputMutex.RLock()
defer fake.saveOutputMutex.RUnlock()
argsForCall := fake.saveOutputArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5
}
func (fake *FakePutDelegate) Starting(arg1 lager.Logger) { func (fake *FakePutDelegate) Starting(arg1 lager.Logger) {
fake.startingMutex.Lock() fake.startingMutex.Lock()
fake.startingArgsForCall = append(fake.startingArgsForCall, struct { fake.startingArgsForCall = append(fake.startingArgsForCall, struct {
@ -371,6 +416,8 @@ func (fake *FakePutDelegate) Invocations() map[string][][]interface{} {
defer fake.imageVersionDeterminedMutex.RUnlock() defer fake.imageVersionDeterminedMutex.RUnlock()
fake.initializingMutex.RLock() fake.initializingMutex.RLock()
defer fake.initializingMutex.RUnlock() defer fake.initializingMutex.RUnlock()
fake.saveOutputMutex.RLock()
defer fake.saveOutputMutex.RUnlock()
fake.startingMutex.RLock() fake.startingMutex.RLock()
defer fake.startingMutex.RUnlock() defer fake.startingMutex.RUnlock()
fake.stderrMutex.RLock() fake.stderrMutex.RLock()

View File

@ -41,90 +41,48 @@ type GetDelegate interface {
Initializing(lager.Logger) Initializing(lager.Logger)
Starting(lager.Logger) Starting(lager.Logger)
Finished(lager.Logger, ExitStatus, VersionInfo) Finished(lager.Logger, ExitStatus, VersionInfo)
UpdateVersion(lager.Logger, atc.GetPlan, VersionInfo)
} }
// GetStep will fetch a version of a resource on a worker that supports the // GetStep will fetch a version of a resource on a worker that supports the
// resource type. // resource type.
type GetStep struct { type GetStep struct {
build db.Build planID atc.PlanID
plan atc.GetPlan
name string metadata StepMetadata
resourceType string containerMetadata db.ContainerMetadata
resource string secrets creds.Secrets
source creds.Source resourceFetcher resource.Fetcher
params creds.Params resourceCacheFactory db.ResourceCacheFactory
versionSource VersionSource strategy worker.ContainerPlacementStrategy
tags atc.Tags workerPool worker.Pool
delegate GetDelegate
delegate GetDelegate succeeded bool
resourceFetcher resource.Fetcher
teamID int
buildID int
planID atc.PlanID
containerMetadata db.ContainerMetadata
dbResourceCacheFactory db.ResourceCacheFactory
stepMetadata StepMetadata
resourceTypes creds.VersionedResourceTypes
succeeded bool
strategy worker.ContainerPlacementStrategy
workerPool worker.Pool
} }
func NewGetStep( func NewGetStep(
build db.Build,
name string,
resourceType string,
resource string,
source creds.Source,
params creds.Params,
versionSource VersionSource,
tags atc.Tags,
delegate GetDelegate,
resourceFetcher resource.Fetcher,
teamID int,
buildID int,
planID atc.PlanID, planID atc.PlanID,
plan atc.GetPlan,
metadata StepMetadata,
containerMetadata db.ContainerMetadata, containerMetadata db.ContainerMetadata,
dbResourceCacheFactory db.ResourceCacheFactory, secrets creds.Secrets,
stepMetadata StepMetadata, resourceFetcher resource.Fetcher,
resourceCacheFactory db.ResourceCacheFactory,
resourceTypes creds.VersionedResourceTypes,
strategy worker.ContainerPlacementStrategy, strategy worker.ContainerPlacementStrategy,
workerPool worker.Pool, workerPool worker.Pool,
delegate GetDelegate,
) Step { ) Step {
return &GetStep{ return &GetStep{
build: build, planID: planID,
plan: plan,
name: name, metadata: metadata,
resourceType: resourceType, containerMetadata: containerMetadata,
resource: resource, secrets: secrets,
source: source, resourceFetcher: resourceFetcher,
params: params, resourceCacheFactory: resourceCacheFactory,
versionSource: versionSource, strategy: strategy,
tags: tags, workerPool: workerPool,
delegate: delegate,
delegate: delegate,
resourceFetcher: resourceFetcher,
teamID: teamID,
buildID: buildID,
planID: planID,
containerMetadata: containerMetadata,
dbResourceCacheFactory: dbResourceCacheFactory,
stepMetadata: stepMetadata,
resourceTypes: resourceTypes,
strategy: strategy,
workerPool: workerPool,
} }
} }
@ -154,35 +112,56 @@ func NewGetStep(
func (step *GetStep) Run(ctx context.Context, state RunState) error { func (step *GetStep) Run(ctx context.Context, state RunState) error {
logger := lagerctx.FromContext(ctx) logger := lagerctx.FromContext(ctx)
logger = logger.Session("get-step", lager.Data{ logger = logger.Session("get-step", lager.Data{
"step-name": step.name, "step-name": step.plan.Name,
"job-id": step.build.JobID(), "job-id": step.metadata.JobID,
}) })
step.delegate.Initializing(logger) step.delegate.Initializing(logger)
version, err := step.versionSource.Version(state) variables := creds.NewVariables(step.secrets, step.metadata.TeamName, step.metadata.PipelineName)
source, err := creds.NewSource(variables, step.plan.Source).Evaluate()
if err != nil { if err != nil {
return err return err
} }
source, err := step.source.Evaluate() params, err := creds.NewParams(variables, step.plan.Params).Evaluate()
if err != nil { if err != nil {
return err return err
} }
params, err := step.params.Evaluate() resourceTypes, err := creds.NewVersionedResourceTypes(variables, step.plan.VersionedResourceTypes).Evaluate()
if err != nil { if err != nil {
return err return err
} }
resourceCache, err := step.dbResourceCacheFactory.FindOrCreateResourceCache( version, err := NewVersionSourceFromPlan(&step.plan).Version(state)
logger, if err != nil {
db.ForBuild(step.buildID), return err
step.resourceType, }
containerSpec := worker.ContainerSpec{
ImageSpec: worker.ImageSpec{
ResourceType: step.plan.Type,
},
TeamID: step.metadata.TeamID,
Env: step.metadata.Env(),
}
workerSpec := worker.WorkerSpec{
ResourceType: step.plan.Type,
Tags: step.plan.Tags,
TeamID: step.metadata.TeamID,
ResourceTypes: resourceTypes,
}
resourceCache, err := step.resourceCacheFactory.FindOrCreateResourceCache(
db.ForBuild(step.metadata.BuildID),
step.plan.Type,
version, version,
source, source,
params, params,
step.resourceTypes, resourceTypes,
) )
if err != nil { if err != nil {
logger.Error("failed-to-create-resource-cache", err) logger.Error("failed-to-create-resource-cache", err)
@ -190,31 +169,24 @@ func (step *GetStep) Run(ctx context.Context, state RunState) error {
} }
resourceInstance := resource.NewResourceInstance( resourceInstance := resource.NewResourceInstance(
resource.ResourceType(step.resourceType), resource.ResourceType(step.plan.Type),
version, version,
source, source,
params, params,
step.resourceTypes, resourceTypes,
resourceCache, resourceCache,
db.NewBuildStepContainerOwner(step.buildID, step.planID, step.teamID), db.NewBuildStepContainerOwner(step.metadata.BuildID, step.planID, step.metadata.TeamID),
) )
containerSpec := worker.ContainerSpec{ chosenWorker, err := step.workerPool.FindOrChooseWorkerForContainer(
ImageSpec: worker.ImageSpec{ ctx,
ResourceType: step.resourceType, logger,
}, resourceInstance.ContainerOwner(),
TeamID: step.teamID, containerSpec,
Env: step.stepMetadata.Env(), step.containerMetadata,
} workerSpec,
step.strategy,
workerSpec := worker.WorkerSpec{ )
ResourceType: step.resourceType,
Tags: step.tags,
TeamID: step.teamID,
ResourceTypes: step.resourceTypes,
}
chosenWorker, err := step.workerPool.FindOrChooseWorkerForContainer(logger, resourceInstance.ContainerOwner(), containerSpec, workerSpec, step.strategy)
if err != nil { if err != nil {
return err return err
} }
@ -229,7 +201,7 @@ func (step *GetStep) Run(ctx context.Context, state RunState) error {
}, },
chosenWorker, chosenWorker,
containerSpec, containerSpec,
step.resourceTypes, resourceTypes,
resourceInstance, resourceInstance,
step.delegate, step.delegate,
) )
@ -244,50 +216,23 @@ func (step *GetStep) Run(ctx context.Context, state RunState) error {
return err return err
} }
state.Artifacts().RegisterSource(artifact.Name(step.name), &getArtifactSource{ state.Artifacts().RegisterSource(artifact.Name(step.plan.Name), &getArtifactSource{
resourceInstance: resourceInstance, resourceInstance: resourceInstance,
versionedSource: versionedSource, versionedSource: versionedSource,
}) })
if step.resource != "" { versionInfo := VersionInfo{
pipeline, found, err := step.build.Pipeline() Version: versionedSource.Version(),
if err != nil { Metadata: versionedSource.Metadata(),
logger.Error("failed-to-find-pipeline", err, lager.Data{"name": step.name, "pipeline-name": step.build.PipelineName(), "pipeline-id": step.build.PipelineID()}) }
return err
}
if !found { if step.plan.Resource != "" {
logger.Debug("pipeline-not-found", lager.Data{"name": step.name, "pipeline-name": step.build.PipelineName(), "pipeline-id": step.build.PipelineID()}) step.delegate.UpdateVersion(logger, step.plan, versionInfo)
return ErrPipelineNotFound{step.build.PipelineName()}
}
resource, found, err := pipeline.Resource(step.resource)
if err != nil {
logger.Error("failed-to-find-resource", err, lager.Data{"name": step.name, "pipeline-name": step.build.PipelineName(), "resource": step.resource})
return err
}
if !found {
logger.Debug("resource-not-found", lager.Data{"name": step.name, "pipeline-name": step.build.PipelineName(), "resource": step.resource})
return ErrResourceNotFound{step.resource}
}
// Find or Save* the version used in the get step, and update the Metadata
// *saving will occur when the resource's config has changed, but it hasn't
// checked yet, so the resource config versions don't exist
_, err = resource.SaveUncheckedVersion(versionedSource.Version(), db.NewResourceConfigMetadataFields(versionedSource.Metadata()), resourceCache.ResourceConfig(), step.resourceTypes)
if err != nil {
logger.Error("failed-to-save-resource-config-version", err, lager.Data{"name": step.name, "resource": step.resource, "version": versionedSource.Version()})
return err
}
} }
step.succeeded = true step.succeeded = true
step.delegate.Finished(logger, 0, VersionInfo{ step.delegate.Finished(logger, 0, versionInfo)
Version: versionedSource.Version(),
Metadata: versionedSource.Metadata(),
})
return nil return nil
} }

View File

@ -12,7 +12,6 @@ import (
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/creds/credsfakes" "github.com/concourse/concourse/atc/creds/credsfakes"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
@ -40,13 +39,11 @@ var _ = Describe("GetStep", func() {
fakeResourceFetcher *resourcefakes.FakeFetcher fakeResourceFetcher *resourcefakes.FakeFetcher
fakeResourceCacheFactory *dbfakes.FakeResourceCacheFactory fakeResourceCacheFactory *dbfakes.FakeResourceCacheFactory
fakeSecretManager *credsfakes.FakeSecrets fakeSecretManager *credsfakes.FakeSecrets
variables creds.Variables
fakeBuild *dbfakes.FakeBuild
fakeDelegate *execfakes.FakeGetDelegate fakeDelegate *execfakes.FakeGetDelegate
getPlan *atc.GetPlan getPlan *atc.GetPlan
fakeVersionedSource *resourcefakes.FakeVersionedSource fakeVersionedSource *resourcefakes.FakeVersionedSource
resourceTypes atc.VersionedResourceTypes interpolatedResourceTypes atc.VersionedResourceTypes
artifactRepository *artifact.Repository artifactRepository *artifact.Repository
state *execfakes.FakeRunState state *execfakes.FakeRunState
@ -55,16 +52,22 @@ var _ = Describe("GetStep", func() {
stepErr error stepErr error
containerMetadata = db.ContainerMetadata{ containerMetadata = db.ContainerMetadata{
PipelineID: 4567, WorkingDirectory: resource.ResourcesDir("get"),
Type: db.ContainerTypeGet, PipelineID: 4567,
StepName: "some-step", Type: db.ContainerTypeGet,
StepName: "some-step",
} }
stepMetadata testMetadata = []string{"a=1", "b=2"} stepMetadata = exec.StepMetadata{
TeamID: 123,
TeamName: "some-team",
BuildID: 42,
BuildName: "some-build",
PipelineID: 4567,
PipelineName: "some-pipeline",
}
teamID = 123 planID = 56
buildID = 42
planID = 56
) )
BeforeEach(func() { BeforeEach(func() {
@ -79,7 +82,6 @@ var _ = Describe("GetStep", func() {
fakeSecretManager = new(credsfakes.FakeSecrets) fakeSecretManager = new(credsfakes.FakeSecrets)
fakeSecretManager.GetReturns("super-secret-source", nil, true, nil) fakeSecretManager.GetReturns("super-secret-source", nil, true, nil)
variables = creds.NewVariables(fakeSecretManager, "team", "pipeline")
artifactRepository = artifact.NewRepository() artifactRepository = artifact.NewRepository()
state = new(execfakes.FakeRunState) state = new(execfakes.FakeRunState)
@ -88,19 +90,25 @@ var _ = Describe("GetStep", func() {
fakeVersionedSource = new(resourcefakes.FakeVersionedSource) fakeVersionedSource = new(resourcefakes.FakeVersionedSource)
fakeResourceFetcher.FetchReturns(fakeVersionedSource, nil) fakeResourceFetcher.FetchReturns(fakeVersionedSource, nil)
fakeBuild = new(dbfakes.FakeBuild)
fakeBuild.IDReturns(buildID)
fakeBuild.TeamIDReturns(teamID)
fakeBuild.PipelineNameReturns("pipeline")
fakeDelegate = new(execfakes.FakeGetDelegate) fakeDelegate = new(execfakes.FakeGetDelegate)
resourceTypes = atc.VersionedResourceTypes{ uninterpolatedResourceTypes := atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "custom-resource", Name: "custom-resource",
Type: "custom-type", Type: "custom-type",
Source: atc.Source{"some-custom": "source"}, Source: atc.Source{"some-custom": "((source-param))"},
},
Version: atc.Version{"some-custom": "version"},
},
}
interpolatedResourceTypes = atc.VersionedResourceTypes{
{
ResourceType: atc.ResourceType{
Name: "custom-resource",
Type: "custom-type",
Source: atc.Source{"some-custom": "super-secret-source"},
}, },
Version: atc.Version{"some-custom": "version"}, Version: atc.Version{"some-custom": "version"},
}, },
@ -113,10 +121,8 @@ var _ = Describe("GetStep", func() {
Params: atc.Params{"some-param": "some-value"}, Params: atc.Params{"some-param": "some-value"},
Tags: []string{"some", "tags"}, Tags: []string{"some", "tags"},
Version: &atc.Version{"some-version": "some-value"}, Version: &atc.Version{"some-version": "some-value"},
VersionedResourceTypes: resourceTypes, VersionedResourceTypes: uninterpolatedResourceTypes,
} }
containerMetadata.WorkingDirectory = resource.ResourcesDir("get")
}) })
AfterEach(func() { AfterEach(func() {
@ -129,32 +135,17 @@ var _ = Describe("GetStep", func() {
Get: getPlan, Get: getPlan,
} }
variables := creds.NewVariables(fakeSecretManager, fakeBuild.TeamName(), fakeBuild.PipelineName())
getStep = exec.NewGetStep( getStep = exec.NewGetStep(
fakeBuild,
plan.Get.Name,
plan.Get.Type,
plan.Get.Resource,
creds.NewSource(variables, plan.Get.Source),
creds.NewParams(variables, plan.Get.Params),
exec.NewVersionSourceFromPlan(plan.Get),
plan.Get.Tags,
fakeDelegate,
fakeResourceFetcher,
fakeBuild.TeamID(),
fakeBuild.ID(),
plan.ID, plan.ID,
containerMetadata, *plan.Get,
fakeResourceCacheFactory,
stepMetadata, stepMetadata,
containerMetadata,
creds.NewVersionedResourceTypes(variables, plan.Get.VersionedResourceTypes), fakeSecretManager,
fakeResourceFetcher,
fakeResourceCacheFactory,
fakeStrategy, fakeStrategy,
fakePool, fakePool,
fakeDelegate,
) )
stepErr = getStep.Run(ctx, state) stepErr = getStep.Run(ctx, state)
@ -162,20 +153,21 @@ var _ = Describe("GetStep", func() {
It("finds or chooses a worker", func() { It("finds or chooses a worker", func() {
Expect(fakePool.FindOrChooseWorkerForContainerCallCount()).To(Equal(1)) Expect(fakePool.FindOrChooseWorkerForContainerCallCount()).To(Equal(1))
_, actualOwner, actualContainerSpec, actualWorkerSpec, strategy := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, actualOwner, actualContainerSpec, actualContainerMetadata, actualWorkerSpec, strategy := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(actualOwner).To(Equal(db.NewBuildStepContainerOwner(buildID, atc.PlanID(planID), teamID))) Expect(actualOwner).To(Equal(db.NewBuildStepContainerOwner(stepMetadata.BuildID, atc.PlanID(planID), stepMetadata.TeamID)))
Expect(actualContainerSpec).To(Equal(worker.ContainerSpec{ Expect(actualContainerSpec).To(Equal(worker.ContainerSpec{
ImageSpec: worker.ImageSpec{ ImageSpec: worker.ImageSpec{
ResourceType: "some-resource-type", ResourceType: "some-resource-type",
}, },
TeamID: teamID, TeamID: stepMetadata.TeamID,
Env: stepMetadata.Env(), Env: stepMetadata.Env(),
})) }))
Expect(actualContainerMetadata).To(Equal(containerMetadata))
Expect(actualWorkerSpec).To(Equal(worker.WorkerSpec{ Expect(actualWorkerSpec).To(Equal(worker.WorkerSpec{
ResourceType: "some-resource-type", ResourceType: "some-resource-type",
Tags: atc.Tags{"some", "tags"}, Tags: atc.Tags{"some", "tags"},
TeamID: teamID, TeamID: stepMetadata.TeamID,
ResourceTypes: creds.NewVersionedResourceTypes(variables, resourceTypes), ResourceTypes: interpolatedResourceTypes,
})) }))
Expect(strategy).To(Equal(fakeStrategy)) Expect(strategy).To(Equal(fakeStrategy))
}) })
@ -205,7 +197,7 @@ var _ = Describe("GetStep", func() {
ImageSpec: worker.ImageSpec{ ImageSpec: worker.ImageSpec{
ResourceType: "some-resource-type", ResourceType: "some-resource-type",
}, },
TeamID: teamID, TeamID: stepMetadata.TeamID,
Env: stepMetadata.Env(), Env: stepMetadata.Env(),
})) }))
Expect(resourceInstance).To(Equal(resource.NewResourceInstance( Expect(resourceInstance).To(Equal(resource.NewResourceInstance(
@ -213,11 +205,11 @@ var _ = Describe("GetStep", func() {
atc.Version{"some-version": "some-value"}, atc.Version{"some-version": "some-value"},
atc.Source{"some": "super-secret-source"}, atc.Source{"some": "super-secret-source"},
atc.Params{"some-param": "some-value"}, atc.Params{"some-param": "some-value"},
creds.NewVersionedResourceTypes(variables, resourceTypes), interpolatedResourceTypes,
nil, nil,
db.NewBuildStepContainerOwner(buildID, atc.PlanID(planID), teamID), db.NewBuildStepContainerOwner(stepMetadata.BuildID, atc.PlanID(planID), stepMetadata.TeamID),
))) )))
Expect(actualResourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, resourceTypes))) Expect(actualResourceTypes).To(Equal(interpolatedResourceTypes))
Expect(delegate).To(Equal(fakeDelegate)) Expect(delegate).To(Equal(fakeDelegate))
expectedLockName := fmt.Sprintf("%x", expectedLockName := fmt.Sprintf("%x",
sha256.Sum256([]byte( sha256.Sum256([]byte(
@ -231,7 +223,7 @@ var _ = Describe("GetStep", func() {
Context("when fetching resource succeeds", func() { Context("when fetching resource succeeds", func() {
BeforeEach(func() { BeforeEach(func() {
fakeVersionedSource.VersionReturns(atc.Version{"some": "version"}) fakeVersionedSource.VersionReturns(atc.Version{"some": "version"})
fakeVersionedSource.MetadataReturns([]atc.MetadataField{{"some", "metadata"}}) fakeVersionedSource.MetadataReturns([]atc.MetadataField{{Name: "some", Value: "metadata"}})
}) })
It("returns nil", func() { It("returns nil", func() {
@ -247,132 +239,31 @@ var _ = Describe("GetStep", func() {
_, status, info := fakeDelegate.FinishedArgsForCall(0) _, status, info := fakeDelegate.FinishedArgsForCall(0)
Expect(status).To(Equal(exec.ExitStatus(0))) Expect(status).To(Equal(exec.ExitStatus(0)))
Expect(info.Version).To(Equal(atc.Version{"some": "version"})) Expect(info.Version).To(Equal(atc.Version{"some": "version"}))
Expect(info.Metadata).To(Equal([]atc.MetadataField{{"some", "metadata"}})) Expect(info.Metadata).To(Equal([]atc.MetadataField{{Name: "some", Value: "metadata"}}))
}) })
Context("when getting a pipeline resource", func() { Context("when the plan has a resource", func() {
var fakeResourceCache *dbfakes.FakeUsedResourceCache
var fakeResourceConfig *dbfakes.FakeResourceConfig
BeforeEach(func() { BeforeEach(func() {
getPlan.Resource = "some-pipeline-resource" getPlan.Resource = "some-pipeline-resource"
fakeResourceCache = new(dbfakes.FakeUsedResourceCache)
fakeResourceConfig = new(dbfakes.FakeResourceConfig)
fakeResourceCache.ResourceConfigReturns(fakeResourceConfig)
fakeResourceCacheFactory.FindOrCreateResourceCacheReturns(fakeResourceCache, nil)
}) })
It("finds the pipeline", func() { It("saves a version for the resource", func() {
Expect(fakeBuild.PipelineCallCount()).To(Equal(1)) Expect(fakeDelegate.UpdateVersionCallCount()).To(Equal(1))
}) _, plan, info := fakeDelegate.UpdateVersionArgsForCall(0)
Expect(plan.Resource).To(Equal("some-pipeline-resource"))
Context("when finding the pipeline succeeds", func() { Expect(info.Version).To(Equal(atc.Version{"some": "version"}))
var fakePipeline *dbfakes.FakePipeline Expect(info.Metadata).To(Equal([]atc.MetadataField{{Name: "some", Value: "metadata"}}))
BeforeEach(func() {
fakePipeline = new(dbfakes.FakePipeline)
fakeBuild.PipelineReturns(fakePipeline, true, nil)
})
It("finds the resource", func() {
Expect(fakePipeline.ResourceCallCount()).To(Equal(1))
Expect(fakePipeline.ResourceArgsForCall(0)).To(Equal(getPlan.Resource))
})
Context("when finding the resource succeeds", func() {
var fakeResource *dbfakes.FakeResource
BeforeEach(func() {
fakeResource = new(dbfakes.FakeResource)
fakePipeline.ResourceReturns(fakeResource, true, nil)
})
It("saves the resource config version", func() {
Expect(fakeResource.SaveUncheckedVersionCallCount()).To(Equal(1))
version, metadata, resourceConfig, actualResourceTypes := fakeResource.SaveUncheckedVersionArgsForCall(0)
Expect(version).To(Equal(atc.Version{"some": "version"}))
Expect(metadata).To(Equal(db.NewResourceConfigMetadataFields([]atc.MetadataField{{"some", "metadata"}})))
Expect(resourceConfig).To(Equal(fakeResourceConfig))
Expect(actualResourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, resourceTypes)))
})
Context("when it fails to save the version", func() {
disaster := errors.New("oops")
BeforeEach(func() {
fakeResource.SaveUncheckedVersionReturns(false, disaster)
})
It("returns an error", func() {
Expect(stepErr).To(Equal(disaster))
})
})
})
Context("when it fails to find the resource", func() {
disaster := errors.New("oops")
BeforeEach(func() {
fakePipeline.ResourceReturns(nil, false, disaster)
})
It("returns an error", func() {
Expect(stepErr).To(Equal(disaster))
})
})
Context("when the resource is not found", func() {
BeforeEach(func() {
fakePipeline.ResourceReturns(nil, false, nil)
})
It("returns an ErrResourceNotFound", func() {
Expect(stepErr).To(Equal(exec.ErrResourceNotFound{"some-pipeline-resource"}))
})
})
})
Context("when it fails to find the pipeline", func() {
disaster := errors.New("oops")
BeforeEach(func() {
fakeBuild.PipelineReturns(nil, false, disaster)
})
It("returns an error", func() {
Expect(stepErr).To(Equal(disaster))
})
})
Context("when the pipeline is not found", func() {
BeforeEach(func() {
fakeBuild.PipelineReturns(nil, false, nil)
})
It("returns an ErrPipelineNotFound", func() {
Expect(stepErr).To(Equal(exec.ErrPipelineNotFound{"pipeline"}))
})
}) })
}) })
Context("when getting an anonymous resource", func() { Context("when getting an anonymous resource", func() {
var fakeResourceCache *dbfakes.FakeUsedResourceCache
var fakeResourceConfig *dbfakes.FakeResourceConfig
BeforeEach(func() { BeforeEach(func() {
getPlan.Resource = "" getPlan.Resource = ""
fakeResourceCache = new(dbfakes.FakeUsedResourceCache)
fakeResourceConfig = new(dbfakes.FakeResourceConfig)
fakeResourceCache.ResourceConfigReturns(fakeResourceConfig)
fakeResourceCacheFactory.FindOrCreateResourceCacheReturns(fakeResourceCache, nil)
}) })
It("does not find the pipeline", func() { It("does not save the version", func() {
// TODO: this can be removed once /check returns metadata Expect(fakeDelegate.UpdateVersionCallCount()).To(Equal(0))
Expect(fakeBuild.PipelineCallCount()).To(Equal(0))
}) })
}) })

View File

@ -20,75 +20,48 @@ type PutDelegate interface {
Initializing(lager.Logger) Initializing(lager.Logger)
Starting(lager.Logger) Starting(lager.Logger)
Finished(lager.Logger, ExitStatus, VersionInfo) Finished(lager.Logger, ExitStatus, VersionInfo)
SaveOutput(lager.Logger, atc.PutPlan, atc.Source, atc.VersionedResourceTypes, VersionInfo)
} }
// PutStep produces a resource version using preconfigured params and any data // PutStep produces a resource version using preconfigured params and any data
// available in the worker.ArtifactRepository. // available in the worker.ArtifactRepository.
type PutStep struct { type PutStep struct {
build db.Build
name string
resourceType string
resource string
source creds.Source
params creds.Params
tags atc.Tags
inputs PutInputs
delegate PutDelegate
pool worker.Pool
resourceConfigFactory db.ResourceConfigFactory
planID atc.PlanID planID atc.PlanID
plan atc.PutPlan
metadata StepMetadata
containerMetadata db.ContainerMetadata containerMetadata db.ContainerMetadata
stepMetadata StepMetadata secrets creds.Secrets
resourceFactory resource.ResourceFactory
resourceTypes creds.VersionedResourceTypes resourceConfigFactory db.ResourceConfigFactory
strategy worker.ContainerPlacementStrategy
versionInfo VersionInfo pool worker.Pool
succeeded bool delegate PutDelegate
succeeded bool
strategy worker.ContainerPlacementStrategy
resourceFactory resource.ResourceFactory
} }
func NewPutStep( func NewPutStep(
build db.Build,
name string,
resourceType string,
resourceName string,
source creds.Source,
params creds.Params,
tags atc.Tags,
inputs PutInputs,
delegate PutDelegate,
pool worker.Pool,
resourceConfigFactory db.ResourceConfigFactory,
planID atc.PlanID, planID atc.PlanID,
plan atc.PutPlan,
metadata StepMetadata,
containerMetadata db.ContainerMetadata, containerMetadata db.ContainerMetadata,
stepMetadata StepMetadata, secrets creds.Secrets,
resourceTypes creds.VersionedResourceTypes,
strategy worker.ContainerPlacementStrategy,
resourceFactory resource.ResourceFactory, resourceFactory resource.ResourceFactory,
resourceConfigFactory db.ResourceConfigFactory,
strategy worker.ContainerPlacementStrategy,
pool worker.Pool,
delegate PutDelegate,
) *PutStep { ) *PutStep {
return &PutStep{ return &PutStep{
build: build,
resourceType: resourceType,
name: name,
resource: resourceName,
source: source,
params: params,
tags: tags,
inputs: inputs,
delegate: delegate,
pool: pool,
resourceConfigFactory: resourceConfigFactory,
planID: planID, planID: planID,
plan: plan,
metadata: metadata,
containerMetadata: containerMetadata, containerMetadata: containerMetadata,
stepMetadata: stepMetadata, secrets: secrets,
resourceTypes: resourceTypes,
strategy: strategy,
resourceFactory: resourceFactory, resourceFactory: resourceFactory,
resourceConfigFactory: resourceConfigFactory,
pool: pool,
strategy: strategy,
delegate: delegate,
} }
} }
@ -103,40 +76,79 @@ func NewPutStep(
func (step *PutStep) Run(ctx context.Context, state RunState) error { func (step *PutStep) Run(ctx context.Context, state RunState) error {
logger := lagerctx.FromContext(ctx) logger := lagerctx.FromContext(ctx)
logger = logger.Session("put-step", lager.Data{ logger = logger.Session("put-step", lager.Data{
"step-name": step.name, "step-name": step.plan.Name,
"job-id": step.build.JobID(), "job-id": step.metadata.JobID,
}) })
step.delegate.Initializing(logger) step.delegate.Initializing(logger)
containerInputs, err := step.inputs.FindAll(state.Artifacts()) variables := creds.NewVariables(step.secrets, step.metadata.TeamName, step.metadata.PipelineName)
source, err := creds.NewSource(variables, step.plan.Source).Evaluate()
if err != nil {
return err
}
params, err := creds.NewParams(variables, step.plan.Params).Evaluate()
if err != nil {
return err
}
resourceTypes, err := creds.NewVersionedResourceTypes(variables, step.plan.VersionedResourceTypes).Evaluate()
if err != nil {
return err
}
var putInputs PutInputs
if step.plan.Inputs == nil {
// Put step defaults to all inputs if not specified
putInputs = NewAllInputs()
} else if step.plan.Inputs.All {
putInputs = NewAllInputs()
} else {
// Covers both cases where inputs are specified and when there are no
// inputs specified and "all" field is given a false boolean, which will
// result in no inputs attached
putInputs = NewSpecificInputs(step.plan.Inputs.Specified)
}
containerInputs, err := putInputs.FindAll(state.Artifacts())
if err != nil { if err != nil {
return err return err
} }
containerSpec := worker.ContainerSpec{ containerSpec := worker.ContainerSpec{
ImageSpec: worker.ImageSpec{ ImageSpec: worker.ImageSpec{
ResourceType: step.resourceType, ResourceType: step.plan.Type,
}, },
Tags: step.tags, Tags: step.plan.Tags,
TeamID: step.build.TeamID(), TeamID: step.metadata.TeamID,
Dir: resource.ResourcesDir("put"), Dir: step.containerMetadata.WorkingDirectory,
Env: step.stepMetadata.Env(), Env: step.metadata.Env(),
Inputs: containerInputs, Inputs: containerInputs,
} }
workerSpec := worker.WorkerSpec{ workerSpec := worker.WorkerSpec{
ResourceType: step.resourceType, ResourceType: step.plan.Type,
Tags: step.tags, Tags: step.plan.Tags,
TeamID: step.build.TeamID(), TeamID: step.metadata.TeamID,
ResourceTypes: step.resourceTypes, ResourceTypes: resourceTypes,
} }
owner := db.NewBuildStepContainerOwner(step.build.ID(), step.planID, step.build.TeamID()) owner := db.NewBuildStepContainerOwner(step.metadata.BuildID, step.planID, step.metadata.TeamID)
chosenWorker, err := step.pool.FindOrChooseWorkerForContainer(logger, owner, containerSpec, workerSpec, step.strategy)
chosenWorker, err := step.pool.FindOrChooseWorkerForContainer(
ctx,
logger,
owner,
containerSpec,
step.containerMetadata,
workerSpec,
step.strategy,
)
if err != nil { if err != nil {
return err return err
} }
@ -150,24 +162,13 @@ func (step *PutStep) Run(ctx context.Context, state RunState) error {
logger, logger,
step.delegate, step.delegate,
owner, owner,
step.containerMetadata,
containerSpec, containerSpec,
step.resourceTypes, resourceTypes,
) )
if err != nil { if err != nil {
return err return err
} }
source, err := step.source.Evaluate()
if err != nil {
return err
}
params, err := step.params.Evaluate()
if err != nil {
return err
}
step.delegate.Starting(logger) step.delegate.Starting(logger)
putResource := step.resourceFactory.NewResourceForContainer(container) putResource := step.resourceFactory.NewResourceForContainer(container)
@ -192,34 +193,24 @@ func (step *PutStep) Run(ctx context.Context, state RunState) error {
return err return err
} }
step.versionInfo = VersionInfo{ versionInfo := VersionInfo{
Version: versionedSource.Version(), Version: versionedSource.Version(),
Metadata: versionedSource.Metadata(), Metadata: versionedSource.Metadata(),
} }
if step.resource != "" { if step.plan.Resource != "" {
logger = logger.WithData(lager.Data{"step": step.name, "resource": step.resource, "resource-type": step.resourceType, "version": step.versionInfo.Version}) step.delegate.SaveOutput(logger, step.plan, source, resourceTypes, versionInfo)
err = step.build.SaveOutput(logger, step.resourceType, source, step.resourceTypes, step.versionInfo.Version, db.NewResourceConfigMetadataFields(step.versionInfo.Metadata), step.name, step.resource)
if err != nil {
logger.Error("failed-to-save-output", err)
return err
}
} }
state.StoreResult(step.planID, step.versionInfo) state.StoreResult(step.planID, versionInfo)
step.succeeded = true step.succeeded = true
step.delegate.Finished(logger, 0, step.versionInfo) step.delegate.Finished(logger, 0, versionInfo)
return nil return nil
} }
// VersionInfo returns the info of the pushed version.
func (step *PutStep) VersionInfo() VersionInfo {
return step.versionInfo
}
// Succeeded returns true if the resource script exited successfully. // Succeeded returns true if the resource script exited successfully.
func (step *PutStep) Succeeded() bool { func (step *PutStep) Succeeded() bool {
return step.succeeded return step.succeeded

View File

@ -4,9 +4,8 @@ import (
"context" "context"
"errors" "errors"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc/creds/credsfakes"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
"github.com/concourse/concourse/atc/exec" "github.com/concourse/concourse/atc/exec"
@ -26,61 +25,58 @@ var _ = Describe("PutStep", func() {
ctx context.Context ctx context.Context
cancel func() cancel func()
fakeBuild *dbfakes.FakeBuild
pipelineResourceName string
fakeStrategy *workerfakes.FakeContainerPlacementStrategy
fakePool *workerfakes.FakePool
fakeWorker *workerfakes.FakeWorker fakeWorker *workerfakes.FakeWorker
fakePool *workerfakes.FakePool
fakeStrategy *workerfakes.FakeContainerPlacementStrategy
fakeResourceFactory *resourcefakes.FakeResourceFactory fakeResourceFactory *resourcefakes.FakeResourceFactory
fakeResourceConfigFactory *dbfakes.FakeResourceConfigFactory fakeResourceConfigFactory *dbfakes.FakeResourceConfigFactory
fakeSecretManager *credsfakes.FakeSecrets
fakeDelegate *execfakes.FakePutDelegate
putPlan *atc.PutPlan
variables creds.Variables interpolatedResourceTypes atc.VersionedResourceTypes
stepMetadata testMetadata = []string{"a=1", "b=2"}
containerMetadata = db.ContainerMetadata{ containerMetadata = db.ContainerMetadata{
Type: db.ContainerTypePut, WorkingDirectory: resource.ResourcesDir("put"),
StepName: "some-step", Type: db.ContainerTypePut,
StepName: "some-step",
} }
planID atc.PlanID
fakeDelegate *execfakes.FakePutDelegate
resourceTypes creds.VersionedResourceTypes stepMetadata = exec.StepMetadata{
TeamID: 123,
TeamName: "some-team",
BuildID: 42,
BuildName: "some-build",
PipelineID: 4567,
PipelineName: "some-pipeline",
}
repo *artifact.Repository repo *artifact.Repository
state *execfakes.FakeRunState state *execfakes.FakeRunState
stdoutBuf *gbytes.Buffer
stderrBuf *gbytes.Buffer
putStep *exec.PutStep putStep *exec.PutStep
stepErr error stepErr error
putInputs exec.PutInputs stdoutBuf *gbytes.Buffer
stderrBuf *gbytes.Buffer
planID atc.PlanID
) )
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.Background()) ctx, cancel = context.WithCancel(context.Background())
fakeBuild = new(dbfakes.FakeBuild)
fakeBuild.IDReturns(42)
fakeBuild.TeamIDReturns(123)
planID = atc.PlanID("some-plan-id") planID = atc.PlanID("some-plan-id")
pipelineResourceName = "some-resource"
fakeStrategy = new(workerfakes.FakeContainerPlacementStrategy) fakeStrategy = new(workerfakes.FakeContainerPlacementStrategy)
fakePool = new(workerfakes.FakePool) fakePool = new(workerfakes.FakePool)
fakeWorker = new(workerfakes.FakeWorker) fakeWorker = new(workerfakes.FakeWorker)
fakeResourceFactory = new(resourcefakes.FakeResourceFactory) fakeResourceFactory = new(resourcefakes.FakeResourceFactory)
fakeResourceConfigFactory = new(dbfakes.FakeResourceConfigFactory) fakeResourceConfigFactory = new(dbfakes.FakeResourceConfigFactory)
variables = template.StaticVariables{
"custom-param": "source", fakeSecretManager = new(credsfakes.FakeSecrets)
"source-param": "super-secret-source", fakeSecretManager.GetReturnsOnCall(0, "super-secret-source", nil, true, nil)
} fakeSecretManager.GetReturnsOnCall(1, "source", nil, true, nil)
fakeDelegate = new(execfakes.FakePutDelegate) fakeDelegate = new(execfakes.FakePutDelegate)
stdoutBuf = gbytes.NewBuffer() stdoutBuf = gbytes.NewBuffer()
@ -92,7 +88,7 @@ var _ = Describe("PutStep", func() {
state = new(execfakes.FakeRunState) state = new(execfakes.FakeRunState)
state.ArtifactsReturns(repo) state.ArtifactsReturns(repo)
resourceTypes = creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ uninterpolatedResourceTypes := atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "custom-resource", Name: "custom-resource",
@ -101,11 +97,28 @@ var _ = Describe("PutStep", func() {
}, },
Version: atc.Version{"some-custom": "version"}, Version: atc.Version{"some-custom": "version"},
}, },
}) }
stepErr = nil interpolatedResourceTypes = atc.VersionedResourceTypes{
{
ResourceType: atc.ResourceType{
Name: "custom-resource",
Type: "custom-type",
Source: atc.Source{"some-custom": "source"},
},
Version: atc.Version{"some-custom": "version"},
},
}
putInputs = exec.NewAllInputs() putPlan = &atc.PutPlan{
Name: "some-name",
Resource: "some-resource",
Type: "some-resource-type",
Source: atc.Source{"some": "((source-param))"},
Params: atc.Params{"some-param": "some-value"},
Tags: []string{"some", "tags"},
VersionedResourceTypes: uninterpolatedResourceTypes,
}
}) })
AfterEach(func() { AfterEach(func() {
@ -113,24 +126,22 @@ var _ = Describe("PutStep", func() {
}) })
JustBeforeEach(func() { JustBeforeEach(func() {
plan := atc.Plan{
ID: atc.PlanID(planID),
Put: putPlan,
}
putStep = exec.NewPutStep( putStep = exec.NewPutStep(
fakeBuild, plan.ID,
"some-name", *plan.Put,
"some-resource-type",
pipelineResourceName,
creds.NewSource(variables, atc.Source{"some": "((source-param))"}),
creds.NewParams(variables, atc.Params{"some-param": "some-value"}),
[]string{"some", "tags"},
putInputs,
fakeDelegate,
fakePool,
fakeResourceConfigFactory,
planID,
containerMetadata,
stepMetadata, stepMetadata,
resourceTypes, containerMetadata,
fakeStrategy, fakeSecretManager,
fakeResourceFactory, fakeResourceFactory,
fakeResourceConfigFactory,
fakeStrategy,
fakePool,
fakeDelegate,
) )
stepErr = putStep.Run(ctx, state) stepErr = putStep.Run(ctx, state)
@ -168,7 +179,7 @@ var _ = Describe("PutStep", func() {
fakeVersionedSource = new(resourcefakes.FakeVersionedSource) fakeVersionedSource = new(resourcefakes.FakeVersionedSource)
fakeVersionedSource.VersionReturns(atc.Version{"some": "version"}) fakeVersionedSource.VersionReturns(atc.Version{"some": "version"})
fakeVersionedSource.MetadataReturns([]atc.MetadataField{{"some", "metadata"}}) fakeVersionedSource.MetadataReturns([]atc.MetadataField{{Name: "some", Value: "metadata"}})
fakeWorker.NameReturns("some-worker") fakeWorker.NameReturns("some-worker")
fakePool.FindOrChooseWorkerForContainerReturns(fakeWorker, nil) fakePool.FindOrChooseWorkerForContainerReturns(fakeWorker, nil)
@ -180,33 +191,33 @@ var _ = Describe("PutStep", func() {
It("finds/chooses a worker and creates a container with the correct type, session, and sources with no inputs specified (meaning it takes all artifacts)", func() { It("finds/chooses a worker and creates a container with the correct type, session, and sources with no inputs specified (meaning it takes all artifacts)", func() {
Expect(fakePool.FindOrChooseWorkerForContainerCallCount()).To(Equal(1)) Expect(fakePool.FindOrChooseWorkerForContainerCallCount()).To(Equal(1))
_, actualOwner, actualContainerSpec, actualWorkerSpec, strategy := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, actualOwner, actualContainerSpec, actualContainerMetadata, actualWorkerSpec, strategy := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(actualOwner).To(Equal(db.NewBuildStepContainerOwner(42, atc.PlanID(planID), 123))) Expect(actualOwner).To(Equal(db.NewBuildStepContainerOwner(42, atc.PlanID(planID), 123)))
Expect(actualContainerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(actualContainerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "some-resource-type", ResourceType: "some-resource-type",
})) }))
Expect(actualContainerSpec.Tags).To(Equal([]string{"some", "tags"})) Expect(actualContainerSpec.Tags).To(Equal([]string{"some", "tags"}))
Expect(actualContainerSpec.TeamID).To(Equal(123)) Expect(actualContainerSpec.TeamID).To(Equal(123))
Expect(actualContainerSpec.Env).To(Equal([]string{"a=1", "b=2"})) Expect(actualContainerSpec.Env).To(Equal(stepMetadata.Env()))
Expect(actualContainerSpec.Dir).To(Equal("/tmp/build/put")) Expect(actualContainerSpec.Dir).To(Equal("/tmp/build/put"))
Expect(actualContainerSpec.Inputs).To(HaveLen(3)) Expect(actualContainerSpec.Inputs).To(HaveLen(3))
Expect(actualContainerMetadata).To(Equal(containerMetadata))
Expect(actualWorkerSpec).To(Equal(worker.WorkerSpec{ Expect(actualWorkerSpec).To(Equal(worker.WorkerSpec{
TeamID: 123, TeamID: 123,
Tags: []string{"some", "tags"}, Tags: []string{"some", "tags"},
ResourceType: "some-resource-type", ResourceType: "some-resource-type",
ResourceTypes: resourceTypes, ResourceTypes: interpolatedResourceTypes,
})) }))
Expect(strategy).To(Equal(fakeStrategy)) Expect(strategy).To(Equal(fakeStrategy))
_, _, delegate, owner, cm, containerSpec, actualResourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, delegate, owner, containerSpec, actualResourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(cm).To(Equal(containerMetadata))
Expect(owner).To(Equal(db.NewBuildStepContainerOwner(42, atc.PlanID(planID), 123))) Expect(owner).To(Equal(db.NewBuildStepContainerOwner(42, atc.PlanID(planID), 123)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "some-resource-type", ResourceType: "some-resource-type",
})) }))
Expect(containerSpec.Tags).To(Equal([]string{"some", "tags"})) Expect(containerSpec.Tags).To(Equal([]string{"some", "tags"}))
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(containerSpec.Env).To(Equal([]string{"a=1", "b=2"})) Expect(containerSpec.Env).To(Equal(stepMetadata.Env()))
Expect(containerSpec.Dir).To(Equal("/tmp/build/put")) Expect(containerSpec.Dir).To(Equal("/tmp/build/put"))
Expect(containerSpec.Inputs).To(HaveLen(3)) Expect(containerSpec.Inputs).To(HaveLen(3))
@ -219,17 +230,19 @@ var _ = Describe("PutStep", func() {
exec.PutResourceSource{fakeOtherSource}, exec.PutResourceSource{fakeOtherSource},
exec.PutResourceSource{fakeMountedSource}, exec.PutResourceSource{fakeMountedSource},
)) ))
Expect(actualResourceTypes).To(Equal(resourceTypes)) Expect(actualResourceTypes).To(Equal(interpolatedResourceTypes))
Expect(delegate).To(Equal(fakeDelegate)) Expect(delegate).To(Equal(fakeDelegate))
}) })
Context("when the inputs are specified", func() { Context("when the inputs are specified", func() {
BeforeEach(func() { BeforeEach(func() {
putInputs = exec.NewSpecificInputs([]string{"some-source", "some-other-source"}) putPlan.Inputs = &atc.InputsConfig{
Specified: []string{"some-source", "some-other-source"},
}
}) })
It("initializes the container with specified inputs", func() { It("initializes the container with specified inputs", func() {
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.Inputs).To(HaveLen(2)) Expect(containerSpec.Inputs).To(HaveLen(2))
Expect([]worker.ArtifactSource{ Expect([]worker.ArtifactSource{
containerSpec.Inputs[0].Source(), containerSpec.Inputs[0].Source(),
@ -267,32 +280,26 @@ var _ = Describe("PutStep", func() {
Expect(fakeResource.PutCallCount()).To(Equal(1)) Expect(fakeResource.PutCallCount()).To(Equal(1))
}) })
It("reports the created version info", func() {
info := putStep.VersionInfo()
Expect(info.Version).To(Equal(atc.Version{"some": "version"}))
Expect(info.Metadata).To(Equal([]atc.MetadataField{{"some", "metadata"}}))
})
It("is successful", func() { It("is successful", func() {
Expect(putStep.Succeeded()).To(BeTrue()) Expect(putStep.Succeeded()).To(BeTrue())
}) })
It("saves the build output", func() { It("saves the build output", func() {
Expect(fakeBuild.SaveOutputCallCount()).To(Equal(1)) Expect(fakeDelegate.SaveOutputCallCount()).To(Equal(1))
_, actualResourceType, actualSource, actualResourceTypes, version, metadata, outputName, resourceName := fakeBuild.SaveOutputArgsForCall(0) _, plan, actualSource, actualResourceTypes, info := fakeDelegate.SaveOutputArgsForCall(0)
Expect(actualResourceType).To(Equal("some-resource-type")) Expect(plan.Name).To(Equal("some-name"))
Expect(plan.Type).To(Equal("some-resource-type"))
Expect(plan.Resource).To(Equal("some-resource"))
Expect(actualSource).To(Equal(atc.Source{"some": "super-secret-source"})) Expect(actualSource).To(Equal(atc.Source{"some": "super-secret-source"}))
Expect(actualResourceTypes).To(Equal(resourceTypes)) Expect(actualResourceTypes).To(Equal(interpolatedResourceTypes))
Expect(version).To(Equal(atc.Version{"some": "version"})) Expect(info.Version).To(Equal(atc.Version{"some": "version"}))
Expect(metadata).To(Equal(db.NewResourceConfigMetadataFields([]atc.MetadataField{{"some", "metadata"}}))) Expect(info.Metadata).To(Equal([]atc.MetadataField{{"some", "metadata"}}))
Expect(outputName).To(Equal("some-name"))
Expect(resourceName).To(Equal("some-resource"))
}) })
Context("when the resource is blank", func() { Context("when the resource is blank", func() {
BeforeEach(func() { BeforeEach(func() {
pipelineResourceName = "" putPlan.Resource = ""
}) })
It("is successful", func() { It("is successful", func() {
@ -300,7 +307,7 @@ var _ = Describe("PutStep", func() {
}) })
It("does not save the build output", func() { It("does not save the build output", func() {
Expect(fakeBuild.SaveOutputCallCount()).To(Equal(0)) Expect(fakeDelegate.SaveOutputCallCount()).To(Equal(0))
}) })
}) })
@ -309,7 +316,7 @@ var _ = Describe("PutStep", func() {
_, status, info := fakeDelegate.FinishedArgsForCall(0) _, status, info := fakeDelegate.FinishedArgsForCall(0)
Expect(status).To(Equal(exec.ExitStatus(0))) Expect(status).To(Equal(exec.ExitStatus(0)))
Expect(info.Version).To(Equal(atc.Version{"some": "version"})) Expect(info.Version).To(Equal(atc.Version{"some": "version"}))
Expect(info.Metadata).To(Equal([]atc.MetadataField{{"some", "metadata"}})) Expect(info.Metadata).To(Equal([]atc.MetadataField{{Name: "some", Value: "metadata"}}))
}) })
It("stores the version info as the step result", func() { It("stores the version info as the step result", func() {
@ -318,22 +325,10 @@ var _ = Describe("PutStep", func() {
Expect(sID).To(Equal(planID)) Expect(sID).To(Equal(planID))
Expect(sVal).To(Equal(exec.VersionInfo{ Expect(sVal).To(Equal(exec.VersionInfo{
Version: atc.Version{"some": "version"}, Version: atc.Version{"some": "version"},
Metadata: []atc.MetadataField{{"some", "metadata"}}, Metadata: []atc.MetadataField{{Name: "some", Value: "metadata"}},
})) }))
}) })
Context("when saving the build output fails", func() {
disaster := errors.New("nope")
BeforeEach(func() {
fakeBuild.SaveOutputReturns(disaster)
})
It("returns the error", func() {
Expect(stepErr).To(Equal(disaster))
})
})
Context("when performing the put exits unsuccessfully", func() { Context("when performing the put exits unsuccessfully", func() {
BeforeEach(func() { BeforeEach(func() {
fakeResource.PutReturns(nil, resource.ErrResourceScriptFailed{ fakeResource.PutReturns(nil, resource.ErrResourceScriptFailed{

View File

@ -66,11 +66,5 @@ type ExitStatus int
// special privileges (i.e. as an administrator user). // special privileges (i.e. as an administrator user).
type Privileged bool type Privileged bool
// StepMetadata is used to inject metadata to make available to the step when
// it's running.
type StepMetadata interface {
Env() []string
}
type InputHandler func(io.ReadCloser) error type InputHandler func(io.ReadCloser) error
type OutputHandler func(io.Writer) error type OutputHandler func(io.Writer) error

55
atc/exec/step_metadata.go Normal file
View File

@ -0,0 +1,55 @@
package exec
import (
"fmt"
)
type StepMetadata struct {
BuildID int
BuildName string
TeamID int
TeamName string
JobID int
JobName string
PipelineID int
PipelineName string
ExternalURL string
}
func (metadata StepMetadata) Env() []string {
env := []string{fmt.Sprintf("BUILD_ID=%d", metadata.BuildID)}
if metadata.BuildName != "" {
env = append(env, "BUILD_NAME="+metadata.BuildName)
}
if metadata.TeamID != 0 {
env = append(env, fmt.Sprintf("BUILD_TEAM_ID=%d", metadata.TeamID))
}
if metadata.TeamName != "" {
env = append(env, "BUILD_TEAM_NAME="+metadata.TeamName)
}
if metadata.JobID != 0 {
env = append(env, fmt.Sprintf("BUILD_JOB_ID=%d", metadata.JobID))
}
if metadata.JobName != "" {
env = append(env, "BUILD_JOB_NAME="+metadata.JobName)
}
if metadata.PipelineID != 0 {
env = append(env, fmt.Sprintf("BUILD_PIPELINE_ID=%d", metadata.PipelineID))
}
if metadata.PipelineName != "" {
env = append(env, "BUILD_PIPELINE_NAME="+metadata.PipelineName)
}
if metadata.ExternalURL != "" {
env = append(env, "ATC_EXTERNAL_URL="+metadata.ExternalURL)
}
return env
}

View File

@ -0,0 +1,57 @@
package exec_test
import (
"github.com/concourse/concourse/atc/exec"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("StepMetadata", func() {
var stepMetadata exec.StepMetadata
Describe("Env", func() {
Context("when populating fields", func() {
BeforeEach(func() {
stepMetadata = exec.StepMetadata{
BuildID: 1,
BuildName: "42",
TeamID: 2222,
TeamName: "some-team",
JobID: 3333,
JobName: "some-job-name",
PipelineID: 4444,
PipelineName: "some-pipeline-name",
ExternalURL: "http://www.example.com",
}
})
It("returns the specified values", func() {
Expect(stepMetadata.Env()).To(ConsistOf(
"BUILD_ID=1",
"BUILD_NAME=42",
"BUILD_TEAM_ID=2222",
"BUILD_TEAM_NAME=some-team",
"BUILD_JOB_ID=3333",
"BUILD_JOB_NAME=some-job-name",
"BUILD_PIPELINE_ID=4444",
"BUILD_PIPELINE_NAME=some-pipeline-name",
"ATC_EXTERNAL_URL=http://www.example.com",
))
})
})
Context("when fields are empty", func() {
BeforeEach(func() {
stepMetadata = exec.StepMetadata{
BuildID: 1,
}
})
It("does not include fields that are not set", func() {
Expect(stepMetadata.Env()).To(Equal([]string{
"BUILD_ID=1",
}))
})
})
})
})

View File

@ -13,7 +13,7 @@ import (
"code.cloudfoundry.org/garden" "code.cloudfoundry.org/garden"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagerctx" "code.cloudfoundry.org/lager/lagerctx"
boshtemplate "github.com/cloudfoundry/bosh-cli/director/template" "github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
@ -66,73 +66,39 @@ type TaskDelegate interface {
// TaskStep executes a TaskConfig, whose inputs will be fetched from the // TaskStep executes a TaskConfig, whose inputs will be fetched from the
// artifact.Repository and outputs will be added to the artifact.Repository. // artifact.Repository and outputs will be added to the artifact.Repository.
type TaskStep struct { type TaskStep struct {
privileged Privileged
configSource TaskConfigSource
tags atc.Tags
inputMapping map[string]string
outputMapping map[string]string
artifactsRoot string
imageArtifactName string
delegate TaskDelegate
workerPool worker.Pool
teamID int
buildID int
jobID int
stepName string
planID atc.PlanID planID atc.PlanID
plan atc.TaskPlan
defaultLimits atc.ContainerLimits
metadata StepMetadata
containerMetadata db.ContainerMetadata containerMetadata db.ContainerMetadata
secrets creds.Secrets
resourceTypes creds.VersionedResourceTypes strategy worker.ContainerPlacementStrategy
workerPool worker.Pool
defaultLimits atc.ContainerLimits delegate TaskDelegate
succeeded bool
succeeded bool
strategy worker.ContainerPlacementStrategy
} }
func NewTaskStep( func NewTaskStep(
privileged Privileged,
configSource TaskConfigSource,
tags atc.Tags,
inputMapping map[string]string,
outputMapping map[string]string,
artifactsRoot string,
imageArtifactName string,
delegate TaskDelegate,
workerPool worker.Pool,
teamID int,
buildID int,
jobID int,
stepName string,
planID atc.PlanID, planID atc.PlanID,
containerMetadata db.ContainerMetadata, plan atc.TaskPlan,
resourceTypes creds.VersionedResourceTypes,
defaultLimits atc.ContainerLimits, defaultLimits atc.ContainerLimits,
metadata StepMetadata,
containerMetadata db.ContainerMetadata,
secrets creds.Secrets,
strategy worker.ContainerPlacementStrategy, strategy worker.ContainerPlacementStrategy,
workerPool worker.Pool,
delegate TaskDelegate,
) Step { ) Step {
return &TaskStep{ return &TaskStep{
privileged: privileged,
configSource: configSource,
tags: tags,
inputMapping: inputMapping,
outputMapping: outputMapping,
artifactsRoot: artifactsRoot,
imageArtifactName: imageArtifactName,
delegate: delegate,
workerPool: workerPool,
teamID: teamID,
buildID: buildID,
jobID: jobID,
stepName: stepName,
planID: planID, planID: planID,
containerMetadata: containerMetadata, plan: plan,
resourceTypes: resourceTypes,
defaultLimits: defaultLimits, defaultLimits: defaultLimits,
metadata: metadata,
containerMetadata: containerMetadata,
secrets: secrets,
strategy: strategy, strategy: strategy,
workerPool: workerPool,
delegate: delegate,
} }
} }
@ -151,45 +117,88 @@ func NewTaskStep(
// are registered with the artifact.Repository. If no outputs are specified, the // are registered with the artifact.Repository. If no outputs are specified, the
// task's entire working directory is registered as an ArtifactSource under the // task's entire working directory is registered as an ArtifactSource under the
// name of the task. // name of the task.
func (action *TaskStep) Run(ctx context.Context, state RunState) error { func (step *TaskStep) Run(ctx context.Context, state RunState) error {
logger := lagerctx.FromContext(ctx) logger := lagerctx.FromContext(ctx)
logger = logger.Session("task-step", lager.Data{ logger = logger.Session("task-step", lager.Data{
"step-name": action.stepName, "step-name": step.plan.Name,
"job-id": action.jobID, "job-id": step.metadata.JobID,
}) })
variables := creds.NewVariables(step.secrets, step.metadata.TeamName, step.metadata.PipelineName)
resourceTypes, err := creds.NewVersionedResourceTypes(variables, step.plan.VersionedResourceTypes).Evaluate()
if err != nil {
return err
}
var taskConfigSource TaskConfigSource
var taskVars []template.Variables
if step.plan.ConfigPath != "" {
// external task - construct a source which reads it from file
taskConfigSource = FileConfigSource{ConfigPath: step.plan.ConfigPath}
// for interpolation - use 'vars' from the pipeline, and then fill remaining with cred variables
taskVars = []template.Variables{template.StaticVariables(step.plan.Vars), variables}
} else {
// embedded task - first we take it
taskConfigSource = StaticConfigSource{Config: step.plan.Config}
// for interpolation - use just cred variables
taskVars = []template.Variables{variables}
}
// override params
taskConfigSource = &OverrideParamsConfigSource{ConfigSource: taskConfigSource, Params: step.plan.Params}
// interpolate template vars
taskConfigSource = InterpolateTemplateConfigSource{ConfigSource: taskConfigSource, Vars: taskVars}
// validate
taskConfigSource = ValidatingConfigSource{ConfigSource: taskConfigSource}
repository := state.Artifacts() repository := state.Artifacts()
config, err := action.configSource.FetchConfig(logger, repository) config, err := taskConfigSource.FetchConfig(logger, repository)
for _, warning := range action.configSource.Warnings() { for _, warning := range taskConfigSource.Warnings() {
fmt.Fprintln(action.delegate.Stderr(), "[WARNING]", warning) fmt.Fprintln(step.delegate.Stderr(), "[WARNING]", warning)
} }
if err != nil { if err != nil {
return err return err
} }
if config.Limits.CPU == nil { if config.Limits.CPU == nil {
config.Limits.CPU = action.defaultLimits.CPU config.Limits.CPU = step.defaultLimits.CPU
} }
if config.Limits.Memory == nil { if config.Limits.Memory == nil {
config.Limits.Memory = action.defaultLimits.Memory config.Limits.Memory = step.defaultLimits.Memory
} }
action.delegate.Initializing(logger, config) step.delegate.Initializing(logger, config)
containerSpec, err := action.containerSpec(logger, repository, config) workerSpec, err := step.workerSpec(logger, resourceTypes, repository, config)
if err != nil { if err != nil {
return err return err
} }
workerSpec, err := action.workerSpec(logger, action.resourceTypes, repository, config) containerSpec, err := step.containerSpec(logger, repository, config, step.containerMetadata)
if err != nil { if err != nil {
return err return err
} }
owner := db.NewBuildStepContainerOwner(action.buildID, action.planID, action.teamID) owner := db.NewBuildStepContainerOwner(step.metadata.BuildID, step.planID, step.metadata.TeamID)
chosenWorker, err := action.workerPool.FindOrChooseWorkerForContainer(logger, owner, containerSpec, workerSpec, action.strategy)
chosenWorker, err := step.workerPool.FindOrChooseWorkerForContainer(
ctx,
logger,
owner,
containerSpec,
step.containerMetadata,
workerSpec,
step.strategy,
)
if err != nil { if err != nil {
return err return err
} }
@ -197,11 +206,10 @@ func (action *TaskStep) Run(ctx context.Context, state RunState) error {
container, err := chosenWorker.FindOrCreateContainer( container, err := chosenWorker.FindOrCreateContainer(
ctx, ctx,
logger, logger,
action.delegate, step.delegate,
owner, owner,
action.containerMetadata,
containerSpec, containerSpec,
action.resourceTypes, resourceTypes,
) )
if err != nil { if err != nil {
return err return err
@ -216,9 +224,9 @@ func (action *TaskStep) Run(ctx context.Context, state RunState) error {
return err return err
} }
action.succeeded = (status == 0) step.succeeded = (status == 0)
err = action.registerOutputs(logger, repository, config, container) err = step.registerOutputs(logger, repository, config, container, step.containerMetadata)
if err != nil { if err != nil {
return err return err
} }
@ -227,8 +235,8 @@ func (action *TaskStep) Run(ctx context.Context, state RunState) error {
} }
processIO := garden.ProcessIO{ processIO := garden.ProcessIO{
Stdout: action.delegate.Stdout(), Stdout: step.delegate.Stdout(),
Stderr: action.delegate.Stderr(), Stderr: step.delegate.Stderr(),
} }
process, err := container.Attach(taskProcessID, processIO) process, err := container.Attach(taskProcessID, processIO)
@ -237,7 +245,7 @@ func (action *TaskStep) Run(ctx context.Context, state RunState) error {
} else { } else {
logger.Info("spawning") logger.Info("spawning")
action.delegate.Starting(logger, config) step.delegate.Starting(logger, config)
process, err = container.Run( process, err = container.Run(
garden.ProcessSpec{ garden.ProcessSpec{
@ -246,7 +254,7 @@ func (action *TaskStep) Run(ctx context.Context, state RunState) error {
Path: config.Run.Path, Path: config.Run.Path,
Args: config.Run.Args, Args: config.Run.Args,
Dir: path.Join(action.artifactsRoot, config.Run.Dir), Dir: path.Join(step.containerMetadata.WorkingDirectory, config.Run.Dir),
// Guardian sets the default TTY window size to width: 80, height: 24, // Guardian sets the default TTY window size to width: 80, height: 24,
// which creates ANSI control sequences that do not work with other window sizes // which creates ANSI control sequences that do not work with other window sizes
@ -274,7 +282,7 @@ func (action *TaskStep) Run(ctx context.Context, state RunState) error {
select { select {
case <-ctx.Done(): case <-ctx.Done():
err = action.registerOutputs(logger, repository, config, container) err = step.registerOutputs(logger, repository, config, container, step.containerMetadata)
if err != nil { if err != nil {
return err return err
} }
@ -293,39 +301,39 @@ func (action *TaskStep) Run(ctx context.Context, state RunState) error {
return processErr return processErr
} }
err = action.registerOutputs(logger, repository, config, container) err = step.registerOutputs(logger, repository, config, container, step.containerMetadata)
if err != nil { if err != nil {
return err return err
} }
action.delegate.Finished(logger, ExitStatus(processStatus)) step.delegate.Finished(logger, ExitStatus(processStatus))
err = container.SetProperty(taskExitStatusPropertyName, fmt.Sprintf("%d", processStatus)) err = container.SetProperty(taskExitStatusPropertyName, fmt.Sprintf("%d", processStatus))
if err != nil { if err != nil {
return err return err
} }
action.succeeded = processStatus == 0 step.succeeded = processStatus == 0
return nil return nil
} }
} }
func (action *TaskStep) Succeeded() bool { func (step *TaskStep) Succeeded() bool {
return action.succeeded return step.succeeded
} }
func (action *TaskStep) imageSpec(logger lager.Logger, repository *artifact.Repository, config atc.TaskConfig) (worker.ImageSpec, error) { func (step *TaskStep) imageSpec(logger lager.Logger, repository *artifact.Repository, config atc.TaskConfig) (worker.ImageSpec, error) {
imageSpec := worker.ImageSpec{ imageSpec := worker.ImageSpec{
Privileged: bool(action.privileged), Privileged: bool(step.plan.Privileged),
} }
// Determine the source of the container image // Determine the source of the container image
// a reference to an artifact (get step, task output) ? // a reference to an artifact (get step, task output) ?
if action.imageArtifactName != "" { if step.plan.ImageArtifactName != "" {
source, found := repository.SourceFor(artifact.Name(action.imageArtifactName)) source, found := repository.SourceFor(artifact.Name(step.plan.ImageArtifactName))
if !found { if !found {
return worker.ImageSpec{}, MissingTaskImageSourceError{action.imageArtifactName} return worker.ImageSpec{}, MissingTaskImageSourceError{step.plan.ImageArtifactName}
} }
imageSpec.ImageArtifactSource = source imageSpec.ImageArtifactSource = source
@ -334,7 +342,7 @@ func (action *TaskStep) imageSpec(logger lager.Logger, repository *artifact.Repo
} else if config.ImageResource != nil { } else if config.ImageResource != nil {
imageSpec.ImageResource = &worker.ImageResource{ imageSpec.ImageResource = &worker.ImageResource{
Type: config.ImageResource.Type, Type: config.ImageResource.Type,
Source: creds.NewSource(boshtemplate.StaticVariables{}, config.ImageResource.Source), Source: config.ImageResource.Source,
Params: config.ImageResource.Params, Params: config.ImageResource.Params,
Version: config.ImageResource.Version, Version: config.ImageResource.Version,
} }
@ -346,13 +354,13 @@ func (action *TaskStep) imageSpec(logger lager.Logger, repository *artifact.Repo
return imageSpec, nil return imageSpec, nil
} }
func (action *TaskStep) containerInputs(logger lager.Logger, repository *artifact.Repository, config atc.TaskConfig) ([]worker.InputSource, error) { func (step *TaskStep) containerInputs(logger lager.Logger, repository *artifact.Repository, config atc.TaskConfig, metadata db.ContainerMetadata) ([]worker.InputSource, error) {
inputs := []worker.InputSource{} inputs := []worker.InputSource{}
var missingRequiredInputs []string var missingRequiredInputs []string
for _, input := range config.Inputs { for _, input := range config.Inputs {
inputName := input.Name inputName := input.Name
if sourceName, ok := action.inputMapping[inputName]; ok { if sourceName, ok := step.plan.InputMapping[inputName]; ok {
inputName = sourceName inputName = sourceName
} }
@ -367,7 +375,7 @@ func (action *TaskStep) containerInputs(logger lager.Logger, repository *artifac
inputs = append(inputs, &taskInputSource{ inputs = append(inputs, &taskInputSource{
config: input, config: input,
source: source, source: source,
artifactsRoot: action.artifactsRoot, artifactsRoot: metadata.WorkingDirectory,
}) })
} }
@ -376,10 +384,10 @@ func (action *TaskStep) containerInputs(logger lager.Logger, repository *artifac
} }
for _, cacheConfig := range config.Caches { for _, cacheConfig := range config.Caches {
source := newTaskCacheSource(logger, action.teamID, action.jobID, action.stepName, cacheConfig.Path) source := newTaskCacheSource(logger, step.metadata.TeamID, step.metadata.JobID, step.plan.Name, cacheConfig.Path)
inputs = append(inputs, &taskCacheInputSource{ inputs = append(inputs, &taskCacheInputSource{
source: source, source: source,
artifactsRoot: action.artifactsRoot, artifactsRoot: metadata.WorkingDirectory,
cachePath: cacheConfig.Path, cachePath: cacheConfig.Path,
}) })
} }
@ -387,48 +395,48 @@ func (action *TaskStep) containerInputs(logger lager.Logger, repository *artifac
return inputs, nil return inputs, nil
} }
func (action *TaskStep) containerSpec(logger lager.Logger, repository *artifact.Repository, config atc.TaskConfig) (worker.ContainerSpec, error) { func (step *TaskStep) containerSpec(logger lager.Logger, repository *artifact.Repository, config atc.TaskConfig, metadata db.ContainerMetadata) (worker.ContainerSpec, error) {
imageSpec, err := action.imageSpec(logger, repository, config) imageSpec, err := step.imageSpec(logger, repository, config)
if err != nil { if err != nil {
return worker.ContainerSpec{}, err return worker.ContainerSpec{}, err
} }
containerSpec := worker.ContainerSpec{ containerSpec := worker.ContainerSpec{
Platform: config.Platform, Platform: config.Platform,
Tags: action.tags, Tags: step.plan.Tags,
TeamID: action.teamID, TeamID: step.metadata.TeamID,
ImageSpec: imageSpec, ImageSpec: imageSpec,
Limits: worker.ContainerLimits(config.Limits), Limits: worker.ContainerLimits(config.Limits),
User: config.Run.User, User: config.Run.User,
Dir: action.artifactsRoot, Dir: metadata.WorkingDirectory,
Env: action.envForParams(config.Params), Env: step.envForParams(config.Params),
Inputs: []worker.InputSource{}, Inputs: []worker.InputSource{},
Outputs: worker.OutputPaths{}, Outputs: worker.OutputPaths{},
} }
containerSpec.Inputs, err = action.containerInputs(logger, repository, config) containerSpec.Inputs, err = step.containerInputs(logger, repository, config, metadata)
if err != nil { if err != nil {
return worker.ContainerSpec{}, err return worker.ContainerSpec{}, err
} }
for _, output := range config.Outputs { for _, output := range config.Outputs {
path := artifactsPath(output, action.artifactsRoot) path := artifactsPath(output, metadata.WorkingDirectory)
containerSpec.Outputs[output.Name] = path containerSpec.Outputs[output.Name] = path
} }
return containerSpec, nil return containerSpec, nil
} }
func (action *TaskStep) workerSpec(logger lager.Logger, resourceTypes creds.VersionedResourceTypes, repository *artifact.Repository, config atc.TaskConfig) (worker.WorkerSpec, error) { func (step *TaskStep) workerSpec(logger lager.Logger, resourceTypes atc.VersionedResourceTypes, repository *artifact.Repository, config atc.TaskConfig) (worker.WorkerSpec, error) {
workerSpec := worker.WorkerSpec{ workerSpec := worker.WorkerSpec{
Platform: config.Platform, Platform: config.Platform,
Tags: action.tags, Tags: step.plan.Tags,
TeamID: action.teamID, TeamID: step.metadata.TeamID,
ResourceTypes: resourceTypes, ResourceTypes: resourceTypes,
} }
imageSpec, err := action.imageSpec(logger, repository, config) imageSpec, err := step.imageSpec(logger, repository, config)
if err != nil { if err != nil {
return worker.WorkerSpec{}, err return worker.WorkerSpec{}, err
} }
@ -440,18 +448,18 @@ func (action *TaskStep) workerSpec(logger lager.Logger, resourceTypes creds.Vers
return workerSpec, nil return workerSpec, nil
} }
func (action *TaskStep) registerOutputs(logger lager.Logger, repository *artifact.Repository, config atc.TaskConfig, container worker.Container) error { func (step *TaskStep) registerOutputs(logger lager.Logger, repository *artifact.Repository, config atc.TaskConfig, container worker.Container, metadata db.ContainerMetadata) error {
volumeMounts := container.VolumeMounts() volumeMounts := container.VolumeMounts()
logger.Debug("registering-outputs", lager.Data{"outputs": config.Outputs}) logger.Debug("registering-outputs", lager.Data{"outputs": config.Outputs})
for _, output := range config.Outputs { for _, output := range config.Outputs {
outputName := output.Name outputName := output.Name
if destinationName, ok := action.outputMapping[output.Name]; ok { if destinationName, ok := step.plan.OutputMapping[output.Name]; ok {
outputName = destinationName outputName = destinationName
} }
outputPath := artifactsPath(output, action.artifactsRoot) outputPath := artifactsPath(output, metadata.WorkingDirectory)
for _, mount := range volumeMounts { for _, mount := range volumeMounts {
if filepath.Clean(mount.MountPath) == filepath.Clean(outputPath) { if filepath.Clean(mount.MountPath) == filepath.Clean(outputPath) {
@ -462,20 +470,20 @@ func (action *TaskStep) registerOutputs(logger lager.Logger, repository *artifac
} }
// Do not initialize caches for one-off builds // Do not initialize caches for one-off builds
if action.jobID != 0 { if step.metadata.JobID != 0 {
logger.Debug("initializing-caches", lager.Data{"caches": config.Caches}) logger.Debug("initializing-caches", lager.Data{"caches": config.Caches})
for _, cacheConfig := range config.Caches { for _, cacheConfig := range config.Caches {
for _, volumeMount := range volumeMounts { for _, volumeMount := range volumeMounts {
if volumeMount.MountPath == filepath.Join(action.artifactsRoot, cacheConfig.Path) { if volumeMount.MountPath == filepath.Join(metadata.WorkingDirectory, cacheConfig.Path) {
logger.Debug("initializing-cache", lager.Data{"path": volumeMount.MountPath}) logger.Debug("initializing-cache", lager.Data{"path": volumeMount.MountPath})
err := volumeMount.Volume.InitializeTaskCache( err := volumeMount.Volume.InitializeTaskCache(
logger, logger,
action.jobID, step.metadata.JobID,
action.stepName, step.plan.Name,
cacheConfig.Path, cacheConfig.Path,
bool(action.privileged)) bool(step.plan.Privileged))
if err != nil { if err != nil {
return err return err
} }

View File

@ -13,9 +13,8 @@ import (
"code.cloudfoundry.org/garden/gardenfakes" "code.cloudfoundry.org/garden/gardenfakes"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc/creds/credsfakes"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/exec" "github.com/concourse/concourse/atc/exec"
"github.com/concourse/concourse/atc/exec/artifact" "github.com/concourse/concourse/atc/exec/artifact"
@ -30,124 +29,125 @@ import (
var _ = Describe("TaskStep", func() { var _ = Describe("TaskStep", func() {
var ( var (
ctx context.Context ctx context.Context
cancel func()
logger *lagertest.TestLogger logger *lagertest.TestLogger
cancel func() stdoutBuf *gbytes.Buffer
stderrBuf *gbytes.Buffer
fakePool *workerfakes.FakePool fakePool *workerfakes.FakePool
fakeWorker *workerfakes.FakeWorker fakeWorker *workerfakes.FakeWorker
fakeStrategy *workerfakes.FakeContainerPlacementStrategy fakeStrategy *workerfakes.FakeContainerPlacementStrategy
stdoutBuf *gbytes.Buffer fakeSecretManager *credsfakes.FakeSecrets
stderrBuf *gbytes.Buffer fakeDelegate *execfakes.FakeTaskDelegate
taskPlan *atc.TaskPlan
imageArtifactName string interpolatedResourceTypes atc.VersionedResourceTypes
containerMetadata db.ContainerMetadata
fakeDelegate *execfakes.FakeTaskDelegate
privileged exec.Privileged
tags []string
teamID int
buildID int
planID atc.PlanID
jobID int
configSource *execfakes.FakeTaskConfigSource
resourceTypes creds.VersionedResourceTypes
inputMapping map[string]string
outputMapping map[string]string
repo *artifact.Repository repo *artifact.Repository
state *execfakes.FakeRunState state *execfakes.FakeRunState
taskStep exec.Step taskStep exec.Step
stepErr error
stepErr error containerMetadata = db.ContainerMetadata{
WorkingDirectory: "some-artifact-root",
Type: db.ContainerTypeTask,
StepName: "some-step",
}
stepMetadata = exec.StepMetadata{
TeamID: 123,
BuildID: 1234,
JobID: 12345,
}
planID = atc.PlanID(42)
) )
BeforeEach(func() { BeforeEach(func() {
ctx, cancel = context.WithCancel(context.Background()) ctx, cancel = context.WithCancel(context.Background())
logger = lagertest.NewTestLogger("task-action-test") logger = lagertest.NewTestLogger("task-action-test")
stdoutBuf = gbytes.NewBuffer()
stderrBuf = gbytes.NewBuffer()
fakeWorker = new(workerfakes.FakeWorker) fakeWorker = new(workerfakes.FakeWorker)
fakePool = new(workerfakes.FakePool) fakePool = new(workerfakes.FakePool)
fakeStrategy = new(workerfakes.FakeContainerPlacementStrategy) fakeStrategy = new(workerfakes.FakeContainerPlacementStrategy)
stdoutBuf = gbytes.NewBuffer() fakeSecretManager = new(credsfakes.FakeSecrets)
stderrBuf = gbytes.NewBuffer() fakeSecretManager.GetReturns("super-secret-source", nil, true, nil)
fakeDelegate = new(execfakes.FakeTaskDelegate) fakeDelegate = new(execfakes.FakeTaskDelegate)
fakeDelegate.StdoutReturns(stdoutBuf) fakeDelegate.StdoutReturns(stdoutBuf)
fakeDelegate.StderrReturns(stderrBuf) fakeDelegate.StderrReturns(stderrBuf)
privileged = false
tags = []string{"step", "tags"}
teamID = 123
planID = atc.PlanID(42)
buildID = 1234
jobID = 12345
configSource = new(execfakes.FakeTaskConfigSource)
repo = artifact.NewRepository() repo = artifact.NewRepository()
state = new(execfakes.FakeRunState) state = new(execfakes.FakeRunState)
state.ArtifactsReturns(repo) state.ArtifactsReturns(repo)
resourceTypes = creds.NewVersionedResourceTypes(template.StaticVariables{}, atc.VersionedResourceTypes{ uninterpolatedResourceTypes := atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "custom-resource", Name: "custom-resource",
Type: "custom-type", Type: "custom-type",
Source: atc.Source{"some-custom": "source"}, Source: atc.Source{"some-custom": "((source-param))"},
Params: atc.Params{"some-custom": "param"}, Params: atc.Params{"some-custom": "param"},
}, },
Version: atc.Version{"some-custom": "version"}, Version: atc.Version{"some-custom": "version"},
}, },
})
inputMapping = nil
outputMapping = nil
imageArtifactName = ""
containerMetadata = db.ContainerMetadata{
Type: db.ContainerTypeTask,
StepName: "some-step",
} }
stepErr = nil interpolatedResourceTypes = atc.VersionedResourceTypes{
{
ResourceType: atc.ResourceType{
Name: "custom-resource",
Type: "custom-type",
Source: atc.Source{"some-custom": "super-secret-source"},
Params: atc.Params{"some-custom": "param"},
},
Version: atc.Version{"some-custom": "version"},
},
}
taskPlan = &atc.TaskPlan{
Name: "some-task",
Privileged: false,
Tags: []string{"step", "tags"},
VersionedResourceTypes: uninterpolatedResourceTypes,
}
}) })
JustBeforeEach(func() { JustBeforeEach(func() {
plan := atc.Plan{
ID: atc.PlanID(planID),
Task: taskPlan,
}
taskStep = exec.NewTaskStep( taskStep = exec.NewTaskStep(
privileged, plan.ID,
configSource, *plan.Task,
tags,
inputMapping,
outputMapping,
"some-artifact-root",
imageArtifactName,
fakeDelegate,
fakePool,
teamID,
buildID,
jobID,
"some-task",
planID,
containerMetadata,
resourceTypes,
atc.ContainerLimits{}, atc.ContainerLimits{},
stepMetadata,
containerMetadata,
fakeSecretManager,
fakeStrategy, fakeStrategy,
fakePool,
fakeDelegate,
) )
stepErr = taskStep.Run(ctx, state) stepErr = taskStep.Run(ctx, state)
}) })
Context("when getting the config works", func() { Context("when the plan has a config", func() {
var fetchedConfig atc.TaskConfig
BeforeEach(func() { BeforeEach(func() {
cpu := uint64(1024) cpu := uint64(1024)
memory := uint64(1024) memory := uint64(1024)
fetchedConfig = atc.TaskConfig{
taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
ImageResource: &atc.ImageResource{ ImageResource: &atc.ImageResource{
Type: "docker", Type: "docker",
@ -167,8 +167,6 @@ var _ = Describe("TaskStep", func() {
Args: []string{"some", "args"}, Args: []string{"some", "args"},
}, },
} }
configSource.FetchConfigReturns(fetchedConfig, nil)
}) })
Context("when the worker is either found or chosen", func() { Context("when the worker is either found or chosen", func() {
@ -182,19 +180,24 @@ var _ = Describe("TaskStep", func() {
It("finds or chooses a worker", func() { It("finds or chooses a worker", func() {
Expect(fakePool.FindOrChooseWorkerForContainerCallCount()).To(Equal(1)) Expect(fakePool.FindOrChooseWorkerForContainerCallCount()).To(Equal(1))
_, owner, containerSpec, workerSpec, strategy := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, owner, containerSpec, createdMetadata, workerSpec, strategy := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewBuildStepContainerOwner(buildID, planID, teamID))) Expect(owner).To(Equal(db.NewBuildStepContainerOwner(stepMetadata.BuildID, planID, stepMetadata.TeamID)))
Expect(createdMetadata).To(Equal(db.ContainerMetadata{
WorkingDirectory: "some-artifact-root",
Type: db.ContainerTypeTask,
StepName: "some-step",
}))
cpu := uint64(1024) cpu := uint64(1024)
memory := uint64(1024) memory := uint64(1024)
Expect(containerSpec).To(Equal(worker.ContainerSpec{ Expect(containerSpec).To(Equal(worker.ContainerSpec{
Platform: "some-platform", Platform: "some-platform",
Tags: []string{"step", "tags"}, Tags: []string{"step", "tags"},
TeamID: teamID, TeamID: stepMetadata.TeamID,
ImageSpec: worker.ImageSpec{ ImageSpec: worker.ImageSpec{
ImageResource: &worker.ImageResource{ ImageResource: &worker.ImageResource{
Type: "docker", Type: "docker",
Source: creds.NewSource(template.StaticVariables{}, atc.Source{"some": "secret-source-param"}), Source: atc.Source{"some": "secret-source-param"},
Params: &atc.Params{"some": "params"}, Params: &atc.Params{"some": "params"},
Version: &atc.Version{"some": "version"}, Version: &atc.Version{"some": "version"},
}, },
@ -213,9 +216,9 @@ var _ = Describe("TaskStep", func() {
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
Platform: "some-platform", Platform: "some-platform",
Tags: []string{"step", "tags"}, Tags: []string{"step", "tags"},
TeamID: teamID, TeamID: stepMetadata.TeamID,
ResourceType: "docker", ResourceType: "docker",
ResourceTypes: resourceTypes, ResourceTypes: interpolatedResourceTypes,
})) }))
Expect(strategy).To(Equal(fakeStrategy)) Expect(strategy).To(Equal(fakeStrategy))
}) })
@ -246,14 +249,9 @@ var _ = Describe("TaskStep", func() {
It("finds or creates a container", func() { It("finds or creates a container", func() {
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, cancel, delegate, owner, createdMetadata, containerSpec, actualResourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, cancel, delegate, owner, containerSpec, actualResourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(cancel).ToNot(BeNil()) Expect(cancel).ToNot(BeNil())
Expect(owner).To(Equal(db.NewBuildStepContainerOwner(buildID, planID, teamID))) Expect(owner).To(Equal(db.NewBuildStepContainerOwner(stepMetadata.BuildID, planID, stepMetadata.TeamID)))
Expect(createdMetadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeTask,
StepName: "some-step",
}))
Expect(delegate).To(Equal(fakeDelegate)) Expect(delegate).To(Equal(fakeDelegate))
cpu := uint64(1024) cpu := uint64(1024)
@ -261,11 +259,11 @@ var _ = Describe("TaskStep", func() {
Expect(containerSpec).To(Equal(worker.ContainerSpec{ Expect(containerSpec).To(Equal(worker.ContainerSpec{
Platform: "some-platform", Platform: "some-platform",
Tags: []string{"step", "tags"}, Tags: []string{"step", "tags"},
TeamID: teamID, TeamID: stepMetadata.TeamID,
ImageSpec: worker.ImageSpec{ ImageSpec: worker.ImageSpec{
ImageResource: &worker.ImageResource{ ImageResource: &worker.ImageResource{
Type: "docker", Type: "docker",
Source: creds.NewSource(template.StaticVariables{}, atc.Source{"some": "secret-source-param"}), Source: atc.Source{"some": "secret-source-param"},
Params: &atc.Params{"some": "params"}, Params: &atc.Params{"some": "params"},
Version: &atc.Version{"some": "version"}, Version: &atc.Version{"some": "version"},
}, },
@ -280,12 +278,12 @@ var _ = Describe("TaskStep", func() {
Inputs: []worker.InputSource{}, Inputs: []worker.InputSource{},
Outputs: worker.OutputPaths{}, Outputs: worker.OutputPaths{},
})) }))
Expect(actualResourceTypes).To(Equal(resourceTypes)) Expect(actualResourceTypes).To(Equal(interpolatedResourceTypes))
}) })
Context("when rootfs uri is set instead of image resource", func() { Context("when rootfs uri is set instead of image resource", func() {
BeforeEach(func() { BeforeEach(func() {
fetchedConfig = atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
Params: map[string]string{"SOME": "params"}, Params: map[string]string{"SOME": "params"},
@ -294,26 +292,19 @@ var _ = Describe("TaskStep", func() {
Args: []string{"some", "args"}, Args: []string{"some", "args"},
}, },
} }
configSource.FetchConfigReturns(fetchedConfig, nil)
}) })
It("finds or creates a container", func() { It("finds or creates a container", func() {
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, cancel, delegate, owner, createdMetadata, containerSpec, actualResourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, cancel, delegate, owner, containerSpec, actualResourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(cancel).ToNot(BeNil()) Expect(cancel).ToNot(BeNil())
Expect(owner).To(Equal(db.NewBuildStepContainerOwner(buildID, planID, teamID))) Expect(owner).To(Equal(db.NewBuildStepContainerOwner(stepMetadata.BuildID, planID, stepMetadata.TeamID)))
Expect(createdMetadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeTask,
StepName: "some-step",
}))
Expect(delegate).To(Equal(fakeDelegate)) Expect(delegate).To(Equal(fakeDelegate))
Expect(containerSpec).To(Equal(worker.ContainerSpec{ Expect(containerSpec).To(Equal(worker.ContainerSpec{
Platform: "some-platform", Platform: "some-platform",
Tags: []string{"step", "tags"}, Tags: []string{"step", "tags"},
TeamID: teamID, TeamID: stepMetadata.TeamID,
ImageSpec: worker.ImageSpec{ ImageSpec: worker.ImageSpec{
ImageURL: "some-image", ImageURL: "some-image",
Privileged: false, Privileged: false,
@ -324,7 +315,7 @@ var _ = Describe("TaskStep", func() {
Outputs: worker.OutputPaths{}, Outputs: worker.OutputPaths{},
})) }))
Expect(actualResourceTypes).To(Equal(resourceTypes)) Expect(actualResourceTypes).To(Equal(interpolatedResourceTypes))
}) })
}) })
@ -370,7 +361,7 @@ var _ = Describe("TaskStep", func() {
) )
BeforeEach(func() { BeforeEach(func() {
configSource.FetchConfigReturns(atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
Params: map[string]string{"SOME": "params"}, Params: map[string]string{"SOME": "params"},
@ -383,7 +374,7 @@ var _ = Describe("TaskStep", func() {
{Name: "some-other-output"}, {Name: "some-other-output"},
{Name: "some-trailing-slash-output", Path: "some-output-configured-path-with-trailing-slash/"}, {Name: "some-trailing-slash-output", Path: "some-output-configured-path-with-trailing-slash/"},
}, },
}, nil) }
fakeNewlyCreatedVolume1 = new(workerfakes.FakeVolume) fakeNewlyCreatedVolume1 = new(workerfakes.FakeVolume)
fakeNewlyCreatedVolume1.HandleReturns("some-handle-1") fakeNewlyCreatedVolume1.HandleReturns("some-handle-1")
@ -518,12 +509,12 @@ var _ = Describe("TaskStep", func() {
Context("when privileged", func() { Context("when privileged", func() {
BeforeEach(func() { BeforeEach(func() {
privileged = true taskPlan.Privileged = true
}) })
It("creates the container privileged", func() { It("creates the container privileged", func() {
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.ImageSpec.Privileged).To(BeTrue()) Expect(containerSpec.ImageSpec.Privileged).To(BeTrue())
}) })
@ -549,7 +540,7 @@ var _ = Describe("TaskStep", func() {
inputSource = new(workerfakes.FakeArtifactSource) inputSource = new(workerfakes.FakeArtifactSource)
otherInputSource = new(workerfakes.FakeArtifactSource) otherInputSource = new(workerfakes.FakeArtifactSource)
configSource.FetchConfigReturns(atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
Params: map[string]string{"SOME": "params"}, Params: map[string]string{"SOME": "params"},
@ -561,7 +552,7 @@ var _ = Describe("TaskStep", func() {
{Name: "some-input", Path: "some-input-configured-path"}, {Name: "some-input", Path: "some-input-configured-path"},
{Name: "some-other-input"}, {Name: "some-other-input"},
}, },
}, nil) }
}) })
Context("when all inputs are present", func() { Context("when all inputs are present", func() {
@ -571,7 +562,7 @@ var _ = Describe("TaskStep", func() {
}) })
It("creates the container with the inputs configured correctly", func() { It("creates the container with the inputs configured correctly", func() {
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.Inputs).To(HaveLen(2)) Expect(containerSpec.Inputs).To(HaveLen(2))
for _, input := range containerSpec.Inputs { for _, input := range containerSpec.Inputs {
switch input.DestinationPath() { switch input.DestinationPath() {
@ -603,16 +594,17 @@ var _ = Describe("TaskStep", func() {
BeforeEach(func() { BeforeEach(func() {
remappedInputSource = new(workerfakes.FakeArtifactSource) remappedInputSource = new(workerfakes.FakeArtifactSource)
inputMapping = map[string]string{"remapped-input": "remapped-input-src"} taskPlan.InputMapping = map[string]string{"remapped-input": "remapped-input-src"}
configSource.FetchConfigReturns(atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform",
Run: atc.TaskRunConfig{ Run: atc.TaskRunConfig{
Path: "ls", Path: "ls",
Args: []string{"some", "args"},
}, },
Inputs: []atc.TaskInputConfig{ Inputs: []atc.TaskInputConfig{
{Name: "remapped-input"}, {Name: "remapped-input"},
}, },
}, nil) }
}) })
Context("when all inputs are present in the in source repository", func() { Context("when all inputs are present in the in source repository", func() {
@ -621,7 +613,8 @@ var _ = Describe("TaskStep", func() {
}) })
It("uses remapped input", func() { It("uses remapped input", func() {
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.Inputs).To(HaveLen(1)) Expect(containerSpec.Inputs).To(HaveLen(1))
Expect(containerSpec.Inputs[0].Source()).To(Equal(remappedInputSource)) Expect(containerSpec.Inputs[0].Source()).To(Equal(remappedInputSource))
Expect(containerSpec.Inputs[0].DestinationPath()).To(Equal("some-artifact-root/remapped-input")) Expect(containerSpec.Inputs[0].DestinationPath()).To(Equal("some-artifact-root/remapped-input"))
@ -646,7 +639,8 @@ var _ = Describe("TaskStep", func() {
optionalInputSource = new(workerfakes.FakeArtifactSource) optionalInputSource = new(workerfakes.FakeArtifactSource)
optionalInput2Source = new(workerfakes.FakeArtifactSource) optionalInput2Source = new(workerfakes.FakeArtifactSource)
requiredInputSource = new(workerfakes.FakeArtifactSource) requiredInputSource = new(workerfakes.FakeArtifactSource)
configSource.FetchConfigReturns(atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform",
Run: atc.TaskRunConfig{ Run: atc.TaskRunConfig{
Path: "ls", Path: "ls",
}, },
@ -655,7 +649,7 @@ var _ = Describe("TaskStep", func() {
{Name: "optional-input-2", Optional: true}, {Name: "optional-input-2", Optional: true},
{Name: "required-input"}, {Name: "required-input"},
}, },
}, nil) }
}) })
Context("when an optional input is missing", func() { Context("when an optional input is missing", func() {
@ -666,7 +660,7 @@ var _ = Describe("TaskStep", func() {
It("runs successfully without the optional input", func() { It("runs successfully without the optional input", func() {
Expect(stepErr).ToNot(HaveOccurred()) Expect(stepErr).ToNot(HaveOccurred())
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.Inputs).To(HaveLen(2)) Expect(containerSpec.Inputs).To(HaveLen(2))
Expect(containerSpec.Inputs[0].Source()).To(Equal(optionalInput2Source)) Expect(containerSpec.Inputs[0].Source()).To(Equal(optionalInput2Source))
Expect(containerSpec.Inputs[0].DestinationPath()).To(Equal("some-artifact-root/optional-input-2")) Expect(containerSpec.Inputs[0].DestinationPath()).To(Equal("some-artifact-root/optional-input-2"))
@ -695,15 +689,17 @@ var _ = Describe("TaskStep", func() {
) )
BeforeEach(func() { BeforeEach(func() {
configSource.FetchConfigReturns(atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
Run: atc.TaskRunConfig{}, Run: atc.TaskRunConfig{
Path: "ls",
},
Caches: []atc.CacheConfig{ Caches: []atc.CacheConfig{
{Path: "some-path-1"}, {Path: "some-path-1"},
{Path: "some-path-2"}, {Path: "some-path-2"},
}, },
}, nil) }
fakeVolume1 = new(workerfakes.FakeVolume) fakeVolume1 = new(workerfakes.FakeVolume)
fakeVolume2 = new(workerfakes.FakeVolume) fakeVolume2 = new(workerfakes.FakeVolume)
@ -720,7 +716,7 @@ var _ = Describe("TaskStep", func() {
}) })
It("creates the container with the caches in the inputs", func() { It("creates the container with the caches in the inputs", func() {
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.Inputs).To(HaveLen(2)) Expect(containerSpec.Inputs).To(HaveLen(2))
Expect([]string{ Expect([]string{
containerSpec.Inputs[0].DestinationPath(), containerSpec.Inputs[0].DestinationPath(),
@ -731,27 +727,33 @@ var _ = Describe("TaskStep", func() {
)) ))
}) })
It("registers cache volumes as task caches", func() { Context("when task belongs to a job", func() {
Expect(stepErr).ToNot(HaveOccurred()) BeforeEach(func() {
stepMetadata.JobID = 12
})
Expect(fakeVolume1.InitializeTaskCacheCallCount()).To(Equal(1)) It("registers cache volumes as task caches", func() {
_, jID, stepName, cachePath, p := fakeVolume1.InitializeTaskCacheArgsForCall(0) Expect(stepErr).ToNot(HaveOccurred())
Expect(jID).To(Equal(jobID))
Expect(stepName).To(Equal("some-task"))
Expect(cachePath).To(Equal("some-path-1"))
Expect(p).To(Equal(bool(privileged)))
Expect(fakeVolume2.InitializeTaskCacheCallCount()).To(Equal(1)) Expect(fakeVolume1.InitializeTaskCacheCallCount()).To(Equal(1))
_, jID, stepName, cachePath, p = fakeVolume2.InitializeTaskCacheArgsForCall(0) _, jID, stepName, cachePath, p := fakeVolume1.InitializeTaskCacheArgsForCall(0)
Expect(jID).To(Equal(jobID)) Expect(jID).To(Equal(stepMetadata.JobID))
Expect(stepName).To(Equal("some-task")) Expect(stepName).To(Equal("some-task"))
Expect(cachePath).To(Equal("some-path-2")) Expect(cachePath).To(Equal("some-path-1"))
Expect(p).To(Equal(bool(privileged))) Expect(p).To(Equal(bool(taskPlan.Privileged)))
Expect(fakeVolume2.InitializeTaskCacheCallCount()).To(Equal(1))
_, jID, stepName, cachePath, p = fakeVolume2.InitializeTaskCacheArgsForCall(0)
Expect(jID).To(Equal(stepMetadata.JobID))
Expect(stepName).To(Equal("some-task"))
Expect(cachePath).To(Equal("some-path-2"))
Expect(p).To(Equal(bool(taskPlan.Privileged)))
})
}) })
Context("when task does not belong to job (one-off build)", func() { Context("when task does not belong to job (one-off build)", func() {
BeforeEach(func() { BeforeEach(func() {
jobID = 0 stepMetadata.JobID = 0
}) })
It("does not initialize caches", func() { It("does not initialize caches", func() {
@ -764,7 +766,7 @@ var _ = Describe("TaskStep", func() {
Context("when the configuration specifies paths for outputs", func() { Context("when the configuration specifies paths for outputs", func() {
BeforeEach(func() { BeforeEach(func() {
configSource.FetchConfigReturns(atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
Params: map[string]string{"SOME": "params"}, Params: map[string]string{"SOME": "params"},
@ -777,11 +779,11 @@ var _ = Describe("TaskStep", func() {
{Name: "some-other-output"}, {Name: "some-other-output"},
{Name: "some-trailing-slash-output", Path: "some-output-configured-path-with-trailing-slash/"}, {Name: "some-trailing-slash-output", Path: "some-output-configured-path-with-trailing-slash/"},
}, },
}, nil) }
}) })
It("configures them appropriately in the container spec", func() { It("configures them appropriately in the container spec", func() {
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.Outputs).To(Equal(worker.OutputPaths{ Expect(containerSpec.Outputs).To(Equal(worker.OutputPaths{
"some-output": "some-artifact-root/some-output-configured-path/", "some-output": "some-artifact-root/some-output-configured-path/",
"some-other-output": "some-artifact-root/some-other-output/", "some-other-output": "some-artifact-root/some-other-output/",
@ -881,7 +883,7 @@ var _ = Describe("TaskStep", func() {
}) })
It("passes existing output volumes to the resource", func() { It("passes existing output volumes to the resource", func() {
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.Outputs).To(Equal(worker.OutputPaths{ Expect(containerSpec.Outputs).To(Equal(worker.OutputPaths{
"some-output": "some-artifact-root/some-output-configured-path/", "some-output": "some-artifact-root/some-output-configured-path/",
"some-other-output": "some-artifact-root/some-other-output/", "some-other-output": "some-artifact-root/some-other-output/",
@ -1142,15 +1144,16 @@ var _ = Describe("TaskStep", func() {
) )
BeforeEach(func() { BeforeEach(func() {
outputMapping = map[string]string{"generic-remapped-output": "specific-remapped-output"} taskPlan.OutputMapping = map[string]string{"generic-remapped-output": "specific-remapped-output"}
configSource.FetchConfigReturns(atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform",
Run: atc.TaskRunConfig{ Run: atc.TaskRunConfig{
Path: "ls", Path: "ls",
}, },
Outputs: []atc.TaskOutputConfig{ Outputs: []atc.TaskOutputConfig{
{Name: "generic-remapped-output"}, {Name: "generic-remapped-output"},
}, },
}, nil) }
fakeProcess.WaitReturns(0, nil) fakeProcess.WaitReturns(0, nil)
@ -1180,7 +1183,7 @@ var _ = Describe("TaskStep", func() {
Context("when an image artifact name is specified", func() { Context("when an image artifact name is specified", func() {
BeforeEach(func() { BeforeEach(func() {
imageArtifactName = "some-image-artifact" taskPlan.ImageArtifactName = "some-image-artifact"
fakeProcess.WaitReturns(0, nil) fakeProcess.WaitReturns(0, nil)
}) })
@ -1194,7 +1197,7 @@ var _ = Describe("TaskStep", func() {
}) })
It("chooses a worker and creates the container with the image artifact source", func() { It("chooses a worker and creates the container with the image artifact source", func() {
_, _, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, _, containerSpec, _, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ImageArtifactSource: imageArtifactSource, ImageArtifactSource: imageArtifactSource,
})) }))
@ -1216,7 +1219,7 @@ var _ = Describe("TaskStep", func() {
Context("when the task config also specifies image", func() { Context("when the task config also specifies image", func() {
BeforeEach(func() { BeforeEach(func() {
configWithImage := atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
Params: map[string]string{"SOME": "params"}, Params: map[string]string{"SOME": "params"},
@ -1225,12 +1228,10 @@ var _ = Describe("TaskStep", func() {
Args: []string{"some", "args"}, Args: []string{"some", "args"},
}, },
} }
configSource.FetchConfigReturns(configWithImage, nil)
}) })
It("still chooses a worker and creates the container with the volume and a metadata stream", func() { It("still chooses a worker and creates the container with the volume and a metadata stream", func() {
_, _, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, _, containerSpec, _, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ImageArtifactSource: imageArtifactSource, ImageArtifactSource: imageArtifactSource,
})) }))
@ -1241,7 +1242,7 @@ var _ = Describe("TaskStep", func() {
Context("when the task config also specifies image_resource", func() { Context("when the task config also specifies image_resource", func() {
BeforeEach(func() { BeforeEach(func() {
configWithImageResource := atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
ImageResource: &atc.ImageResource{ ImageResource: &atc.ImageResource{
Type: "docker", Type: "docker",
@ -1255,12 +1256,10 @@ var _ = Describe("TaskStep", func() {
Args: []string{"some", "args"}, Args: []string{"some", "args"},
}, },
} }
configSource.FetchConfigReturns(configWithImageResource, nil)
}) })
It("still chooses a worker and creates the container with the volume and a metadata stream", func() { It("still chooses a worker and creates the container with the volume and a metadata stream", func() {
_, _, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, _, containerSpec, _, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ImageArtifactSource: imageArtifactSource, ImageArtifactSource: imageArtifactSource,
})) }))
@ -1271,7 +1270,7 @@ var _ = Describe("TaskStep", func() {
Context("when the task config also specifies image and image_resource", func() { Context("when the task config also specifies image and image_resource", func() {
BeforeEach(func() { BeforeEach(func() {
configWithImageAndImageResource := atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
ImageResource: &atc.ImageResource{ ImageResource: &atc.ImageResource{
@ -1286,12 +1285,10 @@ var _ = Describe("TaskStep", func() {
Args: []string{"some", "args"}, Args: []string{"some", "args"},
}, },
} }
configSource.FetchConfigReturns(configWithImageAndImageResource, nil)
}) })
It("still chooses a worker and creates the container with the volume and a metadata stream", func() { It("still chooses a worker and creates the container with the volume and a metadata stream", func() {
_, _, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, _, containerSpec, _, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ImageArtifactSource: imageArtifactSource, ImageArtifactSource: imageArtifactSource,
})) }))
@ -1315,7 +1312,7 @@ var _ = Describe("TaskStep", func() {
Context("when the image_resource is specified (even if RootfsURI is configured)", func() { Context("when the image_resource is specified (even if RootfsURI is configured)", func() {
BeforeEach(func() { BeforeEach(func() {
configWithImageResource := atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
ImageResource: &atc.ImageResource{ ImageResource: &atc.ImageResource{
@ -1330,15 +1327,13 @@ var _ = Describe("TaskStep", func() {
Args: []string{"some", "args"}, Args: []string{"some", "args"},
}, },
} }
configSource.FetchConfigReturns(configWithImageResource, nil)
}) })
It("creates the specs with the image resource", func() { It("creates the specs with the image resource", func() {
_, _, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, _, containerSpec, _, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(containerSpec.ImageSpec.ImageResource).To(Equal(&worker.ImageResource{ Expect(containerSpec.ImageSpec.ImageResource).To(Equal(&worker.ImageResource{
Type: "docker", Type: "docker",
Source: creds.NewSource(template.StaticVariables{}, atc.Source{"some": "super-secret-source"}), Source: atc.Source{"some": "super-secret-source"},
Params: &atc.Params{"some": "params"}, Params: &atc.Params{"some": "params"},
Version: &atc.Version{"some": "version"}, Version: &atc.Version{"some": "version"},
})) }))
@ -1346,7 +1341,7 @@ var _ = Describe("TaskStep", func() {
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
TeamID: 123, TeamID: 123,
Platform: "some-platform", Platform: "some-platform",
ResourceTypes: resourceTypes, ResourceTypes: interpolatedResourceTypes,
Tags: []string{"step", "tags"}, Tags: []string{"step", "tags"},
ResourceType: "docker", ResourceType: "docker",
})) }))
@ -1355,7 +1350,7 @@ var _ = Describe("TaskStep", func() {
Context("when the RootfsURI is configured", func() { Context("when the RootfsURI is configured", func() {
BeforeEach(func() { BeforeEach(func() {
configWithRootfs := atc.TaskConfig{ taskPlan.Config = &atc.TaskConfig{
Platform: "some-platform", Platform: "some-platform",
RootfsURI: "some-image", RootfsURI: "some-image",
Params: map[string]string{"SOME": "params"}, Params: map[string]string{"SOME": "params"},
@ -1364,18 +1359,16 @@ var _ = Describe("TaskStep", func() {
Args: []string{"some", "args"}, Args: []string{"some", "args"},
}, },
} }
configSource.FetchConfigReturns(configWithRootfs, nil)
}) })
It("creates the specs with the image resource", func() { It("creates the specs with the image resource", func() {
_, _, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, _, containerSpec, _, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(containerSpec.ImageSpec.ImageURL).To(Equal("some-image")) Expect(containerSpec.ImageSpec.ImageURL).To(Equal("some-image"))
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
TeamID: 123, TeamID: 123,
Platform: "some-platform", Platform: "some-platform",
ResourceTypes: resourceTypes, ResourceTypes: interpolatedResourceTypes,
Tags: []string{"step", "tags"}, Tags: []string{"step", "tags"},
})) }))
}) })
@ -1383,8 +1376,7 @@ var _ = Describe("TaskStep", func() {
Context("when a run dir is specified", func() { Context("when a run dir is specified", func() {
BeforeEach(func() { BeforeEach(func() {
fetchedConfig.Run.Dir = "/some/dir" taskPlan.Config.Run.Dir = "/some/dir"
configSource.FetchConfigReturns(fetchedConfig, nil)
}) })
It("runs a process in the specified (custom) directory", func() { It("runs a process in the specified (custom) directory", func() {
@ -1395,12 +1387,11 @@ var _ = Describe("TaskStep", func() {
Context("when a run user is specified", func() { Context("when a run user is specified", func() {
BeforeEach(func() { BeforeEach(func() {
fetchedConfig.Run.User = "some-user" taskPlan.Config.Run.User = "some-user"
configSource.FetchConfigReturns(fetchedConfig, nil)
}) })
It("adds the user to the container spec", func() { It("adds the user to the container spec", func() {
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.User).To(Equal("some-user")) Expect(containerSpec.User).To(Equal("some-user"))
}) })
@ -1656,15 +1647,29 @@ var _ = Describe("TaskStep", func() {
}) })
}) })
Context("when getting the config fails", func() { Context("when missing the platform", func() {
disaster := errors.New("nope")
BeforeEach(func() { BeforeEach(func() {
configSource.FetchConfigReturns(atc.TaskConfig{}, disaster) taskPlan.Config.Platform = ""
}) })
It("returns the error", func() { It("returns the error", func() {
Expect(stepErr).To(Equal(disaster)) Expect(stepErr).To(HaveOccurred())
})
It("is not successful", func() {
Expect(taskStep.Succeeded()).To(BeFalse())
})
})
Context("when missing the path to the executable", func() {
BeforeEach(func() {
taskPlan.Config.Run.Path = ""
})
It("returns the error", func() {
Expect(stepErr).To(HaveOccurred())
}) })
It("is not successful", func() { It("is not successful", func() {

View File

@ -6,7 +6,6 @@ import (
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/algorithm" "github.com/concourse/concourse/atc/db/algorithm"
"github.com/concourse/concourse/atc/gc" "github.com/concourse/concourse/atc/gc"
@ -43,7 +42,6 @@ var _ = Describe("ResourceCacheCollector", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
oneOffCache, err = resourceCacheFactory.FindOrCreateResourceCache( oneOffCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(oneOffBuild.ID()), db.ForBuild(oneOffBuild.ID()),
"some-base-type", "some-base-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -51,7 +49,7 @@ var _ = Describe("ResourceCacheCollector", func() {
"some": "source", "some": "source",
}, },
nil, nil,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@ -59,7 +57,6 @@ var _ = Describe("ResourceCacheCollector", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
jobCache, err = resourceCacheFactory.FindOrCreateResourceCache( jobCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(jobBuild.ID()), db.ForBuild(jobBuild.ID()),
"some-base-type", "some-base-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -67,7 +64,7 @@ var _ = Describe("ResourceCacheCollector", func() {
"some": "source", "some": "source",
}, },
nil, nil,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@ -77,11 +74,10 @@ var _ = Describe("ResourceCacheCollector", func() {
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
_, err = resource.SetResourceConfig( _, err = resource.SetResourceConfig(
logger,
atc.Source{ atc.Source{
"some": "source", "some": "source",
}, },
creds.VersionedResourceTypes{}) atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
@ -173,7 +169,6 @@ var _ = Describe("ResourceCacheCollector", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
secondJobCache, err = resourceCacheFactory.FindOrCreateResourceCache( secondJobCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(secondJobBuild.ID()), db.ForBuild(secondJobBuild.ID()),
"some-base-type", "some-base-type",
atc.Version{"some": "new-version"}, atc.Version{"some": "new-version"},
@ -181,7 +176,7 @@ var _ = Describe("ResourceCacheCollector", func() {
"some": "source", "some": "source",
}, },
nil, nil,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@ -224,7 +219,6 @@ var _ = Describe("ResourceCacheCollector", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
secondJobCache, err = resourceCacheFactory.FindOrCreateResourceCache( secondJobCache, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(secondJobBuild.ID()), db.ForBuild(secondJobBuild.ID()),
"some-base-type", "some-base-type",
atc.Version{"some": "new-version"}, atc.Version{"some": "new-version"},
@ -232,7 +226,7 @@ var _ = Describe("ResourceCacheCollector", func() {
"some": "source", "some": "source",
}, },
nil, nil,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())

View File

@ -3,9 +3,7 @@ package gc_test
import ( import (
"context" "context"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/gc" "github.com/concourse/concourse/atc/gc"
@ -52,7 +50,7 @@ var _ = Describe("ResourceCacheUseCollector", func() {
Name: "some-type", Name: "some-type",
Type: "some-base-type", Type: "some-base-type",
Source: atc.Source{ Source: atc.Source{
"some-type": "((source-param))", "some-type": "source-param",
}, },
}, },
Version: atc.Version{"some-type": "version"}, Version: atc.Version{"some-type": "version"},
@ -62,7 +60,6 @@ var _ = Describe("ResourceCacheUseCollector", func() {
Describe("for one-off builds", func() { Describe("for one-off builds", func() {
BeforeEach(func() { BeforeEach(func() {
_, err = resourceCacheFactory.FindOrCreateResourceCache( _, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(defaultBuild.ID()), db.ForBuild(defaultBuild.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -70,11 +67,9 @@ var _ = Describe("ResourceCacheUseCollector", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes(template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceTypes{
atc.VersionedResourceTypes{ versionedResourceType,
versionedResourceType, },
},
),
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -129,7 +124,6 @@ var _ = Describe("ResourceCacheUseCollector", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
_, err = resourceCacheFactory.FindOrCreateResourceCache( _, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(jobBuild.ID()), db.ForBuild(jobBuild.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -137,11 +131,9 @@ var _ = Describe("ResourceCacheUseCollector", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes(template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceTypes{
atc.VersionedResourceTypes{ versionedResourceType,
versionedResourceType, },
},
),
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -165,7 +157,6 @@ var _ = Describe("ResourceCacheUseCollector", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
_, err = resourceCacheFactory.FindOrCreateResourceCache( _, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(secondJobBuild.ID()), db.ForBuild(secondJobBuild.ID()),
"some-type", "some-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -173,11 +164,9 @@ var _ = Describe("ResourceCacheUseCollector", func() {
"some": "source", "some": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes(template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceTypes{
atc.VersionedResourceTypes{ versionedResourceType,
versionedResourceType, },
},
),
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -214,7 +203,6 @@ var _ = Describe("ResourceCacheUseCollector", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
_, err = resourceCacheFactory.FindOrCreateResourceCache( _, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForContainer(container.ID()), db.ForContainer(container.ID()),
"some-type", "some-type",
atc.Version{"some-type": "version"}, atc.Version{"some-type": "version"},
@ -222,11 +210,9 @@ var _ = Describe("ResourceCacheUseCollector", func() {
"cache": "source", "cache": "source",
}, },
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.NewVersionedResourceTypes(template.StaticVariables{"source-param": "some-secret-sauce"}, atc.VersionedResourceTypes{
atc.VersionedResourceTypes{ versionedResourceType,
versionedResourceType, },
},
),
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })

View File

@ -6,7 +6,6 @@ import (
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/gc" "github.com/concourse/concourse/atc/gc"
@ -34,8 +33,8 @@ var _ = Describe("ResourceConfigCheckSessionCollector", func() {
var owner db.ContainerOwner var owner db.ContainerOwner
ownerExpiries = db.ContainerOwnerExpiries{ ownerExpiries = db.ContainerOwnerExpiries{
Min: 10 * time.Second, Min: 10 * time.Second,
Max: 10 * time.Second, Max: 10 * time.Second,
} }
BeforeEach(func() { BeforeEach(func() {
@ -46,11 +45,10 @@ var _ = Describe("ResourceConfigCheckSessionCollector", func() {
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
resourceConfigScope, err = resource.SetResourceConfig( resourceConfigScope, err = resource.SetResourceConfig(
logger,
atc.Source{ atc.Source{
"some": "source", "some": "source",
}, },
creds.VersionedResourceTypes{}) atc.VersionedResourceTypes{})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
owner = db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), ownerExpiries) owner = db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), ownerExpiries)

View File

@ -5,7 +5,6 @@ import (
"time" "time"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/gc" "github.com/concourse/concourse/atc/gc"
@ -40,18 +39,17 @@ var _ = Describe("ResourceConfigCollector", func() {
Context("when the config is referenced in resource config check sessions", func() { Context("when the config is referenced in resource config check sessions", func() {
ownerExpiries := db.ContainerOwnerExpiries{ ownerExpiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 10 * time.Minute, Max: 10 * time.Minute,
} }
BeforeEach(func() { BeforeEach(func() {
resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig( resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-base-type", "some-base-type",
atc.Source{ atc.Source{
"some": "source", "some": "source",
}, },
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@ -84,18 +82,17 @@ var _ = Describe("ResourceConfigCollector", func() {
Context("when the config is no longer referenced in resource config check sessions", func() { Context("when the config is no longer referenced in resource config check sessions", func() {
ownerExpiries := db.ContainerOwnerExpiries{ ownerExpiries := db.ContainerOwnerExpiries{
Min: 5 * time.Minute, Min: 5 * time.Minute,
Max: 10 * time.Minute, Max: 10 * time.Minute,
} }
BeforeEach(func() { BeforeEach(func() {
resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig( resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-base-type", "some-base-type",
atc.Source{ atc.Source{
"some": "source", "some": "source",
}, },
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@ -137,7 +134,6 @@ var _ = Describe("ResourceConfigCollector", func() {
Context("when config is referenced in resource caches", func() { Context("when config is referenced in resource caches", func() {
BeforeEach(func() { BeforeEach(func() {
_, err = resourceCacheFactory.FindOrCreateResourceCache( _, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(defaultBuild.ID()), db.ForBuild(defaultBuild.ID()),
"some-base-type", "some-base-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -145,7 +141,7 @@ var _ = Describe("ResourceConfigCollector", func() {
"some": "source", "some": "source",
}, },
nil, nil,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -160,7 +156,6 @@ var _ = Describe("ResourceConfigCollector", func() {
Context("when config is not referenced in resource caches", func() { Context("when config is not referenced in resource caches", func() {
BeforeEach(func() { BeforeEach(func() {
_, err = resourceCacheFactory.FindOrCreateResourceCache( _, err = resourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForBuild(defaultBuild.ID()), db.ForBuild(defaultBuild.ID()),
"some-base-type", "some-base-type",
atc.Version{"some": "version"}, atc.Version{"some": "version"},
@ -168,7 +163,7 @@ var _ = Describe("ResourceConfigCollector", func() {
"some": "source", "some": "source",
}, },
nil, nil,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@ -193,9 +188,8 @@ var _ = Describe("ResourceConfigCollector", func() {
Context("when config is referenced in resources", func() { Context("when config is referenced in resources", func() {
BeforeEach(func() { BeforeEach(func() {
_, err := usedResource.SetResourceConfig( _, err := usedResource.SetResourceConfig(
logger,
atc.Source{"some": "source"}, atc.Source{"some": "source"},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -210,10 +204,9 @@ var _ = Describe("ResourceConfigCollector", func() {
Context("when config is not referenced in resources", func() { Context("when config is not referenced in resources", func() {
BeforeEach(func() { BeforeEach(func() {
_, err := resourceConfigFactory.FindOrCreateResourceConfig( _, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-base-type", "some-base-type",
atc.Source{"some": "source"}, atc.Source{"some": "source"},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
_, err = usedResource.Reload() _, err = usedResource.Reload()
@ -231,9 +224,8 @@ var _ = Describe("ResourceConfigCollector", func() {
Context("when config is referenced in resource types", func() { Context("when config is referenced in resource types", func() {
BeforeEach(func() { BeforeEach(func() {
_, err := usedResourceType.SetResourceConfig( _, err := usedResourceType.SetResourceConfig(
logger,
atc.Source{"some": "source-type"}, atc.Source{"some": "source-type"},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -248,10 +240,9 @@ var _ = Describe("ResourceConfigCollector", func() {
Context("when config is not referenced in resource types", func() { Context("when config is not referenced in resource types", func() {
BeforeEach(func() { BeforeEach(func() {
_, err := resourceConfigFactory.FindOrCreateResourceConfig( _, err := resourceConfigFactory.FindOrCreateResourceConfig(
logger,
"some-base-type", "some-base-type",
atc.Source{"some": "source-type"}, atc.Source{"some": "source-type"},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
_, err = usedResourceType.Reload() _, err = usedResourceType.Reload()

View File

@ -61,22 +61,6 @@ var _ = Describe("ATC Integration Test", func() {
}) })
}) })
Context("when cluster name is specified", func() {
BeforeEach(func() {
cmd.Server.ClusterName = "foobar"
})
It("renders cluster name into HTML template", func() {
resp, err := http.Get(atcURL)
Expect(err).NotTo(HaveOccurred())
bodyBytes, err := ioutil.ReadAll(resp.Body)
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(200))
Expect(string(bodyBytes)).To(ContainSubstring("foobar"))
})
})
It("set default team and config auth for the main team", func() { It("set default team and config auth for the main team", func() {
client := webLogin(atcURL, "test", "test") client := webLogin(atcURL, "test", "test")

View File

@ -154,10 +154,15 @@ func (scanner *resourceScanner) scan(logger lager.Logger, resourceID int, fromVe
return 0, err return 0, err
} }
versionedResourceTypes := creds.NewVersionedResourceTypes( versionedResourceTypes, err := creds.NewVersionedResourceTypes(
scanner.variables, scanner.variables,
resourceTypes.Deserialize(), resourceTypes.Deserialize(),
) ).Evaluate()
if err != nil {
logger.Error("failed-to-evaluate-resource-types", err)
scanner.setResourceCheckError(logger, savedResource, err)
return 0, err
}
source, err := creds.NewSource(scanner.variables, savedResource.Source()).Evaluate() source, err := creds.NewSource(scanner.variables, savedResource.Source()).Evaluate()
if err != nil { if err != nil {
@ -167,7 +172,6 @@ func (scanner *resourceScanner) scan(logger lager.Logger, resourceID int, fromVe
} }
resourceConfigScope, err := savedResource.SetResourceConfig( resourceConfigScope, err := savedResource.SetResourceConfig(
logger,
source, source,
versionedResourceTypes, versionedResourceTypes,
) )
@ -203,7 +207,6 @@ func (scanner *resourceScanner) scan(logger lager.Logger, resourceID int, fromVe
for { for {
lock, acquired, err := resourceConfigScope.AcquireResourceCheckingLock( lock, acquired, err := resourceConfigScope.AcquireResourceCheckingLock(
logger, logger,
interval,
) )
if err != nil { if err != nil {
lockLogger.Error("failed-to-get-lock", err, lager.Data{ lockLogger.Error("failed-to-get-lock", err, lager.Data{
@ -265,7 +268,7 @@ func (scanner *resourceScanner) check(
savedResource db.Resource, savedResource db.Resource,
resourceConfigScope db.ResourceConfigScope, resourceConfigScope db.ResourceConfigScope,
fromVersion atc.Version, fromVersion atc.Version,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
source atc.Source, source atc.Source,
saveGiven bool, saveGiven bool,
timeout time.Duration, timeout time.Duration,
@ -317,11 +320,18 @@ func (scanner *resourceScanner) check(
} }
owner := db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), ContainerExpiries) owner := db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), ContainerExpiries)
containerMetadata := db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}
chosenWorker, err := scanner.pool.FindOrChooseWorkerForContainer(logger, owner, containerSpec, workerSpec, scanner.strategy) chosenWorker, err := scanner.pool.FindOrChooseWorkerForContainer(
context.Background(),
logger,
owner,
containerSpec,
db.ContainerMetadata{
Type: db.ContainerTypeCheck,
},
workerSpec,
scanner.strategy,
)
if err != nil { if err != nil {
logger.Error("failed-to-choose-a-worker", err) logger.Error("failed-to-choose-a-worker", err)
chkErr := resourceConfigScope.SetCheckError(err) chkErr := resourceConfigScope.SetCheckError(err)
@ -330,17 +340,22 @@ func (scanner *resourceScanner) check(
} }
return err return err
} }
container, err := chosenWorker.FindOrCreateContainer( container, err := chosenWorker.FindOrCreateContainer(
context.Background(), context.Background(),
logger, logger,
worker.NoopImageFetchingDelegate{}, worker.NoopImageFetchingDelegate{},
owner, owner,
containerMetadata,
containerSpec, containerSpec,
resourceTypes, resourceTypes,
) )
if err != nil { if err != nil {
// TODO: remove this after ephemeral check containers.
// Sometimes we pass in a check session thats too close to
// expirey into FindOrCreateContainer such that the container
// gced before the call is completed
if err == worker.ResourceConfigCheckSessionExpiredError {
return nil
}
logger.Error("failed-to-create-or-find-container", err) logger.Error("failed-to-create-or-find-container", err)
chkErr := resourceConfigScope.SetCheckError(err) chkErr := resourceConfigScope.SetCheckError(err)
if chkErr != nil { if chkErr != nil {

View File

@ -42,8 +42,8 @@ var _ = Describe("ResourceScanner", func() {
interval time.Duration interval time.Duration
variables creds.Variables variables creds.Variables
fakeResourceType *dbfakes.FakeResourceType fakeResourceType *dbfakes.FakeResourceType
versionedResourceType atc.VersionedResourceType interpolatedResourceTypes atc.VersionedResourceTypes
scanner Scanner scanner Scanner
@ -73,13 +73,15 @@ var _ = Describe("ResourceScanner", func() {
Tags: atc.Tags{"some-tag"}, Tags: atc.Tags{"some-tag"},
} }
versionedResourceType = atc.VersionedResourceType{ interpolatedResourceTypes = atc.VersionedResourceTypes{
ResourceType: atc.ResourceType{ {
Name: "some-custom-resource", ResourceType: atc.ResourceType{
Type: "registry-image", Name: "some-custom-resource",
Source: atc.Source{"custom": "((source-params))"}, Type: "registry-image",
Source: atc.Source{"custom": "some-secret-sauce"},
},
Version: atc.Version{"custom": "version"},
}, },
Version: atc.Version{"custom": "version"},
} }
fakeContainer = new(workerfakes.FakeContainer) fakeContainer = new(workerfakes.FakeContainer)
@ -165,7 +167,7 @@ var _ = Describe("ResourceScanner", func() {
results <- true results <- true
close(results) close(results)
fakeResourceConfigScope.AcquireResourceCheckingLockStub = func(logger lager.Logger, interval time.Duration) (lock.Lock, bool, error) { fakeResourceConfigScope.AcquireResourceCheckingLockStub = func(logger lager.Logger) (lock.Lock, bool, error) {
if <-results { if <-results {
return fakeLock, true, nil return fakeLock, true, nil
} else { } else {
@ -178,16 +180,6 @@ var _ = Describe("ResourceScanner", func() {
It("retries every second until it is", func() { It("retries every second until it is", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(3)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(3))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(interval))
_, leaseInterval = fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(1)
Expect(leaseInterval).To(Equal(interval))
_, leaseInterval = fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(2)
Expect(leaseInterval).To(Equal(interval))
Expect(fakeLock.ReleaseCallCount()).To(Equal(1)) Expect(fakeLock.ReleaseCallCount()).To(Equal(1))
}) })
}) })
@ -238,17 +230,15 @@ var _ = Describe("ResourceScanner", func() {
It("constructs the resource of the correct type", func() { It("constructs the resource of the correct type", func() {
Expect(fakeDBResource.SetResourceConfigCallCount()).To(Equal(1)) Expect(fakeDBResource.SetResourceConfigCallCount()).To(Equal(1))
_, resourceSource, resourceTypes := fakeDBResource.SetResourceConfigArgsForCall(0) resourceSource, resourceTypes := fakeDBResource.SetResourceConfigArgsForCall(0)
Expect(resourceSource).To(Equal(atc.Source{"uri": "some-secret-sauce"})) Expect(resourceSource).To(Equal(atc.Source{"uri": "some-secret-sauce"}))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(interpolatedResourceTypes))
versionedResourceType,
})))
Expect(fakeDBResource.SetCheckSetupErrorCallCount()).To(Equal(1)) Expect(fakeDBResource.SetCheckSetupErrorCallCount()).To(Equal(1))
err := fakeDBResource.SetCheckSetupErrorArgsForCall(0) err := fakeDBResource.SetCheckSetupErrorArgsForCall(0)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
_, owner, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, owner, containerSpec, metadata, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, radar.ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, radar.ContainerExpiries)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "git", ResourceType: "git",
@ -260,19 +250,19 @@ var _ = Describe("ResourceScanner", func() {
"RESOURCE_PIPELINE_NAME=some-pipeline", "RESOURCE_PIPELINE_NAME=some-pipeline",
"RESOURCE_NAME=some-resource", "RESOURCE_NAME=some-resource",
})) }))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
ResourceType: "git", ResourceType: "git",
Tags: atc.Tags{"some-tag"}, Tags: atc.Tags{"some-tag"},
ResourceTypes: creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{versionedResourceType}), ResourceTypes: interpolatedResourceTypes,
TeamID: 123, TeamID: 123,
})) }))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, _, _, owner, metadata, containerSpec, resourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, owner, containerSpec, resourceTypes = fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, radar.ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, radar.ContainerExpiries)))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "git", ResourceType: "git",
})) }))
@ -283,9 +273,7 @@ var _ = Describe("ResourceScanner", func() {
"RESOURCE_PIPELINE_NAME=some-pipeline", "RESOURCE_PIPELINE_NAME=some-pipeline",
"RESOURCE_NAME=some-resource", "RESOURCE_NAME=some-resource",
})) }))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(interpolatedResourceTypes))
versionedResourceType,
})))
}) })
Context("when the resource config has a specified check interval", func() { Context("when the resource config has a specified check interval", func() {
@ -298,9 +286,6 @@ var _ = Describe("ResourceScanner", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1))
Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(10 * time.Millisecond))
leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0) leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0)
Expect(leaseInterval).To(Equal(10 * time.Millisecond)) Expect(leaseInterval).To(Equal(10 * time.Millisecond))
Expect(immediate).To(BeFalse()) Expect(immediate).To(BeFalse())
@ -335,9 +320,6 @@ var _ = Describe("ResourceScanner", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1))
Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(interval))
leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0) leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0)
Expect(leaseInterval).To(Equal(interval)) Expect(leaseInterval).To(Equal(interval))
Expect(immediate).To(BeFalse()) Expect(immediate).To(BeFalse())
@ -670,17 +652,15 @@ var _ = Describe("ResourceScanner", func() {
It("constructs the resource of the correct type", func() { It("constructs the resource of the correct type", func() {
Expect(fakeDBResource.SetResourceConfigCallCount()).To(Equal(1)) Expect(fakeDBResource.SetResourceConfigCallCount()).To(Equal(1))
_, resourceSource, resourceTypes := fakeDBResource.SetResourceConfigArgsForCall(0) resourceSource, resourceTypes := fakeDBResource.SetResourceConfigArgsForCall(0)
Expect(resourceSource).To(Equal(atc.Source{"uri": "some-secret-sauce"})) Expect(resourceSource).To(Equal(atc.Source{"uri": "some-secret-sauce"}))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(interpolatedResourceTypes))
versionedResourceType,
})))
Expect(fakeDBResource.SetCheckSetupErrorCallCount()).To(Equal(1)) Expect(fakeDBResource.SetCheckSetupErrorCallCount()).To(Equal(1))
err := fakeDBResource.SetCheckSetupErrorArgsForCall(0) err := fakeDBResource.SetCheckSetupErrorArgsForCall(0)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
_, owner, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, owner, containerSpec, metadata, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, radar.ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, radar.ContainerExpiries)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "git", ResourceType: "git",
@ -692,18 +672,18 @@ var _ = Describe("ResourceScanner", func() {
"RESOURCE_PIPELINE_NAME=some-pipeline", "RESOURCE_PIPELINE_NAME=some-pipeline",
"RESOURCE_NAME=some-resource", "RESOURCE_NAME=some-resource",
})) }))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
ResourceType: "git", ResourceType: "git",
Tags: atc.Tags{"some-tag"}, Tags: atc.Tags{"some-tag"},
ResourceTypes: creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{versionedResourceType}), ResourceTypes: interpolatedResourceTypes,
TeamID: 123, TeamID: 123,
})) }))
_, _, _, owner, metadata, containerSpec, resourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, owner, containerSpec, resourceTypes = fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, radar.ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, radar.ContainerExpiries)))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "git", ResourceType: "git",
})) }))
@ -714,18 +694,13 @@ var _ = Describe("ResourceScanner", func() {
"RESOURCE_PIPELINE_NAME=some-pipeline", "RESOURCE_PIPELINE_NAME=some-pipeline",
"RESOURCE_NAME=some-resource", "RESOURCE_NAME=some-resource",
})) }))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(interpolatedResourceTypes))
versionedResourceType,
})))
}) })
It("grabs an immediate resource checking lock before checking, breaks lock after done", func() { It("grabs an immediate resource checking lock before checking, breaks lock after done", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1))
Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(interval))
leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0) leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0)
Expect(leaseInterval).To(Equal(interval)) Expect(leaseInterval).To(Equal(interval))
Expect(immediate).To(BeTrue()) Expect(immediate).To(BeTrue())
@ -785,9 +760,6 @@ var _ = Describe("ResourceScanner", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1))
Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(10 * time.Millisecond))
leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0) leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0)
Expect(leaseInterval).To(Equal(10 * time.Millisecond)) Expect(leaseInterval).To(Equal(10 * time.Millisecond))
Expect(immediate).To(BeTrue()) Expect(immediate).To(BeTrue())

View File

@ -115,10 +115,15 @@ func (scanner *resourceTypeScanner) scan(logger lager.Logger, resourceTypeID int
return 0, err return 0, err
} }
versionedResourceTypes := creds.NewVersionedResourceTypes( versionedResourceTypes, err := creds.NewVersionedResourceTypes(
scanner.variables, scanner.variables,
resourceTypes.Deserialize(), resourceTypes.Deserialize(),
) ).Evaluate()
if err != nil {
logger.Error("failed-to-evaluate-resource-types", err)
scanner.setCheckError(logger, savedResourceType, err)
return 0, err
}
source, err := creds.NewSource(scanner.variables, savedResourceType.Source()).Evaluate() source, err := creds.NewSource(scanner.variables, savedResourceType.Source()).Evaluate()
if err != nil { if err != nil {
@ -128,7 +133,6 @@ func (scanner *resourceTypeScanner) scan(logger lager.Logger, resourceTypeID int
} }
resourceConfigScope, err := savedResourceType.SetResourceConfig( resourceConfigScope, err := savedResourceType.SetResourceConfig(
logger,
source, source,
versionedResourceTypes.Without(savedResourceType.Name()), versionedResourceTypes.Without(savedResourceType.Name()),
) )
@ -146,7 +150,6 @@ func (scanner *resourceTypeScanner) scan(logger lager.Logger, resourceTypeID int
reattempt = mustComplete reattempt = mustComplete
lock, acquired, err := resourceConfigScope.AcquireResourceCheckingLock( lock, acquired, err := resourceConfigScope.AcquireResourceCheckingLock(
logger, logger,
interval,
) )
if err != nil { if err != nil {
lockLogger.Error("failed-to-get-lock", err, lager.Data{ lockLogger.Error("failed-to-get-lock", err, lager.Data{
@ -218,7 +221,7 @@ func (scanner *resourceTypeScanner) check(
savedResourceType db.ResourceType, savedResourceType db.ResourceType,
resourceConfigScope db.ResourceConfigScope, resourceConfigScope db.ResourceConfigScope,
fromVersion atc.Version, fromVersion atc.Version,
versionedResourceTypes creds.VersionedResourceTypes, versionedResourceTypes atc.VersionedResourceTypes,
source atc.Source, source atc.Source,
saveGiven bool, saveGiven bool,
) error { ) error {
@ -253,7 +256,17 @@ func (scanner *resourceTypeScanner) check(
owner := db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), ContainerExpiries) owner := db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), ContainerExpiries)
chosenWorker, err := scanner.pool.FindOrChooseWorkerForContainer(logger, owner, containerSpec, workerSpec, scanner.strategy) chosenWorker, err := scanner.pool.FindOrChooseWorkerForContainer(
context.Background(),
logger,
owner,
containerSpec,
db.ContainerMetadata{
Type: db.ContainerTypeCheck,
},
workerSpec,
scanner.strategy,
)
if err != nil { if err != nil {
chkErr := resourceConfigScope.SetCheckError(err) chkErr := resourceConfigScope.SetCheckError(err)
if chkErr != nil { if chkErr != nil {
@ -268,9 +281,6 @@ func (scanner *resourceTypeScanner) check(
logger, logger,
worker.NoopImageFetchingDelegate{}, worker.NoopImageFetchingDelegate{},
db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), ContainerExpiries), db.NewResourceConfigCheckSessionContainerOwner(resourceConfigScope.ResourceConfig(), ContainerExpiries),
db.ContainerMetadata{
Type: db.ContainerTypeCheck,
},
containerSpec, containerSpec,
versionedResourceTypes.Without(savedResourceType.Name()), versionedResourceTypes.Without(savedResourceType.Name()),
) )

View File

@ -42,8 +42,8 @@ var _ = Describe("ResourceTypeScanner", func() {
interval time.Duration interval time.Duration
variables creds.Variables variables creds.Variables
fakeResourceType *dbfakes.FakeResourceType fakeResourceType *dbfakes.FakeResourceType
versionedResourceType atc.VersionedResourceType interpolatedResourceTypes atc.VersionedResourceTypes
scanner Scanner scanner Scanner
@ -58,14 +58,16 @@ var _ = Describe("ResourceTypeScanner", func() {
"source-params": "some-secret-sauce", "source-params": "some-secret-sauce",
} }
versionedResourceType = atc.VersionedResourceType{ interpolatedResourceTypes = atc.VersionedResourceTypes{
ResourceType: atc.ResourceType{ {
Name: "some-custom-resource", ResourceType: atc.ResourceType{
Type: "registry-image", Name: "some-custom-resource",
Source: atc.Source{"custom": "((source-params))"}, Type: "registry-image",
Tags: atc.Tags{"some-tag"}, Source: atc.Source{"custom": "some-secret-sauce"},
Tags: atc.Tags{"some-tag"},
},
Version: atc.Version{"custom": "version"},
}, },
Version: atc.Version{"custom": "version"},
} }
fakeClock = fakeclock.NewFakeClock(epoch) fakeClock = fakeclock.NewFakeClock(epoch)
@ -180,36 +182,36 @@ var _ = Describe("ResourceTypeScanner", func() {
It("constructs the resource of the correct type", func() { It("constructs the resource of the correct type", func() {
Expect(fakeResourceType.SetResourceConfigCallCount()).To(Equal(1)) Expect(fakeResourceType.SetResourceConfigCallCount()).To(Equal(1))
_, resourceSource, resourceTypes := fakeResourceType.SetResourceConfigArgsForCall(0) resourceSource, resourceTypes := fakeResourceType.SetResourceConfigArgsForCall(0)
Expect(resourceSource).To(Equal(atc.Source{"custom": "some-secret-sauce"})) Expect(resourceSource).To(Equal(atc.Source{"custom": "some-secret-sauce"}))
Expect(resourceTypes).To(Equal(creds.VersionedResourceTypes{})) Expect(resourceTypes).To(Equal(atc.VersionedResourceTypes{}))
_, owner, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, owner, containerSpec, metadata, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
})) }))
Expect(containerSpec.Tags).To(Equal([]string{"some-tag"})) Expect(containerSpec.Tags).To(Equal([]string{"some-tag"}))
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
Tags: []string{"some-tag"}, Tags: []string{"some-tag"},
ResourceTypes: creds.VersionedResourceTypes{}, ResourceTypes: atc.VersionedResourceTypes{},
TeamID: 123, TeamID: 123,
})) }))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, _, _, owner, metadata, containerSpec, resourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, owner, containerSpec, resourceTypes = fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
})) }))
Expect(containerSpec.Tags).To(Equal([]string{"some-tag"})) Expect(containerSpec.Tags).To(Equal([]string{"some-tag"}))
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(resourceTypes).To(Equal(creds.VersionedResourceTypes{})) Expect(resourceTypes).To(Equal(atc.VersionedResourceTypes{}))
}) })
Context("when the resource type overrides a base resource type", func() { Context("when the resource type overrides a base resource type", func() {
@ -233,41 +235,37 @@ var _ = Describe("ResourceTypeScanner", func() {
It("constructs the resource of the correct type", func() { It("constructs the resource of the correct type", func() {
Expect(fakeResourceType.SetResourceConfigCallCount()).To(Equal(1)) Expect(fakeResourceType.SetResourceConfigCallCount()).To(Equal(1))
_, resourceSource, resourceTypes := fakeResourceType.SetResourceConfigArgsForCall(0) resourceSource, resourceTypes := fakeResourceType.SetResourceConfigArgsForCall(0)
Expect(resourceSource).To(Equal(atc.Source{"custom": "some-secret-sauce"})) Expect(resourceSource).To(Equal(atc.Source{"custom": "some-secret-sauce"}))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(interpolatedResourceTypes))
versionedResourceType,
})))
Expect(fakeResourceType.SetCheckSetupErrorCallCount()).To(Equal(1)) Expect(fakeResourceType.SetCheckSetupErrorCallCount()).To(Equal(1))
err := fakeResourceType.SetCheckSetupErrorArgsForCall(0) err := fakeResourceType.SetCheckSetupErrorArgsForCall(0)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
_, owner, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, owner, containerSpec, metadata, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
})) }))
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
ResourceTypes: creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{versionedResourceType}), ResourceTypes: interpolatedResourceTypes,
TeamID: 123, TeamID: 123,
})) }))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, _, _, owner, metadata, containerSpec, resourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, owner, containerSpec, resourceTypes = fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
})) }))
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(interpolatedResourceTypes))
versionedResourceType,
})))
}) })
}) })
@ -281,9 +279,6 @@ var _ = Describe("ResourceTypeScanner", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1))
Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(10 * time.Millisecond))
leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0) leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0)
Expect(leaseInterval).To(Equal(10 * time.Millisecond)) Expect(leaseInterval).To(Equal(10 * time.Millisecond))
Expect(immediate).To(BeFalse()) Expect(immediate).To(BeFalse())
@ -318,9 +313,6 @@ var _ = Describe("ResourceTypeScanner", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1))
Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(interval))
leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0) leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0)
Expect(leaseInterval).To(Equal(interval)) Expect(leaseInterval).To(Equal(interval))
Expect(immediate).To(BeFalse()) Expect(immediate).To(BeFalse())
@ -469,40 +461,40 @@ var _ = Describe("ResourceTypeScanner", func() {
It("constructs the resource of the correct type", func() { It("constructs the resource of the correct type", func() {
Expect(fakeResourceType.SetResourceConfigCallCount()).To(Equal(1)) Expect(fakeResourceType.SetResourceConfigCallCount()).To(Equal(1))
_, resourceSource, resourceTypes := fakeResourceType.SetResourceConfigArgsForCall(0) resourceSource, resourceTypes := fakeResourceType.SetResourceConfigArgsForCall(0)
Expect(resourceSource).To(Equal(atc.Source{"custom": "some-secret-sauce"})) Expect(resourceSource).To(Equal(atc.Source{"custom": "some-secret-sauce"}))
Expect(resourceTypes).To(Equal(creds.VersionedResourceTypes{})) Expect(resourceTypes).To(Equal(atc.VersionedResourceTypes{}))
Expect(fakeResourceType.SetCheckSetupErrorCallCount()).To(Equal(1)) Expect(fakeResourceType.SetCheckSetupErrorCallCount()).To(Equal(1))
err := fakeResourceType.SetCheckSetupErrorArgsForCall(0) err := fakeResourceType.SetCheckSetupErrorArgsForCall(0)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
_, owner, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, owner, containerSpec, metadata, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
})) }))
Expect(containerSpec.Tags).To(Equal([]string{"some-tag"})) Expect(containerSpec.Tags).To(Equal([]string{"some-tag"}))
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
Tags: []string{"some-tag"}, Tags: []string{"some-tag"},
ResourceTypes: creds.VersionedResourceTypes{}, ResourceTypes: atc.VersionedResourceTypes{},
TeamID: 123, TeamID: 123,
})) }))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, _, _, owner, metadata, containerSpec, resourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, owner, containerSpec, resourceTypes = fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck,
}))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
})) }))
Expect(containerSpec.Tags).To(Equal([]string{"some-tag"})) Expect(containerSpec.Tags).To(Equal([]string{"some-tag"}))
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(resourceTypes).To(Equal(creds.VersionedResourceTypes{})) Expect(resourceTypes).To(Equal(atc.VersionedResourceTypes{}))
}) })
Context("when the resource type depends on another custom type", func() { Context("when the resource type depends on another custom type", func() {
@ -597,13 +589,11 @@ var _ = Describe("ResourceTypeScanner", func() {
It("constructs the resource of the correct type", func() { It("constructs the resource of the correct type", func() {
Expect(fakeResourceType.SetResourceConfigCallCount()).To(Equal(1)) Expect(fakeResourceType.SetResourceConfigCallCount()).To(Equal(1))
_, resourceSource, resourceTypes := fakeResourceType.SetResourceConfigArgsForCall(0) resourceSource, resourceTypes := fakeResourceType.SetResourceConfigArgsForCall(0)
Expect(resourceSource).To(Equal(atc.Source{"custom": "some-secret-sauce"})) Expect(resourceSource).To(Equal(atc.Source{"custom": "some-secret-sauce"}))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(interpolatedResourceTypes))
versionedResourceType,
})))
_, owner, containerSpec, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0) _, _, owner, containerSpec, metadata, workerSpec, _ := fakePool.FindOrChooseWorkerForContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries))) Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
@ -611,23 +601,21 @@ var _ = Describe("ResourceTypeScanner", func() {
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(workerSpec).To(Equal(worker.WorkerSpec{ Expect(workerSpec).To(Equal(worker.WorkerSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
ResourceTypes: creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{versionedResourceType}), ResourceTypes: interpolatedResourceTypes,
TeamID: 123, TeamID: 123,
})) }))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, _, _, owner, metadata, containerSpec, resourceTypes := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(metadata).To(Equal(db.ContainerMetadata{ Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck, Type: db.ContainerTypeCheck,
})) }))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, _, _, owner, containerSpec, resourceTypes = fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(owner).To(Equal(db.NewResourceConfigCheckSessionContainerOwner(fakeResourceConfig, ContainerExpiries)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "registry-image", ResourceType: "registry-image",
})) }))
Expect(containerSpec.TeamID).To(Equal(123)) Expect(containerSpec.TeamID).To(Equal(123))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(interpolatedResourceTypes))
versionedResourceType,
})))
}) })
}) })
@ -635,9 +623,6 @@ var _ = Describe("ResourceTypeScanner", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(1))
Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1)) Expect(fakeResourceConfigScope.UpdateLastCheckStartTimeCallCount()).To(Equal(1))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(interval))
leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0) leaseInterval, immediate := fakeResourceConfigScope.UpdateLastCheckStartTimeArgsForCall(0)
Expect(leaseInterval).To(Equal(interval)) Expect(leaseInterval).To(Equal(interval))
Expect(immediate).To(BeTrue()) Expect(immediate).To(BeTrue())
@ -776,7 +761,7 @@ var _ = Describe("ResourceTypeScanner", func() {
results <- true results <- true
close(results) close(results)
fakeResourceConfigScope.AcquireResourceCheckingLockStub = func(logger lager.Logger, interval time.Duration) (lock.Lock, bool, error) { fakeResourceConfigScope.AcquireResourceCheckingLockStub = func(logger lager.Logger) (lock.Lock, bool, error) {
if <-results { if <-results {
return fakeLock, true, nil return fakeLock, true, nil
} else { } else {
@ -789,16 +774,6 @@ var _ = Describe("ResourceTypeScanner", func() {
It("retries every second until it is", func() { It("retries every second until it is", func() {
Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(3)) Expect(fakeResourceConfigScope.AcquireResourceCheckingLockCallCount()).To(Equal(3))
_, leaseInterval := fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(0)
Expect(leaseInterval).To(Equal(interval))
_, leaseInterval = fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(1)
Expect(leaseInterval).To(Equal(interval))
_, leaseInterval = fakeResourceConfigScope.AcquireResourceCheckingLockArgsForCall(2)
Expect(leaseInterval).To(Equal(interval))
Expect(fakeLock.ReleaseCallCount()).To(Equal(1)) Expect(fakeLock.ReleaseCallCount()).To(Equal(1))
}) })
}) })

View File

@ -8,7 +8,7 @@ import (
"code.cloudfoundry.org/clock" "code.cloudfoundry.org/clock"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
) )
@ -27,7 +27,7 @@ type Fetcher interface {
session Session, session Session,
gardenWorker worker.Worker, gardenWorker worker.Worker,
containerSpec worker.ContainerSpec, containerSpec worker.ContainerSpec,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
resourceInstance ResourceInstance, resourceInstance ResourceInstance,
imageFetchingDelegate worker.ImageFetchingDelegate, imageFetchingDelegate worker.ImageFetchingDelegate,
) (VersionedSource, error) ) (VersionedSource, error)
@ -57,7 +57,7 @@ func (f *fetcher) Fetch(
session Session, session Session,
gardenWorker worker.Worker, gardenWorker worker.Worker,
containerSpec worker.ContainerSpec, containerSpec worker.ContainerSpec,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
resourceInstance ResourceInstance, resourceInstance ResourceInstance,
imageFetchingDelegate worker.ImageFetchingDelegate, imageFetchingDelegate worker.ImageFetchingDelegate,
) (VersionedSource, error) { ) (VersionedSource, error) {

View File

@ -8,7 +8,7 @@ import (
"code.cloudfoundry.org/clock/fakeclock" "code.cloudfoundry.org/clock/fakeclock"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/db/lock" "github.com/concourse/concourse/atc/db/lock"
"github.com/concourse/concourse/atc/db/lock/lockfakes" "github.com/concourse/concourse/atc/db/lock/lockfakes"
"github.com/concourse/concourse/atc/resource" "github.com/concourse/concourse/atc/resource"
@ -67,7 +67,7 @@ var _ = Describe("Fetcher", func() {
worker.ContainerSpec{ worker.ContainerSpec{
TeamID: teamID, TeamID: teamID,
}, },
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
new(resourcefakes.FakeResourceInstance), new(resourcefakes.FakeResourceInstance),
fakeBuildStepDelegate, fakeBuildStepDelegate,
) )

View File

@ -7,7 +7,6 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
) )
@ -34,7 +33,7 @@ type resourceInstance struct {
version atc.Version version atc.Version
source atc.Source source atc.Source
params atc.Params params atc.Params
resourceTypes creds.VersionedResourceTypes resourceTypes atc.VersionedResourceTypes
resourceCache db.UsedResourceCache resourceCache db.UsedResourceCache
containerOwner db.ContainerOwner containerOwner db.ContainerOwner
@ -45,7 +44,7 @@ func NewResourceInstance(
version atc.Version, version atc.Version,
source atc.Source, source atc.Source,
params atc.Params, params atc.Params,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
resourceCache db.UsedResourceCache, resourceCache db.UsedResourceCache,
containerOwner db.ContainerOwner, containerOwner db.ContainerOwner,

View File

@ -4,7 +4,7 @@ import (
"context" "context"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
) )
@ -24,7 +24,7 @@ type FetchSourceFactory interface {
logger lager.Logger, logger lager.Logger,
worker worker.Worker, worker worker.Worker,
resourceInstance ResourceInstance, resourceInstance ResourceInstance,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
containerSpec worker.ContainerSpec, containerSpec worker.ContainerSpec,
session Session, session Session,
imageFetchingDelegate worker.ImageFetchingDelegate, imageFetchingDelegate worker.ImageFetchingDelegate,
@ -50,7 +50,7 @@ func (r *fetchSourceFactory) NewFetchSource(
logger lager.Logger, logger lager.Logger,
worker worker.Worker, worker worker.Worker,
resourceInstance ResourceInstance, resourceInstance ResourceInstance,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
containerSpec worker.ContainerSpec, containerSpec worker.ContainerSpec,
session Session, session Session,
imageFetchingDelegate worker.ImageFetchingDelegate, imageFetchingDelegate worker.ImageFetchingDelegate,
@ -72,7 +72,7 @@ type resourceInstanceFetchSource struct {
logger lager.Logger logger lager.Logger
worker worker.Worker worker worker.Worker
resourceInstance ResourceInstance resourceInstance ResourceInstance
resourceTypes creds.VersionedResourceTypes resourceTypes atc.VersionedResourceTypes
containerSpec worker.ContainerSpec containerSpec worker.ContainerSpec
session Session session Session
imageFetchingDelegate worker.ImageFetchingDelegate imageFetchingDelegate worker.ImageFetchingDelegate
@ -130,12 +130,21 @@ func (s *resourceInstanceFetchSource) Create(ctx context.Context) (VersionedSour
&worker.CertsVolumeMount{Logger: s.logger}, &worker.CertsVolumeMount{Logger: s.logger},
} }
err = s.worker.EnsureDBContainerExists(
ctx,
s.logger,
s.resourceInstance.ContainerOwner(),
s.session.Metadata,
)
if err != nil {
return nil, err
}
container, err := s.worker.FindOrCreateContainer( container, err := s.worker.FindOrCreateContainer(
ctx, ctx,
s.logger, s.logger,
s.imageFetchingDelegate, s.imageFetchingDelegate,
s.resourceInstance.ContainerOwner(), s.resourceInstance.ContainerOwner(),
s.session.Metadata,
s.containerSpec, s.containerSpec,
s.resourceTypes, s.resourceTypes,
) )

View File

@ -7,9 +7,7 @@ import (
"code.cloudfoundry.org/garden" "code.cloudfoundry.org/garden"
"code.cloudfoundry.org/garden/gardenfakes" "code.cloudfoundry.org/garden/gardenfakes"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
"github.com/concourse/concourse/atc/resource" "github.com/concourse/concourse/atc/resource"
@ -33,7 +31,8 @@ var _ = Describe("ResourceInstanceFetchSource", func() {
fakeResourceCacheFactory *dbfakes.FakeResourceCacheFactory fakeResourceCacheFactory *dbfakes.FakeResourceCacheFactory
fakeUsedResourceCache *dbfakes.FakeUsedResourceCache fakeUsedResourceCache *dbfakes.FakeUsedResourceCache
fakeDelegate *workerfakes.FakeImageFetchingDelegate fakeDelegate *workerfakes.FakeImageFetchingDelegate
resourceTypes creds.VersionedResourceTypes resourceTypes atc.VersionedResourceTypes
metadata db.ContainerMetadata
ctx context.Context ctx context.Context
cancel func() cancel func()
@ -88,23 +87,20 @@ var _ = Describe("ResourceInstanceFetchSource", func() {
fakeDelegate = new(workerfakes.FakeImageFetchingDelegate) fakeDelegate = new(workerfakes.FakeImageFetchingDelegate)
variables := template.StaticVariables{ resourceTypes = atc.VersionedResourceTypes{
"secret-custom": "source",
}
resourceTypes = creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "custom-resource", Name: "custom-resource",
Type: "custom-type", Type: "custom-type",
Source: atc.Source{"some-custom": "((secret-custom))"}, Source: atc.Source{"some-custom": "source"},
}, },
Version: atc.Version{"some-custom": "version"}, Version: atc.Version{"some-custom": "version"},
}, },
}) }
resourceFactory := resource.NewResourceFactory() resourceFactory := resource.NewResourceFactory()
fetchSourceFactory = resource.NewFetchSourceFactory(fakeResourceCacheFactory, resourceFactory) fetchSourceFactory = resource.NewFetchSourceFactory(fakeResourceCacheFactory, resourceFactory)
metadata = db.ContainerMetadata{Type: db.ContainerTypeGet}
fetchSource = fetchSourceFactory.NewFetchSource( fetchSource = fetchSourceFactory.NewFetchSource(
logger, logger,
fakeWorker, fakeWorker,
@ -120,7 +116,9 @@ var _ = Describe("ResourceInstanceFetchSource", func() {
"resource": resource.ResourcesDir("get"), "resource": resource.ResourcesDir("get"),
}, },
}, },
resource.Session{}, resource.Session{
Metadata: metadata,
},
fakeDelegate, fakeDelegate,
) )
}) })
@ -204,11 +202,15 @@ var _ = Describe("ResourceInstanceFetchSource", func() {
It("creates container with volume and worker", func() { It("creates container with volume and worker", func() {
Expect(initErr).NotTo(HaveOccurred()) Expect(initErr).NotTo(HaveOccurred())
Expect(fakeWorker.EnsureDBContainerExistsCallCount()).To(Equal(1))
_, _, owner, actualMetadata := fakeWorker.EnsureDBContainerExistsArgsForCall(0)
Expect(owner).To(Equal(db.NewBuildStepContainerOwner(43, atc.PlanID("some-plan-id"), 42)))
Expect(actualMetadata).To(Equal(metadata))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
_, logger, delegate, owner, metadata, containerSpec, types := fakeWorker.FindOrCreateContainerArgsForCall(0) _, logger, delegate, owner, containerSpec, types := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(delegate).To(Equal(fakeDelegate)) Expect(delegate).To(Equal(fakeDelegate))
Expect(owner).To(Equal(db.NewBuildStepContainerOwner(43, atc.PlanID("some-plan-id"), 42))) Expect(owner).To(Equal(db.NewBuildStepContainerOwner(43, atc.PlanID("some-plan-id"), 42)))
Expect(metadata).To(BeZero())
Expect(containerSpec).To(Equal(worker.ContainerSpec{ Expect(containerSpec).To(Equal(worker.ContainerSpec{
TeamID: 42, TeamID: 42,
Tags: []string{}, Tags: []string{},

View File

@ -6,7 +6,6 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
. "github.com/concourse/concourse/atc/resource" . "github.com/concourse/concourse/atc/resource"
@ -36,7 +35,7 @@ var _ = Describe("ResourceInstance", func() {
atc.Version{"some": "version"}, atc.Version{"some": "version"},
atc.Source{"some": "source"}, atc.Source{"some": "source"},
atc.Params{"some": "params"}, atc.Params{"some": "params"},
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
fakeResourceCache, fakeResourceCache,
db.NewBuildStepContainerOwner(42, atc.PlanID("some-plan-id"), 1), db.NewBuildStepContainerOwner(42, atc.PlanID("some-plan-id"), 1),
) )

View File

@ -5,19 +5,19 @@ import (
"sync" "sync"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/resource" "github.com/concourse/concourse/atc/resource"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
) )
type FakeFetchSourceFactory struct { type FakeFetchSourceFactory struct {
NewFetchSourceStub func(lager.Logger, worker.Worker, resource.ResourceInstance, creds.VersionedResourceTypes, worker.ContainerSpec, resource.Session, worker.ImageFetchingDelegate) resource.FetchSource NewFetchSourceStub func(lager.Logger, worker.Worker, resource.ResourceInstance, atc.VersionedResourceTypes, worker.ContainerSpec, resource.Session, worker.ImageFetchingDelegate) resource.FetchSource
newFetchSourceMutex sync.RWMutex newFetchSourceMutex sync.RWMutex
newFetchSourceArgsForCall []struct { newFetchSourceArgsForCall []struct {
arg1 lager.Logger arg1 lager.Logger
arg2 worker.Worker arg2 worker.Worker
arg3 resource.ResourceInstance arg3 resource.ResourceInstance
arg4 creds.VersionedResourceTypes arg4 atc.VersionedResourceTypes
arg5 worker.ContainerSpec arg5 worker.ContainerSpec
arg6 resource.Session arg6 resource.Session
arg7 worker.ImageFetchingDelegate arg7 worker.ImageFetchingDelegate
@ -32,14 +32,14 @@ type FakeFetchSourceFactory struct {
invocationsMutex sync.RWMutex invocationsMutex sync.RWMutex
} }
func (fake *FakeFetchSourceFactory) NewFetchSource(arg1 lager.Logger, arg2 worker.Worker, arg3 resource.ResourceInstance, arg4 creds.VersionedResourceTypes, arg5 worker.ContainerSpec, arg6 resource.Session, arg7 worker.ImageFetchingDelegate) resource.FetchSource { func (fake *FakeFetchSourceFactory) NewFetchSource(arg1 lager.Logger, arg2 worker.Worker, arg3 resource.ResourceInstance, arg4 atc.VersionedResourceTypes, arg5 worker.ContainerSpec, arg6 resource.Session, arg7 worker.ImageFetchingDelegate) resource.FetchSource {
fake.newFetchSourceMutex.Lock() fake.newFetchSourceMutex.Lock()
ret, specificReturn := fake.newFetchSourceReturnsOnCall[len(fake.newFetchSourceArgsForCall)] ret, specificReturn := fake.newFetchSourceReturnsOnCall[len(fake.newFetchSourceArgsForCall)]
fake.newFetchSourceArgsForCall = append(fake.newFetchSourceArgsForCall, struct { fake.newFetchSourceArgsForCall = append(fake.newFetchSourceArgsForCall, struct {
arg1 lager.Logger arg1 lager.Logger
arg2 worker.Worker arg2 worker.Worker
arg3 resource.ResourceInstance arg3 resource.ResourceInstance
arg4 creds.VersionedResourceTypes arg4 atc.VersionedResourceTypes
arg5 worker.ContainerSpec arg5 worker.ContainerSpec
arg6 resource.Session arg6 resource.Session
arg7 worker.ImageFetchingDelegate arg7 worker.ImageFetchingDelegate
@ -62,13 +62,13 @@ func (fake *FakeFetchSourceFactory) NewFetchSourceCallCount() int {
return len(fake.newFetchSourceArgsForCall) return len(fake.newFetchSourceArgsForCall)
} }
func (fake *FakeFetchSourceFactory) NewFetchSourceCalls(stub func(lager.Logger, worker.Worker, resource.ResourceInstance, creds.VersionedResourceTypes, worker.ContainerSpec, resource.Session, worker.ImageFetchingDelegate) resource.FetchSource) { func (fake *FakeFetchSourceFactory) NewFetchSourceCalls(stub func(lager.Logger, worker.Worker, resource.ResourceInstance, atc.VersionedResourceTypes, worker.ContainerSpec, resource.Session, worker.ImageFetchingDelegate) resource.FetchSource) {
fake.newFetchSourceMutex.Lock() fake.newFetchSourceMutex.Lock()
defer fake.newFetchSourceMutex.Unlock() defer fake.newFetchSourceMutex.Unlock()
fake.NewFetchSourceStub = stub fake.NewFetchSourceStub = stub
} }
func (fake *FakeFetchSourceFactory) NewFetchSourceArgsForCall(i int) (lager.Logger, worker.Worker, resource.ResourceInstance, creds.VersionedResourceTypes, worker.ContainerSpec, resource.Session, worker.ImageFetchingDelegate) { func (fake *FakeFetchSourceFactory) NewFetchSourceArgsForCall(i int) (lager.Logger, worker.Worker, resource.ResourceInstance, atc.VersionedResourceTypes, worker.ContainerSpec, resource.Session, worker.ImageFetchingDelegate) {
fake.newFetchSourceMutex.RLock() fake.newFetchSourceMutex.RLock()
defer fake.newFetchSourceMutex.RUnlock() defer fake.newFetchSourceMutex.RUnlock()
argsForCall := fake.newFetchSourceArgsForCall[i] argsForCall := fake.newFetchSourceArgsForCall[i]

View File

@ -6,13 +6,13 @@ import (
"sync" "sync"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/resource" "github.com/concourse/concourse/atc/resource"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
) )
type FakeFetcher struct { type FakeFetcher struct {
FetchStub func(context.Context, lager.Logger, resource.Session, worker.Worker, worker.ContainerSpec, creds.VersionedResourceTypes, resource.ResourceInstance, worker.ImageFetchingDelegate) (resource.VersionedSource, error) FetchStub func(context.Context, lager.Logger, resource.Session, worker.Worker, worker.ContainerSpec, atc.VersionedResourceTypes, resource.ResourceInstance, worker.ImageFetchingDelegate) (resource.VersionedSource, error)
fetchMutex sync.RWMutex fetchMutex sync.RWMutex
fetchArgsForCall []struct { fetchArgsForCall []struct {
arg1 context.Context arg1 context.Context
@ -20,7 +20,7 @@ type FakeFetcher struct {
arg3 resource.Session arg3 resource.Session
arg4 worker.Worker arg4 worker.Worker
arg5 worker.ContainerSpec arg5 worker.ContainerSpec
arg6 creds.VersionedResourceTypes arg6 atc.VersionedResourceTypes
arg7 resource.ResourceInstance arg7 resource.ResourceInstance
arg8 worker.ImageFetchingDelegate arg8 worker.ImageFetchingDelegate
} }
@ -36,7 +36,7 @@ type FakeFetcher struct {
invocationsMutex sync.RWMutex invocationsMutex sync.RWMutex
} }
func (fake *FakeFetcher) Fetch(arg1 context.Context, arg2 lager.Logger, arg3 resource.Session, arg4 worker.Worker, arg5 worker.ContainerSpec, arg6 creds.VersionedResourceTypes, arg7 resource.ResourceInstance, arg8 worker.ImageFetchingDelegate) (resource.VersionedSource, error) { func (fake *FakeFetcher) Fetch(arg1 context.Context, arg2 lager.Logger, arg3 resource.Session, arg4 worker.Worker, arg5 worker.ContainerSpec, arg6 atc.VersionedResourceTypes, arg7 resource.ResourceInstance, arg8 worker.ImageFetchingDelegate) (resource.VersionedSource, error) {
fake.fetchMutex.Lock() fake.fetchMutex.Lock()
ret, specificReturn := fake.fetchReturnsOnCall[len(fake.fetchArgsForCall)] ret, specificReturn := fake.fetchReturnsOnCall[len(fake.fetchArgsForCall)]
fake.fetchArgsForCall = append(fake.fetchArgsForCall, struct { fake.fetchArgsForCall = append(fake.fetchArgsForCall, struct {
@ -45,7 +45,7 @@ func (fake *FakeFetcher) Fetch(arg1 context.Context, arg2 lager.Logger, arg3 res
arg3 resource.Session arg3 resource.Session
arg4 worker.Worker arg4 worker.Worker
arg5 worker.ContainerSpec arg5 worker.ContainerSpec
arg6 creds.VersionedResourceTypes arg6 atc.VersionedResourceTypes
arg7 resource.ResourceInstance arg7 resource.ResourceInstance
arg8 worker.ImageFetchingDelegate arg8 worker.ImageFetchingDelegate
}{arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8}) }{arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8})
@ -67,13 +67,13 @@ func (fake *FakeFetcher) FetchCallCount() int {
return len(fake.fetchArgsForCall) return len(fake.fetchArgsForCall)
} }
func (fake *FakeFetcher) FetchCalls(stub func(context.Context, lager.Logger, resource.Session, worker.Worker, worker.ContainerSpec, creds.VersionedResourceTypes, resource.ResourceInstance, worker.ImageFetchingDelegate) (resource.VersionedSource, error)) { func (fake *FakeFetcher) FetchCalls(stub func(context.Context, lager.Logger, resource.Session, worker.Worker, worker.ContainerSpec, atc.VersionedResourceTypes, resource.ResourceInstance, worker.ImageFetchingDelegate) (resource.VersionedSource, error)) {
fake.fetchMutex.Lock() fake.fetchMutex.Lock()
defer fake.fetchMutex.Unlock() defer fake.fetchMutex.Unlock()
fake.FetchStub = stub fake.FetchStub = stub
} }
func (fake *FakeFetcher) FetchArgsForCall(i int) (context.Context, lager.Logger, resource.Session, worker.Worker, worker.ContainerSpec, creds.VersionedResourceTypes, resource.ResourceInstance, worker.ImageFetchingDelegate) { func (fake *FakeFetcher) FetchArgsForCall(i int) (context.Context, lager.Logger, resource.Session, worker.Worker, worker.ContainerSpec, atc.VersionedResourceTypes, resource.ResourceInstance, worker.ImageFetchingDelegate) {
fake.fetchMutex.RLock() fake.fetchMutex.RLock()
defer fake.fetchMutex.RUnlock() defer fake.fetchMutex.RUnlock()
argsForCall := fake.fetchArgsForCall[i] argsForCall := fake.fetchArgsForCall[i]

View File

@ -80,6 +80,16 @@ func (s *buildStarter) tryStartNextPendingBuild(
"build-name": nextPendingBuild.Name(), "build-name": nextPendingBuild.Name(),
}) })
if nextPendingBuild.IsAborted() {
logger.Debug("cancel-aborted-pending-build")
err := nextPendingBuild.Finish(db.BuildStatusAborted)
if err != nil {
return false, err
}
return true, nil
}
reachedMaxInFlight, err := s.maxInFlightUpdater.UpdateMaxInFlightReached(logger, job, nextPendingBuild.ID()) reachedMaxInFlight, err := s.maxInFlightUpdater.UpdateMaxInFlightReached(logger, job, nextPendingBuild.ID())
if err != nil { if err != nil {
return false, err return false, err

View File

@ -69,6 +69,48 @@ var _ = Describe("BuildStarter", func() {
resource.NameReturns("some-resource") resource.NameReturns("some-resource")
}) })
Context("when one pending build is aborted before start", func() {
var abortedBuild *dbfakes.FakeBuild
BeforeEach(func() {
job = new(dbfakes.FakeJob)
job.NameReturns("some-job")
job.ConfigReturns(atc.JobConfig{Plan: atc.PlanSequence{{Get: "input-1", Resource: "some-resource"}, {Get: "input-2", Resource: "some-resource"}}})
abortedBuild = new(dbfakes.FakeBuild)
abortedBuild.IDReturns(42)
abortedBuild.IsAbortedReturns(true)
// make sure pending build can be started after another pending build is aborted
pendingBuilds = append([]db.Build{abortedBuild}, pendingBuilds...)
resources = db.Resources{resource}
})
JustBeforeEach(func() {
tryStartErr = buildStarter.TryStartPendingBuildsForJob(
lagertest.NewTestLogger("test"),
job,
resources,
versionedResourceTypes,
pendingBuilds,
)
})
It("won't try to start the aborted pending build", func() {
Expect(abortedBuild.FinishCallCount()).To(Equal(1))
})
It("will try to start the next non aborted pending build", func() {
Expect(fakeUpdater.UpdateMaxInFlightReachedCallCount()).To(Equal(1))
_, _, buildID := fakeUpdater.UpdateMaxInFlightReachedArgsForCall(0)
Expect(buildID).To(Equal(66))
})
It("returns without error", func() {
Expect(tryStartErr).NotTo(HaveOccurred())
})
})
Context("when manually triggered", func() { Context("when manually triggered", func() {
BeforeEach(func() { BeforeEach(func() {
job = new(dbfakes.FakeJob) job = new(dbfakes.FakeJob)
@ -274,7 +316,6 @@ var _ = Describe("BuildStarter", func() {
}})) }}))
}) })
}) })
}) })
}) })
}) })

View File

@ -6,7 +6,6 @@ import (
"code.cloudfoundry.org/garden" "code.cloudfoundry.org/garden"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
) )
type WorkerSpec struct { type WorkerSpec struct {
@ -14,7 +13,7 @@ type WorkerSpec struct {
ResourceType string ResourceType string
Tags []string Tags []string
TeamID int TeamID int
ResourceTypes creds.VersionedResourceTypes ResourceTypes atc.VersionedResourceTypes
} }
type ContainerSpec struct { type ContainerSpec struct {
@ -71,7 +70,7 @@ type ImageSpec struct {
type ImageResource struct { type ImageResource struct {
Type string Type string
Source creds.Source Source atc.Source
Params *atc.Params Params *atc.Params
Version *atc.Version Version *atc.Version
} }

View File

@ -424,7 +424,14 @@ var _ = Describe("DBProvider", func() {
By("connecting to the worker") By("connecting to the worker")
fakeDBWorkerFactory.GetWorkerReturns(fakeWorker1, true, nil) fakeDBWorkerFactory.GetWorkerReturns(fakeWorker1, true, nil)
container, err := workers[0].FindOrCreateContainer(context.TODO(), logger, fakeImageFetchingDelegate, db.NewBuildStepContainerOwner(42, atc.PlanID("some-plan-id"), 1), db.ContainerMetadata{}, containerSpec, nil) container, err := workers[0].FindOrCreateContainer(
context.TODO(),
logger,
fakeImageFetchingDelegate,
db.NewBuildStepContainerOwner(42, atc.PlanID("some-plan-id"), 1),
containerSpec,
nil,
)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = container.Destroy() err = container.Destroy()
@ -463,6 +470,7 @@ var _ = Describe("DBProvider", func() {
fakeCreatedContainer = new(dbfakes.FakeCreatedContainer) fakeCreatedContainer = new(dbfakes.FakeCreatedContainer)
fakeCreatingContainer.CreatedReturns(fakeCreatedContainer, nil) fakeCreatingContainer.CreatedReturns(fakeCreatedContainer, nil)
fakeWorker1.CreateContainerReturns(fakeCreatingContainer, nil) fakeWorker1.CreateContainerReturns(fakeCreatingContainer, nil)
fakeWorker1.FindContainerReturns(fakeCreatingContainer, nil, nil)
workerBaseResourceType := &db.UsedWorkerBaseResourceType{ID: 42} workerBaseResourceType := &db.UsedWorkerBaseResourceType{ID: 42}
fakeDBWorkerBaseResourceTypeFactory.FindReturns(workerBaseResourceType, true, nil) fakeDBWorkerBaseResourceTypeFactory.FindReturns(workerBaseResourceType, true, nil)
@ -481,7 +489,22 @@ var _ = Describe("DBProvider", func() {
fakeGardenBackend.CreateReturns(fakeContainer, nil) fakeGardenBackend.CreateReturns(fakeContainer, nil)
fakeGardenBackend.LookupReturns(fakeContainer, nil) fakeGardenBackend.LookupReturns(fakeContainer, nil)
container, err := workers[0].FindOrCreateContainer(context.TODO(), logger, fakeImageFetchingDelegate, db.NewBuildStepContainerOwner(42, atc.PlanID("some-plan-id"), 1), db.ContainerMetadata{}, containerSpec, nil) err := workers[0].EnsureDBContainerExists(
context.TODO(),
logger,
db.NewBuildStepContainerOwner(42, atc.PlanID("some-plan-id"), 1),
db.ContainerMetadata{},
)
Expect(err).NotTo(HaveOccurred())
container, err := workers[0].FindOrCreateContainer(
context.TODO(),
logger,
fakeImageFetchingDelegate,
db.NewBuildStepContainerOwner(42, atc.PlanID("some-plan-id"), 1),
containerSpec,
nil,
)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(container.Handle()).To(Equal("created-handle")) Expect(container.Handle()).To(Equal("created-handle"))

View File

@ -5,7 +5,6 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
w "github.com/concourse/concourse/atc/worker" w "github.com/concourse/concourse/atc/worker"
) )
@ -31,7 +30,7 @@ func (f *imageFactory) GetImage(
imageSpec worker.ImageSpec, imageSpec worker.ImageSpec,
teamID int, teamID int,
delegate worker.ImageFetchingDelegate, delegate worker.ImageFetchingDelegate,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
) (worker.Image, error) { ) (worker.Image, error) {
if imageSpec.ImageArtifactSource != nil { if imageSpec.ImageArtifactSource != nil {
artifactVolume, existsOnWorker, err := imageSpec.ImageArtifactSource.VolumeOn(logger, worker) artifactVolume, existsOnWorker, err := imageSpec.ImageArtifactSource.VolumeOn(logger, worker)

View File

@ -10,7 +10,6 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/resource" "github.com/concourse/concourse/atc/resource"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
@ -32,7 +31,7 @@ type ImageResourceFetcherFactory interface {
worker.ImageResource, worker.ImageResource,
atc.Version, atc.Version,
int, int,
creds.VersionedResourceTypes, atc.VersionedResourceTypes,
worker.ImageFetchingDelegate, worker.ImageFetchingDelegate,
) ImageResourceFetcher ) ImageResourceFetcher
} }
@ -74,7 +73,7 @@ func (f *imageResourceFetcherFactory) NewImageResourceFetcher(
imageResource worker.ImageResource, imageResource worker.ImageResource,
version atc.Version, version atc.Version,
teamID int, teamID int,
customTypes creds.VersionedResourceTypes, customTypes atc.VersionedResourceTypes,
imageFetchingDelegate worker.ImageFetchingDelegate, imageFetchingDelegate worker.ImageFetchingDelegate,
) ImageResourceFetcher { ) ImageResourceFetcher {
return &imageResourceFetcher{ return &imageResourceFetcher{
@ -102,7 +101,7 @@ type imageResourceFetcher struct {
imageResource worker.ImageResource imageResource worker.ImageResource
version atc.Version version atc.Version
teamID int teamID int
customTypes creds.VersionedResourceTypes customTypes atc.VersionedResourceTypes
imageFetchingDelegate worker.ImageFetchingDelegate imageFetchingDelegate worker.ImageFetchingDelegate
} }
@ -122,22 +121,16 @@ func (i *imageResourceFetcher) Fetch(
} }
} }
source, err := i.imageResource.Source.Evaluate()
if err != nil {
return nil, nil, nil, err
}
var params atc.Params var params atc.Params
if i.imageResource.Params != nil { if i.imageResource.Params != nil {
params = *i.imageResource.Params params = *i.imageResource.Params
} }
resourceCache, err := i.dbResourceCacheFactory.FindOrCreateResourceCache( resourceCache, err := i.dbResourceCacheFactory.FindOrCreateResourceCache(
logger,
db.ForContainer(container.ID()), db.ForContainer(container.ID()),
i.imageResource.Type, i.imageResource.Type,
version, version,
source, i.imageResource.Source,
params, params,
i.customTypes, i.customTypes,
) )
@ -149,7 +142,7 @@ func (i *imageResourceFetcher) Fetch(
resourceInstance := resource.NewResourceInstance( resourceInstance := resource.NewResourceInstance(
resource.ResourceType(i.imageResource.Type), resource.ResourceType(i.imageResource.Type),
version, version,
source, i.imageResource.Source,
params, params,
i.customTypes, i.customTypes,
resourceCache, resourceCache,
@ -225,7 +218,7 @@ func (i *imageResourceFetcher) ensureVersionOfType(
ctx context.Context, ctx context.Context,
logger lager.Logger, logger lager.Logger,
container db.CreatingContainer, container db.CreatingContainer,
resourceType creds.VersionedResourceType, resourceType atc.VersionedResourceType,
) error { ) error {
containerSpec := worker.ContainerSpec{ containerSpec := worker.ContainerSpec{
ImageSpec: worker.ImageSpec{ ImageSpec: worker.ImageSpec{
@ -237,14 +230,24 @@ func (i *imageResourceFetcher) ensureVersionOfType(
}, },
} }
owner := db.NewImageCheckContainerOwner(container, i.teamID)
err := i.worker.EnsureDBContainerExists(
ctx,
logger,
owner,
db.ContainerMetadata{
Type: db.ContainerTypeCheck,
},
)
if err != nil {
return err
}
resourceTypeContainer, err := i.worker.FindOrCreateContainer( resourceTypeContainer, err := i.worker.FindOrCreateContainer(
ctx, ctx,
logger, logger,
worker.NoopImageFetchingDelegate{}, worker.NoopImageFetchingDelegate{},
db.NewImageCheckContainerOwner(container, i.teamID), owner,
db.ContainerMetadata{
Type: db.ContainerTypeCheck,
},
containerSpec, containerSpec,
i.customTypes, i.customTypes,
) )
@ -252,13 +255,8 @@ func (i *imageResourceFetcher) ensureVersionOfType(
return err return err
} }
source, err := resourceType.Source.Evaluate()
if err != nil {
return err
}
checkResourceType := i.resourceFactory.NewResourceForContainer(resourceTypeContainer) checkResourceType := i.resourceFactory.NewResourceForContainer(resourceTypeContainer)
versions, err := checkResourceType.Check(context.TODO(), source, nil) versions, err := checkResourceType.Check(context.TODO(), resourceType.Source, nil)
if err != nil { if err != nil {
return err return err
} }
@ -298,7 +296,15 @@ func (i *imageResourceFetcher) getLatestVersion(
}, },
} }
source, err := i.imageResource.Source.Evaluate() owner := db.NewImageCheckContainerOwner(container, i.teamID)
err := i.worker.EnsureDBContainerExists(
ctx,
logger,
owner,
db.ContainerMetadata{
Type: db.ContainerTypeCheck,
},
)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -307,10 +313,7 @@ func (i *imageResourceFetcher) getLatestVersion(
ctx, ctx,
logger, logger,
i.imageFetchingDelegate, i.imageFetchingDelegate,
db.NewImageCheckContainerOwner(container, i.teamID), owner,
db.ContainerMetadata{
Type: db.ContainerTypeCheck,
},
resourceSpec, resourceSpec,
i.customTypes, i.customTypes,
) )
@ -319,7 +322,7 @@ func (i *imageResourceFetcher) getLatestVersion(
} }
checkingResource := i.resourceFactory.NewResourceForContainer(imageContainer) checkingResource := i.resourceFactory.NewResourceForContainer(imageContainer)
versions, err := checkingResource.Check(context.TODO(), source, nil) versions, err := checkingResource.Check(context.TODO(), i.imageResource.Source, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -12,9 +12,7 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
"github.com/concourse/concourse/atc/resource" "github.com/concourse/concourse/atc/resource"
@ -46,7 +44,7 @@ var _ = Describe("Image", func() {
var fakeImageFetchingDelegate *workerfakes.FakeImageFetchingDelegate var fakeImageFetchingDelegate *workerfakes.FakeImageFetchingDelegate
var fakeWorker *workerfakes.FakeWorker var fakeWorker *workerfakes.FakeWorker
var customTypes creds.VersionedResourceTypes var customTypes atc.VersionedResourceTypes
var privileged bool var privileged bool
var fetchedVolume worker.Volume var fetchedVolume worker.Volume
@ -54,7 +52,6 @@ var _ = Describe("Image", func() {
var fetchedVersion atc.Version var fetchedVersion atc.Version
var fetchErr error var fetchErr error
var teamID int var teamID int
var variables template.StaticVariables
BeforeEach(func() { BeforeEach(func() {
fakeResourceFactory = new(resourcefakes.FakeResourceFactory) fakeResourceFactory = new(resourcefakes.FakeResourceFactory)
@ -63,16 +60,10 @@ var _ = Describe("Image", func() {
fakeCreatingContainer = new(dbfakes.FakeCreatingContainer) fakeCreatingContainer = new(dbfakes.FakeCreatingContainer)
stderrBuf = gbytes.NewBuffer() stderrBuf = gbytes.NewBuffer()
variables = template.StaticVariables{
"source-param": "super-secret-sauce",
"a-source-param": "super-secret-a-source",
"b-source-param": "super-secret-b-source",
}
logger = lagertest.NewTestLogger("test") logger = lagertest.NewTestLogger("test")
imageResource = worker.ImageResource{ imageResource = worker.ImageResource{
Type: "docker", Type: "docker",
Source: creds.NewSource(variables, atc.Source{"some": "((source-param))"}), Source: atc.Source{"some": "super-secret-sauce"},
Params: &atc.Params{"some": "params"}, Params: &atc.Params{"some": "params"},
} }
version = nil version = nil
@ -84,12 +75,12 @@ var _ = Describe("Image", func() {
fakeWorker.TagsReturns(atc.Tags{"worker", "tags"}) fakeWorker.TagsReturns(atc.Tags{"worker", "tags"})
teamID = 123 teamID = 123
customTypes = creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ customTypes = atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "custom-type-a", Name: "custom-type-a",
Type: "base-type", Type: "base-type",
Source: atc.Source{"some": "((a-source-param))"}, Source: atc.Source{"some": "a-source-param"},
}, },
Version: atc.Version{"some": "a-version"}, Version: atc.Version{"some": "a-version"},
}, },
@ -97,11 +88,11 @@ var _ = Describe("Image", func() {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "custom-type-b", Name: "custom-type-b",
Type: "custom-type-a", Type: "custom-type-a",
Source: atc.Source{"some": "((b-source-param))"}, Source: atc.Source{"some": "b-source-param"},
}, },
Version: atc.Version{"some": "b-version"}, Version: atc.Version{"some": "b-version"},
}, },
}) }
fakeResourceCacheFactory = new(dbfakes.FakeResourceCacheFactory) fakeResourceCacheFactory = new(dbfakes.FakeResourceCacheFactory)
}) })
@ -158,7 +149,7 @@ var _ = Describe("Image", func() {
BeforeEach(func() { BeforeEach(func() {
imageResource = worker.ImageResource{ imageResource = worker.ImageResource{
Type: customResourceTypeName, Type: customResourceTypeName,
Source: creds.NewSource(variables, atc.Source{"some": "((source-param))"}), Source: atc.Source{"some": "source-param"},
Params: &atc.Params{"some": "params"}, Params: &atc.Params{"some": "params"},
} }
@ -172,7 +163,7 @@ var _ = Describe("Image", func() {
Context("and the custom type does not have a version", func() { Context("and the custom type does not have a version", func() {
BeforeEach(func() { BeforeEach(func() {
customTypes = creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ customTypes = atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "custom-type-a", Name: "custom-type-a",
@ -181,7 +172,7 @@ var _ = Describe("Image", func() {
}, },
Version: nil, Version: nil,
}, },
}) }
fakeCheckResourceType = new(resourcefakes.FakeResource) fakeCheckResourceType = new(resourcefakes.FakeResource)
fakeWorker.FindOrCreateContainerReturns(fakeContainer, nil) fakeWorker.FindOrCreateContainerReturns(fakeContainer, nil)
@ -192,7 +183,7 @@ var _ = Describe("Image", func() {
It("checks for the latest version of the resource type", func() { It("checks for the latest version of the resource type", func() {
By("find or create a resource container") By("find or create a resource container")
_, _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, _, _, containerSpec, _ := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(containerSpec.ImageSpec.ResourceType).To(Equal("custom-type-a")) Expect(containerSpec.ImageSpec.ResourceType).To(Equal("custom-type-a"))
By("calling the resource type's check script") By("calling the resource type's check script")
@ -205,8 +196,9 @@ var _ = Describe("Image", func() {
}) })
It("uses the version of the custom type when checking for the original resource", func() { It("uses the version of the custom type when checking for the original resource", func() {
Expect(fakeWorker.EnsureDBContainerExistsCallCount()).To(Equal(2))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(2)) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(2))
_, _, _, _, _, containerSpec, customTypes := fakeWorker.FindOrCreateContainerArgsForCall(1) _, _, _, _, containerSpec, customTypes := fakeWorker.FindOrCreateContainerArgsForCall(1)
Expect(containerSpec.ImageSpec.ResourceType).To(Equal("custom-type-a")) Expect(containerSpec.ImageSpec.ResourceType).To(Equal("custom-type-a"))
Expect(customTypes[0].Version).To(Equal(atc.Version{"some": "version"})) Expect(customTypes[0].Version).To(Equal(atc.Version{"some": "version"}))
}) })
@ -277,13 +269,17 @@ var _ = Describe("Image", func() {
}) })
It("created the 'check' resource with the correct session, with the currently fetching type removed from the set", func() { It("created the 'check' resource with the correct session, with the currently fetching type removed from the set", func() {
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.EnsureDBContainerExistsCallCount()).To(Equal(1))
cctx, _, delegate, owner, metadata, containerSpec, actualCustomTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, owner, metadata := fakeWorker.EnsureDBContainerExistsArgsForCall(0)
Expect(cctx).To(Equal(ctx))
Expect(owner).To(Equal(db.NewImageCheckContainerOwner(fakeCreatingContainer, 123)))
Expect(metadata).To(Equal(db.ContainerMetadata{ Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck, Type: db.ContainerTypeCheck,
})) }))
Expect(owner).To(Equal(db.NewImageCheckContainerOwner(fakeCreatingContainer, 123)))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
cctx, _, delegate, owner, containerSpec, actualCustomTypes := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(cctx).To(Equal(ctx))
Expect(owner).To(Equal(db.NewImageCheckContainerOwner(fakeCreatingContainer, 123)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "docker", ResourceType: "docker",
})) }))
@ -318,13 +314,17 @@ var _ = Describe("Image", func() {
}) })
It("created the 'check' resource with the correct session, with the currently fetching type removed from the set", func() { It("created the 'check' resource with the correct session, with the currently fetching type removed from the set", func() {
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1)) Expect(fakeWorker.EnsureDBContainerExistsCallCount()).To(Equal(1))
cctx, _, delegate, owner, metadata, containerSpec, actualCustomTypes := fakeWorker.FindOrCreateContainerArgsForCall(0) _, _, owner, metadata := fakeWorker.EnsureDBContainerExistsArgsForCall(0)
Expect(cctx).To(Equal(ctx))
Expect(owner).To(Equal(db.NewImageCheckContainerOwner(fakeCreatingContainer, 123)))
Expect(metadata).To(Equal(db.ContainerMetadata{ Expect(metadata).To(Equal(db.ContainerMetadata{
Type: db.ContainerTypeCheck, Type: db.ContainerTypeCheck,
})) }))
Expect(owner).To(Equal(db.NewImageCheckContainerOwner(fakeCreatingContainer, 123)))
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(Equal(1))
cctx, _, delegate, owner, containerSpec, actualCustomTypes := fakeWorker.FindOrCreateContainerArgsForCall(0)
Expect(cctx).To(Equal(ctx))
Expect(owner).To(Equal(db.NewImageCheckContainerOwner(fakeCreatingContainer, 123)))
Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{ Expect(containerSpec.ImageSpec).To(Equal(worker.ImageSpec{
ResourceType: "docker", ResourceType: "docker",
})) }))
@ -537,6 +537,7 @@ var _ = Describe("Image", func() {
}) })
It("does not construct a new resource for checking", func() { It("does not construct a new resource for checking", func() {
Expect(fakeWorker.EnsureDBContainerExistsCallCount()).To(BeZero())
Expect(fakeWorker.FindOrCreateContainerCallCount()).To(BeZero()) Expect(fakeWorker.FindOrCreateContainerCallCount()).To(BeZero())
Expect(fakeResourceFactory.NewResourceForContainerCallCount()).To(BeZero()) Expect(fakeResourceFactory.NewResourceForContainerCallCount()).To(BeZero())
}) })

View File

@ -6,11 +6,9 @@ import (
"strings" "strings"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/baggageclaim" "github.com/concourse/baggageclaim"
"github.com/concourse/baggageclaim/baggageclaimfakes" "github.com/concourse/baggageclaim/baggageclaimfakes"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
"github.com/concourse/concourse/atc/worker/image" "github.com/concourse/concourse/atc/worker/image"
@ -32,7 +30,6 @@ var _ = Describe("Image", func() {
fakeImageFetchingDelegate *workerfakes.FakeImageFetchingDelegate fakeImageFetchingDelegate *workerfakes.FakeImageFetchingDelegate
fakeImageResourceFetcherFactory *imagefakes.FakeImageResourceFetcherFactory fakeImageResourceFetcherFactory *imagefakes.FakeImageResourceFetcherFactory
fakeImageResourceFetcher *imagefakes.FakeImageResourceFetcher fakeImageResourceFetcher *imagefakes.FakeImageResourceFetcher
variables creds.Variables
) )
BeforeEach(func() { BeforeEach(func() {
@ -49,10 +46,6 @@ var _ = Describe("Image", func() {
fakeImageResourceFetcher = new(imagefakes.FakeImageResourceFetcher) fakeImageResourceFetcher = new(imagefakes.FakeImageResourceFetcher)
fakeImageResourceFetcherFactory.NewImageResourceFetcherReturns(fakeImageResourceFetcher) fakeImageResourceFetcherFactory.NewImageResourceFetcherReturns(fakeImageResourceFetcher)
imageFactory = image.NewImageFactory(fakeImageResourceFetcherFactory) imageFactory = image.NewImageFactory(fakeImageResourceFetcherFactory)
variables = template.StaticVariables{
"source-secret": "super-secret-sauce",
}
}) })
Describe("imageProvidedByPreviousStepOnSameWorker", func() { Describe("imageProvidedByPreviousStepOnSameWorker", func() {
@ -88,7 +81,7 @@ var _ = Describe("Image", func() {
}, },
42, 42,
fakeImageFetchingDelegate, fakeImageFetchingDelegate,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -154,7 +147,7 @@ var _ = Describe("Image", func() {
}, },
42, 42,
fakeImageFetchingDelegate, fakeImageFetchingDelegate,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -237,13 +230,13 @@ var _ = Describe("Image", func() {
worker.ImageSpec{ worker.ImageSpec{
ImageResource: &worker.ImageResource{ ImageResource: &worker.ImageResource{
Type: "some-image-resource-type", Type: "some-image-resource-type",
Source: creds.NewSource(variables, atc.Source{"some": "source"}), Source: atc.Source{"some": "source"},
}, },
Privileged: true, Privileged: true,
}, },
42, 42,
fakeImageFetchingDelegate, fakeImageFetchingDelegate,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -252,10 +245,10 @@ var _ = Describe("Image", func() {
worker, imageResource, version, teamID, resourceTypes, delegate := fakeImageResourceFetcherFactory.NewImageResourceFetcherArgsForCall(0) worker, imageResource, version, teamID, resourceTypes, delegate := fakeImageResourceFetcherFactory.NewImageResourceFetcherArgsForCall(0)
Expect(worker).To(Equal(fakeWorker)) Expect(worker).To(Equal(fakeWorker))
Expect(imageResource.Type).To(Equal("some-image-resource-type")) Expect(imageResource.Type).To(Equal("some-image-resource-type"))
Expect(imageResource.Source).To(Equal(creds.NewSource(variables, atc.Source{"some": "source"}))) Expect(imageResource.Source).To(Equal(atc.Source{"some": "source"}))
Expect(version).To(BeNil()) Expect(version).To(BeNil())
Expect(teamID).To(Equal(42)) Expect(teamID).To(Equal(42))
Expect(resourceTypes).To(Equal(creds.VersionedResourceTypes{})) Expect(resourceTypes).To(Equal(atc.VersionedResourceTypes{}))
Expect(delegate).To(Equal(fakeImageFetchingDelegate)) Expect(delegate).To(Equal(fakeImageFetchingDelegate))
}) })
@ -302,7 +295,7 @@ var _ = Describe("Image", func() {
}, },
42, 42,
fakeImageFetchingDelegate, fakeImageFetchingDelegate,
creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "some-custom-resource-type", Name: "some-custom-resource-type",
@ -324,7 +317,7 @@ var _ = Describe("Image", func() {
}, },
Version: atc.Version{"some": "custom-image-resource-type-version"}, Version: atc.Version{"some": "custom-image-resource-type-version"},
}, },
}), },
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -333,12 +326,12 @@ var _ = Describe("Image", func() {
worker, imageResource, version, teamID, resourceTypes, delegate := fakeImageResourceFetcherFactory.NewImageResourceFetcherArgsForCall(0) worker, imageResource, version, teamID, resourceTypes, delegate := fakeImageResourceFetcherFactory.NewImageResourceFetcherArgsForCall(0)
Expect(worker).To(Equal(fakeWorker)) Expect(worker).To(Equal(fakeWorker))
Expect(imageResource.Type).To(Equal("some-base-resource-type")) Expect(imageResource.Type).To(Equal("some-base-resource-type"))
Expect(imageResource.Source).To(Equal(creds.NewSource(variables, atc.Source{ Expect(imageResource.Source).To(Equal(atc.Source{
"some": "custom-resource-type-source", "some": "custom-resource-type-source",
}))) }))
Expect(version).To(Equal(atc.Version{"some": "custom-resource-type-version"})) Expect(version).To(Equal(atc.Version{"some": "custom-resource-type-version"}))
Expect(teamID).To(Equal(42)) Expect(teamID).To(Equal(42))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "some-custom-image-resource-type", Name: "some-custom-image-resource-type",
@ -350,7 +343,7 @@ var _ = Describe("Image", func() {
}, },
Version: atc.Version{"some": "custom-image-resource-type-version"}, Version: atc.Version{"some": "custom-image-resource-type-version"},
}, },
}))) }))
Expect(delegate).To(Equal(fakeImageFetchingDelegate)) Expect(delegate).To(Equal(fakeImageFetchingDelegate))
}) })
@ -397,7 +390,7 @@ var _ = Describe("Image", func() {
}, },
42, 42,
fakeImageFetchingDelegate, fakeImageFetchingDelegate,
creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "some-custom-resource-type", Name: "some-custom-resource-type",
@ -419,7 +412,7 @@ var _ = Describe("Image", func() {
}, },
Version: atc.Version{"some": "custom-image-resource-type-version"}, Version: atc.Version{"some": "custom-image-resource-type-version"},
}, },
}), },
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -428,12 +421,12 @@ var _ = Describe("Image", func() {
worker, imageResource, version, teamID, resourceTypes, delegate := fakeImageResourceFetcherFactory.NewImageResourceFetcherArgsForCall(0) worker, imageResource, version, teamID, resourceTypes, delegate := fakeImageResourceFetcherFactory.NewImageResourceFetcherArgsForCall(0)
Expect(worker).To(Equal(fakeWorker)) Expect(worker).To(Equal(fakeWorker))
Expect(imageResource.Type).To(Equal("some-base-image-resource-type")) Expect(imageResource.Type).To(Equal("some-base-image-resource-type"))
Expect(imageResource.Source).To(Equal(creds.NewSource(variables, atc.Source{ Expect(imageResource.Source).To(Equal(atc.Source{
"some": "custom-image-resource-type-source", "some": "custom-image-resource-type-source",
}))) }))
Expect(version).To(Equal(atc.Version{"some": "custom-image-resource-type-version"})) Expect(version).To(Equal(atc.Version{"some": "custom-image-resource-type-version"}))
Expect(teamID).To(Equal(42)) Expect(teamID).To(Equal(42))
Expect(resourceTypes).To(Equal(creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{ Expect(resourceTypes).To(Equal(atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "some-custom-resource-type", Name: "some-custom-resource-type",
@ -444,7 +437,7 @@ var _ = Describe("Image", func() {
}, },
Version: atc.Version{"some": "custom-resource-type-version"}, Version: atc.Version{"some": "custom-resource-type-version"},
}, },
}))) }))
Expect(delegate).To(Equal(fakeImageFetchingDelegate)) Expect(delegate).To(Equal(fakeImageFetchingDelegate))
}) })
@ -519,7 +512,7 @@ var _ = Describe("Image", func() {
}, },
42, 42,
fakeImageFetchingDelegate, fakeImageFetchingDelegate,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -628,7 +621,7 @@ var _ = Describe("Image", func() {
}, },
42, 42,
fakeImageFetchingDelegate, fakeImageFetchingDelegate,
creds.VersionedResourceTypes{}, atc.VersionedResourceTypes{},
) )
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })

View File

@ -5,20 +5,19 @@ import (
"sync" "sync"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/worker" "github.com/concourse/concourse/atc/worker"
"github.com/concourse/concourse/atc/worker/image" "github.com/concourse/concourse/atc/worker/image"
) )
type FakeImageResourceFetcherFactory struct { type FakeImageResourceFetcherFactory struct {
NewImageResourceFetcherStub func(worker.Worker, worker.ImageResource, atc.Version, int, creds.VersionedResourceTypes, worker.ImageFetchingDelegate) image.ImageResourceFetcher NewImageResourceFetcherStub func(worker.Worker, worker.ImageResource, atc.Version, int, atc.VersionedResourceTypes, worker.ImageFetchingDelegate) image.ImageResourceFetcher
newImageResourceFetcherMutex sync.RWMutex newImageResourceFetcherMutex sync.RWMutex
newImageResourceFetcherArgsForCall []struct { newImageResourceFetcherArgsForCall []struct {
arg1 worker.Worker arg1 worker.Worker
arg2 worker.ImageResource arg2 worker.ImageResource
arg3 atc.Version arg3 atc.Version
arg4 int arg4 int
arg5 creds.VersionedResourceTypes arg5 atc.VersionedResourceTypes
arg6 worker.ImageFetchingDelegate arg6 worker.ImageFetchingDelegate
} }
newImageResourceFetcherReturns struct { newImageResourceFetcherReturns struct {
@ -31,7 +30,7 @@ type FakeImageResourceFetcherFactory struct {
invocationsMutex sync.RWMutex invocationsMutex sync.RWMutex
} }
func (fake *FakeImageResourceFetcherFactory) NewImageResourceFetcher(arg1 worker.Worker, arg2 worker.ImageResource, arg3 atc.Version, arg4 int, arg5 creds.VersionedResourceTypes, arg6 worker.ImageFetchingDelegate) image.ImageResourceFetcher { func (fake *FakeImageResourceFetcherFactory) NewImageResourceFetcher(arg1 worker.Worker, arg2 worker.ImageResource, arg3 atc.Version, arg4 int, arg5 atc.VersionedResourceTypes, arg6 worker.ImageFetchingDelegate) image.ImageResourceFetcher {
fake.newImageResourceFetcherMutex.Lock() fake.newImageResourceFetcherMutex.Lock()
ret, specificReturn := fake.newImageResourceFetcherReturnsOnCall[len(fake.newImageResourceFetcherArgsForCall)] ret, specificReturn := fake.newImageResourceFetcherReturnsOnCall[len(fake.newImageResourceFetcherArgsForCall)]
fake.newImageResourceFetcherArgsForCall = append(fake.newImageResourceFetcherArgsForCall, struct { fake.newImageResourceFetcherArgsForCall = append(fake.newImageResourceFetcherArgsForCall, struct {
@ -39,7 +38,7 @@ func (fake *FakeImageResourceFetcherFactory) NewImageResourceFetcher(arg1 worker
arg2 worker.ImageResource arg2 worker.ImageResource
arg3 atc.Version arg3 atc.Version
arg4 int arg4 int
arg5 creds.VersionedResourceTypes arg5 atc.VersionedResourceTypes
arg6 worker.ImageFetchingDelegate arg6 worker.ImageFetchingDelegate
}{arg1, arg2, arg3, arg4, arg5, arg6}) }{arg1, arg2, arg3, arg4, arg5, arg6})
fake.recordInvocation("NewImageResourceFetcher", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6}) fake.recordInvocation("NewImageResourceFetcher", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6})
@ -60,13 +59,13 @@ func (fake *FakeImageResourceFetcherFactory) NewImageResourceFetcherCallCount()
return len(fake.newImageResourceFetcherArgsForCall) return len(fake.newImageResourceFetcherArgsForCall)
} }
func (fake *FakeImageResourceFetcherFactory) NewImageResourceFetcherCalls(stub func(worker.Worker, worker.ImageResource, atc.Version, int, creds.VersionedResourceTypes, worker.ImageFetchingDelegate) image.ImageResourceFetcher) { func (fake *FakeImageResourceFetcherFactory) NewImageResourceFetcherCalls(stub func(worker.Worker, worker.ImageResource, atc.Version, int, atc.VersionedResourceTypes, worker.ImageFetchingDelegate) image.ImageResourceFetcher) {
fake.newImageResourceFetcherMutex.Lock() fake.newImageResourceFetcherMutex.Lock()
defer fake.newImageResourceFetcherMutex.Unlock() defer fake.newImageResourceFetcherMutex.Unlock()
fake.NewImageResourceFetcherStub = stub fake.NewImageResourceFetcherStub = stub
} }
func (fake *FakeImageResourceFetcherFactory) NewImageResourceFetcherArgsForCall(i int) (worker.Worker, worker.ImageResource, atc.Version, int, creds.VersionedResourceTypes, worker.ImageFetchingDelegate) { func (fake *FakeImageResourceFetcherFactory) NewImageResourceFetcherArgsForCall(i int) (worker.Worker, worker.ImageResource, atc.Version, int, atc.VersionedResourceTypes, worker.ImageFetchingDelegate) {
fake.newImageResourceFetcherMutex.RLock() fake.newImageResourceFetcherMutex.RLock()
defer fake.newImageResourceFetcherMutex.RUnlock() defer fake.newImageResourceFetcherMutex.RUnlock()
argsForCall := fake.newImageResourceFetcherArgsForCall[i] argsForCall := fake.newImageResourceFetcherArgsForCall[i]

View File

@ -7,7 +7,6 @@ import (
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
) )
@ -21,7 +20,7 @@ type ImageFactory interface {
imageSpec ImageSpec, imageSpec ImageSpec,
teamID int, teamID int,
delegate ImageFetchingDelegate, delegate ImageFetchingDelegate,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
) (Image, error) ) (Image, error)
} }

View File

@ -1,6 +1,7 @@
package worker package worker
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"math/rand" "math/rand"
@ -9,6 +10,7 @@ import (
"code.cloudfoundry.org/clock" "code.cloudfoundry.org/clock"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/lock"
) )
//go:generate counterfeiter . WorkerProvider //go:generate counterfeiter . WorkerProvider
@ -42,7 +44,8 @@ type WorkerProvider interface {
} }
var ( var (
ErrNoWorkers = errors.New("no workers") ErrNoWorkers = errors.New("no workers")
ErrFailedAcquirePoolLock = errors.New("failed to acquire pool lock")
) )
type NoCompatibleWorkersError struct { type NoCompatibleWorkersError struct {
@ -57,9 +60,11 @@ func (err NoCompatibleWorkersError) Error() string {
type Pool interface { type Pool interface {
FindOrChooseWorkerForContainer( FindOrChooseWorkerForContainer(
context.Context,
lager.Logger, lager.Logger,
db.ContainerOwner, db.ContainerOwner,
ContainerSpec, ContainerSpec,
db.ContainerMetadata,
WorkerSpec, WorkerSpec,
ContainerPlacementStrategy, ContainerPlacementStrategy,
) (Worker, error) ) (Worker, error)
@ -68,18 +73,30 @@ type Pool interface {
lager.Logger, lager.Logger,
WorkerSpec, WorkerSpec,
) (Worker, error) ) (Worker, error)
AcquireContainerCreatingLock(
logger lager.Logger,
) (lock.Lock, bool, error)
} }
type pool struct { type pool struct {
provider WorkerProvider clock clock.Clock
lockFactory lock.LockFactory
provider WorkerProvider
rand *rand.Rand rand *rand.Rand
} }
func NewPool(provider WorkerProvider) Pool { func NewPool(
clock clock.Clock,
lockFactory lock.LockFactory,
provider WorkerProvider,
) Pool {
return &pool{ return &pool{
provider: provider, clock: clock,
rand: rand.New(rand.NewSource(time.Now().UnixNano())), lockFactory: lockFactory,
provider: provider,
rand: rand.New(rand.NewSource(time.Now().UnixNano())),
} }
} }
@ -120,9 +137,11 @@ func (pool *pool) allSatisfying(logger lager.Logger, spec WorkerSpec) ([]Worker,
} }
func (pool *pool) FindOrChooseWorkerForContainer( func (pool *pool) FindOrChooseWorkerForContainer(
ctx context.Context,
logger lager.Logger, logger lager.Logger,
owner db.ContainerOwner, owner db.ContainerOwner,
containerSpec ContainerSpec, containerSpec ContainerSpec,
metadata db.ContainerMetadata,
workerSpec WorkerSpec, workerSpec WorkerSpec,
strategy ContainerPlacementStrategy, strategy ContainerPlacementStrategy,
) (Worker, error) { ) (Worker, error) {
@ -150,16 +169,43 @@ dance:
} }
} }
if worker == nil { // pool is shared by all steps running in the system,
worker, err = strategy.Choose(logger, compatibleWorkers, containerSpec) // lock around worker placement strategies so decisions
// are serialized and valid at the time of creating
// containers in garden
for {
lock, acquired, err := pool.AcquireContainerCreatingLock(logger)
if err != nil {
return nil, ErrFailedAcquirePoolLock
}
if !acquired {
pool.clock.Sleep(time.Second)
continue
}
defer lock.Release()
if worker == nil {
worker, err = strategy.Choose(logger, compatibleWorkers, containerSpec)
if err != nil {
return nil, err
}
}
err = worker.EnsureDBContainerExists(nil, logger, owner, metadata)
if err != nil { if err != nil {
return nil, err return nil, err
} }
break
} }
return worker, nil return worker, nil
} }
func (pool *pool) AcquireContainerCreatingLock(logger lager.Logger) (lock.Lock, bool, error) {
return pool.lockFactory.Acquire(logger, lock.NewContainerCreatingLockID())
}
func (pool *pool) FindOrChooseWorker( func (pool *pool) FindOrChooseWorker(
logger lager.Logger, logger lager.Logger,
workerSpec WorkerSpec, workerSpec WorkerSpec,

View File

@ -1,14 +1,18 @@
package worker_test package worker_test
import ( import (
"context"
"errors" "errors"
"time"
"code.cloudfoundry.org/clock/fakeclock"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagertest" "code.cloudfoundry.org/lager/lagertest"
"github.com/cloudfoundry/bosh-cli/director/template"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds" "github.com/concourse/concourse/atc/db"
"github.com/concourse/concourse/atc/db/dbfakes" "github.com/concourse/concourse/atc/db/dbfakes"
"github.com/concourse/concourse/atc/db/lock"
"github.com/concourse/concourse/atc/db/lock/lockfakes"
. "github.com/concourse/concourse/atc/worker" . "github.com/concourse/concourse/atc/worker"
"github.com/concourse/concourse/atc/worker/workerfakes" "github.com/concourse/concourse/atc/worker/workerfakes"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -17,24 +21,29 @@ import (
var _ = Describe("Pool", func() { var _ = Describe("Pool", func() {
var ( var (
logger *lagertest.TestLogger fakeClock *fakeclock.FakeClock
fakeProvider *workerfakes.FakeWorkerProvider logger *lagertest.TestLogger
pool Pool fakeProvider *workerfakes.FakeWorkerProvider
fakeLockFactory *lockfakes.FakeLockFactory
pool Pool
) )
BeforeEach(func() { BeforeEach(func() {
logger = lagertest.NewTestLogger("test") logger = lagertest.NewTestLogger("test")
fakeProvider = new(workerfakes.FakeWorkerProvider) fakeProvider = new(workerfakes.FakeWorkerProvider)
fakeLockFactory = new(lockfakes.FakeLockFactory)
fakeClock = fakeclock.NewFakeClock(time.Unix(123, 456))
pool = NewPool(fakeProvider) pool = NewPool(fakeClock, fakeLockFactory, fakeProvider)
}) })
Describe("FindOrChooseWorkerForContainer", func() { Describe("FindOrChooseWorkerForContainer", func() {
var ( var (
spec ContainerSpec spec ContainerSpec
workerSpec WorkerSpec workerSpec WorkerSpec
resourceTypes creds.VersionedResourceTypes resourceTypes atc.VersionedResourceTypes
fakeOwner *dbfakes.FakeContainerOwner fakeOwner *dbfakes.FakeContainerOwner
fakeLock *lockfakes.FakeLock
chosenWorker Worker chosenWorker Worker
chooseErr error chooseErr error
@ -84,20 +93,16 @@ var _ = Describe("Pool", func() {
}, },
} }
variables := template.StaticVariables{ resourceTypes = atc.VersionedResourceTypes{
"secret-source": "super-secret-source",
}
resourceTypes = creds.NewVersionedResourceTypes(variables, atc.VersionedResourceTypes{
{ {
ResourceType: atc.ResourceType{ ResourceType: atc.ResourceType{
Name: "custom-type-b", Name: "custom-type-b",
Type: "custom-type-a", Type: "custom-type-a",
Source: atc.Source{"some": "((secret-source))"}, Source: atc.Source{"some": "super-secret-source"},
}, },
Version: atc.Version{"some": "version"}, Version: atc.Version{"some": "version"},
}, },
}) }
workerSpec = WorkerSpec{ workerSpec = WorkerSpec{
ResourceType: "some-type", ResourceType: "some-type",
@ -111,18 +116,84 @@ var _ = Describe("Pool", func() {
compatibleWorker = new(workerfakes.FakeWorker) compatibleWorker = new(workerfakes.FakeWorker)
compatibleWorker.SatisfiesReturns(true) compatibleWorker.SatisfiesReturns(true)
fakeLock = new(lockfakes.FakeLock)
fakeLockFactory.AcquireReturns(fakeLock, true, nil)
}) })
JustBeforeEach(func() { JustBeforeEach(func() {
chosenWorker, chooseErr = pool.FindOrChooseWorkerForContainer( chosenWorker, chooseErr = pool.FindOrChooseWorkerForContainer(
context.TODO(),
logger, logger,
fakeOwner, fakeOwner,
spec, spec,
db.ContainerMetadata{},
workerSpec, workerSpec,
fakeStrategy, fakeStrategy,
) )
}) })
Context("selects a worker in serial", func() {
var (
workerA *workerfakes.FakeWorker
)
BeforeEach(func() {
workerA = new(workerfakes.FakeWorker)
workerA.NameReturns("workerA")
workerA.SatisfiesReturns(true)
fakeProvider.FindWorkersForContainerByOwnerReturns([]Worker{workerA}, nil)
fakeProvider.RunningWorkersReturns([]Worker{workerA}, nil)
fakeStrategy.ChooseReturns(workerA, nil)
})
Context("fails to acquire the pool lock", func() {
BeforeEach(func() {
fakeLockFactory.AcquireReturns(nil, false, ErrFailedAcquirePoolLock)
})
It("returns an error", func() {
Expect(fakeLockFactory.AcquireCallCount()).To(Equal(1))
fakeLockFactory.AcquireReturns(nil, false, ErrFailedAcquirePoolLock)
Expect(chooseErr).To(HaveOccurred())
Expect(chooseErr.Error()).To(Equal("failed to acquire pool lock"))
})
})
Context("lock is held by another", func() {
BeforeEach(func() {
callCount := 0
fakeLockFactory.AcquireStub = func(logger lager.Logger, lockID lock.LockID) (lock.Lock, bool, error) {
callCount++
go fakeClock.WaitForWatcherAndIncrement(time.Second)
if callCount < 3 {
return nil, false, nil
}
return fakeLock, true, nil
}
})
It("retries every second until it is", func() {
Expect(fakeLockFactory.AcquireCallCount()).To(Equal(3))
Expect(fakeLock.ReleaseCallCount()).To(Equal(1))
})
})
Context("lock is not held by anyone", func() {
BeforeEach(func() {
fakeLockFactory.AcquireReturns(fakeLock, true, nil)
})
It("acquires the lock", func() {
Expect(fakeLockFactory.AcquireCallCount()).To(Equal(1))
Expect(chooseErr).ToNot(HaveOccurred())
})
})
})
Context("when workers are found with the container", func() { Context("when workers are found with the container", func() {
var ( var (
workerA *workerfakes.FakeWorker workerA *workerfakes.FakeWorker
@ -133,6 +204,7 @@ var _ = Describe("Pool", func() {
BeforeEach(func() { BeforeEach(func() {
workerA = new(workerfakes.FakeWorker) workerA = new(workerfakes.FakeWorker)
workerA.NameReturns("workerA") workerA.NameReturns("workerA")
workerA.SatisfiesReturns(true)
workerB = new(workerfakes.FakeWorker) workerB = new(workerfakes.FakeWorker)
workerB.NameReturns("workerB") workerB.NameReturns("workerB")
workerC = new(workerfakes.FakeWorker) workerC = new(workerfakes.FakeWorker)
@ -143,6 +215,10 @@ var _ = Describe("Pool", func() {
fakeStrategy.ChooseReturns(workerA, nil) fakeStrategy.ChooseReturns(workerA, nil)
}) })
It("ensures a db container exists", func() {
Expect(workerA.EnsureDBContainerExistsCallCount()).To(Equal(1))
})
Context("when one of the workers satisfy the spec", func() { Context("when one of the workers satisfy the spec", func() {
BeforeEach(func() { BeforeEach(func() {
workerA.SatisfiesReturns(true) workerA.SatisfiesReturns(true)
@ -235,6 +311,7 @@ var _ = Describe("Pool", func() {
workerA = new(workerfakes.FakeWorker) workerA = new(workerfakes.FakeWorker)
workerB = new(workerfakes.FakeWorker) workerB = new(workerfakes.FakeWorker)
workerC = new(workerfakes.FakeWorker) workerC = new(workerfakes.FakeWorker)
workerA.NameReturns("workerA")
workerA.SatisfiesReturns(true) workerA.SatisfiesReturns(true)
workerB.SatisfiesReturns(true) workerB.SatisfiesReturns(true)
@ -244,6 +321,10 @@ var _ = Describe("Pool", func() {
fakeStrategy.ChooseReturns(workerA, nil) fakeStrategy.ChooseReturns(workerA, nil)
}) })
It("ensures a db container exists", func() {
Expect(workerA.EnsureDBContainerExistsCallCount()).To(Equal(1))
})
It("checks that the workers satisfy the given worker spec", func() { It("checks that the workers satisfy the given worker spec", func() {
Expect(workerA.SatisfiesCallCount()).To(Equal(1)) Expect(workerA.SatisfiesCallCount()).To(Equal(1))
_, actualSpec := workerA.SatisfiesArgsForCall(0) _, actualSpec := workerA.SatisfiesArgsForCall(0)
@ -390,6 +471,9 @@ var _ = Describe("Pool", func() {
fakeStrategy.ChooseReturns(compatibleWorker, nil) fakeStrategy.ChooseReturns(compatibleWorker, nil)
}) })
It("ensures a db container exists", func() {
Expect(compatibleWorker.EnsureDBContainerExistsCallCount()).To(Equal(1))
})
It("chooses a worker", func() { It("chooses a worker", func() {
Expect(chooseErr).ToNot(HaveOccurred()) Expect(chooseErr).ToNot(HaveOccurred())
Expect(fakeStrategy.ChooseCallCount()).To(Equal(1)) Expect(fakeStrategy.ChooseCallCount()).To(Equal(1))

View File

@ -2,6 +2,7 @@ package worker
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"path/filepath" "path/filepath"
"sort" "sort"
@ -14,13 +15,14 @@ import (
"code.cloudfoundry.org/garden" "code.cloudfoundry.org/garden"
"code.cloudfoundry.org/lager" "code.cloudfoundry.org/lager"
"github.com/concourse/concourse/atc" "github.com/concourse/concourse/atc"
"github.com/concourse/concourse/atc/creds"
"github.com/concourse/concourse/atc/db" "github.com/concourse/concourse/atc/db"
"github.com/cppforlife/go-semi-semantic/version" "github.com/cppforlife/go-semi-semantic/version"
) )
const userPropertyName = "user" const userPropertyName = "user"
var ResourceConfigCheckSessionExpiredError = errors.New("no db container was found for owner")
//go:generate counterfeiter . Worker //go:generate counterfeiter . Worker
type Worker interface { type Worker interface {
@ -36,15 +38,21 @@ type Worker interface {
IsVersionCompatible(lager.Logger, version.Version) bool IsVersionCompatible(lager.Logger, version.Version) bool
Satisfies(lager.Logger, WorkerSpec) bool Satisfies(lager.Logger, WorkerSpec) bool
EnsureDBContainerExists(
context.Context,
lager.Logger,
db.ContainerOwner,
db.ContainerMetadata,
) error
FindContainerByHandle(lager.Logger, int, string) (Container, bool, error) FindContainerByHandle(lager.Logger, int, string) (Container, bool, error)
FindOrCreateContainer( FindOrCreateContainer(
context.Context, context.Context,
lager.Logger, lager.Logger,
ImageFetchingDelegate, ImageFetchingDelegate,
db.ContainerOwner, db.ContainerOwner,
db.ContainerMetadata,
ContainerSpec, ContainerSpec,
creds.VersionedResourceTypes, atc.VersionedResourceTypes,
) (Container, error) ) (Container, error)
FindVolumeForResourceCache(logger lager.Logger, resourceCache db.UsedResourceCache) (Volume, bool, error) FindVolumeForResourceCache(logger lager.Logger, resourceCache db.UsedResourceCache) (Volume, bool, error)
@ -170,9 +178,8 @@ func (worker *gardenWorker) FindOrCreateContainer(
logger lager.Logger, logger lager.Logger,
delegate ImageFetchingDelegate, delegate ImageFetchingDelegate,
owner db.ContainerOwner, owner db.ContainerOwner,
metadata db.ContainerMetadata,
containerSpec ContainerSpec, containerSpec ContainerSpec,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
) (Container, error) { ) (Container, error) {
var ( var (
@ -183,11 +190,18 @@ func (worker *gardenWorker) FindOrCreateContainer(
err error err error
) )
creatingContainer, createdContainer, containerHandle, err = worker.helper.findOrInitializeContainer(logger, owner, metadata) creatingContainer, createdContainer, err = worker.dbWorker.FindContainer(owner)
if err != nil { if err != nil {
logger.Error("failed-to-find-container-in-db", err) logger.Error("failed-to-find-container-in-db", err)
return nil, err return nil, err
} }
if creatingContainer != nil {
containerHandle = creatingContainer.Handle()
} else if createdContainer != nil {
containerHandle = createdContainer.Handle()
} else {
return nil, ResourceConfigCheckSessionExpiredError
}
gardenContainer, err = worker.gardenClient.Lookup(containerHandle) gardenContainer, err = worker.gardenClient.Lookup(containerHandle)
if err != nil { if err != nil {
@ -202,7 +216,7 @@ func (worker *gardenWorker) FindOrCreateContainer(
logger.Debug("found-created-container-in-db") logger.Debug("found-created-container-in-db")
if gardenContainer == nil { if gardenContainer == nil {
return nil, garden.ContainerNotFoundError{containerHandle} return nil, garden.ContainerNotFoundError{Handle: containerHandle}
} }
return worker.helper.constructGardenWorkerContainer( return worker.helper.constructGardenWorkerContainer(
logger, logger,
@ -212,8 +226,15 @@ func (worker *gardenWorker) FindOrCreateContainer(
} }
if gardenContainer == nil { if gardenContainer == nil {
fetchedImage, err := worker.fetchImageForContainer(
fetchedImage, err := worker.fetchImageForContainer(ctx, logger, containerSpec.ImageSpec, containerSpec.TeamID, delegate, resourceTypes, creatingContainer) ctx,
logger,
containerSpec.ImageSpec,
containerSpec.TeamID,
delegate,
resourceTypes,
creatingContainer,
)
if err != nil { if err != nil {
creatingContainer.Failed() creatingContainer.Failed()
logger.Error("failed-to-fetch-image-for-container", err) logger.Error("failed-to-fetch-image-for-container", err)
@ -294,13 +315,45 @@ func (worker *gardenWorker) getBindMounts(volumeMounts []VolumeMount, bindMountS
return bindMounts, nil return bindMounts, nil
} }
func (worker *gardenWorker) EnsureDBContainerExists(
ctx context.Context,
logger lager.Logger,
owner db.ContainerOwner,
metadata db.ContainerMetadata,
) error {
creatingContainer, createdContainer, err := worker.dbWorker.FindContainer(owner)
if err != nil {
return err
}
if creatingContainer != nil || createdContainer != nil {
return nil
}
logger.Debug("creating-container-in-db")
creatingContainer, err = worker.dbWorker.CreateContainer(
owner,
metadata,
)
if err != nil {
logger.Error("failed-to-create-container-in-db", err)
return err
}
logger = logger.WithData(lager.Data{"container": creatingContainer.Handle()})
logger.Debug("created-creating-container-in-db")
return nil
}
func (worker *gardenWorker) fetchImageForContainer( func (worker *gardenWorker) fetchImageForContainer(
ctx context.Context, ctx context.Context,
logger lager.Logger, logger lager.Logger,
spec ImageSpec, spec ImageSpec,
teamID int, teamID int,
delegate ImageFetchingDelegate, delegate ImageFetchingDelegate,
resourceTypes creds.VersionedResourceTypes, resourceTypes atc.VersionedResourceTypes,
creatingContainer db.CreatingContainer, creatingContainer db.CreatingContainer,
) (FetchedImage, error) { ) (FetchedImage, error) {
image, err := worker.imageFactory.GetImage( image, err := worker.imageFactory.GetImage(
@ -320,7 +373,12 @@ func (worker *gardenWorker) fetchImageForContainer(
return image.FetchForContainer(ctx, logger, creatingContainer) return image.FetchForContainer(ctx, logger, creatingContainer)
} }
func (worker *gardenWorker) createVolumes(logger lager.Logger, isPrivileged bool, creatingContainer db.CreatingContainer, spec ContainerSpec) ([]VolumeMount, error) { func (worker *gardenWorker) createVolumes(
logger lager.Logger,
isPrivileged bool,
creatingContainer db.CreatingContainer,
spec ContainerSpec,
) ([]VolumeMount, error) {
var volumeMounts []VolumeMount var volumeMounts []VolumeMount
var ioVolumeMounts []VolumeMount var ioVolumeMounts []VolumeMount
@ -550,8 +608,8 @@ func (worker *gardenWorker) Satisfies(logger lager.Logger, spec WorkerSpec) bool
return true return true
} }
func determineUnderlyingTypeName(typeName string, resourceTypes creds.VersionedResourceTypes) string { func determineUnderlyingTypeName(typeName string, resourceTypes atc.VersionedResourceTypes) string {
resourceTypesMap := make(map[string]creds.VersionedResourceType) resourceTypesMap := make(map[string]atc.VersionedResourceType)
for _, resourceType := range resourceTypes { for _, resourceType := range resourceTypes {
resourceTypesMap[resourceType.Name] = resourceType resourceTypesMap[resourceType.Name] = resourceType
} }

Some files were not shown because too many files have changed in this diff Show More