Browse code

fix and skip some tests based on API version

Signed-off-by: Anda Xu <anda.xu@docker.com>

Co-authored-by: Anda Xu <anda.xu@docker.com>
Co-authored-by: Tibor Vass <tibor@docker.com>

Anda Xu authored on 2018/05/05 06:15:00
Showing 31 changed files
... ...
@@ -406,7 +406,8 @@ func (s *DockerSuite) TestBuildAddRemoteNoDecompress(c *check.C) {
406 406
 }
407 407
 
408 408
 func (s *DockerSuite) TestBuildChownOnCopy(c *check.C) {
409
-	testRequires(c, DaemonIsLinux)
409
+	// new feature added in 1.31 - https://github.com/moby/moby/pull/34263
410
+	testRequires(c, DaemonIsLinux, MinimumAPIVersion("1.31"))
410 411
 	dockerfile := `FROM busybox
411 412
 		RUN echo 'test1:x:1001:1001::/bin:/bin/false' >> /etc/passwd
412 413
 		RUN echo 'test1:x:1001:' >> /etc/group
... ...
@@ -21,6 +21,7 @@ import (
21 21
 	containertypes "github.com/docker/docker/api/types/container"
22 22
 	mounttypes "github.com/docker/docker/api/types/mount"
23 23
 	networktypes "github.com/docker/docker/api/types/network"
24
+	"github.com/docker/docker/api/types/versions"
24 25
 	"github.com/docker/docker/client"
25 26
 	"github.com/docker/docker/integration-cli/checker"
26 27
 	"github.com/docker/docker/integration-cli/cli"
... ...
@@ -724,13 +725,23 @@ func (s *DockerSuite) TestContainerAPIVerifyHeader(c *check.C) {
724 724
 	// Try with no content-type
725 725
 	res, body, err := create("")
726 726
 	c.Assert(err, checker.IsNil)
727
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
727
+	// todo: we need to figure out a better way to compare between dockerd versions
728
+	// comparing between daemon API version is not precise.
729
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
730
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
731
+	} else {
732
+		c.Assert(res.StatusCode, checker.Not(checker.Equals), http.StatusOK)
733
+	}
728 734
 	body.Close()
729 735
 
730 736
 	// Try with wrong content-type
731 737
 	res, body, err = create("application/xml")
732 738
 	c.Assert(err, checker.IsNil)
733
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
739
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
740
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
741
+	} else {
742
+		c.Assert(res.StatusCode, checker.Not(checker.Equals), http.StatusOK)
743
+	}
734 744
 	body.Close()
735 745
 
736 746
 	// now application/json
... ...
@@ -756,7 +767,11 @@ func (s *DockerSuite) TestContainerAPIInvalidPortSyntax(c *check.C) {
756 756
 
757 757
 	res, body, err := request.Post("/containers/create", request.RawString(config), request.JSON)
758 758
 	c.Assert(err, checker.IsNil)
759
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
759
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
760
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
761
+	} else {
762
+		c.Assert(res.StatusCode, checker.Not(checker.Equals), http.StatusOK)
763
+	}
760 764
 
761 765
 	b, err := request.ReadBody(body)
762 766
 	c.Assert(err, checker.IsNil)
... ...
@@ -776,7 +791,11 @@ func (s *DockerSuite) TestContainerAPIRestartPolicyInvalidPolicyName(c *check.C)
776 776
 
777 777
 	res, body, err := request.Post("/containers/create", request.RawString(config), request.JSON)
778 778
 	c.Assert(err, checker.IsNil)
779
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
779
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
780
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
781
+	} else {
782
+		c.Assert(res.StatusCode, checker.Not(checker.Equals), http.StatusOK)
783
+	}
780 784
 
781 785
 	b, err := request.ReadBody(body)
782 786
 	c.Assert(err, checker.IsNil)
... ...
@@ -796,7 +815,11 @@ func (s *DockerSuite) TestContainerAPIRestartPolicyRetryMismatch(c *check.C) {
796 796
 
797 797
 	res, body, err := request.Post("/containers/create", request.RawString(config), request.JSON)
798 798
 	c.Assert(err, checker.IsNil)
799
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
799
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
800
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
801
+	} else {
802
+		c.Assert(res.StatusCode, checker.Not(checker.Equals), http.StatusOK)
803
+	}
800 804
 
801 805
 	b, err := request.ReadBody(body)
802 806
 	c.Assert(err, checker.IsNil)
... ...
@@ -816,7 +839,11 @@ func (s *DockerSuite) TestContainerAPIRestartPolicyNegativeRetryCount(c *check.C
816 816
 
817 817
 	res, body, err := request.Post("/containers/create", request.RawString(config), request.JSON)
818 818
 	c.Assert(err, checker.IsNil)
819
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
819
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
820
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
821
+	} else {
822
+		c.Assert(res.StatusCode, checker.Not(checker.Equals), http.StatusOK)
823
+	}
820 824
 
821 825
 	b, err := request.ReadBody(body)
822 826
 	c.Assert(err, checker.IsNil)
... ...
@@ -901,7 +928,11 @@ func (s *DockerSuite) TestCreateWithTooLowMemoryLimit(c *check.C) {
901 901
 	b, err2 := request.ReadBody(body)
902 902
 	c.Assert(err2, checker.IsNil)
903 903
 
904
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
904
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
905
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
906
+	} else {
907
+		c.Assert(res.StatusCode, checker.Not(checker.Equals), http.StatusOK)
908
+	}
905 909
 	c.Assert(string(b), checker.Contains, "Minimum memory limit allowed is 4MB")
906 910
 }
907 911
 
... ...
@@ -1089,7 +1120,11 @@ func (s *DockerSuite) TestContainerAPICopyResourcePathEmptyPre124(c *check.C) {
1089 1089
 
1090 1090
 	res, body, err := request.Post("/v1.23/containers/"+name+"/copy", request.JSONBody(postData))
1091 1091
 	c.Assert(err, checker.IsNil)
1092
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
1092
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
1093
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
1094
+	} else {
1095
+		c.Assert(res.StatusCode, checker.Not(checker.Equals), http.StatusOK)
1096
+	}
1093 1097
 	b, err := request.ReadBody(body)
1094 1098
 	c.Assert(err, checker.IsNil)
1095 1099
 	c.Assert(string(b), checker.Matches, "Path cannot be empty\n")
... ...
@@ -1106,8 +1141,11 @@ func (s *DockerSuite) TestContainerAPICopyResourcePathNotFoundPre124(c *check.C)
1106 1106
 
1107 1107
 	res, body, err := request.Post("/v1.23/containers/"+name+"/copy", request.JSONBody(postData))
1108 1108
 	c.Assert(err, checker.IsNil)
1109
-	c.Assert(res.StatusCode, checker.Equals, http.StatusNotFound)
1110
-
1109
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
1110
+		c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError)
1111
+	} else {
1112
+		c.Assert(res.StatusCode, checker.Equals, http.StatusNotFound)
1113
+	}
1111 1114
 	b, err := request.ReadBody(body)
1112 1115
 	c.Assert(err, checker.IsNil)
1113 1116
 	c.Assert(string(b), checker.Matches, "Could not find the file /notexist in container "+name+"\n")
... ...
@@ -1563,7 +1601,11 @@ func (s *DockerSuite) TestPostContainersCreateMemorySwappinessHostConfigOmitted(
1563 1563
 	containerJSON, err := cli.ContainerInspect(context.Background(), container.ID)
1564 1564
 	c.Assert(err, check.IsNil)
1565 1565
 
1566
-	c.Assert(containerJSON.HostConfig.MemorySwappiness, check.IsNil)
1566
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.31") {
1567
+		c.Assert(*containerJSON.HostConfig.MemorySwappiness, check.Equals, int64(-1))
1568
+	} else {
1569
+		c.Assert(containerJSON.HostConfig.MemorySwappiness, check.IsNil)
1570
+	}
1567 1571
 }
1568 1572
 
1569 1573
 // check validation is done daemon side and not only in cli
... ...
@@ -1910,8 +1952,13 @@ func (s *DockerSuite) TestContainersAPICreateMountsCreate(c *check.C) {
1910 1910
 	}
1911 1911
 
1912 1912
 	var selinuxSharedLabel string
1913
-	if runtime.GOOS == "linux" {
1914
-		selinuxSharedLabel = "z"
1913
+	// this test label was added after a bug fix in 1.32, thus add requirements min API >= 1.32
1914
+	// for the sake of making test pass in earlier versions
1915
+	// bug fixed in https://github.com/moby/moby/pull/34684
1916
+	if !versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
1917
+		if runtime.GOOS == "linux" {
1918
+			selinuxSharedLabel = "z"
1919
+		}
1915 1920
 	}
1916 1921
 
1917 1922
 	cases := []testCase{
... ...
@@ -6,6 +6,7 @@ import (
6 6
 	"time"
7 7
 
8 8
 	"github.com/docker/docker/api/types/container"
9
+	"github.com/docker/docker/api/types/versions"
9 10
 	"github.com/docker/docker/integration-cli/checker"
10 11
 	"github.com/docker/docker/internal/test/request"
11 12
 	"github.com/go-check/check"
... ...
@@ -25,7 +26,11 @@ func (s *DockerSuite) TestAPICreateWithInvalidHealthcheckParams(c *check.C) {
25 25
 
26 26
 	res, body, err := request.Post("/containers/create?name="+name, request.JSONBody(config))
27 27
 	c.Assert(err, check.IsNil)
28
-	c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
28
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
29
+		c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
30
+	} else {
31
+		c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
32
+	}
29 33
 
30 34
 	buf, err := request.ReadBody(body)
31 35
 	c.Assert(err, checker.IsNil)
... ...
@@ -49,7 +54,11 @@ func (s *DockerSuite) TestAPICreateWithInvalidHealthcheckParams(c *check.C) {
49 49
 	buf, err = request.ReadBody(body)
50 50
 	c.Assert(err, checker.IsNil)
51 51
 
52
-	c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
52
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
53
+		c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
54
+	} else {
55
+		c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
56
+	}
53 57
 	c.Assert(getErrorMessage(c, buf), checker.Contains, expected)
54 58
 
55 59
 	// test invalid Timeout in Healthcheck: less than 1ms
... ...
@@ -64,7 +73,11 @@ func (s *DockerSuite) TestAPICreateWithInvalidHealthcheckParams(c *check.C) {
64 64
 	}
65 65
 	res, body, err = request.Post("/containers/create?name="+name, request.JSONBody(config))
66 66
 	c.Assert(err, check.IsNil)
67
-	c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
67
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
68
+		c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
69
+	} else {
70
+		c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
71
+	}
68 72
 
69 73
 	buf, err = request.ReadBody(body)
70 74
 	c.Assert(err, checker.IsNil)
... ...
@@ -84,7 +97,11 @@ func (s *DockerSuite) TestAPICreateWithInvalidHealthcheckParams(c *check.C) {
84 84
 	}
85 85
 	res, body, err = request.Post("/containers/create?name="+name, request.JSONBody(config))
86 86
 	c.Assert(err, check.IsNil)
87
-	c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
87
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
88
+		c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
89
+	} else {
90
+		c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
91
+	}
88 92
 
89 93
 	buf, err = request.ReadBody(body)
90 94
 	c.Assert(err, checker.IsNil)
... ...
@@ -105,7 +122,11 @@ func (s *DockerSuite) TestAPICreateWithInvalidHealthcheckParams(c *check.C) {
105 105
 	}
106 106
 	res, body, err = request.Post("/containers/create?name="+name, request.JSONBody(config))
107 107
 	c.Assert(err, check.IsNil)
108
-	c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
108
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
109
+		c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
110
+	} else {
111
+		c.Assert(res.StatusCode, check.Equals, http.StatusBadRequest)
112
+	}
109 113
 
110 114
 	buf, err = request.ReadBody(body)
111 115
 	c.Assert(err, checker.IsNil)
... ...
@@ -9,6 +9,7 @@ import (
9 9
 	"strings"
10 10
 	"sync"
11 11
 
12
+	"github.com/docker/docker/api/types/versions"
12 13
 	"github.com/docker/docker/integration-cli/checker"
13 14
 	"github.com/docker/docker/internal/test/request"
14 15
 	"github.com/go-check/check"
... ...
@@ -22,7 +23,11 @@ func (s *DockerSuite) TestExecResizeAPIHeightWidthNoInt(c *check.C) {
22 22
 	endpoint := "/exec/" + cleanedContainerID + "/resize?h=foo&w=bar"
23 23
 	res, _, err := request.Post(endpoint)
24 24
 	c.Assert(err, checker.IsNil)
25
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
25
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
26
+		c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError)
27
+	} else {
28
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
29
+	}
26 30
 }
27 31
 
28 32
 // Part of #14845
... ...
@@ -14,6 +14,7 @@ import (
14 14
 	"time"
15 15
 
16 16
 	"github.com/docker/docker/api/types"
17
+	"github.com/docker/docker/api/types/versions"
17 18
 	"github.com/docker/docker/client"
18 19
 	"github.com/docker/docker/integration-cli/checker"
19 20
 	"github.com/docker/docker/internal/test/request"
... ...
@@ -27,8 +28,11 @@ func (s *DockerSuite) TestExecAPICreateNoCmd(c *check.C) {
27 27
 
28 28
 	res, body, err := request.Post(fmt.Sprintf("/containers/%s/exec", name), request.JSONBody(map[string]interface{}{"Cmd": nil}))
29 29
 	c.Assert(err, checker.IsNil)
30
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
31
-
30
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
31
+		c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError)
32
+	} else {
33
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
34
+	}
32 35
 	b, err := request.ReadBody(body)
33 36
 	c.Assert(err, checker.IsNil)
34 37
 
... ...
@@ -47,8 +51,11 @@ func (s *DockerSuite) TestExecAPICreateNoValidContentType(c *check.C) {
47 47
 
48 48
 	res, body, err := request.Post(fmt.Sprintf("/containers/%s/exec", name), request.RawContent(ioutil.NopCloser(jsonData)), request.ContentType("test/plain"))
49 49
 	c.Assert(err, checker.IsNil)
50
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
51
-
50
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
51
+		c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError)
52
+	} else {
53
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
54
+	}
52 55
 	b, err := request.ReadBody(body)
53 56
 	c.Assert(err, checker.IsNil)
54 57
 
... ...
@@ -191,7 +198,11 @@ func (s *DockerSuite) TestExecAPIStartInvalidCommand(c *check.C) {
191 191
 	dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh")
192 192
 
193 193
 	id := createExecCmd(c, name, "invalid")
194
-	startExec(c, id, http.StatusBadRequest)
194
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
195
+		startExec(c, id, http.StatusNotFound)
196
+	} else {
197
+		startExec(c, id, http.StatusBadRequest)
198
+	}
195 199
 	waitForExec(c, id)
196 200
 
197 201
 	var inspectJSON struct{ ExecIDs []string }
... ...
@@ -88,7 +88,7 @@ func testIpcNonePrivateShareable(c *check.C, mode string, mustBeMounted bool, mu
88 88
  * /dev/shm mount inside the container.
89 89
  */
90 90
 func (s *DockerSuite) TestAPIIpcModeNone(c *check.C) {
91
-	testRequires(c, DaemonIsLinux)
91
+	testRequires(c, DaemonIsLinux, MinimumAPIVersion("1.32"))
92 92
 	testIpcNonePrivateShareable(c, "none", false, false)
93 93
 }
94 94
 
... ...
@@ -173,7 +173,7 @@ func (s *DockerSuite) TestAPIIpcModeShareableAndContainer(c *check.C) {
173 173
  * --ipc container:ID can NOT use IPC of another private container.
174 174
  */
175 175
 func (s *DockerSuite) TestAPIIpcModePrivateAndContainer(c *check.C) {
176
-	testRequires(c, DaemonIsLinux)
176
+	testRequires(c, DaemonIsLinux, MinimumAPIVersion("1.32"))
177 177
 	testIpcContainer(s, c, "private", false)
178 178
 }
179 179
 
... ...
@@ -149,6 +149,7 @@ func (s *DockerSuite) TestLogsAPIUntilFutureFollow(c *check.C) {
149 149
 }
150 150
 
151 151
 func (s *DockerSuite) TestLogsAPIUntil(c *check.C) {
152
+	testRequires(c, MinimumAPIVersion("1.34"))
152 153
 	name := "logsuntil"
153 154
 	dockerCmd(c, "run", "--name", name, "busybox", "/bin/sh", "-c", "for i in $(seq 1 3); do echo log$i; sleep 1; done")
154 155
 
... ...
@@ -11,6 +11,7 @@ import (
11 11
 	"github.com/docker/docker/api/types"
12 12
 	"github.com/docker/docker/api/types/filters"
13 13
 	"github.com/docker/docker/api/types/network"
14
+	"github.com/docker/docker/api/types/versions"
14 15
 	"github.com/docker/docker/integration-cli/checker"
15 16
 	"github.com/docker/docker/internal/test/request"
16 17
 	"github.com/go-check/check"
... ...
@@ -64,7 +65,18 @@ func (s *DockerSuite) TestAPINetworkCreateCheckDuplicate(c *check.C) {
64 64
 	c.Assert(isNetworkAvailable(c, name), checker.Equals, true)
65 65
 
66 66
 	// Creating another network with same name and CheckDuplicate must fail
67
-	createNetwork(c, configOnCheck, http.StatusConflict)
67
+	isOlderAPI := versions.LessThan(testEnv.DaemonAPIVersion(), "1.34")
68
+	expectedStatus := http.StatusConflict
69
+	if isOlderAPI {
70
+		// In the early test code it uses bool value to represent
71
+		// whether createNetwork() is expected to fail or not.
72
+		// Therefore, we use negation to handle the same logic after
73
+		// the code was changed in https://github.com/moby/moby/pull/35030
74
+		// -http.StatusCreated will also be checked as NOT equal to
75
+		// http.StatusCreated in createNetwork() function.
76
+		expectedStatus = -http.StatusCreated
77
+	}
78
+	createNetwork(c, configOnCheck, expectedStatus)
68 79
 
69 80
 	// Creating another network with same name and not CheckDuplicate must succeed
70 81
 	createNetwork(c, configNotCheck, http.StatusCreated)
... ...
@@ -202,7 +214,11 @@ func (s *DockerSuite) TestAPINetworkIPAMMultipleBridgeNetworks(c *check.C) {
202 202
 			IPAM:   ipam1,
203 203
 		},
204 204
 	}
205
-	createNetwork(c, config1, http.StatusForbidden)
205
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
206
+		createNetwork(c, config1, http.StatusInternalServerError)
207
+	} else {
208
+		createNetwork(c, config1, http.StatusForbidden)
209
+	}
206 210
 	c.Assert(isNetworkAvailable(c, "test1"), checker.Equals, false)
207 211
 
208 212
 	ipam2 := &network.IPAM{
... ...
@@ -239,7 +255,7 @@ func (s *DockerSuite) TestAPINetworkIPAMMultipleBridgeNetworks(c *check.C) {
239 239
 }
240 240
 
241 241
 func (s *DockerSuite) TestAPICreateDeletePredefinedNetworks(c *check.C) {
242
-	testRequires(c, DaemonIsLinux)
242
+	testRequires(c, DaemonIsLinux, SwarmInactive)
243 243
 	createDeletePredefinedNetwork(c, "bridge")
244 244
 	createDeletePredefinedNetwork(c, "none")
245 245
 	createDeletePredefinedNetwork(c, "host")
... ...
@@ -253,7 +269,17 @@ func createDeletePredefinedNetwork(c *check.C, name string) {
253 253
 			CheckDuplicate: true,
254 254
 		},
255 255
 	}
256
-	createNetwork(c, config, http.StatusForbidden)
256
+	expectedStatus := http.StatusForbidden
257
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.34") {
258
+		// In the early test code it uses bool value to represent
259
+		// whether createNetwork() is expected to fail or not.
260
+		// Therefore, we use negation to handle the same logic after
261
+		// the code was changed in https://github.com/moby/moby/pull/35030
262
+		// -http.StatusCreated will also be checked as NOT equal to
263
+		// http.StatusCreated in createNetwork() function.
264
+		expectedStatus = -http.StatusCreated
265
+	}
266
+	createNetwork(c, config, expectedStatus)
257 267
 	deleteNetwork(c, name, false)
258 268
 }
259 269
 
... ...
@@ -320,9 +346,13 @@ func createNetwork(c *check.C, config types.NetworkCreateRequest, expectedStatus
320 320
 	c.Assert(err, checker.IsNil)
321 321
 	defer resp.Body.Close()
322 322
 
323
-	c.Assert(resp.StatusCode, checker.Equals, expectedStatusCode)
323
+	if expectedStatusCode >= 0 {
324
+		c.Assert(resp.StatusCode, checker.Equals, expectedStatusCode)
325
+	} else {
326
+		c.Assert(resp.StatusCode, checker.Not(checker.Equals), -expectedStatusCode)
327
+	}
324 328
 
325
-	if expectedStatusCode == http.StatusCreated {
329
+	if expectedStatusCode == http.StatusCreated || expectedStatusCode < 0 {
326 330
 		var nr types.NetworkCreateResponse
327 331
 		err = json.NewDecoder(body).Decode(&nr)
328 332
 		c.Assert(err, checker.IsNil)
... ...
@@ -9,6 +9,7 @@ import (
9 9
 	"strings"
10 10
 
11 11
 	"github.com/docker/docker/api"
12
+	"github.com/docker/docker/api/types/versions"
12 13
 	"github.com/docker/docker/integration-cli/checker"
13 14
 	"github.com/docker/docker/internal/test/request"
14 15
 	"github.com/go-check/check"
... ...
@@ -59,7 +60,11 @@ func (s *DockerSuite) TestAPIClientVersionOldNotSupported(c *check.C) {
59 59
 func (s *DockerSuite) TestAPIErrorJSON(c *check.C) {
60 60
 	httpResp, body, err := request.Post("/containers/create", request.JSONBody(struct{}{}))
61 61
 	c.Assert(err, checker.IsNil)
62
-	c.Assert(httpResp.StatusCode, checker.Equals, http.StatusBadRequest)
62
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
63
+		c.Assert(httpResp.StatusCode, checker.Equals, http.StatusInternalServerError)
64
+	} else {
65
+		c.Assert(httpResp.StatusCode, checker.Equals, http.StatusBadRequest)
66
+	}
63 67
 	c.Assert(httpResp.Header.Get("Content-Type"), checker.Equals, "application/json")
64 68
 	b, err := request.ReadBody(body)
65 69
 	c.Assert(err, checker.IsNil)
... ...
@@ -72,7 +77,11 @@ func (s *DockerSuite) TestAPIErrorPlainText(c *check.C) {
72 72
 	testRequires(c, DaemonIsLinux)
73 73
 	httpResp, body, err := request.Post("/v1.23/containers/create", request.JSONBody(struct{}{}))
74 74
 	c.Assert(err, checker.IsNil)
75
-	c.Assert(httpResp.StatusCode, checker.Equals, http.StatusBadRequest)
75
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
76
+		c.Assert(httpResp.StatusCode, checker.Equals, http.StatusInternalServerError)
77
+	} else {
78
+		c.Assert(httpResp.StatusCode, checker.Equals, http.StatusBadRequest)
79
+	}
76 80
 	c.Assert(httpResp.Header.Get("Content-Type"), checker.Contains, "text/plain")
77 81
 	b, err := request.ReadBody(body)
78 82
 	c.Assert(err, checker.IsNil)
... ...
@@ -5953,6 +5953,10 @@ func (s *DockerSuite) TestBuildMulitStageResetScratch(c *check.C) {
5953 5953
 }
5954 5954
 
5955 5955
 func (s *DockerSuite) TestBuildIntermediateTarget(c *check.C) {
5956
+	//todo: need to be removed after 18.06 release
5957
+	if strings.Contains(testEnv.DaemonInfo.ServerVersion, "18.05.0") {
5958
+		c.Skip(fmt.Sprintf("Bug fixed in 18.06 or higher.Skipping it for %s", testEnv.DaemonInfo.ServerVersion))
5959
+	}
5956 5960
 	dockerfile := `
5957 5961
 		FROM busybox AS build-env
5958 5962
 		CMD ["/dev"]
... ...
@@ -3,6 +3,7 @@ package main
3 3
 import (
4 4
 	"strings"
5 5
 
6
+	"github.com/docker/docker/api/types/versions"
6 7
 	"github.com/docker/docker/integration-cli/checker"
7 8
 	"github.com/docker/docker/integration-cli/cli"
8 9
 	"github.com/go-check/check"
... ...
@@ -121,12 +122,14 @@ func (s *DockerSuite) TestCommitChange(c *check.C) {
121 121
 		"test", "test-commit")
122 122
 	imageID = strings.TrimSpace(imageID)
123 123
 
124
-	// The ordering here is due to `PATH` being overridden from the container's
125
-	// ENV.  On windows, the container doesn't have a `PATH` ENV variable so
126
-	// the ordering is the same as the cli.
127
-	expectedEnv := "[PATH=/foo DEBUG=true test=1]"
128
-	if testEnv.OSType == "windows" {
129
-		expectedEnv = "[DEBUG=true test=1 PATH=/foo]"
124
+	expectedEnv := "[DEBUG=true test=1 PATH=/foo]"
125
+	// bug fixed in 1.36, add min APi >= 1.36 requirement
126
+	// PR record https://github.com/moby/moby/pull/35582
127
+	if versions.GreaterThan(testEnv.DaemonAPIVersion(), "1.35") && testEnv.OSType != "windows" {
128
+		// The ordering here is due to `PATH` being overridden from the container's
129
+		// ENV.  On windows, the container doesn't have a `PATH` ENV variable so
130
+		// the ordering is the same as the cli.
131
+		expectedEnv = "[PATH=/foo DEBUG=true test=1]"
130 132
 	}
131 133
 
132 134
 	prefix, slash := getPrefixAndSlashFromDaemonPlatform()
... ...
@@ -463,5 +463,5 @@ func (s *DockerSuite) TestInspectInvalidReference(c *check.C) {
463 463
 	// This test should work on both Windows and Linux
464 464
 	out, _, err := dockerCmdWithError("inspect", "FooBar")
465 465
 	c.Assert(err, checker.NotNil)
466
-	c.Assert(out, checker.Contains, "no such image: FooBar")
466
+	c.Assert(out, checker.Contains, "invalid reference format: repository name must be lowercase")
467 467
 }
... ...
@@ -28,7 +28,9 @@ func (s *DockerSuite) TestLinksInvalidContainerTarget(c *check.C) {
28 28
 	// an invalid container target should produce an error
29 29
 	c.Assert(err, checker.NotNil, check.Commentf("out: %s", out))
30 30
 	// an invalid container target should produce an error
31
-	c.Assert(out, checker.Contains, "could not get container")
31
+	// note: convert the output to lowercase first as the error string
32
+	// capitalization was changed after API version 1.32
33
+	c.Assert(strings.ToLower(out), checker.Contains, "could not get container")
32 34
 }
33 35
 
34 36
 func (s *DockerSuite) TestLinksPingLinkedContainers(c *check.C) {
... ...
@@ -46,7 +46,7 @@ func (s *DockerSuite) TestNetHostname(c *check.C) {
46 46
 	c.Assert(out, checker.Contains, runconfig.ErrConflictNetworkHostname.Error())
47 47
 
48 48
 	out, _ = dockerCmdWithFail(c, "run", "--net=container", "busybox", "ps")
49
-	c.Assert(out, checker.Contains, "Invalid network mode: invalid container format container:<name|id>")
49
+	c.Assert(out, checker.Contains, "invalid container format container:<name|id>")
50 50
 
51 51
 	out, _ = dockerCmdWithFail(c, "run", "--net=weird", "busybox", "ps")
52 52
 	c.Assert(strings.ToLower(out), checker.Contains, "not found")
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	"strings"
8 8
 	"time"
9 9
 
10
+	"github.com/docker/docker/api/types/versions"
10 11
 	"github.com/docker/docker/integration-cli/checker"
11 12
 	"github.com/docker/docker/integration-cli/cli"
12 13
 	"github.com/docker/docker/integration-cli/cli/build"
... ...
@@ -200,11 +201,14 @@ func (s *DockerSuite) TestPsListContainersFilterStatus(c *check.C) {
200 200
 	c.Assert(RemoveOutputForExistingElements(containerOut, existingContainers), checker.Equals, secondID)
201 201
 
202 202
 	result := cli.Docker(cli.Args("ps", "-a", "-q", "--filter=status=rubbish"), cli.WithTimeout(time.Second*60))
203
+	err := "Invalid filter 'status=rubbish'"
204
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
205
+		err = "Unrecognised filter value for status: rubbish"
206
+	}
203 207
 	result.Assert(c, icmd.Expected{
204 208
 		ExitCode: 1,
205
-		Err:      "Invalid filter 'status=rubbish'",
209
+		Err:      err,
206 210
 	})
207
-
208 211
 	// Windows doesn't support pausing of containers
209 212
 	if testEnv.OSType != "windows" {
210 213
 		// pause running container
... ...
@@ -848,8 +852,7 @@ func (s *DockerSuite) TestPsListContainersFilterPorts(c *check.C) {
848 848
 }
849 849
 
850 850
 func (s *DockerSuite) TestPsNotShowLinknamesOfDeletedContainer(c *check.C) {
851
-	testRequires(c, DaemonIsLinux)
852
-
851
+	testRequires(c, DaemonIsLinux, MinimumAPIVersion("1.31"))
853 852
 	existingContainers := ExistingContainerNames(c)
854 853
 
855 854
 	dockerCmd(c, "create", "--name=aaa", "busybox", "top")
... ...
@@ -1165,7 +1165,7 @@ func (s *DockerSuite) TestLegacyRunNoNewPrivSetuid(c *check.C) {
1165 1165
 }
1166 1166
 
1167 1167
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChown(c *check.C) {
1168
-	testRequires(c, DaemonIsLinux)
1168
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
1169 1169
 	ensureSyscallTest(c)
1170 1170
 
1171 1171
 	// test that a root user has default capability CAP_CHOWN
... ...
@@ -1183,7 +1183,7 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChown(c *check.C) {
1183 1183
 }
1184 1184
 
1185 1185
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesDacOverride(c *check.C) {
1186
-	testRequires(c, DaemonIsLinux)
1186
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
1187 1187
 	ensureSyscallTest(c)
1188 1188
 
1189 1189
 	// test that a root user has default capability CAP_DAC_OVERRIDE
... ...
@@ -1196,7 +1196,7 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesDacOverride(c *check.C) {
1196 1196
 }
1197 1197
 
1198 1198
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesFowner(c *check.C) {
1199
-	testRequires(c, DaemonIsLinux)
1199
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
1200 1200
 	ensureSyscallTest(c)
1201 1201
 
1202 1202
 	// test that a root user has default capability CAP_FOWNER
... ...
@@ -1212,7 +1212,7 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesFowner(c *check.C) {
1212 1212
 // TODO CAP_KILL
1213 1213
 
1214 1214
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetuid(c *check.C) {
1215
-	testRequires(c, DaemonIsLinux)
1215
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
1216 1216
 	ensureSyscallTest(c)
1217 1217
 
1218 1218
 	// test that a root user has default capability CAP_SETUID
... ...
@@ -1230,7 +1230,7 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetuid(c *check.C) {
1230 1230
 }
1231 1231
 
1232 1232
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetgid(c *check.C) {
1233
-	testRequires(c, DaemonIsLinux)
1233
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
1234 1234
 	ensureSyscallTest(c)
1235 1235
 
1236 1236
 	// test that a root user has default capability CAP_SETGID
... ...
@@ -1250,7 +1250,7 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetgid(c *check.C) {
1250 1250
 // TODO CAP_SETPCAP
1251 1251
 
1252 1252
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetBindService(c *check.C) {
1253
-	testRequires(c, DaemonIsLinux)
1253
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
1254 1254
 	ensureSyscallTest(c)
1255 1255
 
1256 1256
 	// test that a root user has default capability CAP_NET_BIND_SERVICE
... ...
@@ -1268,7 +1268,7 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetBindService(c *check.C)
1268 1268
 }
1269 1269
 
1270 1270
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetRaw(c *check.C) {
1271
-	testRequires(c, DaemonIsLinux)
1271
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
1272 1272
 	ensureSyscallTest(c)
1273 1273
 
1274 1274
 	// test that a root user has default capability CAP_NET_RAW
... ...
@@ -1286,7 +1286,7 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetRaw(c *check.C) {
1286 1286
 }
1287 1287
 
1288 1288
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChroot(c *check.C) {
1289
-	testRequires(c, DaemonIsLinux)
1289
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
1290 1290
 	ensureSyscallTest(c)
1291 1291
 
1292 1292
 	// test that a root user has default capability CAP_SYS_CHROOT
... ...
@@ -1304,7 +1304,7 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChroot(c *check.C) {
1304 1304
 }
1305 1305
 
1306 1306
 func (s *DockerSuite) TestUserNoEffectiveCapabilitiesMknod(c *check.C) {
1307
-	testRequires(c, DaemonIsLinux, NotUserNamespace)
1307
+	testRequires(c, DaemonIsLinux, NotUserNamespace, SameHostDaemon)
1308 1308
 	ensureSyscallTest(c)
1309 1309
 
1310 1310
 	// test that a root user has default capability CAP_MKNOD
... ...
@@ -330,7 +330,9 @@ func listTar(f io.Reader) ([]string, error) {
330 330
 // The layer.tar file is actually zero bytes, no padding or anything else.
331 331
 // See issue: 18170
332 332
 func (s *DockerSuite) TestLoadZeroSizeLayer(c *check.C) {
333
-	testRequires(c, DaemonIsLinux)
333
+	// this will definitely not work if using remote daemon
334
+	// very weird test
335
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
334 336
 
335 337
 	dockerCmd(c, "load", "-i", "testdata/emptyLayer.tar")
336 338
 }
... ...
@@ -103,7 +103,7 @@ func (s *DockerSuite) TestStartPausedContainer(c *check.C) {
103 103
 	// an error should have been shown that you cannot start paused container
104 104
 	c.Assert(err, checker.NotNil, check.Commentf("out: %s", out))
105 105
 	// an error should have been shown that you cannot start paused container
106
-	c.Assert(out, checker.Contains, "cannot start a paused container, try unpause instead")
106
+	c.Assert(strings.ToLower(out), checker.Contains, "cannot start a paused container, try unpause instead")
107 107
 }
108 108
 
109 109
 func (s *DockerSuite) TestStartMultipleContainers(c *check.C) {
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	"net/http"
8 8
 	"strings"
9 9
 
10
+	"github.com/docker/docker/api/types/versions"
10 11
 	"github.com/docker/docker/integration-cli/checker"
11 12
 	"github.com/docker/docker/internal/test/request"
12 13
 	"github.com/go-check/check"
... ...
@@ -24,12 +25,15 @@ func (s *DockerSuite) TestDeprecatedContainerAPIStartHostConfig(c *check.C) {
24 24
 	}
25 25
 	res, body, err := request.Post("/containers/"+name+"/start", request.JSONBody(config))
26 26
 	c.Assert(err, checker.IsNil)
27
-
28
-	buf, err := request.ReadBody(body)
29
-	c.Assert(err, checker.IsNil)
30
-
31 27
 	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
32
-	c.Assert(string(buf), checker.Contains, "was deprecated since API v1.22")
28
+	if versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), "1.32") {
29
+		// assertions below won't work before 1.32
30
+		buf, err := request.ReadBody(body)
31
+		c.Assert(err, checker.IsNil)
32
+
33
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
34
+		c.Assert(string(buf), checker.Contains, "was deprecated since API v1.22")
35
+	}
33 36
 }
34 37
 
35 38
 func (s *DockerSuite) TestDeprecatedContainerAPIStartVolumeBinds(c *check.C) {
... ...
@@ -88,7 +92,11 @@ func (s *DockerSuite) TestDeprecatedContainerAPIStartDupVolumeBinds(c *check.C)
88 88
 	buf, err := request.ReadBody(body)
89 89
 	c.Assert(err, checker.IsNil)
90 90
 
91
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
91
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
92
+		c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError)
93
+	} else {
94
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
95
+	}
92 96
 	c.Assert(string(buf), checker.Contains, "Duplicate mount point", check.Commentf("Expected failure due to duplicate bind mounts to same path, instead got: %q with error: %v", string(buf), err))
93 97
 }
94 98
 
... ...
@@ -161,7 +169,11 @@ func (s *DockerSuite) TestDeprecatedStartWithTooLowMemoryLimit(c *check.C) {
161 161
 	c.Assert(err, checker.IsNil)
162 162
 	b, err2 := request.ReadBody(body)
163 163
 	c.Assert(err2, checker.IsNil)
164
-	c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
164
+	if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") {
165
+		c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError)
166
+	} else {
167
+		c.Assert(res.StatusCode, checker.Equals, http.StatusBadRequest)
168
+	}
165 169
 	c.Assert(string(b), checker.Contains, "Minimum memory limit allowed is 4MB")
166 170
 }
167 171
 
... ...
@@ -12,6 +12,8 @@ import (
12 12
 	"time"
13 13
 
14 14
 	"github.com/docker/docker/api/types"
15
+	"github.com/docker/docker/api/types/swarm"
16
+	"github.com/docker/docker/api/types/versions"
15 17
 	"github.com/docker/docker/client"
16 18
 	"github.com/docker/docker/integration-cli/requirement"
17 19
 	"github.com/docker/docker/internal/test/registry"
... ...
@@ -40,6 +42,12 @@ func DaemonIsLinux() bool {
40 40
 	return testEnv.OSType == "linux"
41 41
 }
42 42
 
43
+func MinimumAPIVersion(version string) func() bool {
44
+	return func() bool {
45
+		return versions.GreaterThanOrEqualTo(testEnv.DaemonAPIVersion(), version)
46
+	}
47
+}
48
+
43 49
 func OnlyDefaultNetworks() bool {
44 50
 	cli, err := client.NewEnvClient()
45 51
 	if err != nil {
... ...
@@ -109,6 +117,9 @@ func Network() bool {
109 109
 }
110 110
 
111 111
 func Apparmor() bool {
112
+	if strings.HasPrefix(testEnv.DaemonInfo.OperatingSystem, "SUSE Linux Enterprise Server ") {
113
+		return false
114
+	}
112 115
 	buf, err := ioutil.ReadFile("/sys/module/apparmor/parameters/enabled")
113 116
 	return err == nil && len(buf) > 1 && buf[0] == 'Y'
114 117
 }
... ...
@@ -193,6 +204,10 @@ func RegistryHosting() bool {
193 193
 	return err == nil
194 194
 }
195 195
 
196
+func SwarmInactive() bool {
197
+	return testEnv.DaemonInfo.Swarm.LocalNodeState == swarm.LocalNodeStateInactive
198
+}
199
+
196 200
 // testRequires checks if the environment satisfies the requirements
197 201
 // for the test to run or skips the tests.
198 202
 func testRequires(c requirement.SkipT, requirements ...requirement.Test) {
... ...
@@ -136,6 +136,7 @@ func buildContainerIdsFilter(buildOutput io.Reader) (filters.Args, error) {
136 136
 }
137 137
 
138 138
 func TestBuildMultiStageParentConfig(t *testing.T) {
139
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.35"), "broken in earlier versions")
139 140
 	dockerfile := `
140 141
 		FROM busybox AS stage0
141 142
 		ENV WHO=parent
... ...
@@ -204,6 +205,7 @@ func TestBuildWithEmptyLayers(t *testing.T) {
204 204
 // multiple subsequent stages
205 205
 // #35652
206 206
 func TestBuildMultiStageOnBuild(t *testing.T) {
207
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.33"), "broken in earlier versions")
207 208
 	defer setupTest(t)()
208 209
 	// test both metadata and layer based commands as they may be implemented differently
209 210
 	dockerfile := `FROM busybox AS stage1
... ...
@@ -7,13 +7,16 @@ import (
7 7
 
8 8
 	"github.com/docker/docker/api/types"
9 9
 	"github.com/docker/docker/api/types/strslice"
10
+	"github.com/docker/docker/api/types/versions"
10 11
 	"github.com/docker/docker/integration/internal/container"
11 12
 	"github.com/docker/docker/internal/test/request"
12 13
 	"github.com/gotestyourself/gotestyourself/assert"
13 14
 	is "github.com/gotestyourself/gotestyourself/assert/cmp"
15
+	"github.com/gotestyourself/gotestyourself/skip"
14 16
 )
15 17
 
16 18
 func TestExec(t *testing.T) {
19
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.35"), "broken in earlier versions")
17 20
 	defer setupTest(t)()
18 21
 	ctx := context.Background()
19 22
 	client := request.NewAPIClient(t)
... ...
@@ -9,6 +9,7 @@ import (
9 9
 	"github.com/docker/docker/api/types"
10 10
 	"github.com/docker/docker/api/types/events"
11 11
 	"github.com/docker/docker/api/types/filters"
12
+	"github.com/docker/docker/api/types/versions"
12 13
 	"github.com/docker/docker/integration/internal/container"
13 14
 	"github.com/docker/docker/internal/test/request"
14 15
 	"github.com/docker/docker/internal/testutil"
... ...
@@ -66,6 +67,7 @@ func TestPauseFailsOnWindowsServerContainers(t *testing.T) {
66 66
 
67 67
 func TestPauseStopPausedContainer(t *testing.T) {
68 68
 	skip.If(t, testEnv.DaemonInfo.OSType != "linux")
69
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.31"), "broken in earlier versions")
69 70
 
70 71
 	defer setupTest(t)()
71 72
 	client := request.NewAPIClient(t)
... ...
@@ -8,6 +8,7 @@ import (
8 8
 	"github.com/docker/docker/api/types"
9 9
 	containertypes "github.com/docker/docker/api/types/container"
10 10
 	"github.com/docker/docker/api/types/network"
11
+	"github.com/docker/docker/api/types/versions"
11 12
 	"github.com/docker/docker/integration/internal/container"
12 13
 	"github.com/docker/docker/internal/test/request"
13 14
 	"github.com/docker/docker/internal/testutil"
... ...
@@ -23,6 +24,7 @@ import (
23 23
 // and then deleting and recreating the source container linked to the new target.
24 24
 // This checks that "rename" updates source container correctly and doesn't set it to null.
25 25
 func TestRenameLinkedContainer(t *testing.T) {
26
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.32"), "broken in earlier versions")
26 27
 	defer setupTest(t)()
27 28
 	ctx := context.Background()
28 29
 	client := request.NewAPIClient(t)
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	"time"
8 8
 
9 9
 	"github.com/docker/docker/api/types"
10
+	"github.com/docker/docker/api/types/versions"
10 11
 	"github.com/docker/docker/integration/internal/container"
11 12
 	"github.com/docker/docker/internal/test/request"
12 13
 	req "github.com/docker/docker/internal/test/request"
... ...
@@ -14,6 +15,7 @@ import (
14 14
 	"github.com/gotestyourself/gotestyourself/assert"
15 15
 	is "github.com/gotestyourself/gotestyourself/assert/cmp"
16 16
 	"github.com/gotestyourself/gotestyourself/poll"
17
+	"github.com/gotestyourself/gotestyourself/skip"
17 18
 )
18 19
 
19 20
 func TestResize(t *testing.T) {
... ...
@@ -33,6 +35,7 @@ func TestResize(t *testing.T) {
33 33
 }
34 34
 
35 35
 func TestResizeWithInvalidSize(t *testing.T) {
36
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.32"), "broken in earlier versions")
36 37
 	defer setupTest(t)()
37 38
 	client := request.NewAPIClient(t)
38 39
 	ctx := context.Background()
... ...
@@ -43,7 +43,8 @@ func TestStopContainerWithRestartPolicyAlways(t *testing.T) {
43 43
 }
44 44
 
45 45
 func TestDeleteDevicemapper(t *testing.T) {
46
-	skip.IfCondition(t, testEnv.DaemonInfo.Driver != "devicemapper")
46
+	skip.If(t, testEnv.DaemonInfo.Driver != "devicemapper")
47
+	skip.If(t, testEnv.IsRemoteDaemon, "cannot start daemon on remote test run")
47 48
 
48 49
 	defer setupTest(t)()
49 50
 	client := request.NewAPIClient(t)
... ...
@@ -5,13 +5,16 @@ import (
5 5
 	"testing"
6 6
 
7 7
 	"github.com/docker/docker/api/types"
8
+	"github.com/docker/docker/api/types/versions"
8 9
 	"github.com/docker/docker/integration/internal/container"
9 10
 	"github.com/docker/docker/internal/test/request"
10 11
 	"github.com/gotestyourself/gotestyourself/assert"
11 12
 	is "github.com/gotestyourself/gotestyourself/assert/cmp"
13
+	"github.com/gotestyourself/gotestyourself/skip"
12 14
 )
13 15
 
14 16
 func TestCommitInheritsEnv(t *testing.T) {
17
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.36"), "broken in earlier versions")
15 18
 	defer setupTest(t)()
16 19
 	client := request.NewAPIClient(t)
17 20
 	ctx := context.Background()
... ...
@@ -5,9 +5,11 @@ import (
5 5
 	"testing"
6 6
 
7 7
 	"github.com/docker/docker/api/types"
8
+	"github.com/docker/docker/api/types/versions"
8 9
 	"github.com/docker/docker/internal/test/request"
9 10
 	"github.com/gotestyourself/gotestyourself/assert"
10 11
 	is "github.com/gotestyourself/gotestyourself/assert/cmp"
12
+	"github.com/gotestyourself/gotestyourself/skip"
11 13
 )
12 14
 
13 15
 func containsNetwork(nws []types.NetworkResource, nw types.NetworkCreateResponse) bool {
... ...
@@ -48,6 +50,7 @@ func createAmbiguousNetworks(t *testing.T) (types.NetworkCreateResponse, types.N
48 48
 // equal to another network's ID exists, the Network with the given
49 49
 // ID is removed, and not the network with the given name.
50 50
 func TestDockerNetworkDeletePreferID(t *testing.T) {
51
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.34"), "broken in earlier versions")
51 52
 	defer setupTest(t)()
52 53
 	client := request.NewAPIClient(t)
53 54
 	ctx := context.Background()
... ...
@@ -13,6 +13,7 @@ import (
13 13
 	"github.com/gotestyourself/gotestyourself/assert"
14 14
 	"github.com/gotestyourself/gotestyourself/icmd"
15 15
 	"github.com/gotestyourself/gotestyourself/poll"
16
+	"github.com/gotestyourself/gotestyourself/skip"
16 17
 )
17 18
 
18 19
 // delInterface removes given network interface
... ...
@@ -23,6 +24,7 @@ func delInterface(t *testing.T, ifName string) {
23 23
 }
24 24
 
25 25
 func TestDaemonRestartWithLiveRestore(t *testing.T) {
26
+	skip.If(t, testEnv.IsRemoteDaemon())
26 27
 	d := daemon.New(t)
27 28
 	defer d.Stop(t)
28 29
 	d.Start(t)
... ...
@@ -42,6 +44,7 @@ func TestDaemonRestartWithLiveRestore(t *testing.T) {
42 42
 
43 43
 func TestDaemonDefaultNetworkPools(t *testing.T) {
44 44
 	// Remove docker0 bridge and the start daemon defining the predefined address pools
45
+	skip.If(t, testEnv.IsRemoteDaemon())
45 46
 	defaultNetworkBridge := "docker0"
46 47
 	delInterface(t, defaultNetworkBridge)
47 48
 	d := daemon.New(t)
... ...
@@ -86,6 +89,7 @@ func TestDaemonDefaultNetworkPools(t *testing.T) {
86 86
 }
87 87
 
88 88
 func TestDaemonRestartWithExistingNetwork(t *testing.T) {
89
+	skip.If(t, testEnv.IsRemoteDaemon())
89 90
 	defaultNetworkBridge := "docker0"
90 91
 	d := daemon.New(t)
91 92
 	d.Start(t)
... ...
@@ -119,6 +123,7 @@ func TestDaemonRestartWithExistingNetwork(t *testing.T) {
119 119
 }
120 120
 
121 121
 func TestDaemonRestartWithExistingNetworkWithDefaultPoolRange(t *testing.T) {
122
+	skip.If(t, testEnv.IsRemoteDaemon())
122 123
 	defaultNetworkBridge := "docker0"
123 124
 	d := daemon.New(t)
124 125
 	d.Start(t)
... ...
@@ -174,6 +179,7 @@ func TestDaemonRestartWithExistingNetworkWithDefaultPoolRange(t *testing.T) {
174 174
 }
175 175
 
176 176
 func TestDaemonWithBipAndDefaultNetworkPool(t *testing.T) {
177
+	skip.If(t, testEnv.IsRemoteDaemon())
177 178
 	defaultNetworkBridge := "docker0"
178 179
 	d := daemon.New(t)
179 180
 	defer d.Stop(t)
... ...
@@ -13,15 +13,18 @@ import (
13 13
 	"github.com/docker/docker/api/types"
14 14
 	"github.com/docker/docker/api/types/filters"
15 15
 	"github.com/docker/docker/api/types/strslice"
16
+	"github.com/docker/docker/api/types/versions"
16 17
 	"github.com/docker/docker/integration/internal/container"
17 18
 	"github.com/docker/docker/internal/test/request"
18 19
 	req "github.com/docker/docker/internal/test/request"
19 20
 	"github.com/docker/docker/pkg/jsonmessage"
20 21
 	"github.com/gotestyourself/gotestyourself/assert"
21 22
 	is "github.com/gotestyourself/gotestyourself/assert/cmp"
23
+	"github.com/gotestyourself/gotestyourself/skip"
22 24
 )
23 25
 
24
-func TestEvents(t *testing.T) {
26
+func TestEventsExecDie(t *testing.T) {
27
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.36"), "broken in earlier versions")
25 28
 	defer setupTest(t)()
26 29
 	ctx := context.Background()
27 30
 	client := request.NewAPIClient(t)
... ...
@@ -54,9 +54,9 @@ func TestVolumesRemove(t *testing.T) {
54 54
 	client := request.NewAPIClient(t)
55 55
 	ctx := context.Background()
56 56
 
57
-	prefix, _ := getPrefixAndSlashFromDaemonPlatform()
57
+	prefix, slash := getPrefixAndSlashFromDaemonPlatform()
58 58
 
59
-	id := container.Create(t, ctx, client, container.WithVolume(prefix+"foo"))
59
+	id := container.Create(t, ctx, client, container.WithVolume(prefix+slash+"foo"))
60 60
 
61 61
 	c, err := client.ContainerInspect(ctx, id)
62 62
 	assert.NilError(t, err)
... ...
@@ -75,6 +75,7 @@ func TestVolumesRemove(t *testing.T) {
75 75
 }
76 76
 
77 77
 func TestVolumesInspect(t *testing.T) {
78
+	skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
78 79
 	defer setupTest(t)()
79 80
 	client := request.NewAPIClient(t)
80 81
 	ctx := context.Background()