//go:build !windows // +build !windows package network import ( "context" "fmt" "os" "testing" "github.com/docker/docker/api/types" "github.com/docker/docker/client" "github.com/docker/docker/pkg/parsers/kernel" "gotest.tools/v3/assert/cmp" "gotest.tools/v3/icmd" ) // CreateMasterDummy creates a dummy network interface func CreateMasterDummy(t *testing.T, master string) { // ip link add type dummy icmd.RunCommand("ip", "link", "add", master, "type", "dummy").Assert(t, icmd.Success) icmd.RunCommand("ip", "link", "set", master, "up").Assert(t, icmd.Success) } // CreateVlanInterface creates a vlan network interface func CreateVlanInterface(t *testing.T, master, slave, id string) { // ip link add link name . type vlan id icmd.RunCommand("ip", "link", "add", "link", master, "name", slave, "type", "vlan", "id", id).Assert(t, icmd.Success) // ip link set up icmd.RunCommand("ip", "link", "set", slave, "up").Assert(t, icmd.Success) } // DeleteInterface deletes a network interface func DeleteInterface(t *testing.T, ifName string) { icmd.RunCommand("ip", "link", "delete", ifName).Assert(t, icmd.Success) icmd.RunCommand("iptables", "-t", "nat", "--flush").Assert(t, icmd.Success) icmd.RunCommand("iptables", "--flush").Assert(t, icmd.Success) } // LinkExists verifies that a link exists func LinkExists(t *testing.T, master string) { // verify the specified link exists, ip link show icmd.RunCommand("ip", "link", "show", master).Assert(t, icmd.Success) } // IsNetworkAvailable provides a comparison to check if a docker network is available func IsNetworkAvailable(c client.NetworkAPIClient, name string) cmp.Comparison { return func() cmp.Result { networks, err := c.NetworkList(context.Background(), types.NetworkListOptions{}) if err != nil { return cmp.ResultFromError(err) } for _, network := range networks { if network.Name == name { return cmp.ResultSuccess } } return cmp.ResultFailure(fmt.Sprintf("could not find network %s", name)) } } // IsNetworkNotAvailable provides a comparison to check if a docker network is not available func IsNetworkNotAvailable(c client.NetworkAPIClient, name string) cmp.Comparison { return func() cmp.Result { networks, err := c.NetworkList(context.Background(), types.NetworkListOptions{}) if err != nil { return cmp.ResultFromError(err) } for _, network := range networks { if network.Name == name { return cmp.ResultFailure(fmt.Sprintf("network %s is still present", name)) } } return cmp.ResultSuccess } } // CheckKernelMajorVersionGreaterOrEqualThen returns whether the kernel version is greater or equal than the one provided func CheckKernelMajorVersionGreaterOrEqualThen(kernelVersion int, majorVersion int) bool { kv, err := kernel.GetKernelVersion() if err != nil { return false } if kv.Kernel < kernelVersion || (kv.Kernel == kernelVersion && kv.Major < majorVersion) { return false } return true } // IsUserNamespace returns whether the user namespace remapping is enabled func IsUserNamespace() bool { root := os.Getenv("DOCKER_REMAP_ROOT") return root != "" }