1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- package image // import "github.com/docker/docker/integration/image"
- import (
- "context"
- "fmt"
- "strings"
- "testing"
- "time"
- "github.com/docker/docker/api/types"
- "github.com/docker/docker/api/types/filters"
- "github.com/docker/docker/api/types/versions"
- "github.com/docker/docker/integration/internal/container"
- "github.com/google/go-cmp/cmp/cmpopts"
- "gotest.tools/v3/assert"
- is "gotest.tools/v3/assert/cmp"
- "gotest.tools/v3/skip"
- )
- // Regression : #38171
- func TestImagesFilterMultiReference(t *testing.T) {
- skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.40"), "broken in earlier versions")
- defer setupTest(t)()
- client := testEnv.APIClient()
- ctx := context.Background()
- name := strings.ToLower(t.Name())
- repoTags := []string{
- name + ":v1",
- name + ":v2",
- name + ":v3",
- name + ":v4",
- }
- for _, repoTag := range repoTags {
- err := client.ImageTag(ctx, "busybox:latest", repoTag)
- assert.NilError(t, err)
- }
- filter := filters.NewArgs()
- filter.Add("reference", repoTags[0])
- filter.Add("reference", repoTags[1])
- filter.Add("reference", repoTags[2])
- options := types.ImageListOptions{
- All: false,
- Filters: filter,
- }
- images, err := client.ImageList(ctx, options)
- assert.NilError(t, err)
- assert.Check(t, is.Equal(len(images[0].RepoTags), 3))
- for _, repoTag := range images[0].RepoTags {
- if repoTag != repoTags[0] && repoTag != repoTags[1] && repoTag != repoTags[2] {
- t.Errorf("list images doesn't match any repoTag we expected, repoTag: %s", repoTag)
- }
- }
- }
- func TestImagesFilterBeforeSince(t *testing.T) {
- defer setupTest(t)()
- client := testEnv.APIClient()
- ctx := context.Background()
- name := strings.ToLower(t.Name())
- ctr := container.Create(ctx, t, client, container.WithName(name))
- imgs := make([]string, 5)
- for i := range imgs {
- if i > 0 {
- // Make really really sure each image has a distinct timestamp.
- time.Sleep(time.Millisecond)
- }
- id, err := client.ContainerCommit(ctx, ctr, types.ContainerCommitOptions{Reference: fmt.Sprintf("%s:v%d", name, i)})
- assert.NilError(t, err)
- imgs[i] = id.ID
- }
- filter := filters.NewArgs(
- filters.Arg("since", imgs[0]),
- filters.Arg("before", imgs[len(imgs)-1]),
- )
- list, err := client.ImageList(ctx, types.ImageListOptions{Filters: filter})
- assert.NilError(t, err)
- var listedIDs []string
- for _, i := range list {
- t.Logf("ImageList: ID=%v RepoTags=%v", i.ID, i.RepoTags)
- listedIDs = append(listedIDs, i.ID)
- }
- // The ImageList API sorts the list by created timestamp... truncated to
- // 1-second precision. Since all the images were created within
- // milliseconds of each other, listedIDs is effectively unordered and
- // the assertion must therefore be order-independent.
- assert.DeepEqual(t, listedIDs, imgs[1:len(imgs)-1], cmpopts.SortSlices(func(a, b string) bool { return a < b }))
- }
|