示例#1
0
文件: tracker_test.go 项目: ACPK/atc
			Context("when a worker is found", func() {
				var satisfyingWorker *wfakes.FakeWorker

				BeforeEach(func() {
					satisfyingWorker = new(wfakes.FakeWorker)
					workerClient.SatisfyingReturns(satisfyingWorker, nil)

					satisfyingWorker.CreateContainerReturns(fakeContainer, nil)
				})

				Context("when the worker supports volume management", func() {
					var fakeBaggageclaimClient *bfakes.FakeClient

					BeforeEach(func() {
						fakeBaggageclaimClient = new(bfakes.FakeClient)
						satisfyingWorker.VolumeManagerReturns(fakeBaggageclaimClient, true)
					})

					Context("when the cache is already present", func() {
						var foundVolume *bfakes.FakeVolume

						BeforeEach(func() {
							foundVolume = new(bfakes.FakeVolume)
							foundVolume.HandleReturns("found-volume-handle")
							cacheIdentifier.FindOnReturns(foundVolume, true, nil)

							cacheIdentifier.ResourceVersionReturns(atc.Version{"some": "theversion"})
							cacheIdentifier.ResourceHashReturns("hash")
							satisfyingWorker.NameReturns("myworker")
							foundVolume.ExpirationReturns(time.Hour, time.Now(), nil)
						})
			expectedOneOffTTL        = 5 * time.Hour

			baggageCollector lostandfound.BaggageCollector

			savedPipeline  db.SavedPipeline
			fakePipelineDB *dbfakes.FakePipelineDB
		)

		BeforeEach(func() {
			fakeWorkerClient = new(wfakes.FakeClient)

			workerA = new(wfakes.FakeWorker)

			workerB = new(wfakes.FakeWorker)
			workerBBaggageClaimClient = new(bcfakes.FakeClient)
			workerB.VolumeManagerReturns(workerBBaggageClaimClient, true)
			dockerVolume = new(bcfakes.FakeVolume)
			workerBBaggageClaimClient.LookupVolumeReturns(dockerVolume, true, nil)

			workerC = new(wfakes.FakeWorker)
			workerCBaggageClaimClient = new(bcfakes.FakeClient)
			workerC.VolumeManagerReturns(workerCBaggageClaimClient, true)
			crossedWiresVolume = new(bcfakes.FakeVolume)
			workerCBaggageClaimClient.LookupVolumeReturns(crossedWiresVolume, true, nil)

			workerMap := map[string]*wfakes.FakeWorker{
				"workerA": workerA,
				"workerB": workerB,
				"workerC": workerC,
			}
	type baggageCollectionExample struct {
		pipelineData map[string][]resourceConfigAndVersions
		volumeData   []db.Volume
		expectedTTLs map[string]time.Duration
	}

	DescribeTable("baggage collection",
		func(examples ...baggageCollectionExample) {
			var err error

			for _, example := range examples {
				fakeWorkerClient = new(wfakes.FakeClient)
				fakeWorker = new(wfakes.FakeWorker)
				fakeBaggageClaimClient = new(bcfakes.FakeClient)
				fakeWorkerClient.GetWorkerReturns(fakeWorker, nil)
				fakeWorker.VolumeManagerReturns(fakeBaggageClaimClient, true)
				baggageCollectorLogger := lagertest.NewTestLogger("test")

				fakeBaggageCollectorDB = new(fakes.FakeBaggageCollectorDB)
				fakePipelineDBFactory = new(dbfakes.FakePipelineDBFactory)

				baggageCollector = lostandfound.NewBaggageCollector(
					baggageCollectorLogger,
					fakeWorkerClient,
					fakeBaggageCollectorDB,
					fakePipelineDBFactory,
					expectedOldResourceGracePeriod,
					expectedOneOffTTL,
				)

				var savedPipelines []db.SavedPipeline
		expectedOneOffTTL        = 5 * time.Hour

		baggageCollector lostandfound.BaggageCollector

		savedPipeline  db.SavedPipeline
		fakePipelineDB *dbfakes.FakePipelineDB
	)

	BeforeEach(func() {
		fakeWorkerClient = new(wfakes.FakeClient)

		worker1 = new(wfakes.FakeWorker)

		worker2 = new(wfakes.FakeWorker)
		baggageClaimClient2 = new(bcfakes.FakeClient)
		worker2.VolumeManagerReturns(baggageClaimClient2, true)
		volume2 = new(bcfakes.FakeVolume)
		baggageClaimClient2.LookupVolumeReturns(volume2, true, nil)

		workerMap := map[string]*wfakes.FakeWorker{
			"worker1": worker1,
			"worker2": worker2,
		}

		fakeWorkerClient.GetWorkerStub = func(name string) (worker.Worker, error) {
			return workerMap[name], nil
		}
		baggageCollectorLogger := lagertest.NewTestLogger("test")

		fakeBaggageCollectorDB = new(fakes.FakeBaggageCollectorDB)
		fakePipelineDBFactory = new(dbfakes.FakePipelineDBFactory)
				fakeWorkerClient.GetWorkerReturns(nil, errors.New("no-worker-found"))
			})

			It("removes the volume from the database", func() {
				err := baggageCollector.Collect()
				Expect(err).NotTo(HaveOccurred())

				Expect(fakeBaggageCollectorDB.ReapVolumeCallCount()).To(Equal(1))
				Expect(fakeBaggageCollectorDB.ReapVolumeArgsForCall(0)).To(Equal(returnedSavedVolume.Handle))
			})
		})

		Context("baggage claim is no longer found on the worker", func() {
			BeforeEach(func() {
				fakeWorkerClient.GetWorkerReturns(fakeWorker, nil)
				fakeWorker.VolumeManagerReturns(nil, false)
			})

			It("removes the volume from the database", func() {
				err := baggageCollector.Collect()
				Expect(err).NotTo(HaveOccurred())

				Expect(fakeBaggageCollectorDB.ReapVolumeCallCount()).To(Equal(1))
				Expect(fakeBaggageCollectorDB.ReapVolumeArgsForCall(0)).To(Equal(returnedSavedVolume.Handle))
			})
		})

		Context("the volume is no longer found on the worker", func() {
			BeforeEach(func() {
				fakeWorkerClient.GetWorkerReturns(fakeWorker, nil)
				fakeWorker.VolumeManagerReturns(nil, false)