diff --git a/libimage/corrupted_test.go b/libimage/corrupted_test.go index e683c1fa3..614072837 100644 --- a/libimage/corrupted_test.go +++ b/libimage/corrupted_test.go @@ -14,7 +14,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestCorruptedImage(t *testing.T) { +func TestCorruptedLayers(t *testing.T) { // Regression tests for https://bugzilla.redhat.com/show_bug.cgi?id=1966872. runtime, cleanup := testNewRuntime(t) defer cleanup() @@ -41,6 +41,10 @@ func TestCorruptedImage(t *testing.T) { require.NoError(t, err, "healthy image exists") require.True(t, exists, "healthy image exists") + // Disk usage works. + _, err = runtime.DiskUsage(ctx) + require.NoError(t, err, "disk usage works on healthy image") + // Now remove one layer from the layers.json index in the storage. The // image will still be listed in the container storage but attempting // to use it will yield "layer not known" errors. @@ -71,6 +75,11 @@ func TestCorruptedImage(t *testing.T) { require.NoError(t, err, "corrupted image exists should not fail") require.False(t, exists, "corrupted image should not be marked to exist") + // Disk usage does not work. + _, err = runtime.DiskUsage(ctx) + require.Error(t, err, "disk usage does not work on corrupted image") + require.Contains(t, err.Error(), "exists in local storage but may be corrupted", "disk usage reports corrupted image") + // Now make sure that pull will detect the corrupted image and repulls // if needed which will repair the data corruption. pulledImages, err = runtime.Pull(ctx, imageName, config.PullPolicyNewer, pullOptions) diff --git a/libimage/disk_usage.go b/libimage/disk_usage.go index edfd095a0..2cde09846 100644 --- a/libimage/disk_usage.go +++ b/libimage/disk_usage.go @@ -52,6 +52,10 @@ func (r *Runtime) DiskUsage(ctx context.Context) ([]ImageDiskUsage, error) { // diskUsageForImage returns the disk-usage baseistics for the specified image. func diskUsageForImage(ctx context.Context, image *Image, tree *layerTree) ([]ImageDiskUsage, error) { + if err := image.isCorrupted(""); err != nil { + return nil, err + } + base := ImageDiskUsage{ ID: image.ID(), Created: image.Created(), diff --git a/libimage/image.go b/libimage/image.go index b4623a870..ff7d546e9 100644 --- a/libimage/image.go +++ b/libimage/image.go @@ -74,7 +74,10 @@ func (i *Image) isCorrupted(name string) error { } if _, err := ref.NewImage(context.Background(), nil); err != nil { - return errors.Errorf("Image %s exists in local storage but may be corrupted: %v", name, err) + if name == "" { + name = i.ID()[:12] + } + return errors.Errorf("Image %s exists in local storage but may be corrupted (remove the image to resolve the issue): %v", name, err) } return nil }