1package release_test 2 3import ( 4 boshlog "github.com/cloudfoundry/bosh-utils/logger" 5 fakesys "github.com/cloudfoundry/bosh-utils/system/fakes" 6 . "github.com/onsi/ginkgo" 7 . "github.com/onsi/gomega" 8 9 . "github.com/cloudfoundry/bosh-cli/release" 10 boshjob "github.com/cloudfoundry/bosh-cli/release/job" 11 boshlic "github.com/cloudfoundry/bosh-cli/release/license" 12 boshpkg "github.com/cloudfoundry/bosh-cli/release/pkg" 13 . "github.com/cloudfoundry/bosh-cli/release/resource" 14) 15 16var _ = Describe("ManifestReader", func() { 17 var ( 18 fs *fakesys.FakeFileSystem 19 reader ManifestReader 20 ) 21 22 BeforeEach(func() { 23 fs = fakesys.NewFakeFileSystem() 24 fs.TempDirDir = "/release" 25 26 logger := boshlog.NewLogger(boshlog.LevelNone) 27 reader = NewManifestReader(fs, logger) 28 }) 29 30 Describe("Read", func() { 31 act := func() (Release, error) { return reader.Read("/release.yml") } 32 33 Context("when manifest includes jobs and packages", func() { 34 It("returns release with jobs and packages", func() { 35 fs.WriteFileString("/release.yml", `--- 36name: release 37version: version 38commit_hash: commit 39uncommitted_changes: true 40 41jobs: 42- name: job1 43 version: job1-version 44 fingerprint: job1-fp 45 sha1: job1-sha 46- name: job2 47 version: job2-version 48 fingerprint: job2-fp 49 sha1: job2-sha 50 51packages: 52- name: pkg2 53 version: pkg2-version 54 fingerprint: pkg2-fp 55 sha1: pkg2-sha 56- name: pkg1 57 version: pkg1-version 58 fingerprint: pkg1-fp 59 sha1: pkg1-sha 60 dependencies: [pkg2] 61`) 62 63 release, err := act() 64 Expect(err).NotTo(HaveOccurred()) 65 66 job1 := boshjob.NewJob(NewExistingResource("job1", "job1-fp", "job1-sha")) 67 job2 := boshjob.NewJob(NewExistingResource("job2", "job2-fp", "job2-sha")) 68 69 pkg1 := boshpkg.NewPackage(NewExistingResource("pkg1", "pkg1-fp", "pkg1-sha"), []string{"pkg2"}) 70 pkg2 := boshpkg.NewPackage(NewExistingResource("pkg2", "pkg2-fp", "pkg2-sha"), nil) 71 pkg1.AttachDependencies([]*boshpkg.Package{pkg2}) 72 73 Expect(release.Name()).To(Equal("release")) 74 Expect(release.Version()).To(Equal("version")) 75 Expect(release.CommitHashWithMark("*")).To(Equal("commit*")) 76 Expect(release.Jobs()).To(Equal([]*boshjob.Job{job1, job2})) 77 Expect(release.Packages()).To(Equal([]*boshpkg.Package{pkg2, pkg1})) 78 Expect(release.CompiledPackages()).To(BeEmpty()) 79 Expect(release.IsCompiled()).To(BeFalse()) 80 Expect(release.License()).To(BeNil()) 81 }) 82 83 It("returns error if pkg's pkg dependencies cannot be satisfied", func() { 84 fs.WriteFileString("/release.yml", `--- 85name: release 86version: version 87packages: 88- name: pkg1 89 version: pkg1-version 90 fingerprint: pkg1-fp 91 sha1: pkg1-sha 92 dependencies: [pkg-with-other-name] 93`) 94 95 _, err := act() 96 Expect(err).To(HaveOccurred()) 97 Expect(err.Error()).To(ContainSubstring( 98 "Expected to find package 'pkg-with-other-name' since it's a dependency of package 'pkg1'")) 99 }) 100 101 It("returns a release that can be cleaned up", func() { 102 fs.WriteFileString("/release.yml", "") 103 104 release, err := reader.Read("/release.yml") 105 Expect(err).NotTo(HaveOccurred()) 106 107 Expect(release.CleanUp()).ToNot(HaveOccurred()) 108 Expect(fs.FileExists("/release.yml")).To(BeTrue()) 109 }) 110 }) 111 112 Context("when manifest includes jobs and compiled packages and license", func() { 113 It("returns a release with jobs, compiled packages and license", func() { 114 fs.WriteFileString("/release.yml", `--- 115name: release 116version: version 117commit_hash: commit 118uncommitted_changes: true 119 120jobs: 121- name: job1 122 version: job1-version 123 fingerprint: job1-fp 124 sha1: job1-sha 125- name: job2 126 version: job2-version 127 fingerprint: job2-fp 128 sha1: job2-sha 129 130compiled_packages: 131- name: pkg2 132 version: pkg2-version 133 fingerprint: pkg2-fp 134 stemcell: pkg2-stemcell 135 sha1: pkg2-sha 136- name: pkg1 137 version: pkg1-version 138 fingerprint: pkg1-fp 139 stemcell: pkg1-stemcell 140 sha1: pkg1-sha 141 dependencies: [pkg2] 142 143license: 144 version: lic-version 145 fingerprint: lic-fp 146 sha1: lic-sha 147`) 148 149 fs.WriteFileString("/release/license.tgz", "license") 150 151 job1 := boshjob.NewJob(NewExistingResource("job1", "job1-fp", "job1-sha")) 152 job2 := boshjob.NewJob(NewExistingResource("job2", "job2-fp", "job2-sha")) 153 154 compiledPkg1 := boshpkg.NewCompiledPackageWithoutArchive( 155 "pkg1", "pkg1-fp", "pkg1-stemcell", "pkg1-sha", []string{"pkg2"}) 156 compiledPkg2 := boshpkg.NewCompiledPackageWithoutArchive( 157 "pkg2", "pkg2-fp", "pkg2-stemcell", "pkg2-sha", nil) 158 compiledPkg1.AttachDependencies([]*boshpkg.CompiledPackage{compiledPkg2}) 159 160 lic := boshlic.NewLicense(NewExistingResource("license", "lic-fp", "lic-sha")) 161 162 release, err := act() 163 Expect(err).NotTo(HaveOccurred()) 164 165 Expect(release.Name()).To(Equal("release")) 166 Expect(release.Version()).To(Equal("version")) 167 Expect(release.CommitHashWithMark("*")).To(Equal("commit*")) 168 Expect(release.Jobs()).To(Equal([]*boshjob.Job{job1, job2})) 169 Expect(release.Packages()).To(BeEmpty()) 170 Expect(release.CompiledPackages()).To(Equal( 171 []*boshpkg.CompiledPackage{compiledPkg2, compiledPkg1})) 172 Expect(release.IsCompiled()).To(BeTrue()) 173 Expect(release.License()).To(Equal(lic)) 174 }) 175 176 It("returns error if compiled pkg's compiled pkg dependencies cannot be satisfied", func() { 177 fs.WriteFileString("/release.yml", `--- 178name: release 179version: version 180 181compiled_packages: 182- name: pkg1 183 version: pkg1-version 184 fingerprint: pkg1-fp 185 stemcell: pkg1-stemcell 186 sha1: pkg1-sha 187 dependencies: [pkg-with-other-name] 188`) 189 190 _, err := act() 191 Expect(err).To(HaveOccurred()) 192 Expect(err.Error()).To(ContainSubstring( 193 "Expected to find compiled package 'pkg-with-other-name' since it's a dependency of compiled package 'pkg1'")) 194 }) 195 }) 196 197 Context("when the release manifest is invalid", func() { 198 BeforeEach(func() { 199 fs.WriteFileString("/release.yml", "-") 200 }) 201 202 It("returns an error when the YAML in unparseable", func() { 203 _, err := act() 204 Expect(err).To(HaveOccurred()) 205 Expect(err.Error()).To(ContainSubstring("Parsing release manifest")) 206 }) 207 208 It("returns an error when the release manifest is missing", func() { 209 fs.RemoveAll("/release.yml") 210 211 _, err := act() 212 Expect(err).To(HaveOccurred()) 213 Expect(err.Error()).To(ContainSubstring("Reading manifest")) 214 }) 215 }) 216 }) 217}) 218