matchesType tests a network against only the first value of the type filter. The values come from a map. Their order is random and changes from one network to the next. A GET /networks request that filters on both type=builtin and type=custom lists a random subset of the networks. Before networks were filtered one at a time, the daemon filtered the list once for each type value and listed every network that matched any of them. Match a network when its type is any of the filter's values. integration-cli's TestDockerNetworkLsFilter checks this request but is skipped in every run. Its OnlyDefaultNetworks requirement is met only when GET /networks lists no networks at all. The daemon always lists the predefined bridge, host and none networks. Port the test to integration/network as TestNetworkListFilters, which uses the API client. The new test checks the same id, name, type, label and driver filter terms against two networks that it creates and the predefined networks. It derives the expected results for type=custom and driver=bridge from the unfiltered list, as the daemon can have other networks. Remove the integration-cli test, its assertNwList helper and the OnlyDefaultNetworks requirement. Nothing else uses them. Add the combined type values to the filter unit test as well. Both tests fail on the combined values without the fix. Signed-off-by: Cory Snider <csnider@mirantis.com>
162 lines
3.9 KiB
Go
162 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
"os/exec"
|
|
"path"
|
|
"reflect"
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/containerd/containerd/v2/plugins"
|
|
"github.com/moby/moby/api/types/swarm"
|
|
"github.com/moby/moby/v2/internal/testutil/registry"
|
|
)
|
|
|
|
func DaemonIsWindows() bool {
|
|
return testEnv.DaemonInfo.OSType == "windows"
|
|
}
|
|
|
|
func DaemonIsLinux() bool {
|
|
return testEnv.DaemonInfo.OSType == "linux"
|
|
}
|
|
|
|
func IsAmd64() bool {
|
|
return testEnv.DaemonInfo.Architecture == "amd64"
|
|
}
|
|
|
|
func NotPpc64le() bool {
|
|
return testEnv.DaemonInfo.Architecture != "ppc64le"
|
|
}
|
|
|
|
func UnixCli() bool {
|
|
return isUnixCli
|
|
}
|
|
|
|
func GitHubActions() bool {
|
|
return os.Getenv("GITHUB_ACTIONS") != ""
|
|
}
|
|
|
|
func Network() bool {
|
|
// Set a timeout on the GET at 15s
|
|
const timeout = 15 * time.Second
|
|
const url = "https://hub.docker.com"
|
|
|
|
c := http.Client{
|
|
Timeout: timeout,
|
|
}
|
|
|
|
resp, err := c.Get(url)
|
|
if err != nil && !errors.Is(err, net.ErrClosed) {
|
|
panic("Timeout for GET request on " + url)
|
|
}
|
|
if resp != nil {
|
|
resp.Body.Close()
|
|
}
|
|
return err == nil
|
|
}
|
|
|
|
func Apparmor() bool {
|
|
buf, err := os.ReadFile("/sys/module/apparmor/parameters/enabled")
|
|
return err == nil && len(buf) > 1 && buf[0] == 'Y'
|
|
}
|
|
|
|
// containerdSnapshotterEnabled checks if the daemon in the test-environment is
|
|
// configured with containerd-snapshotters enabled.
|
|
func containerdSnapshotterEnabled() bool {
|
|
for _, v := range testEnv.DaemonInfo.DriverStatus {
|
|
if v[0] == "driver-type" {
|
|
return v[1] == string(plugins.SnapshotPlugin)
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func UserNamespaceROMount() bool {
|
|
// quick case--userns not enabled in this test run
|
|
if os.Getenv("DOCKER_REMAP_ROOT") == "" {
|
|
return true
|
|
}
|
|
if _, _, err := dockerCmdWithError("run", "--rm", "--read-only", "busybox", "date"); err != nil {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func NotUserNamespace() bool {
|
|
root := os.Getenv("DOCKER_REMAP_ROOT")
|
|
return root == ""
|
|
}
|
|
|
|
func UserNamespaceInKernel() bool {
|
|
if _, err := os.Stat("/proc/self/uid_map"); os.IsNotExist(err) {
|
|
/*
|
|
* This kernel-provided file only exists if user namespaces are
|
|
* supported
|
|
*/
|
|
return false
|
|
}
|
|
|
|
// We need extra check on redhat based distributions
|
|
if f, err := os.Open("/sys/module/user_namespace/parameters/enable"); err == nil {
|
|
defer f.Close()
|
|
b := make([]byte, 1)
|
|
_, _ = f.Read(b)
|
|
return string(b) != "N"
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func IsPausable() bool {
|
|
if testEnv.DaemonInfo.OSType == "windows" {
|
|
return testEnv.DaemonInfo.Isolation.IsHyperV()
|
|
}
|
|
return true
|
|
}
|
|
|
|
// RegistryHosting returns whether the host can host a registry (v2) or not
|
|
func RegistryHosting() bool {
|
|
// for now registry binary is built only if we're running inside
|
|
// container through `make test`. Figure that out by testing if
|
|
// registry binary is in PATH.
|
|
_, err := exec.LookPath(registry.V2binary)
|
|
return err == nil
|
|
}
|
|
|
|
// RuntimeIsWindowsContainerd returns whether the containerd runtime is used on
|
|
// Windows.
|
|
// It is true when either the legacy DOCKER_WINDOWS_CONTAINERD_RUNTIME=1 env
|
|
// var is set, or when the embedded-containerd feature is enabled via
|
|
// TEST_INTEGRATION_CONTAINERD_EMBEDDED (which also uses containerd).
|
|
func RuntimeIsWindowsContainerd() bool {
|
|
return os.Getenv("DOCKER_WINDOWS_CONTAINERD_RUNTIME") == "1" ||
|
|
(runtime.GOOS == "windows" && os.Getenv("TEST_INTEGRATION_CONTAINERD_EMBEDDED") != "")
|
|
}
|
|
|
|
func SwarmInactive() bool {
|
|
return testEnv.DaemonInfo.Swarm.LocalNodeState == swarm.LocalNodeStateInactive
|
|
}
|
|
|
|
func TODOBuildkit() bool {
|
|
return os.Getenv("DOCKER_BUILDKIT") == ""
|
|
}
|
|
|
|
// testRequires checks if the environment satisfies the requirements
|
|
// for the test to run or skips the tests.
|
|
func testRequires(t *testing.T, requirements ...func() bool) {
|
|
t.Helper()
|
|
for _, check := range requirements {
|
|
if !check() {
|
|
requirementFunc := runtime.FuncForPC(reflect.ValueOf(check).Pointer()).Name()
|
|
_, req, _ := strings.Cut(path.Base(requirementFunc), ".")
|
|
t.Skipf("unmatched requirement %s", req)
|
|
}
|
|
}
|
|
}
|