github.com/cloudfoundry-attic/ltc@v0.0.0-20151123212628-098adc7919fc/docker_runner/docker_repository_name_formatter/docker_repository_name_formatter_test.go (about) 1 package docker_repository_name_formatter_test 2 3 import ( 4 . "github.com/onsi/ginkgo" 5 . "github.com/onsi/gomega" 6 7 "github.com/cloudfoundry-incubator/ltc/docker_runner/docker_repository_name_formatter" 8 ) 9 10 var _ = Describe("DockerRepositoryNameFormatter", func() { 11 12 Describe("FormatForReceptor", func() { 13 Context("with a well-formed docker repo name", func() { 14 Context("with a fully qualified docker repo name", func() { 15 It("Formats it as a url that the receptor can use as a rootfs", func() { 16 formattedName, err := docker_repository_name_formatter.FormatForReceptor("jimbo/my-docker-app") 17 Expect(err).NotTo(HaveOccurred()) 18 Expect(formattedName).To(Equal("docker:///jimbo/my-docker-app#latest")) 19 }) 20 21 Context("when a tag is specified", func() { 22 It("Converts it to a tagged url that receptor can use as a rootfs", func() { 23 formattedName, err := docker_repository_name_formatter.FormatForReceptor("jimbo/my-docker-app:test") 24 Expect(err).NotTo(HaveOccurred()) 25 Expect(formattedName).To(Equal("docker:///jimbo/my-docker-app#test")) 26 }) 27 }) 28 }) 29 30 Context("with a shortened official docker repo name", func() { 31 It("Formats it as a url that the receptor can use as a rootfs", func() { 32 formattedName, err := docker_repository_name_formatter.FormatForReceptor("ubuntu") 33 Expect(err).NotTo(HaveOccurred()) 34 Expect(formattedName).To(Equal("docker:///library/ubuntu#latest")) 35 }) 36 37 It("Converts it to a tagged url that receptor can use as a rootfs", func() { 38 formattedName, err := docker_repository_name_formatter.FormatForReceptor("ubuntu:test") 39 Expect(err).NotTo(HaveOccurred()) 40 Expect(formattedName).To(Equal("docker:///library/ubuntu#test")) 41 }) 42 }) 43 44 Context("when the docker image reference uses docker.io as the index", func() { 45 It("returns the index name and remote name", func() { 46 formattedName, err := docker_repository_name_formatter.FormatForReceptor("docker.io/app-name") 47 Expect(err).ToNot(HaveOccurred()) 48 Expect(formattedName).To(Equal("docker://docker.io/library/app-name#latest")) 49 }) 50 }) 51 }) 52 53 Context("with a non-standard docker registry name", func() { 54 It("Converts it to a tagged url that receptor can use as a rootfs", func() { 55 formattedName, err := docker_repository_name_formatter.FormatForReceptor("docker.gocd.cf-app.com:5000/my-app") 56 Expect(err).NotTo(HaveOccurred()) 57 Expect(formattedName).To(Equal("docker://docker.gocd.cf-app.com:5000/my-app#latest")) 58 }) 59 60 Context("when a tag is specified", func() { 61 It("Converts it to a tagged url that receptor can use as a rootfs", func() { 62 formattedName, err := docker_repository_name_formatter.FormatForReceptor("docker.gocd.cf-app.com:5000/my-app:test") 63 Expect(err).NotTo(HaveOccurred()) 64 Expect(formattedName).To(Equal("docker://docker.gocd.cf-app.com:5000/my-app#test")) 65 }) 66 }) 67 }) 68 69 Context("when the repository name fails docker validation", func() { 70 Context("when the docker image reference contains the scheme", func() { 71 It("returns an error", func() { 72 _, err := docker_repository_name_formatter.FormatForReceptor("docker:///library/ubuntu") 73 Expect(err).To(MatchError("docker URI [docker:///library/ubuntu] should not contain scheme")) 74 }) 75 }) 76 77 It("returns an error for an invalid repository name", func() { 78 _, err := docker_repository_name_formatter.FormatForReceptor("¥¥¥¥¥suchabadname¥¥¥¥¥") 79 Expect(err).To(MatchError(ContainSubstring("repository name component must match"))) 80 }) 81 }) 82 }) 83 84 Describe("ParseRepoNameAndTagFromImageReference", func() { 85 Context("with a well-formed docker repo name", func() { 86 Context("with a shortened official docker repo name", func() { 87 It("parses the repo and tag from a docker image reference", func() { 88 indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("my-docker-app:test") 89 Expect(err).NotTo(HaveOccurred()) 90 Expect(indexName).To(BeEmpty()) 91 Expect(remoteName).To(Equal("library/my-docker-app")) 92 Expect(tag).To(Equal("test")) 93 }) 94 95 It("parses the repo and defaults tag to latest for docker image reference without a tag", func() { 96 indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("my-docker-app") 97 Expect(err).NotTo(HaveOccurred()) 98 Expect(indexName).To(BeEmpty()) 99 Expect(remoteName).To(Equal("library/my-docker-app")) 100 Expect(tag).To(Equal("latest")) 101 }) 102 }) 103 104 Context("with a fully qualified docker repo name", func() { 105 It("parses the repo and tag from a docker image reference", func() { 106 indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("jimbo/my-docker-app:test") 107 Expect(err).NotTo(HaveOccurred()) 108 Expect(indexName).To(BeEmpty()) 109 Expect(remoteName).To(Equal("jimbo/my-docker-app")) 110 Expect(tag).To(Equal("test")) 111 }) 112 113 It("parses the repo and defaults tag to latest for docker image reference without a tag", func() { 114 indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("jimbo/my-docker-app") 115 Expect(err).NotTo(HaveOccurred()) 116 Expect(indexName).To(BeEmpty()) 117 Expect(remoteName).To(Equal("jimbo/my-docker-app")) 118 Expect(tag).To(Equal("latest")) 119 }) 120 }) 121 122 Context("when the docker image reference uses docker.io as the index", func() { 123 It("returns the index name, remote name, and tag", func() { 124 indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("docker.io/app-name") 125 Expect(err).NotTo(HaveOccurred()) 126 Expect(indexName).To(Equal("docker.io")) 127 Expect(remoteName).To(Equal("library/app-name")) 128 Expect(tag).To(Equal("latest")) 129 }) 130 }) 131 }) 132 133 Context("with a non-standard docker registry name", func() { 134 It("Converts it to a tagged url that receptor can use as a rootfs", func() { 135 indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("docker.gocd.cf-app.com:5000/my-app") 136 Expect(err).NotTo(HaveOccurred()) 137 Expect(indexName).To(Equal("docker.gocd.cf-app.com:5000")) 138 Expect(remoteName).To(Equal("my-app")) 139 Expect(tag).To(Equal("latest")) 140 }) 141 142 Context("when a tag is specified", func() { 143 It("Converts it to a tagged url that receptor can use as a rootfs", func() { 144 indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("docker.gocd.cf-app.com:5000/my-app:test") 145 Expect(err).NotTo(HaveOccurred()) 146 Expect(indexName).To(Equal("docker.gocd.cf-app.com:5000")) 147 Expect(remoteName).To(Equal("my-app")) 148 Expect(tag).To(Equal("test")) 149 }) 150 }) 151 }) 152 153 Context("when the repository name fails docker validation", func() { 154 It("returns an error for an invalid repository name", func() { 155 _, _, _, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("¥¥¥¥¥suchabadname¥¥¥¥¥") 156 Expect(err).To(MatchError(ContainSubstring("repository name component must match"))) 157 }) 158 }) 159 }) 160 })