Browse code

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 authored on 2017/02/16 18:48:40
Showing 1 changed files
... ...
@@ -106,20 +106,29 @@ func (store *store) AddDigest(ref reference.Canonical, id digest.Digest, force b
106 106
 	return store.addReference(ref, id, force)
107 107
 }
108 108
 
109
-func (store *store) addReference(ref reference.Named, id digest.Digest, force bool) error {
109
+func favorDigest(originalRef reference.Named) (reference.Named, error) {
110
+	ref := originalRef
110 111
 	// If the reference includes a digest and a tag, we must store only the
111 112
 	// digest.
112
-	canonical, isCanonical := ref.(reference.Canonical)
113
-	_, isNamedTagged := ref.(reference.NamedTagged)
113
+	canonical, isCanonical := originalRef.(reference.Canonical)
114
+	_, isNamedTagged := originalRef.(reference.NamedTagged)
114 115
 
115 116
 	if isCanonical && isNamedTagged {
116 117
 		trimmed, err := reference.WithDigest(reference.TrimNamed(canonical), canonical.Digest())
117 118
 		if err != nil {
118 119
 			// should never happen
119
-			return err
120
+			return originalRef, err
120 121
 		}
121 122
 		ref = trimmed
122 123
 	}
124
+	return ref, nil
125
+}
126
+
127
+func (store *store) addReference(ref reference.Named, id digest.Digest, force bool) error {
128
+	ref, err := favorDigest(ref)
129
+	if err != nil {
130
+		return err
131
+	}
123 132
 
124 133
 	refName := reference.FamiliarName(ref)
125 134
 	refStr := reference.FamiliarString(ref)
... ...
@@ -169,6 +178,11 @@ func (store *store) addReference(ref reference.Named, id digest.Digest, force bo
169 169
 // Delete deletes a reference from the store. It returns true if a deletion
170 170
 // happened, or false otherwise.
171 171
 func (store *store) Delete(ref reference.Named) (bool, error) {
172
+	ref, err := favorDigest(ref)
173
+	if err != nil {
174
+		return false, err
175
+	}
176
+
172 177
 	ref = reference.TagNameOnly(ref)
173 178
 
174 179
 	refName := reference.FamiliarName(ref)