github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/integration/image/remove_test.go (about) 1 package image // import "github.com/Prakhar-Agarwal-byte/moby/integration/image" 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/Prakhar-Agarwal-byte/moby/api/types" 8 containertypes "github.com/Prakhar-Agarwal-byte/moby/api/types/container" 9 "github.com/Prakhar-Agarwal-byte/moby/errdefs" 10 "github.com/Prakhar-Agarwal-byte/moby/integration/internal/container" 11 "gotest.tools/v3/assert" 12 is "gotest.tools/v3/assert/cmp" 13 "gotest.tools/v3/skip" 14 ) 15 16 func TestRemoveImageOrphaning(t *testing.T) { 17 ctx := setupTest(t) 18 19 client := testEnv.APIClient() 20 21 imgName := strings.ToLower(t.Name()) 22 23 // Create a container from busybox, and commit a small change so we have a new image 24 cID1 := container.Create(ctx, t, client, container.WithCmd("")) 25 commitResp1, err := client.ContainerCommit(ctx, cID1, containertypes.CommitOptions{ 26 Changes: []string{`ENTRYPOINT ["true"]`}, 27 Reference: imgName, 28 }) 29 assert.NilError(t, err) 30 31 // verifies that reference now points to first image 32 resp, _, err := client.ImageInspectWithRaw(ctx, imgName) 33 assert.NilError(t, err) 34 assert.Check(t, is.Equal(resp.ID, commitResp1.ID)) 35 36 // Create a container from created image, and commit a small change with same reference name 37 cID2 := container.Create(ctx, t, client, container.WithImage(imgName), container.WithCmd("")) 38 commitResp2, err := client.ContainerCommit(ctx, cID2, containertypes.CommitOptions{ 39 Changes: []string{`LABEL Maintainer="Integration Tests"`}, 40 Reference: imgName, 41 }) 42 assert.NilError(t, err) 43 44 // verifies that reference now points to second image 45 resp, _, err = client.ImageInspectWithRaw(ctx, imgName) 46 assert.NilError(t, err) 47 assert.Check(t, is.Equal(resp.ID, commitResp2.ID)) 48 49 // try to remove the image, should not error out. 50 _, err = client.ImageRemove(ctx, imgName, types.ImageRemoveOptions{}) 51 assert.NilError(t, err) 52 53 // check if the first image is still there 54 resp, _, err = client.ImageInspectWithRaw(ctx, commitResp1.ID) 55 assert.NilError(t, err) 56 assert.Check(t, is.Equal(resp.ID, commitResp1.ID)) 57 58 // check if the second image has been deleted 59 _, _, err = client.ImageInspectWithRaw(ctx, commitResp2.ID) 60 assert.Check(t, is.ErrorContains(err, "No such image:")) 61 } 62 63 func TestRemoveByDigest(t *testing.T) { 64 skip.If(t, !testEnv.UsingSnapshotter(), "RepoDigests doesn't include tags when using graphdrivers") 65 66 ctx := setupTest(t) 67 client := testEnv.APIClient() 68 69 err := client.ImageTag(ctx, "busybox", "test-remove-by-digest:latest") 70 assert.NilError(t, err) 71 72 inspect, _, err := client.ImageInspectWithRaw(ctx, "test-remove-by-digest") 73 assert.NilError(t, err) 74 75 id := "" 76 for _, ref := range inspect.RepoDigests { 77 if strings.Contains(ref, "test-remove-by-digest") { 78 id = ref 79 break 80 } 81 } 82 assert.Assert(t, id != "") 83 84 t.Logf("removing %s", id) 85 _, err = client.ImageRemove(ctx, id, types.ImageRemoveOptions{}) 86 assert.NilError(t, err) 87 88 inspect, _, err = client.ImageInspectWithRaw(ctx, "busybox") 89 assert.Check(t, err, "busybox image got deleted") 90 91 inspect, _, err = client.ImageInspectWithRaw(ctx, "test-remove-by-digest") 92 assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) 93 }