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  }