mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Migrate some ipc container test from integration-cli to integration
This fix migrates some ipc container tests from integration-cli to integration test. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
This commit is contained in:
parent
09f5e9dae3
commit
80c92c9b69
2 changed files with 65 additions and 66 deletions
|
|
@ -4,7 +4,6 @@ package main
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
@ -46,71 +45,6 @@ func testIpcCheckDevExists(mm string) (bool, error) {
|
||||||
return false, s.Err()
|
return false, s.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
// testIpcContainer is a helper function to test --ipc container:NNN mode in various scenarios
|
|
||||||
func testIpcContainer(s *DockerSuite, c *check.C, donorMode string, mustWork bool) {
|
|
||||||
cfg := container.Config{
|
|
||||||
Image: "busybox",
|
|
||||||
Cmd: []string{"top"},
|
|
||||||
}
|
|
||||||
hostCfg := container.HostConfig{
|
|
||||||
IpcMode: container.IpcMode(donorMode),
|
|
||||||
}
|
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
client := testEnv.APIClient()
|
|
||||||
|
|
||||||
// create and start the "donor" container
|
|
||||||
resp, err := client.ContainerCreate(ctx, &cfg, &hostCfg, nil, "")
|
|
||||||
c.Assert(err, checker.IsNil)
|
|
||||||
c.Assert(len(resp.Warnings), checker.Equals, 0)
|
|
||||||
name1 := resp.ID
|
|
||||||
|
|
||||||
err = client.ContainerStart(ctx, name1, types.ContainerStartOptions{})
|
|
||||||
c.Assert(err, checker.IsNil)
|
|
||||||
|
|
||||||
// create and start the second container
|
|
||||||
hostCfg.IpcMode = container.IpcMode("container:" + name1)
|
|
||||||
resp, err = client.ContainerCreate(ctx, &cfg, &hostCfg, nil, "")
|
|
||||||
c.Assert(err, checker.IsNil)
|
|
||||||
c.Assert(len(resp.Warnings), checker.Equals, 0)
|
|
||||||
name2 := resp.ID
|
|
||||||
|
|
||||||
err = client.ContainerStart(ctx, name2, types.ContainerStartOptions{})
|
|
||||||
if !mustWork {
|
|
||||||
// start should fail with a specific error
|
|
||||||
c.Assert(err, checker.NotNil)
|
|
||||||
c.Assert(fmt.Sprintf("%v", err), checker.Contains, "non-shareable IPC")
|
|
||||||
// no more checks to perform here
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// start should succeed
|
|
||||||
c.Assert(err, checker.IsNil)
|
|
||||||
|
|
||||||
// check that IPC is shared
|
|
||||||
// 1. create a file in the first container
|
|
||||||
cli.DockerCmd(c, "exec", name1, "sh", "-c", "printf covfefe > /dev/shm/bar")
|
|
||||||
// 2. check it's the same file in the second one
|
|
||||||
out := cli.DockerCmd(c, "exec", "-i", name2, "cat", "/dev/shm/bar").Combined()
|
|
||||||
c.Assert(out, checker.Matches, "^covfefe$")
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TestAPIIpcModeShareableAndContainer checks that a container created with
|
|
||||||
* --ipc container:ID can use IPC of another shareable container.
|
|
||||||
*/
|
|
||||||
func (s *DockerSuite) TestAPIIpcModeShareableAndContainer(c *check.C) {
|
|
||||||
testRequires(c, DaemonIsLinux)
|
|
||||||
testIpcContainer(s, c, "shareable", true)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TestAPIIpcModePrivateAndContainer checks that a container created with
|
|
||||||
* --ipc container:ID can NOT use IPC of another private container.
|
|
||||||
*/
|
|
||||||
func (s *DockerSuite) TestAPIIpcModePrivateAndContainer(c *check.C) {
|
|
||||||
testRequires(c, DaemonIsLinux, MinimumAPIVersion("1.32"))
|
|
||||||
testIpcContainer(s, c, "private", false)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TestAPIIpcModeHost checks that a container created with --ipc host
|
/* TestAPIIpcModeHost checks that a container created with --ipc host
|
||||||
* can use IPC of the host system.
|
* can use IPC of the host system.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -114,3 +114,68 @@ func TestIpcModeShareable(t *testing.T) {
|
||||||
|
|
||||||
testIpcNonePrivateShareable(t, "shareable", true, true)
|
testIpcNonePrivateShareable(t, "shareable", true, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// testIpcContainer is a helper function to test --ipc container:NNN mode in various scenarios
|
||||||
|
func testIpcContainer(t *testing.T, donorMode string, mustWork bool) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
defer setupTest(t)()
|
||||||
|
|
||||||
|
cfg := containertypes.Config{
|
||||||
|
Image: "busybox",
|
||||||
|
Cmd: []string{"top"},
|
||||||
|
}
|
||||||
|
hostCfg := containertypes.HostConfig{
|
||||||
|
IpcMode: containertypes.IpcMode(donorMode),
|
||||||
|
}
|
||||||
|
ctx := context.Background()
|
||||||
|
client := request.NewAPIClient(t)
|
||||||
|
|
||||||
|
// create and start the "donor" container
|
||||||
|
resp, err := client.ContainerCreate(ctx, &cfg, &hostCfg, nil, "")
|
||||||
|
assert.NilError(t, err)
|
||||||
|
assert.Check(t, is.Equal(len(resp.Warnings), 0))
|
||||||
|
name1 := resp.ID
|
||||||
|
|
||||||
|
err = client.ContainerStart(ctx, name1, types.ContainerStartOptions{})
|
||||||
|
assert.NilError(t, err)
|
||||||
|
|
||||||
|
// create and start the second container
|
||||||
|
hostCfg.IpcMode = containertypes.IpcMode("container:" + name1)
|
||||||
|
resp, err = client.ContainerCreate(ctx, &cfg, &hostCfg, nil, "")
|
||||||
|
assert.NilError(t, err)
|
||||||
|
assert.Check(t, is.Equal(len(resp.Warnings), 0))
|
||||||
|
name2 := resp.ID
|
||||||
|
|
||||||
|
err = client.ContainerStart(ctx, name2, types.ContainerStartOptions{})
|
||||||
|
if !mustWork {
|
||||||
|
// start should fail with a specific error
|
||||||
|
assert.Check(t, is.ErrorContains(err, "non-shareable IPC"))
|
||||||
|
// no more checks to perform here
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// start should succeed
|
||||||
|
assert.NilError(t, err)
|
||||||
|
|
||||||
|
// check that IPC is shared
|
||||||
|
// 1. create a file in the first container
|
||||||
|
_, err = container.Exec(ctx, client, name1, []string{"sh", "-c", "printf covfefe > /dev/shm/bar"})
|
||||||
|
assert.NilError(t, err)
|
||||||
|
// 2. check it's the same file in the second one
|
||||||
|
result, err := container.Exec(ctx, client, name2, []string{"cat", "/dev/shm/bar"})
|
||||||
|
assert.NilError(t, err)
|
||||||
|
out := result.Combined()
|
||||||
|
assert.Check(t, is.Equal(true, regexp.MustCompile("^covfefe$").MatchString(out)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestAPIIpcModeShareableAndPrivate checks that
|
||||||
|
// 1) a container created with --ipc container:ID can use IPC of another shareable container.
|
||||||
|
// 2) a container created with --ipc container:ID can NOT use IPC of another private container.
|
||||||
|
func TestAPIIpcModeShareableAndContainer(t *testing.T) {
|
||||||
|
skip.If(t, testEnv.DaemonInfo.OSType != "linux")
|
||||||
|
|
||||||
|
testIpcContainer(t, "shareable", true)
|
||||||
|
|
||||||
|
testIpcContainer(t, "private", false)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue