github.com/moby/docker@v26.1.3+incompatible/integration/network/dns_test.go (about)

     1  package network // import "github.com/docker/docker/integration/network"
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	containertypes "github.com/docker/docker/api/types/container"
     8  	"github.com/docker/docker/integration/internal/container"
     9  	"github.com/docker/docker/integration/internal/network"
    10  	"github.com/docker/docker/testutil"
    11  	"github.com/docker/docker/testutil/daemon"
    12  	"gotest.tools/v3/assert"
    13  	is "gotest.tools/v3/assert/cmp"
    14  	"gotest.tools/v3/poll"
    15  	"gotest.tools/v3/skip"
    16  )
    17  
    18  func TestDaemonDNSFallback(t *testing.T) {
    19  	skip.If(t, testEnv.IsRemoteDaemon, "cannot start daemon on remote test run")
    20  	skip.If(t, testEnv.DaemonInfo.OSType != "linux")
    21  	skip.If(t, testEnv.IsUserNamespace)
    22  	ctx := testutil.StartSpan(baseContext, t)
    23  
    24  	d := daemon.New(t)
    25  	d.StartWithBusybox(ctx, t, "-b", "none", "--dns", "127.127.127.1", "--dns", "8.8.8.8")
    26  	defer d.Stop(t)
    27  
    28  	c := d.NewClientT(t)
    29  
    30  	network.CreateNoError(ctx, t, c, "test")
    31  	defer c.NetworkRemove(ctx, "test")
    32  
    33  	cid := container.Run(ctx, t, c, container.WithNetworkMode("test"), container.WithCmd("nslookup", "docker.com"))
    34  	defer c.ContainerRemove(ctx, cid, containertypes.RemoveOptions{Force: true})
    35  
    36  	poll.WaitOn(t, container.IsSuccessful(ctx, c, cid), poll.WithDelay(100*time.Millisecond), poll.WithTimeout(10*time.Second))
    37  }
    38  
    39  // Check that, when the internal DNS server's address is supplied as an external
    40  // DNS server, the daemon doesn't start talking to itself.
    41  func TestIntDNSAsExtDNS(t *testing.T) {
    42  	skip.If(t, testEnv.DaemonInfo.OSType == "windows", "cannot start daemon on Windows test run")
    43  	skip.If(t, testEnv.IsRemoteDaemon, "cannot start daemon on remote test run")
    44  
    45  	ctx := setupTest(t)
    46  
    47  	d := daemon.New(t)
    48  	d.StartWithBusybox(ctx, t)
    49  	defer d.Stop(t)
    50  
    51  	c := d.NewClientT(t)
    52  	defer c.Close()
    53  
    54  	testcases := []struct {
    55  		name        string
    56  		extServers  []string
    57  		expExitCode int
    58  		expStdout   string
    59  	}{
    60  		{
    61  			name:        "only self",
    62  			extServers:  []string{"127.0.0.11"},
    63  			expExitCode: 1,
    64  			expStdout:   "SERVFAIL",
    65  		},
    66  		{
    67  			name:        "self then ext",
    68  			extServers:  []string{"127.0.0.11", "8.8.8.8"},
    69  			expExitCode: 0,
    70  			expStdout:   "Non-authoritative answer",
    71  		},
    72  	}
    73  
    74  	for _, tc := range testcases {
    75  		t.Run(tc.name, func(t *testing.T) {
    76  			ctx := testutil.StartSpan(ctx, t)
    77  
    78  			const netName = "testnet"
    79  			network.CreateNoError(ctx, t, c, netName)
    80  			defer network.RemoveNoError(ctx, t, c, netName)
    81  
    82  			res := container.RunAttach(ctx, t, c,
    83  				container.WithNetworkMode(netName),
    84  				container.WithDNS(tc.extServers),
    85  				container.WithCmd("nslookup", "docker.com"),
    86  			)
    87  			defer c.ContainerRemove(ctx, res.ContainerID, containertypes.RemoveOptions{Force: true})
    88  
    89  			assert.Check(t, is.Equal(res.ExitCode, tc.expExitCode))
    90  			assert.Check(t, is.Contains(res.Stdout.String(), tc.expStdout))
    91  		})
    92  	}
    93  }