github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/gc/destroyer_test.go (about) 1 package gc_test 2 3 import ( 4 "errors" 5 6 "github.com/pf-qiu/concourse/v6/atc/gc" 7 8 "code.cloudfoundry.org/lager/lagertest" 9 "github.com/pf-qiu/concourse/v6/atc/db/dbfakes" 10 . "github.com/onsi/ginkgo" 11 . "github.com/onsi/gomega" 12 ) 13 14 var _ = Describe("Destroyer", func() { 15 var ( 16 fakeContainerRepository *dbfakes.FakeContainerRepository 17 fakeVolumeRepository *dbfakes.FakeVolumeRepository 18 destroyer gc.Destroyer 19 ) 20 21 BeforeEach(func() { 22 fakeContainerRepository = new(dbfakes.FakeContainerRepository) 23 fakeVolumeRepository = new(dbfakes.FakeVolumeRepository) 24 25 logger = lagertest.NewTestLogger("test") 26 27 destroyer = gc.NewDestroyer( 28 logger, 29 fakeContainerRepository, 30 fakeVolumeRepository, 31 ) 32 }) 33 34 Describe("Destroy Containers", func() { 35 var ( 36 err error 37 workerName string 38 handles []string 39 ) 40 41 Context("there are containers to destroy", func() { 42 BeforeEach(func() { 43 handles = []string{"some-handle1", "some-handle2"} 44 workerName = "some-worker" 45 }) 46 47 It("succeed", func() { 48 fakeContainerRepository.RemoveDestroyingContainersReturns(2, nil) 49 err = destroyer.DestroyContainers(workerName, handles) 50 51 Expect(err).NotTo(HaveOccurred()) 52 Expect(fakeContainerRepository.RemoveDestroyingContainersCallCount()).To(Equal(1)) 53 }) 54 55 Context("when worker name is not provided", func() { 56 It("returns an error", func() { 57 58 err = destroyer.DestroyContainers("", handles) 59 60 Expect(err).To(HaveOccurred()) 61 Expect(err.Error()).To(Equal("worker-name-must-be-provided")) 62 Expect(fakeContainerRepository.RemoveDestroyingContainersCallCount()).To(Equal(0)) 63 }) 64 }) 65 }) 66 67 Context("there are no containers to destroy", func() { 68 BeforeEach(func() { 69 handles = []string{} 70 workerName = "some-worker" 71 }) 72 73 It("returned no error and called container repository", func() { 74 err = destroyer.DestroyContainers(workerName, handles) 75 76 Expect(err).NotTo(HaveOccurred()) 77 Expect(fakeContainerRepository.RemoveDestroyingContainersCallCount()).To(Equal(1)) 78 79 err = destroyer.DestroyContainers(workerName, nil) 80 81 Expect(err).NotTo(HaveOccurred()) 82 Expect(fakeContainerRepository.RemoveDestroyingContainersCallCount()).To(Equal(1)) 83 }) 84 }) 85 86 Context("there is error in the container repository call", func() { 87 var repoErrorString string 88 BeforeEach(func() { 89 handles = []string{"container_one", "container_two", "container_three"} 90 workerName = "some-worker" 91 repoErrorString = "I am le tired" 92 93 fakeContainerRepository.RemoveDestroyingContainersReturns(0, errors.New(repoErrorString)) 94 }) 95 It("returns an error", func() { 96 err = destroyer.DestroyContainers(workerName, handles) 97 98 Expect(err).To(HaveOccurred()) 99 Expect(err.Error()).To(Equal(repoErrorString)) 100 Expect(fakeContainerRepository.RemoveDestroyingContainersCallCount()).To(Equal(1)) 101 }) 102 }) 103 }) 104 105 Describe("Destroy Volumes", func() { 106 var ( 107 err error 108 workerName string 109 handles []string 110 ) 111 112 Context("there are volumes to destroy", func() { 113 BeforeEach(func() { 114 handles = []string{"some-handle1", "some-handle2"} 115 workerName = "some-worker" 116 117 }) 118 119 It("succeed", func() { 120 fakeVolumeRepository.RemoveDestroyingVolumesReturns(2, nil) 121 err = destroyer.DestroyVolumes(workerName, handles) 122 123 Expect(err).NotTo(HaveOccurred()) 124 Expect(fakeVolumeRepository.RemoveDestroyingVolumesCallCount()).To(Equal(1)) 125 }) 126 127 Context("when worker name is not provided", func() { 128 It("returns an error", func() { 129 130 err = destroyer.DestroyVolumes("", handles) 131 132 Expect(err).To(HaveOccurred()) 133 Expect(err.Error()).To(Equal("worker-name-must-be-provided")) 134 Expect(fakeVolumeRepository.RemoveDestroyingVolumesCallCount()).To(Equal(0)) 135 }) 136 }) 137 }) 138 139 Context("there are no volumes to destroy", func() { 140 BeforeEach(func() { 141 handles = []string{} 142 workerName = "some-worker" 143 }) 144 It("returned no error and called volume repository", func() { 145 err = destroyer.DestroyVolumes(workerName, handles) 146 147 Expect(err).NotTo(HaveOccurred()) 148 Expect(fakeVolumeRepository.RemoveDestroyingVolumesCallCount()).To(Equal(1)) 149 150 err = destroyer.DestroyVolumes(workerName, nil) 151 152 Expect(err).NotTo(HaveOccurred()) 153 Expect(fakeVolumeRepository.RemoveDestroyingVolumesCallCount()).To(Equal(1)) 154 }) 155 }) 156 157 Context("there is error in the volumes repository call", func() { 158 var repoErrorString string 159 BeforeEach(func() { 160 handles = []string{"volume_one", "volume_two", "volume_three"} 161 workerName = "some-worker" 162 repoErrorString = "I am le tired" 163 164 fakeVolumeRepository.RemoveDestroyingVolumesReturns(0, errors.New(repoErrorString)) 165 }) 166 It("returns an error", func() { 167 err = destroyer.DestroyVolumes(workerName, handles) 168 169 Expect(err).To(HaveOccurred()) 170 Expect(err.Error()).To(Equal(repoErrorString)) 171 Expect(fakeVolumeRepository.RemoveDestroyingVolumesCallCount()).To(Equal(1)) 172 }) 173 }) 174 }) 175 176 Describe("Find Orphan Volumes as Destroying", func() { 177 var ( 178 FindErr error 179 workerName string 180 handles []string 181 ) 182 JustBeforeEach(func() { 183 handles, FindErr = destroyer.FindDestroyingVolumesForGc(workerName) 184 }) 185 186 Context("when orphaned volumes are returned", func() { 187 BeforeEach(func() { 188 workerName = "some-worker" 189 fakeVolumeRepository.GetDestroyingVolumesReturns(nil, nil) 190 }) 191 192 It("succeed", func() { 193 Expect(FindErr).NotTo(HaveOccurred()) 194 Expect(len(handles)).To(Equal(0)) 195 Expect(fakeVolumeRepository.GetDestroyingVolumesCallCount()).To(Equal(1)) 196 }) 197 }) 198 199 Context("there are volumes returned", func() { 200 BeforeEach(func() { 201 workerName = "some-worker" 202 handles = []string{"volume-1", "volume-2"} 203 204 fakeVolumeRepository.GetDestroyingVolumesReturns(handles, nil) 205 }) 206 207 It("returned list of both destroyed handles", func() { 208 Expect(FindErr).NotTo(HaveOccurred()) 209 Expect(len(handles)).To(Equal(2)) 210 Expect(fakeVolumeRepository.GetDestroyingVolumesCallCount()).To(Equal(1)) 211 }) 212 }) 213 214 Context("there is error in the volumes repository call", func() { 215 BeforeEach(func() { 216 fakeVolumeRepository.GetDestroyingVolumesReturns(nil, errors.New("some-bad-err")) 217 }) 218 It("returns an error", func() { 219 Expect(FindErr).To(HaveOccurred()) 220 }) 221 }) 222 }) 223 })