Skip to content

Commit 413e952

Browse files
author
Michal Minář
committed
fix: preserve images when all its blobs are intact
Signed-off-by: Michal Minář <[email protected]>
1 parent 39bffa5 commit 413e952

File tree

2 files changed

+52
-9
lines changed

2 files changed

+52
-9
lines changed

pkg/oc/admin/prune/imageprune/prune_test.go

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package imageprune
22

33
import (
44
"bytes"
5+
"errors"
56
"flag"
67
"fmt"
78
"io/ioutil"
@@ -73,7 +74,7 @@ func TestImagePruning(t *testing.T) {
7374
imageStreamDeleterErr error
7475
layerDeleterErr error
7576
manifestDeleterErr error
76-
blobDeleterErr error
77+
blobDeleterErrorGetter errorForSHA
7778
expectedImageDeletions []string
7879
expectedStreamUpdates []string
7980
expectedLayerLinkDeletions []string
@@ -406,7 +407,7 @@ func TestImagePruning(t *testing.T) {
406407
testutil.UnmanagedImage("sha256:0000000000000000000000000000000000000000000000000000000000000000", "otherregistry/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000000", false, "", ""),
407408
testutil.Image("sha256:0000000000000000000000000000000000000000000000000000000000000002", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000002"),
408409
testutil.Image("sha256:0000000000000000000000000000000000000000000000000000000000000003", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000003"),
409-
testutil.Image("sha256:0000000000000000000000000000000000000000000000000000000000000004", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000004"),
410+
testutil.ImageWithLayers("sha256:0000000000000000000000000000000000000000000000000000000000000004", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000004", nil, "layer1", "layer2"),
410411
),
411412
streams: testutil.StreamList(
412413
testutil.Stream(registryHost, "foo", "bar", testutil.Tags(
@@ -418,12 +419,49 @@ func TestImagePruning(t *testing.T) {
418419
),
419420
)),
420421
),
421-
blobDeleterErr: fmt.Errorf("err"),
422+
blobDeleterErrorGetter: func(dgst string) error {
423+
if dgst == "layer1" {
424+
return errors.New("err")
425+
}
426+
return nil
427+
},
422428
expectedImageDeletions: []string{"sha256:0000000000000000000000000000000000000000000000000000000000000004"},
423429
expectedStreamUpdates: []string{"foo/bar|sha256:0000000000000000000000000000000000000000000000000000000000000004"},
424430
expectedManifestLinkDeletions: []string{registryURL + "|foo/bar|sha256:0000000000000000000000000000000000000000000000000000000000000004"},
425-
expectedBlobDeletions: []string{registryURL + "|" + "sha256:0000000000000000000000000000000000000000000000000000000000000004"},
426-
expectedFailures: []string{registryURL + "|" + "sha256:0000000000000000000000000000000000000000000000000000000000000004|err"},
431+
expectedLayerLinkDeletions: []string{registryURL + "|foo/bar|layer1", registryURL + "|foo/bar|layer2"},
432+
expectedBlobDeletions: []string{
433+
registryURL + "|" + "layer1",
434+
registryURL + "|" + "layer2",
435+
registryURL + "|" + "sha256:0000000000000000000000000000000000000000000000000000000000000004",
436+
},
437+
expectedFailures: []string{registryURL + "|" + "layer1|err"},
438+
},
439+
440+
{
441+
name: "keep image when all blob deletions fail",
442+
images: testutil.ImageList(
443+
testutil.UnmanagedImage("sha256:0000000000000000000000000000000000000000000000000000000000000000", "otherregistry/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000000", false, "", ""),
444+
testutil.Image("sha256:0000000000000000000000000000000000000000000000000000000000000002", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000002"),
445+
testutil.Image("sha256:0000000000000000000000000000000000000000000000000000000000000003", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000003"),
446+
testutil.ImageWithLayers("sha256:0000000000000000000000000000000000000000000000000000000000000004", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000004", nil, "layer1", "layer2"),
447+
),
448+
streams: testutil.StreamList(
449+
testutil.Stream(registryHost, "foo", "bar", testutil.Tags(
450+
testutil.Tag("latest",
451+
testutil.TagEvent("sha256:0000000000000000000000000000000000000000000000000000000000000000", "otherregistry/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000000"),
452+
testutil.TagEvent("sha256:0000000000000000000000000000000000000000000000000000000000000002", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000002"),
453+
testutil.TagEvent("sha256:0000000000000000000000000000000000000000000000000000000000000003", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000003"),
454+
testutil.TagEvent("sha256:0000000000000000000000000000000000000000000000000000000000000004", registryHost+"/foo/bar@sha256:0000000000000000000000000000000000000000000000000000000000000004"),
455+
),
456+
)),
457+
),
458+
blobDeleterErrorGetter: func(dgst string) error { return errors.New("err") },
459+
expectedImageDeletions: []string{},
460+
expectedStreamUpdates: []string{"foo/bar|sha256:0000000000000000000000000000000000000000000000000000000000000004"},
461+
expectedManifestLinkDeletions: []string{registryURL + "|foo/bar|sha256:0000000000000000000000000000000000000000000000000000000000000004"},
462+
expectedLayerLinkDeletions: []string{registryURL + "|foo/bar|layer1", registryURL + "|foo/bar|layer2"},
463+
expectedBlobDeletions: []string{registryURL + "|layer1", registryURL + "|layer2", registryURL + "|" + "sha256:0000000000000000000000000000000000000000000000000000000000000004"},
464+
expectedFailures: []string{registryURL + "|" + "layer1|err", registryURL + "|" + "layer2|err", registryURL + "|sha256:0000000000000000000000000000000000000000000000000000000000000004|err"},
427465
},
428466

429467
{
@@ -1195,7 +1233,7 @@ func TestImagePruning(t *testing.T) {
11951233
imageDeleter, imageDeleterFactory := newFakeImageDeleter(test.imageDeleterErr)
11961234
streamDeleter := &fakeImageStreamDeleter{err: test.imageStreamDeleterErr, invocations: sets.NewString()}
11971235
layerLinkDeleter := &fakeLayerLinkDeleter{err: test.layerDeleterErr, invocations: sets.NewString()}
1198-
blobDeleter := &fakeBlobDeleter{err: test.blobDeleterErr, invocations: sets.NewString()}
1236+
blobDeleter := &fakeBlobDeleter{getError: test.blobDeleterErrorGetter, invocations: sets.NewString()}
11991237
manifestDeleter := &fakeManifestDeleter{err: test.manifestDeleterErr, invocations: sets.NewString()}
12001238

12011239
deletions, failures := p.Prune(imageDeleterFactory, streamDeleter, layerLinkDeleter, blobDeleter, manifestDeleter)
@@ -2166,10 +2204,12 @@ func (p *fakeImageStreamDeleter) NotifyImageStreamPrune(stream *imageapi.ImageSt
21662204
return
21672205
}
21682206

2207+
type errorForSHA func(dgst string) error
2208+
21692209
type fakeBlobDeleter struct {
21702210
mutex sync.Mutex
21712211
invocations sets.String
2172-
err error
2212+
getError errorForSHA
21732213
}
21742214

21752215
var _ BlobDeleter = &fakeBlobDeleter{}
@@ -2178,7 +2218,10 @@ func (p *fakeBlobDeleter) DeleteBlob(registryClient *http.Client, registryURL *u
21782218
p.mutex.Lock()
21792219
defer p.mutex.Unlock()
21802220
p.invocations.Insert(fmt.Sprintf("%s|%s", registryURL.String(), blob))
2181-
return p.err
2221+
if p.getError == nil {
2222+
return nil
2223+
}
2224+
return p.getError(blob)
21822225
}
21832226

21842227
type fakeLayerLinkDeleter struct {

pkg/oc/admin/prune/imageprune/worker.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ func (w *worker) prune(job *Job) *JobResult {
237237
w.layerLinkPruner,
238238
))
239239

240-
blobDeletions, blobFailures := pruneBlobs(
240+
blobDeletions, blobFailures = pruneBlobs(
241241
w.registryClient,
242242
w.registryURL,
243243
job.Components,

0 commit comments

Comments
 (0)