github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/integration/image/list_test.go (about)

     1  package image // import "github.com/Prakhar-Agarwal-byte/moby/integration/image"
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/Prakhar-Agarwal-byte/moby/api/types"
    10  	containertypes "github.com/Prakhar-Agarwal-byte/moby/api/types/container"
    11  	"github.com/Prakhar-Agarwal-byte/moby/api/types/filters"
    12  	"github.com/Prakhar-Agarwal-byte/moby/api/types/versions"
    13  	"github.com/Prakhar-Agarwal-byte/moby/integration/internal/container"
    14  	"github.com/Prakhar-Agarwal-byte/moby/testutil"
    15  	"github.com/google/go-cmp/cmp/cmpopts"
    16  	"gotest.tools/v3/assert"
    17  	is "gotest.tools/v3/assert/cmp"
    18  	"gotest.tools/v3/skip"
    19  )
    20  
    21  // Regression : #38171
    22  func TestImagesFilterMultiReference(t *testing.T) {
    23  	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.40"), "broken in earlier versions")
    24  	ctx := setupTest(t)
    25  
    26  	client := testEnv.APIClient()
    27  
    28  	name := strings.ToLower(t.Name())
    29  	repoTags := []string{
    30  		name + ":v1",
    31  		name + ":v2",
    32  		name + ":v3",
    33  		name + ":v4",
    34  	}
    35  
    36  	for _, repoTag := range repoTags {
    37  		err := client.ImageTag(ctx, "busybox:latest", repoTag)
    38  		assert.NilError(t, err)
    39  	}
    40  
    41  	filter := filters.NewArgs()
    42  	filter.Add("reference", repoTags[0])
    43  	filter.Add("reference", repoTags[1])
    44  	filter.Add("reference", repoTags[2])
    45  	options := types.ImageListOptions{
    46  		Filters: filter,
    47  	}
    48  	images, err := client.ImageList(ctx, options)
    49  	assert.NilError(t, err)
    50  
    51  	assert.Assert(t, is.Len(images, 1))
    52  	assert.Check(t, is.Len(images[0].RepoTags, 3))
    53  	for _, repoTag := range images[0].RepoTags {
    54  		if repoTag != repoTags[0] && repoTag != repoTags[1] && repoTag != repoTags[2] {
    55  			t.Errorf("list images doesn't match any repoTag we expected, repoTag: %s", repoTag)
    56  		}
    57  	}
    58  }
    59  
    60  func TestImagesFilterBeforeSince(t *testing.T) {
    61  	ctx := setupTest(t)
    62  
    63  	client := testEnv.APIClient()
    64  
    65  	name := strings.ToLower(t.Name())
    66  	ctr := container.Create(ctx, t, client, container.WithName(name))
    67  
    68  	imgs := make([]string, 5)
    69  	for i := range imgs {
    70  		if i > 0 {
    71  			// Make really really sure each image has a distinct timestamp.
    72  			time.Sleep(time.Millisecond)
    73  		}
    74  		id, err := client.ContainerCommit(ctx, ctr, containertypes.CommitOptions{Reference: fmt.Sprintf("%s:v%d", name, i)})
    75  		assert.NilError(t, err)
    76  		imgs[i] = id.ID
    77  	}
    78  
    79  	filter := filters.NewArgs(
    80  		filters.Arg("since", imgs[0]),
    81  		filters.Arg("before", imgs[len(imgs)-1]),
    82  	)
    83  	list, err := client.ImageList(ctx, types.ImageListOptions{Filters: filter})
    84  	assert.NilError(t, err)
    85  
    86  	var listedIDs []string
    87  	for _, i := range list {
    88  		t.Logf("ImageList: ID=%v RepoTags=%v", i.ID, i.RepoTags)
    89  		listedIDs = append(listedIDs, i.ID)
    90  	}
    91  	// The ImageList API sorts the list by created timestamp... truncated to
    92  	// 1-second precision. Since all the images were created within
    93  	// milliseconds of each other, listedIDs is effectively unordered and
    94  	// the assertion must therefore be order-independent.
    95  	assert.DeepEqual(t, listedIDs, imgs[1:len(imgs)-1], cmpopts.SortSlices(func(a, b string) bool { return a < b }))
    96  }
    97  
    98  func TestAPIImagesFilters(t *testing.T) {
    99  	ctx := setupTest(t)
   100  	client := testEnv.APIClient()
   101  
   102  	for _, n := range []string{"utest:tag1", "utest/docker:tag2", "utest:5000/docker:tag3"} {
   103  		err := client.ImageTag(ctx, "busybox:latest", n)
   104  		assert.NilError(t, err)
   105  	}
   106  
   107  	testcases := []struct {
   108  		name             string
   109  		filters          []filters.KeyValuePair
   110  		expectedImages   int
   111  		expectedRepoTags int
   112  	}{
   113  		{
   114  			name:             "repository regex",
   115  			filters:          []filters.KeyValuePair{filters.Arg("reference", "utest*/*")},
   116  			expectedImages:   1,
   117  			expectedRepoTags: 2,
   118  		},
   119  		{
   120  			name:             "image name regex",
   121  			filters:          []filters.KeyValuePair{filters.Arg("reference", "utest*")},
   122  			expectedImages:   1,
   123  			expectedRepoTags: 1,
   124  		},
   125  		{
   126  			name:             "image name without a tag",
   127  			filters:          []filters.KeyValuePair{filters.Arg("reference", "utest")},
   128  			expectedImages:   1,
   129  			expectedRepoTags: 1,
   130  		},
   131  		{
   132  			name:             "registry port regex",
   133  			filters:          []filters.KeyValuePair{filters.Arg("reference", "*5000*/*")},
   134  			expectedImages:   1,
   135  			expectedRepoTags: 1,
   136  		},
   137  	}
   138  
   139  	for _, tc := range testcases {
   140  		tc := tc
   141  		t.Run(tc.name, func(t *testing.T) {
   142  			t.Parallel()
   143  
   144  			ctx := testutil.StartSpan(ctx, t)
   145  			images, err := client.ImageList(ctx, types.ImageListOptions{
   146  				Filters: filters.NewArgs(tc.filters...),
   147  			})
   148  			assert.Check(t, err)
   149  			assert.Assert(t, is.Len(images, tc.expectedImages))
   150  			assert.Check(t, is.Len(images[0].RepoTags, tc.expectedRepoTags))
   151  		})
   152  	}
   153  }