1package db_test 2 3import ( 4 "os" 5 "testing" 6 "time" 7 8 "code.cloudfoundry.org/lager/lagertest" 9 sq "github.com/Masterminds/squirrel" 10 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 14 "github.com/concourse/concourse/atc" 15 "github.com/concourse/concourse/atc/creds/credsfakes" 16 "github.com/concourse/concourse/atc/db" 17 "github.com/concourse/concourse/atc/db/dbfakes" 18 "github.com/concourse/concourse/atc/db/lock" 19 "github.com/concourse/concourse/atc/metric" 20 "github.com/concourse/concourse/atc/postgresrunner" 21 "github.com/tedsuo/ifrit" 22) 23 24func TestDB(t *testing.T) { 25 RegisterFailHandler(Fail) 26 RunSpecs(t, "DB Suite") 27} 28 29var ( 30 postgresRunner postgresrunner.Runner 31 dbProcess ifrit.Process 32 33 dbConn db.Conn 34 fakeSecrets *credsfakes.FakeSecrets 35 fakeVarSourcePool *credsfakes.FakeVarSourcePool 36 componentFactory db.ComponentFactory 37 buildFactory db.BuildFactory 38 volumeRepository db.VolumeRepository 39 containerRepository db.ContainerRepository 40 teamFactory db.TeamFactory 41 workerFactory db.WorkerFactory 42 workerLifecycle db.WorkerLifecycle 43 resourceConfigCheckSessionLifecycle db.ResourceConfigCheckSessionLifecycle 44 resourceConfigFactory db.ResourceConfigFactory 45 resourceCacheFactory db.ResourceCacheFactory 46 taskCacheFactory db.TaskCacheFactory 47 checkFactory db.CheckFactory 48 workerBaseResourceTypeFactory db.WorkerBaseResourceTypeFactory 49 workerTaskCacheFactory db.WorkerTaskCacheFactory 50 userFactory db.UserFactory 51 dbWall db.Wall 52 fakeClock dbfakes.FakeClock 53 54 defaultWorkerResourceType atc.WorkerResourceType 55 defaultTeam db.Team 56 defaultWorkerPayload atc.Worker 57 defaultWorker db.Worker 58 otherWorker db.Worker 59 otherWorkerPayload atc.Worker 60 defaultResourceType db.ResourceType 61 defaultResource db.Resource 62 defaultPipelineConfig atc.Config 63 defaultPipeline db.Pipeline 64 defaultJob db.Job 65 logger *lagertest.TestLogger 66 lockFactory lock.LockFactory 67 68 fullMetadata = db.ContainerMetadata{ 69 Type: db.ContainerTypeTask, 70 71 StepName: "some-step-name", 72 Attempt: "1.2.3", 73 74 PipelineID: 123, 75 JobID: 456, 76 BuildID: 789, 77 78 PipelineName: "some-pipeline", 79 JobName: "some-job", 80 BuildName: "some-build", 81 82 WorkingDirectory: "/some/work/dir", 83 User: "some-user", 84 } 85 86 psql = sq.StatementBuilder.PlaceholderFormat(sq.Dollar) 87) 88 89var _ = BeforeSuite(func() { 90 postgresRunner = postgresrunner.Runner{ 91 Port: 5433 + GinkgoParallelNode(), 92 } 93 94 dbProcess = ifrit.Invoke(postgresRunner) 95 96 postgresRunner.CreateTestDB() 97}) 98 99var _ = BeforeEach(func() { 100 postgresRunner.Truncate() 101 102 dbConn = postgresRunner.OpenConn() 103 104 lockFactory = lock.NewLockFactory(postgresRunner.OpenSingleton(), metric.LogLockAcquired, metric.LogLockReleased) 105 106 fakeSecrets = new(credsfakes.FakeSecrets) 107 fakeVarSourcePool = new(credsfakes.FakeVarSourcePool) 108 componentFactory = db.NewComponentFactory(dbConn) 109 buildFactory = db.NewBuildFactory(dbConn, lockFactory, 5*time.Minute, 5*time.Minute) 110 volumeRepository = db.NewVolumeRepository(dbConn) 111 containerRepository = db.NewContainerRepository(dbConn) 112 teamFactory = db.NewTeamFactory(dbConn, lockFactory) 113 workerFactory = db.NewWorkerFactory(dbConn) 114 workerLifecycle = db.NewWorkerLifecycle(dbConn) 115 resourceConfigCheckSessionLifecycle = db.NewResourceConfigCheckSessionLifecycle(dbConn) 116 resourceConfigFactory = db.NewResourceConfigFactory(dbConn, lockFactory) 117 resourceCacheFactory = db.NewResourceCacheFactory(dbConn, lockFactory) 118 taskCacheFactory = db.NewTaskCacheFactory(dbConn) 119 checkFactory = db.NewCheckFactory(dbConn, lockFactory, fakeSecrets, fakeVarSourcePool, time.Minute) 120 workerBaseResourceTypeFactory = db.NewWorkerBaseResourceTypeFactory(dbConn) 121 workerTaskCacheFactory = db.NewWorkerTaskCacheFactory(dbConn) 122 userFactory = db.NewUserFactory(dbConn) 123 dbWall = db.NewWall(dbConn, &fakeClock) 124 125 var err error 126 defaultTeam, err = teamFactory.CreateTeam(atc.Team{Name: "default-team"}) 127 Expect(err).NotTo(HaveOccurred()) 128 129 defaultWorkerResourceType = atc.WorkerResourceType{ 130 Type: "some-base-resource-type", 131 Image: "/path/to/image", 132 Version: "some-brt-version", 133 } 134 135 certsPath := "/etc/ssl/certs" 136 137 defaultWorkerPayload = atc.Worker{ 138 ResourceTypes: []atc.WorkerResourceType{defaultWorkerResourceType}, 139 Name: "default-worker", 140 GardenAddr: "1.2.3.4:7777", 141 BaggageclaimURL: "5.6.7.8:7878", 142 CertsPath: &certsPath, 143 } 144 145 otherWorkerPayload = atc.Worker{ 146 ResourceTypes: []atc.WorkerResourceType{defaultWorkerResourceType}, 147 Name: "other-worker", 148 GardenAddr: "2.3.4.5:7777", 149 BaggageclaimURL: "6.7.8.9:7878", 150 CertsPath: &certsPath, 151 } 152 153 defaultWorker, err = workerFactory.SaveWorker(defaultWorkerPayload, 0) 154 Expect(err).NotTo(HaveOccurred()) 155 156 otherWorker, err = workerFactory.SaveWorker(otherWorkerPayload, 0) 157 Expect(err).NotTo(HaveOccurred()) 158 159 defaultPipelineConfig = atc.Config{ 160 Jobs: atc.JobConfigs{ 161 { 162 Name: "some-job", 163 }, 164 }, 165 Resources: atc.ResourceConfigs{ 166 { 167 Name: "some-resource", 168 Type: "some-base-resource-type", 169 Source: atc.Source{ 170 "some": "source", 171 }, 172 }, 173 }, 174 ResourceTypes: atc.ResourceTypes{ 175 { 176 Name: "some-type", 177 Type: "some-base-resource-type", 178 Source: atc.Source{ 179 "some-type": "source", 180 }, 181 }, 182 }, 183 } 184 185 defaultPipeline, _, err = defaultTeam.SavePipeline("default-pipeline", defaultPipelineConfig, db.ConfigVersion(0), false) 186 Expect(err).NotTo(HaveOccurred()) 187 188 var found bool 189 defaultResourceType, found, err = defaultPipeline.ResourceType("some-type") 190 Expect(err).NotTo(HaveOccurred()) 191 Expect(found).To(BeTrue()) 192 193 defaultResource, found, err = defaultPipeline.Resource("some-resource") 194 Expect(err).NotTo(HaveOccurred()) 195 Expect(found).To(BeTrue()) 196 197 defaultJob, found, err = defaultPipeline.Job("some-job") 198 Expect(err).NotTo(HaveOccurred()) 199 Expect(found).To(BeTrue()) 200 201 logger = lagertest.NewTestLogger("test") 202}) 203 204func destroy(d interface{ Destroy() error }) { 205 err := d.Destroy() 206 Expect(err).ToNot(HaveOccurred()) 207} 208 209var _ = AfterEach(func() { 210 err := dbConn.Close() 211 Expect(err).NotTo(HaveOccurred()) 212}) 213 214var _ = AfterSuite(func() { 215 dbProcess.Signal(os.Interrupt) 216 <-dbProcess.Wait() 217}) 218