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  })