mirror of https://github.com/containers/image.git
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:
parent
0cf04c4adf
commit
aaadde2550
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
Loading…
Reference in New Issue