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