1package integration_test 2 3import ( 4 . "github.com/onsi/ginkgo" 5 . "github.com/onsi/gomega" 6 7 . "github.com/cloudfoundry/bosh-cli/cmd" 8 boshrel "github.com/cloudfoundry/bosh-cli/release" 9 boshui "github.com/cloudfoundry/bosh-cli/ui" 10 fakeui "github.com/cloudfoundry/bosh-cli/ui/fakes" 11 boshlog "github.com/cloudfoundry/bosh-utils/logger" 12 boshsys "github.com/cloudfoundry/bosh-utils/system" 13 "path/filepath" 14 "regexp" 15 "strings" 16) 17 18var _ = Describe("sha2ify-release", func() { 19 20 var ( 21 ui *fakeui.FakeUI 22 fs boshsys.FileSystem 23 deps BasicDeps 24 cmdFactory Factory 25 releaseProvider boshrel.Provider 26 createSimpleRelease func() string 27 removeSHA1s func(string) string 28 ) 29 30 BeforeEach(func() { 31 ui = &fakeui.FakeUI{} 32 logger := boshlog.NewLogger(boshlog.LevelNone) 33 confUI := boshui.NewWrappingConfUI(ui, logger) 34 35 fs = boshsys.NewOsFileSystem(logger) 36 deps = NewBasicDepsWithFS(confUI, fs, logger) 37 cmdFactory = NewFactory(deps) 38 39 releaseProvider = boshrel.NewProvider( 40 deps.CmdRunner, deps.Compressor, deps.DigestCalculator, deps.FS, deps.Logger) 41 42 }) 43 44 execCmd := func(args []string) { 45 cmd, err := cmdFactory.New(args) 46 Expect(err).ToNot(HaveOccurred()) 47 48 err = cmd.Execute() 49 50 Expect(err).ToNot(HaveOccurred()) 51 52 } 53 54 It("converts the SHA1s into SHA2s for packages and jobs", func() { 55 sha2ifyReleasePath := createSimpleRelease() 56 defer fs.RemoveAll(filepath.Dir(sha2ifyReleasePath)) 57 58 dirtyPath, err := fs.TempDir("sha2release") 59 Expect(err).ToNot(HaveOccurred()) 60 61 outFile := filepath.Join(dirtyPath, "small-sha256-release.tgz") 62 63 execCmd([]string{"sha2ify-release", sha2ifyReleasePath, outFile}) 64 65 extractor := releaseProvider.NewExtractingArchiveReader() 66 67 release, err := extractor.Read(outFile) 68 Expect(err).ToNot(HaveOccurred()) 69 70 By("keeping all the jobs and packages") 71 Expect(release.Jobs()).To(HaveLen(1)) 72 Expect(release.Packages()).To(HaveLen(1)) 73 Expect(release.License()).ToNot(BeNil()) 74 75 By("converting the SHAs to 256") 76 jobArchiveSha := release.Jobs()[0].ArchiveDigest() 77 Expect(removeSHA1s(jobArchiveSha)).To(Equal("sha256:replaced")) 78 79 packageArchiveSha := release.Packages()[0].ArchiveDigest() 80 Expect(removeSHA1s(packageArchiveSha)).To(Equal("sha256:replaced")) 81 82 licenseArchiveSha := release.License().ArchiveDigest() 83 Expect(removeSHA1s(licenseArchiveSha)).To(Equal("sha256:replaced")) 84 85 By("preserving the version string exactly") 86 Expect(release.Version()).To(Equal("0+dev.1")) 87 }) 88 89 It("converts the SHA1s into SHA2s for packages and jobs", func() { 90 dirtyPath, err := fs.TempDir("sha2release") 91 Expect(err).ToNot(HaveOccurred()) 92 93 outFile := filepath.Join(dirtyPath, "small-sha256-release.tgz") 94 95 execCmd([]string{"sha2ify-release", "assets/small-sha128-compiled-release.tgz", outFile}) 96 97 extractor := releaseProvider.NewExtractingArchiveReader() 98 99 release, err := extractor.Read(outFile) 100 Expect(err).ToNot(HaveOccurred()) 101 102 By("keeping all the jobs and packages") 103 Expect(release.Jobs()).To(HaveLen(1)) 104 Expect(release.CompiledPackages()).To(HaveLen(1)) 105 106 By("converting the SHAs to 256") 107 jobArchiveSha := release.Jobs()[0].ArchiveDigest() 108 Expect(removeSHA1s(jobArchiveSha)).To(Equal("sha256:replaced")) 109 compiledPackageSha := release.CompiledPackages()[0].ArchiveDigest() 110 Expect(removeSHA1s(compiledPackageSha)).To(Equal("sha256:replaced")) 111 112 By("preserving the version string exactly") 113 Expect(release.Version()).To(Equal("0+dev.3")) 114 }) 115 116 removeSHA1s = func(contents string) string { 117 matchSHA1s := regexp.MustCompile("sha256:[a-z0-9]{64}") 118 return matchSHA1s.ReplaceAllString(contents, "sha256:replaced") 119 } 120 121 createSimpleRelease = func() string { 122 tmpDir, err := fs.TempDir("bosh-create-release-int-test") 123 Expect(err).ToNot(HaveOccurred()) 124 125 relName := filepath.Base(tmpDir) 126 127 { 128 execCmd([]string{"init-release", "--dir", tmpDir}) 129 Expect(fs.FileExists(filepath.Join(tmpDir, "config"))).To(BeTrue()) 130 Expect(fs.FileExists(filepath.Join(tmpDir, "jobs"))).To(BeTrue()) 131 Expect(fs.FileExists(filepath.Join(tmpDir, "packages"))).To(BeTrue()) 132 Expect(fs.FileExists(filepath.Join(tmpDir, "src"))).To(BeTrue()) 133 } 134 135 execCmd([]string{"generate-job", "job1", "--dir", tmpDir}) 136 execCmd([]string{"generate-package", "pkg1", "--dir", tmpDir}) 137 138 err = fs.WriteFileString(filepath.Join(tmpDir, "LICENSE"), "LICENSE") 139 Expect(err).ToNot(HaveOccurred()) 140 141 { 142 pkg1SpecPath := filepath.Join(tmpDir, "packages", "pkg1", "spec") 143 144 contents, err := fs.ReadFileString(pkg1SpecPath) 145 Expect(err).ToNot(HaveOccurred()) 146 147 err = fs.WriteFileString(pkg1SpecPath, strings.Replace(contents, "dependencies: []", "dependencies: []", -1)) 148 Expect(err).ToNot(HaveOccurred()) 149 } 150 151 { 152 jobSpecPath := filepath.Join(tmpDir, "jobs", "job1", "spec") 153 154 contents, err := fs.ReadFileString(jobSpecPath) 155 Expect(err).ToNot(HaveOccurred()) 156 157 err = fs.WriteFileString(jobSpecPath, strings.Replace(contents, "packages: []", "packages: [pkg1]", -1)) 158 Expect(err).ToNot(HaveOccurred()) 159 } 160 161 sha2ifyReleasePath := filepath.Join(tmpDir, "sha2ify-release.tgz") 162 163 { // Make empty release 164 execCmd([]string{"create-release", "--dir", tmpDir, "--tarball", sha2ifyReleasePath}) 165 166 _, err := fs.ReadFileString(filepath.Join(tmpDir, "dev_releases", relName, relName+"-0+dev.1.yml")) 167 Expect(err).ToNot(HaveOccurred()) 168 } 169 170 return sha2ifyReleasePath 171 } 172}) 173