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