Browse code

integration-cli: migrate some "info" tests to integration

- Updated TestInfoSecurityOptions to not rely on CLI output. Note that this
test should be migrated to the integration suite, but that suite does not yet
have checks for "Seccomp" and "AppArmor"
- TestInfoAPIWarnings: don't start with busybox because we're not running containers in this test
- Migrate TestInfoDebug to integration suite
- Migrate TestInsecureRegistries to integration suite (renamed to TestInfoInsecureRegistries)
- Migrate TestRegistryMirrors to integration suite (renamed to TestInfoRegistryMirrors)
- Migrate TestInfoDiscoveryBackend to integration suite
- Migrate TestInfoDiscoveryInvalidAdvertise to integration suite
- Migrate TestInfoDiscoveryAdvertiseInterfaceName to integration suite
- Remove TestInfoFormat, which is testing the CLI functionality, and there is an
existing test in docker/cli (TestFormatInfo) covering this

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2019/10/19 00:57:01
Showing 4 changed files
... ...
@@ -3,12 +3,9 @@ package main
3 3
 import (
4 4
 	"encoding/json"
5 5
 	"fmt"
6
-	"net"
7 6
 	"strings"
8 7
 	"testing"
9 8
 
10
-	"github.com/docker/docker/integration-cli/daemon"
11
-	testdaemon "github.com/docker/docker/testutil/daemon"
12 9
 	"gotest.tools/assert"
13 10
 )
14 11
 
... ...
@@ -56,77 +53,6 @@ func (s *DockerSuite) TestInfoEnsureSucceeds(c *testing.T) {
56 56
 	}
57 57
 }
58 58
 
59
-// TestInfoFormat tests `docker info --format`
60
-func (s *DockerSuite) TestInfoFormat(c *testing.T) {
61
-	out, status := dockerCmd(c, "info", "--format", "{{json .}}")
62
-	assert.Equal(c, status, 0)
63
-	var m map[string]interface{}
64
-	err := json.Unmarshal([]byte(out), &m)
65
-	assert.NilError(c, err)
66
-	_, _, err = dockerCmdWithError("info", "--format", "{{.badString}}")
67
-	assert.ErrorContains(c, err, "")
68
-}
69
-
70
-// TestInfoDiscoveryBackend verifies that a daemon run with `--cluster-advertise` and
71
-// `--cluster-store` properly show the backend's endpoint in info output.
72
-func (s *DockerSuite) TestInfoDiscoveryBackend(c *testing.T) {
73
-	testRequires(c, testEnv.IsLocalDaemon, DaemonIsLinux)
74
-
75
-	d := daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
76
-	discoveryBackend := "consul://consuladdr:consulport/some/path"
77
-	discoveryAdvertise := "1.1.1.1:2375"
78
-	d.Start(c, fmt.Sprintf("--cluster-store=%s", discoveryBackend), fmt.Sprintf("--cluster-advertise=%s", discoveryAdvertise))
79
-	defer d.Stop(c)
80
-
81
-	out, err := d.Cmd("info")
82
-	assert.NilError(c, err)
83
-	assert.Assert(c, strings.Contains(out, fmt.Sprintf("Cluster Store: %s\n", discoveryBackend)))
84
-	assert.Assert(c, strings.Contains(out, fmt.Sprintf("Cluster Advertise: %s\n", discoveryAdvertise)))
85
-}
86
-
87
-// TestInfoDiscoveryInvalidAdvertise verifies that a daemon run with
88
-// an invalid `--cluster-advertise` configuration
89
-func (s *DockerSuite) TestInfoDiscoveryInvalidAdvertise(c *testing.T) {
90
-	testRequires(c, testEnv.IsLocalDaemon, DaemonIsLinux)
91
-
92
-	d := daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
93
-	discoveryBackend := "consul://consuladdr:consulport/some/path"
94
-
95
-	// --cluster-advertise with an invalid string is an error
96
-	err := d.StartWithError(fmt.Sprintf("--cluster-store=%s", discoveryBackend), "--cluster-advertise=invalid")
97
-	assert.ErrorContains(c, err, "")
98
-
99
-	// --cluster-advertise without --cluster-store is also an error
100
-	err = d.StartWithError("--cluster-advertise=1.1.1.1:2375")
101
-	assert.ErrorContains(c, err, "")
102
-}
103
-
104
-// TestInfoDiscoveryAdvertiseInterfaceName verifies that a daemon run with `--cluster-advertise`
105
-// configured with interface name properly show the advertise ip-address in info output.
106
-func (s *DockerSuite) TestInfoDiscoveryAdvertiseInterfaceName(c *testing.T) {
107
-	testRequires(c, testEnv.IsLocalDaemon, Network, DaemonIsLinux)
108
-
109
-	d := daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
110
-	discoveryBackend := "consul://consuladdr:consulport/some/path"
111
-	discoveryAdvertise := "eth0"
112
-
113
-	d.Start(c, fmt.Sprintf("--cluster-store=%s", discoveryBackend), fmt.Sprintf("--cluster-advertise=%s:2375", discoveryAdvertise))
114
-	defer d.Stop(c)
115
-
116
-	iface, err := net.InterfaceByName(discoveryAdvertise)
117
-	assert.NilError(c, err)
118
-	addrs, err := iface.Addrs()
119
-	assert.NilError(c, err)
120
-	assert.Assert(c, len(addrs) > 0)
121
-	ip, _, err := net.ParseCIDR(addrs[0].String())
122
-	assert.NilError(c, err)
123
-
124
-	out, err := d.Cmd("info")
125
-	assert.NilError(c, err)
126
-	assert.Assert(c, strings.Contains(out, fmt.Sprintf("Cluster Store: %s\n", discoveryBackend)))
127
-	assert.Assert(c, strings.Contains(out, fmt.Sprintf("Cluster Advertise: %s:2375\n", ip.String())))
128
-}
129
-
130 59
 func (s *DockerSuite) TestInfoDisplaysRunningContainers(c *testing.T) {
131 60
 	testRequires(c, DaemonIsLinux)
132 61
 
... ...
@@ -174,55 +100,6 @@ func (s *DockerSuite) TestInfoDisplaysStoppedContainers(c *testing.T) {
174 174
 	assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Stopped: %d\n", existing["ContainersStopped"]+1)))
175 175
 }
176 176
 
177
-func (s *DockerSuite) TestInfoDebug(c *testing.T) {
178
-	testRequires(c, testEnv.IsLocalDaemon, DaemonIsLinux)
179
-
180
-	d := daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
181
-	d.Start(c, "--debug")
182
-	defer d.Stop(c)
183
-
184
-	out, err := d.Cmd("--debug", "info")
185
-	assert.NilError(c, err)
186
-	assert.Assert(c, strings.Contains(out, "Debug Mode (client): true\n"))
187
-	assert.Assert(c, strings.Contains(out, "Debug Mode (server): true\n"))
188
-	assert.Assert(c, strings.Contains(out, "File Descriptors"))
189
-	assert.Assert(c, strings.Contains(out, "Goroutines"))
190
-	assert.Assert(c, strings.Contains(out, "System Time"))
191
-	assert.Assert(c, strings.Contains(out, "EventsListeners"))
192
-	assert.Assert(c, strings.Contains(out, "Docker Root Dir"))
193
-}
194
-
195
-func (s *DockerSuite) TestInsecureRegistries(c *testing.T) {
196
-	testRequires(c, testEnv.IsLocalDaemon, DaemonIsLinux)
197
-
198
-	registryCIDR := "192.168.1.0/24"
199
-	registryHost := "insecurehost.com:5000"
200
-
201
-	d := daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
202
-	d.Start(c, "--insecure-registry="+registryCIDR, "--insecure-registry="+registryHost)
203
-	defer d.Stop(c)
204
-
205
-	out, err := d.Cmd("info")
206
-	assert.NilError(c, err)
207
-	assert.Assert(c, strings.Contains(out, "Insecure Registries:\n"))
208
-	assert.Assert(c, strings.Contains(out, fmt.Sprintf(" %s\n", registryHost)))
209
-	assert.Assert(c, strings.Contains(out, fmt.Sprintf(" %s\n", registryCIDR)))
210
-}
211
-
212
-func (s *DockerDaemonSuite) TestRegistryMirrors(c *testing.T) {
213
-
214
-	registryMirror1 := "https://192.168.1.2"
215
-	registryMirror2 := "http://registry.mirror.com:5000"
216
-
217
-	s.d.Start(c, "--registry-mirror="+registryMirror1, "--registry-mirror="+registryMirror2)
218
-
219
-	out, err := s.d.Cmd("info")
220
-	assert.NilError(c, err)
221
-	assert.Assert(c, strings.Contains(out, "Registry Mirrors:\n"))
222
-	assert.Assert(c, strings.Contains(out, fmt.Sprintf(" %s", registryMirror1)))
223
-	assert.Assert(c, strings.Contains(out, fmt.Sprintf(" %s", registryMirror2)))
224
-}
225
-
226 177
 func existingContainerStates(c *testing.T) map[string]int {
227 178
 	out, _ := dockerCmd(c, "info", "--format", "{{json .}}")
228 179
 	var m map[string]interface{}
... ...
@@ -3,15 +3,30 @@
3 3
 package main
4 4
 
5 5
 import (
6
-	"strings"
6
+	"context"
7 7
 	"testing"
8 8
 
9
+	"github.com/docker/docker/client"
9 10
 	"gotest.tools/assert"
11
+	is "gotest.tools/assert/cmp"
10 12
 )
11 13
 
12 14
 func (s *DockerSuite) TestInfoSecurityOptions(c *testing.T) {
13
-	testRequires(c, testEnv.IsLocalDaemon, seccompEnabled, Apparmor, DaemonIsLinux)
15
+	testRequires(c, testEnv.IsLocalDaemon, DaemonIsLinux)
16
+	if !seccompEnabled() && !Apparmor() {
17
+		c.Skip("test requires Seccomp and/or AppArmor")
18
+	}
14 19
 
15
-	out, _ := dockerCmd(c, "info")
16
-	assert.Assert(c, strings.Contains(out, "Security Options:\n apparmor\n seccomp\n  Profile: default\n"))
20
+	cli, err := client.NewClientWithOpts(client.FromEnv)
21
+	assert.NilError(c, err)
22
+	defer cli.Close()
23
+	info, err := cli.Info(context.Background())
24
+	assert.NilError(c, err)
25
+
26
+	if Apparmor() {
27
+		assert.Check(c, is.Contains(info.SecurityOptions, "name=apparmor"))
28
+	}
29
+	if seccompEnabled() {
30
+		assert.Check(c, is.Contains(info.SecurityOptions, "name=seccomp,profile=default"))
31
+	}
17 32
 }
... ...
@@ -4,12 +4,16 @@ package system // import "github.com/docker/docker/integration/system"
4 4
 
5 5
 import (
6 6
 	"context"
7
+	"fmt"
8
+	"net"
7 9
 	"net/http"
8 10
 	"testing"
9 11
 
12
+	"github.com/docker/docker/testutil/daemon"
10 13
 	req "github.com/docker/docker/testutil/request"
11 14
 	"gotest.tools/assert"
12 15
 	is "gotest.tools/assert/cmp"
16
+	"gotest.tools/skip"
13 17
 )
14 18
 
15 19
 func TestInfoBinaryCommits(t *testing.T) {
... ...
@@ -43,3 +47,71 @@ func TestInfoAPIVersioned(t *testing.T) {
43 43
 	assert.Check(t, is.Contains(out, "ExecutionDriver"))
44 44
 	assert.Check(t, is.Contains(out, "not supported"))
45 45
 }
46
+
47
+// TestInfoDiscoveryBackend verifies that a daemon run with `--cluster-advertise` and
48
+// `--cluster-store` properly returns the backend's endpoint in info output.
49
+func TestInfoDiscoveryBackend(t *testing.T) {
50
+	skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
51
+
52
+	const (
53
+		discoveryBackend   = "consul://consuladdr:consulport/some/path"
54
+		discoveryAdvertise = "1.1.1.1:2375"
55
+	)
56
+
57
+	d := daemon.New(t)
58
+	d.Start(t, "--cluster-store="+discoveryBackend, "--cluster-advertise="+discoveryAdvertise)
59
+	defer d.Stop(t)
60
+
61
+	info := d.Info(t)
62
+	assert.Equal(t, info.ClusterStore, discoveryBackend)
63
+	assert.Equal(t, info.ClusterAdvertise, discoveryAdvertise)
64
+}
65
+
66
+// TestInfoDiscoveryInvalidAdvertise verifies that a daemon run with
67
+// an invalid `--cluster-advertise` configuration
68
+func TestInfoDiscoveryInvalidAdvertise(t *testing.T) {
69
+	skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
70
+	d := daemon.New(t)
71
+
72
+	// --cluster-advertise with an invalid string is an error
73
+	err := d.StartWithError("--cluster-store=consul://consuladdr:consulport/some/path", "--cluster-advertise=invalid")
74
+	if err == nil {
75
+		d.Stop(t)
76
+	}
77
+	assert.ErrorContains(t, err, "", "expected error when starting daemon")
78
+
79
+	// --cluster-advertise without --cluster-store is also an error
80
+	err = d.StartWithError("--cluster-advertise=1.1.1.1:2375")
81
+	if err == nil {
82
+		d.Stop(t)
83
+	}
84
+	assert.ErrorContains(t, err, "", "expected error when starting daemon")
85
+}
86
+
87
+// TestInfoDiscoveryAdvertiseInterfaceName verifies that a daemon run with `--cluster-advertise`
88
+// configured with interface name properly show the advertise ip-address in info output.
89
+func TestInfoDiscoveryAdvertiseInterfaceName(t *testing.T) {
90
+	skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
91
+	// TODO should we check for networking availability (integration-cli suite checks for networking through `Network()`)
92
+
93
+	d := daemon.New(t)
94
+	const (
95
+		discoveryStore     = "consul://consuladdr:consulport/some/path"
96
+		discoveryInterface = "eth0"
97
+	)
98
+
99
+	d.Start(t, "--cluster-store="+discoveryStore, fmt.Sprintf("--cluster-advertise=%s:2375", discoveryInterface))
100
+	defer d.Stop(t)
101
+
102
+	iface, err := net.InterfaceByName(discoveryInterface)
103
+	assert.NilError(t, err)
104
+	addrs, err := iface.Addrs()
105
+	assert.NilError(t, err)
106
+	assert.Assert(t, len(addrs) > 0)
107
+	ip, _, err := net.ParseCIDR(addrs[0].String())
108
+	assert.NilError(t, err)
109
+
110
+	info := d.Info(t)
111
+	assert.Equal(t, info.ClusterStore, discoveryStore)
112
+	assert.Equal(t, info.ClusterAdvertise, ip.String()+":2375")
113
+}
... ...
@@ -3,8 +3,10 @@ package system // import "github.com/docker/docker/integration/system"
3 3
 import (
4 4
 	"context"
5 5
 	"fmt"
6
+	"sort"
6 7
 	"testing"
7 8
 
9
+	"github.com/docker/docker/api/types/registry"
8 10
 	"github.com/docker/docker/testutil/daemon"
9 11
 	"gotest.tools/assert"
10 12
 	is "gotest.tools/assert/cmp"
... ...
@@ -49,7 +51,7 @@ func TestInfoAPIWarnings(t *testing.T) {
49 49
 	d := daemon.New(t)
50 50
 	c := d.NewClientT(t)
51 51
 
52
-	d.StartWithBusybox(t, "-H=0.0.0.0:23756", "-H="+d.Sock())
52
+	d.Start(t, "-H=0.0.0.0:23756", "-H="+d.Sock())
53 53
 	defer d.Stop(t)
54 54
 
55 55
 	info, err := c.Info(context.Background())
... ...
@@ -65,3 +67,64 @@ func TestInfoAPIWarnings(t *testing.T) {
65 65
 		assert.Check(t, is.Contains(out, linePrefix))
66 66
 	}
67 67
 }
68
+
69
+func TestInfoDebug(t *testing.T) {
70
+	skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
71
+
72
+	d := daemon.New(t)
73
+	d.Start(t, "--debug")
74
+	defer d.Stop(t)
75
+
76
+	info := d.Info(t)
77
+	assert.Equal(t, info.Debug, true)
78
+
79
+	// Note that the information below is not tied to debug-mode being enabled.
80
+	assert.Check(t, info.NFd != 0)
81
+
82
+	// TODO need a stable way to generate event listeners
83
+	// assert.Check(t, info.NEventsListener != 0)
84
+	assert.Check(t, info.NGoroutines != 0)
85
+	assert.Check(t, info.SystemTime != "")
86
+	assert.Equal(t, info.DockerRootDir, d.Root)
87
+}
88
+
89
+func TestInfoInsecureRegistries(t *testing.T) {
90
+	skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
91
+
92
+	const (
93
+		registryCIDR = "192.168.1.0/24"
94
+		registryHost = "insecurehost.com:5000"
95
+	)
96
+
97
+	d := daemon.New(t)
98
+	d.Start(t, "--insecure-registry="+registryCIDR, "--insecure-registry="+registryHost)
99
+	defer d.Stop(t)
100
+
101
+	info := d.Info(t)
102
+	assert.Assert(t, is.Len(info.RegistryConfig.InsecureRegistryCIDRs, 2))
103
+	cidrs := []string{
104
+		info.RegistryConfig.InsecureRegistryCIDRs[0].String(),
105
+		info.RegistryConfig.InsecureRegistryCIDRs[1].String(),
106
+	}
107
+	assert.Assert(t, is.Contains(cidrs, registryCIDR))
108
+	assert.Assert(t, is.Contains(cidrs, "127.0.0.0/8"))
109
+	assert.DeepEqual(t, *info.RegistryConfig.IndexConfigs["docker.io"], registry.IndexInfo{Name: "docker.io", Mirrors: []string{}, Secure: true, Official: true})
110
+	assert.DeepEqual(t, *info.RegistryConfig.IndexConfigs[registryHost], registry.IndexInfo{Name: registryHost, Mirrors: []string{}, Secure: false, Official: false})
111
+}
112
+
113
+func TestInfoRegistryMirrors(t *testing.T) {
114
+	skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
115
+
116
+	const (
117
+		registryMirror1 = "https://192.168.1.2"
118
+		registryMirror2 = "http://registry.mirror.com:5000"
119
+	)
120
+
121
+	d := daemon.New(t)
122
+	d.Start(t, "--registry-mirror="+registryMirror1, "--registry-mirror="+registryMirror2)
123
+	defer d.Stop(t)
124
+
125
+	info := d.Info(t)
126
+	sort.Strings(info.RegistryConfig.Mirrors)
127
+	assert.DeepEqual(t, info.RegistryConfig.Mirrors, []string{registryMirror2 + "/", registryMirror1 + "/"})
128
+}