func (fetcher *dockerMetadataFetcher) FetchMetadata(dockerPath string) (*ImageMetadata, error) { indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference(dockerPath) if err != nil { return nil, err } var reposName string if len(indexName) > 0 { reposName = fmt.Sprintf("%s/%s", indexName, remoteName) } else { reposName = remoteName } var session DockerSession if session, err = fetcher.dockerSessionFactory.MakeSession(reposName, false); err != nil { if !strings.Contains(err.Error(), "this private registry supports only HTTP or HTTPS with an unknown CA certificate") { return nil, err } session, err = fetcher.dockerSessionFactory.MakeSession(reposName, true) if err != nil { return nil, err } } repoData, err := session.GetRepositoryData(remoteName) if err != nil { return nil, err } tagsList, err := session.GetRemoteTags(repoData.Endpoints, remoteName, repoData.Tokens) if err != nil { return nil, err } imgID, ok := tagsList[tag] if !ok { return nil, fmt.Errorf("Unknown tag: %s:%s", remoteName, tag) } var img *image.Image endpoint := repoData.Endpoints[0] imgJSON, _, err := session.GetRemoteImageJSON(imgID, endpoint, repoData.Tokens) if err != nil { return nil, err } img, err = image.NewImgJSON(imgJSON) if err != nil { return nil, fmt.Errorf("Error parsing remote image json for specified docker image:\n%s", err) } if img.Config == nil { return nil, fmt.Errorf("Parsing start command failed") } startCommand := append(img.Config.Entrypoint, img.Config.Cmd...) exposedPorts := sortPorts(img.ContainerConfig.ExposedPorts) return &ImageMetadata{ WorkingDir: img.Config.WorkingDir, User: img.Config.User, StartCommand: startCommand, ExposedPorts: exposedPorts, Env: img.Config.Env, }, nil }
_, err := docker_repository_name_formatter.FormatForReceptor("¥¥¥¥¥suchabadname¥¥¥¥¥") Expect(err).To(MatchError("Invalid repository name (¥¥¥¥¥suchabadname¥¥¥¥¥), only [a-z0-9-_.] are allowed")) }) It("returns an error for an invalid namespace name", func() { _, err := docker_repository_name_formatter.FormatForReceptor("jim/my-docker-app") Expect(err).To(MatchError("Invalid namespace name (jim). Cannot be fewer than 4 or more than 30 characters.")) }) }) }) Describe("ParseRepoNameAndTagFromImageReference", func() { Context("with a well-formed docker repo name", func() { Context("with a shortened official docker repo name", func() { It("parses the repo and tag from a docker image reference", func() { indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("my-docker-app:test") Expect(err).NotTo(HaveOccurred()) Expect(indexName).To(BeEmpty()) Expect(remoteName).To(Equal("library/my-docker-app")) Expect(tag).To(Equal("test")) }) It("parses the repo and defaults tag to latest for docker image reference without a tag", func() { indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("my-docker-app") Expect(err).NotTo(HaveOccurred()) Expect(indexName).To(BeEmpty()) Expect(remoteName).To(Equal("library/my-docker-app")) Expect(tag).To(Equal("latest")) }) })