From ea643e86588ee122fe8667da1fc6335f42d1f20e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20Trma=C4=8D?= Date: Thu, 26 May 2016 23:04:35 +0200 Subject: [PATCH] Use types.ImageSource instead of *dockerImageSource in genericImage This finally makes genericImage Docker-independent. (dockerImage is still the only implementation of types.Image.) --- docker/docker_image.go | 25 ++++++++++++++++++++----- docker/image.go | 5 +++-- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/docker/docker_image.go b/docker/docker_image.go index 53528875..b2134f41 100644 --- a/docker/docker_image.go +++ b/docker/docker_image.go @@ -24,17 +24,32 @@ func NewDockerImage(img, certPath string, tlsVerify bool) (types.Image, error) { return &Image{genericImage{src: s}}, nil } +// By construction a, docker.Image.genericImage.src must be a dockerImageSource. +// dockerSource returns it. +func (i *Image) dockerSource() (*dockerImageSource, error) { + if src, ok := i.genericImage.src.(*dockerImageSource); ok { + return src, nil + } + return nil, fmt.Errorf("Unexpected internal inconsistency, docker.Image not based on dockerImageSource") +} + // SourceRefFullName returns a fully expanded name for the repository this image is in. func (i *Image) SourceRefFullName() (string, error) { - // FIXME? Breaking the abstraction. - return i.genericImage.src.ref.FullName(), nil + src, err := i.dockerSource() + if err != nil { + return "", err + } + return src.ref.FullName(), nil } // GetRepositoryTags list all tags available in the repository. Note that this has no connection with the tag(s) used for this specific image, if any. func (i *Image) GetRepositoryTags() ([]string, error) { - // FIXME? Breaking the abstraction. - url := fmt.Sprintf(tagsURL, i.genericImage.src.ref.RemoteName()) - res, err := i.genericImage.src.c.makeRequest("GET", url, nil, nil) + src, err := i.dockerSource() + if err != nil { + return nil, err + } + url := fmt.Sprintf(tagsURL, src.ref.RemoteName()) + res, err := src.c.makeRequest("GET", url, nil, nil) if err != nil { return nil, err } diff --git a/docker/image.go b/docker/image.go index eb37fde4..621fee39 100644 --- a/docker/image.go +++ b/docker/image.go @@ -18,9 +18,10 @@ var ( validHex = regexp.MustCompile(`^([a-f0-9]{64})$`) ) -// genericImage is a general set of utilities for working with container images. +// genericImage is a general set of utilities for working with container images, +// whatever is their underlying location (i.e. dockerImageSource-independent). type genericImage struct { - src *dockerImageSource + src types.ImageSource cachedManifest []byte // Private cache for Manifest(); nil if not yet known. cachedSignatures [][]byte // Private cache for Signatures(); nil if not yet known. }