Move tagOrDigest to dockerReference

This improves the dockerReference encapsulation, and makes it more clear
that the reference.IsNameOnly case can not happen.

Signed-off-by: Miloslav Trmač <mitr@redhat.com>
This commit is contained in:
Miloslav Trmač 2016-07-12 16:01:48 +02:00
parent 0cf04c4adf
commit aaadde2550
4 changed files with 36 additions and 20 deletions

View File

@ -59,7 +59,7 @@ func simplifyContentType(contentType string) string {
}
func (s *dockerImageSource) GetManifest(mimetypes []string) ([]byte, string, error) {
reference, err := tagOrDigest(s.ref.ref)
reference, err := s.ref.tagOrDigest()
if err != nil {
return nil, "", err
}
@ -114,7 +114,7 @@ func (s *dockerImageSource) Delete() error {
headers := make(map[string][]string)
headers["Accept"] = []string{manifest.DockerV2Schema2MIMEType}
reference, err := tagOrDigest(s.ref.ref)
reference, err := s.ref.tagOrDigest()
if err != nil {
return err
}

View File

@ -129,3 +129,15 @@ func (ref dockerReference) NewImageSource(certPath string, tlsVerify bool) (type
func (ref dockerReference) NewImageDestination(certPath string, tlsVerify bool) (types.ImageDestination, error) {
return newImageDestination(ref, certPath, tlsVerify)
}
// tagOrDigest returns a tag or digest from the reference.
func (ref dockerReference) tagOrDigest() (string, error) {
if ref, ok := ref.ref.(reference.Canonical); ok {
return ref.Digest().String(), nil
}
if ref, ok := ref.ref.(reference.NamedTagged); ok {
return ref.Tag(), nil
}
// This should not happen, NewReference above refuses reference.IsNameOnly values.
return "", fmt.Errorf("Internal inconsistency: Reference %s unexpectedly has neither a digest nor a tag", ref.ref.String())
}

View File

@ -177,3 +177,25 @@ func TestReferenceNewImageDestination(t *testing.T) {
_, err = ref.NewImageDestination("", true)
assert.NoError(t, err)
}
func TestReferenceTagOrDigest(t *testing.T) {
for input, expected := range map[string]string{
"//busybox:notlatest": "notlatest",
"//busybox" + sha256digest: "sha256:" + sha256digestHex,
} {
ref, err := ParseReference(input)
require.NoError(t, err, input)
dockerRef, ok := ref.(dockerReference)
require.True(t, ok, input)
tod, err := dockerRef.tagOrDigest()
require.NoError(t, err, input)
assert.Equal(t, expected, tod, input)
}
// Invalid input
ref, err := reference.ParseNamed("busybox")
require.NoError(t, err)
dockerRef := dockerReference{ref: ref}
_, err = dockerRef.tagOrDigest()
assert.Error(t, err)
}

View File

@ -1,18 +0,0 @@
package docker
import (
"fmt"
"github.com/docker/docker/reference"
)
// tagOrDigest returns a tag or digest from a reference for which !reference.IsNameOnly.
func tagOrDigest(ref reference.Named) (string, error) {
if ref, ok := ref.(reference.Canonical); ok {
return ref.Digest().String(), nil
}
if ref, ok := ref.(reference.NamedTagged); ok {
return ref.Tag(), nil
}
return "", fmt.Errorf("Internal inconsistency: Reference %s unexpectedly has neither a digest nor a tag", ref.String())
}