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>
| ... | ... |
@@ -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() |