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 }