github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/gc/volume_collector_test.go (about) 1 package gc_test 2 3 import ( 4 "context" 5 "time" 6 7 "github.com/pf-qiu/concourse/v6/atc" 8 "github.com/pf-qiu/concourse/v6/atc/db" 9 "github.com/pf-qiu/concourse/v6/atc/db/dbfakes" 10 "github.com/pf-qiu/concourse/v6/atc/gc" 11 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 ) 15 16 var _ = Describe("VolumeCollector", func() { 17 var ( 18 volumeCollector GcCollector 19 missingVolumeGracePeriod time.Duration 20 21 volumeRepository db.VolumeRepository 22 workerFactory db.WorkerFactory 23 creatingContainer1 db.CreatingContainer 24 creatingContainer2 db.CreatingContainer 25 team db.Team 26 worker db.Worker 27 build db.Build 28 ) 29 30 BeforeEach(func() { 31 postgresRunner.Truncate() 32 33 volumeRepository = db.NewVolumeRepository(dbConn) 34 workerFactory = db.NewWorkerFactory(dbConn) 35 36 missingVolumeGracePeriod = 1 * time.Minute 37 38 volumeCollector = gc.NewVolumeCollector( 39 volumeRepository, 40 missingVolumeGracePeriod, 41 ) 42 }) 43 44 Describe("Run", func() { 45 BeforeEach(func() { 46 var err error 47 team, err = teamFactory.CreateTeam(atc.Team{Name: "some-team"}) 48 Expect(err).ToNot(HaveOccurred()) 49 50 build, err = team.CreateOneOffBuild() 51 Expect(err).ToNot(HaveOccurred()) 52 53 worker, err = workerFactory.SaveWorker(atc.Worker{ 54 Name: "some-worker", 55 GardenAddr: "1.2.3.4:7777", 56 BaggageclaimURL: "1.2.3.4:7788", 57 }, 5*time.Minute) 58 Expect(err).ToNot(HaveOccurred()) 59 60 creatingContainer1, err = worker.CreateContainer(db.NewBuildStepContainerOwner(build.ID(), "some-plan", team.ID()), db.ContainerMetadata{ 61 Type: "task", 62 StepName: "some-task", 63 }) 64 Expect(err).ToNot(HaveOccurred()) 65 }) 66 67 Context("when there are expired volumes", func() { 68 var fakeVolumeRepository *dbfakes.FakeVolumeRepository 69 70 BeforeEach(func() { 71 fakeVolumeRepository = new(dbfakes.FakeVolumeRepository) 72 73 volumeCollector = gc.NewVolumeCollector( 74 fakeVolumeRepository, 75 missingVolumeGracePeriod, 76 ) 77 78 err = volumeCollector.Run(context.TODO()) 79 Expect(err).NotTo(HaveOccurred()) 80 }) 81 82 It("deletes them from the database", func() { 83 Expect(fakeVolumeRepository.RemoveMissingVolumesCallCount()).To(Equal(1)) 84 Expect(fakeVolumeRepository.RemoveMissingVolumesArgsForCall(0)).To(Equal(missingVolumeGracePeriod)) 85 }) 86 }) 87 88 Context("when there are failed volumes", func() { 89 JustBeforeEach(func() { 90 creatingVolume1, err := volumeRepository.CreateContainerVolume(team.ID(), worker.Name(), creatingContainer1, "some-path-1") 91 Expect(err).NotTo(HaveOccurred()) 92 93 _, err = creatingVolume1.Failed() 94 Expect(err).NotTo(HaveOccurred()) 95 }) 96 97 It("deletes all the failed volumes from the database", func() { 98 failedVolumesLen, err := volumeRepository.DestroyFailedVolumes() 99 Expect(err).NotTo(HaveOccurred()) 100 Expect(failedVolumesLen).To(Equal(1)) 101 102 err = volumeCollector.Run(context.TODO()) 103 Expect(err).NotTo(HaveOccurred()) 104 105 failedVolumesLen, err = volumeRepository.DestroyFailedVolumes() 106 Expect(err).NotTo(HaveOccurred()) 107 Expect(failedVolumesLen).To(Equal(0)) 108 }) 109 }) 110 111 Context("when there are orphaned volumes", func() { 112 var expectedOrphanedVolumeHandles []string 113 114 JustBeforeEach(func() { 115 creatingContainer2, err = worker.CreateContainer(db.NewBuildStepContainerOwner(build.ID(), "some-plan", team.ID()), db.ContainerMetadata{ 116 Type: "task", 117 StepName: "some-task", 118 }) 119 Expect(err).ToNot(HaveOccurred()) 120 121 creatingVolume1, err := volumeRepository.CreateContainerVolume(team.ID(), worker.Name(), creatingContainer1, "some-path-1") 122 Expect(err).NotTo(HaveOccurred()) 123 expectedOrphanedVolumeHandles = append(expectedOrphanedVolumeHandles, creatingVolume1.Handle()) 124 125 _, err = creatingVolume1.Created() 126 Expect(err).NotTo(HaveOccurred()) 127 128 creatingVolume2, err := volumeRepository.CreateContainerVolume(team.ID(), worker.Name(), creatingContainer2, "some-path-1") 129 Expect(err).NotTo(HaveOccurred()) 130 131 _, err = creatingVolume2.Created() 132 Expect(err).NotTo(HaveOccurred()) 133 134 createdContainer1, err := creatingContainer1.Created() 135 Expect(err).NotTo(HaveOccurred()) 136 137 _, err = creatingContainer2.Created() 138 Expect(err).NotTo(HaveOccurred()) 139 140 destroyingContainer, err := createdContainer1.Destroying() 141 Expect(err).NotTo(HaveOccurred()) 142 143 destroyed, err := destroyingContainer.Destroy() 144 Expect(err).NotTo(HaveOccurred()) 145 Expect(destroyed).To(BeTrue()) 146 }) 147 148 It("marks orphaned volumes as 'destroying'", func() { 149 err = volumeCollector.Run(context.TODO()) 150 Expect(err).NotTo(HaveOccurred()) 151 152 destroyingVolumes, err := volumeRepository.GetDestroyingVolumes(worker.Name()) 153 Expect(err).NotTo(HaveOccurred()) 154 Expect(destroyingVolumes).To(HaveLen(1)) 155 156 Expect(destroyingVolumes).To(Equal(expectedOrphanedVolumeHandles)) 157 }) 158 }) 159 }) 160 })