podman/libpod/image/parts.go
Daniel J Walsh a917f8fa2a We are mistakenly seeing repos as registries.
Currently `podman pull rhel7/rhel-tools` is failing because it
sees rhel7 as a registry.  This change will verify that the returned
registry from the parser is actually a registry and not a repo,
if a repo it will return the correct content, and we will pull the image.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>

Closes: #1387
Approved by: mtrmac
2018-08-31 18:02:14 +00:00

80 lines
1.8 KiB
Go

package image
import (
"fmt"
"strings"
"github.com/containers/image/docker/reference"
)
// imageParts describes the parts of an image's name
type imageParts struct {
transport string
registry string
name string
tag string
isTagged bool
hasRegistry bool
}
// Registries must contain a ":" or a "." or be localhost
func isRegistry(name string) bool {
return strings.ContainsAny(name, ".:") || name == "localhost"
}
// decompose breaks an input name into an imageParts description
func decompose(input string) (imageParts, error) {
var (
parts imageParts
hasRegistry bool
tag string
)
imgRef, err := reference.Parse(input)
if err != nil {
return parts, err
}
ntag, isTagged := imgRef.(reference.NamedTagged)
if !isTagged {
tag = "latest"
if _, hasDigest := imgRef.(reference.Digested); hasDigest {
tag = "none"
}
} else {
tag = ntag.Tag()
}
registry := reference.Domain(imgRef.(reference.Named))
imageName := reference.Path(imgRef.(reference.Named))
// Is this a registry or a repo?
if isRegistry(registry) {
hasRegistry = true
} else {
if registry != "" {
imageName = registry + "/" + imageName
registry = ""
}
}
return imageParts{
registry: registry,
hasRegistry: hasRegistry,
name: imageName,
tag: tag,
isTagged: isTagged,
transport: DefaultTransport,
}, nil
}
// assemble concatenates an image's parts into a string
func (ip *imageParts) assemble() string {
spec := fmt.Sprintf("%s:%s", ip.name, ip.tag)
if ip.registry != "" {
spec = fmt.Sprintf("%s/%s", ip.registry, spec)
}
return spec
}
// assemble concatenates an image's parts with transport into a string
func (ip *imageParts) assembleWithTransport() string {
return fmt.Sprintf("%s%s", ip.transport, ip.assemble())
}