Merge pull request #37728 from thaJeztah/fix_prefix_matching

Fix regression when filtering container names using a leading slash
This commit is contained in:
Tibor Vass 2018-08-28 16:59:30 -07:00 committed by GitHub
commit 082da188a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 6 deletions

View File

@ -146,7 +146,8 @@ func (daemon *Daemon) filterByNameIDMatches(view container.View, ctx *listContex
continue continue
} }
for _, eachName := range idNames { for _, eachName := range idNames {
if ctx.filters.Match("name", strings.TrimPrefix(eachName, "/")) { // match both on container name with, and without slash-prefix
if ctx.filters.Match("name", eachName) || ctx.filters.Match("name", strings.TrimPrefix(eachName, "/")) {
matches[id] = true matches[id] = true
} }
} }
@ -429,7 +430,7 @@ func includeContainerInList(container *container.Snapshot, ctx *listContext) ite
} }
// Do not include container if the name doesn't match // Do not include container if the name doesn't match
if !ctx.filters.Match("name", strings.TrimPrefix(container.Name, "/")) { if !ctx.filters.Match("name", container.Name) && !ctx.filters.Match("name", strings.TrimPrefix(container.Name, "/")) {
return excludeContainer return excludeContainer
} }

View File

@ -4,7 +4,6 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"testing" "testing"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
@ -35,6 +34,7 @@ func TestMain(m *testing.M) {
// work against it. It takes in a pointer to Daemon so that // work against it. It takes in a pointer to Daemon so that
// minor operations are not repeated by the caller // minor operations are not repeated by the caller
func setupContainerWithName(t *testing.T, name string, daemon *Daemon) *container.Container { func setupContainerWithName(t *testing.T, name string, daemon *Daemon) *container.Container {
t.Helper()
var ( var (
id = uuid.New() id = uuid.New()
computedImageID = digest.FromString(id) computedImageID = digest.FromString(id)
@ -46,6 +46,9 @@ func setupContainerWithName(t *testing.T, name string, daemon *Daemon) *containe
c := container.NewBaseContainer(id, cRoot) c := container.NewBaseContainer(id, cRoot)
// these are for passing includeContainerInList // these are for passing includeContainerInList
if name[0] != '/' {
name = "/" + name
}
c.Name = name c.Name = name
c.Running = true c.Running = true
c.HostConfig = &containertypes.HostConfig{} c.HostConfig = &containertypes.HostConfig{}
@ -68,7 +71,7 @@ func setupContainerWithName(t *testing.T, name string, daemon *Daemon) *containe
func containerListContainsName(containers []*types.Container, name string) bool { func containerListContainsName(containers []*types.Container, name string) bool {
for _, container := range containers { for _, container := range containers {
for _, containerName := range container.Names { for _, containerName := range container.Names {
if strings.TrimPrefix(containerName, "/") == name { if containerName == name {
return true return true
} }
} }
@ -110,16 +113,33 @@ func TestNameFilter(t *testing.T) {
containerList, err := d.Containers(&types.ContainerListOptions{ containerList, err := d.Containers(&types.ContainerListOptions{
Filters: filters.NewArgs(filters.Arg("name", "^a")), Filters: filters.NewArgs(filters.Arg("name", "^a")),
}) })
assert.Assert(t, err == nil) assert.NilError(t, err)
assert.Assert(t, is.Len(containerList, 2)) assert.Assert(t, is.Len(containerList, 2))
assert.Assert(t, containerListContainsName(containerList, one.Name)) assert.Assert(t, containerListContainsName(containerList, one.Name))
assert.Assert(t, containerListContainsName(containerList, two.Name)) assert.Assert(t, containerListContainsName(containerList, two.Name))
// Same as above but with slash prefix should produce the same result
containerListWithPrefix, err := d.Containers(&types.ContainerListOptions{
Filters: filters.NewArgs(filters.Arg("name", "^/a")),
})
assert.NilError(t, err)
assert.Assert(t, is.Len(containerListWithPrefix, 2))
assert.Assert(t, containerListContainsName(containerListWithPrefix, one.Name))
assert.Assert(t, containerListContainsName(containerListWithPrefix, two.Name))
// Same as above but make sure it works for exact names // Same as above but make sure it works for exact names
containerList, err = d.Containers(&types.ContainerListOptions{ containerList, err = d.Containers(&types.ContainerListOptions{
Filters: filters.NewArgs(filters.Arg("name", "b1")), Filters: filters.NewArgs(filters.Arg("name", "b1")),
}) })
assert.Assert(t, err == nil) assert.NilError(t, err)
assert.Assert(t, is.Len(containerList, 1)) assert.Assert(t, is.Len(containerList, 1))
assert.Assert(t, containerListContainsName(containerList, three.Name)) assert.Assert(t, containerListContainsName(containerList, three.Name))
// Same as above but with slash prefix should produce the same result
containerListWithPrefix, err = d.Containers(&types.ContainerListOptions{
Filters: filters.NewArgs(filters.Arg("name", "/b1")),
})
assert.NilError(t, err)
assert.Assert(t, is.Len(containerListWithPrefix, 1))
assert.Assert(t, containerListContainsName(containerListWithPrefix, three.Name))
} }