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  })