Jelajahi Sumber

reference: handle combination of tag and digest in ImageDelete

If you remove an image with digest+tag, it will fail because it wont
find it in the reference store (where digest+tag -> digest). Let's
make sure we do the same in ImageDelete, stripping the tag if
digest+tag are present.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Vincent Demeester 8 tahun lalu
induk
melakukan
0fbfeb17e5
1 mengubah file dengan 18 tambahan dan 4 penghapusan
  1. 18 4
      reference/store.go

+ 18 - 4
reference/store.go

@@ -106,20 +106,29 @@ func (store *store) AddDigest(ref reference.Canonical, id digest.Digest, force b
 	return store.addReference(ref, id, force)
 	return store.addReference(ref, id, force)
 }
 }
 
 
-func (store *store) addReference(ref reference.Named, id digest.Digest, force bool) error {
+func favorDigest(originalRef reference.Named) (reference.Named, error) {
+	ref := originalRef
 	// If the reference includes a digest and a tag, we must store only the
 	// If the reference includes a digest and a tag, we must store only the
 	// digest.
 	// digest.
-	canonical, isCanonical := ref.(reference.Canonical)
-	_, isNamedTagged := ref.(reference.NamedTagged)
+	canonical, isCanonical := originalRef.(reference.Canonical)
+	_, isNamedTagged := originalRef.(reference.NamedTagged)
 
 
 	if isCanonical && isNamedTagged {
 	if isCanonical && isNamedTagged {
 		trimmed, err := reference.WithDigest(reference.TrimNamed(canonical), canonical.Digest())
 		trimmed, err := reference.WithDigest(reference.TrimNamed(canonical), canonical.Digest())
 		if err != nil {
 		if err != nil {
 			// should never happen
 			// should never happen
-			return err
+			return originalRef, err
 		}
 		}
 		ref = trimmed
 		ref = trimmed
 	}
 	}
+	return ref, nil
+}
+
+func (store *store) addReference(ref reference.Named, id digest.Digest, force bool) error {
+	ref, err := favorDigest(ref)
+	if err != nil {
+		return err
+	}
 
 
 	refName := reference.FamiliarName(ref)
 	refName := reference.FamiliarName(ref)
 	refStr := reference.FamiliarString(ref)
 	refStr := reference.FamiliarString(ref)
@@ -169,6 +178,11 @@ func (store *store) addReference(ref reference.Named, id digest.Digest, force bo
 // Delete deletes a reference from the store. It returns true if a deletion
 // Delete deletes a reference from the store. It returns true if a deletion
 // happened, or false otherwise.
 // happened, or false otherwise.
 func (store *store) Delete(ref reference.Named) (bool, error) {
 func (store *store) Delete(ref reference.Named) (bool, error) {
+	ref, err := favorDigest(ref)
+	if err != nil {
+		return false, err
+	}
+
 	ref = reference.TagNameOnly(ref)
 	ref = reference.TagNameOnly(ref)
 
 
 	refName := reference.FamiliarName(ref)
 	refName := reference.FamiliarName(ref)