7781a1bf |
// +build linux |
9c4570a9 |
package main
import ( |
863ab9ab |
"os" |
21ecd5a9 |
"path/filepath"
"strings"
|
33968e6c |
"github.com/docker/docker/integration-cli/checker" |
c54b717c |
"github.com/docker/docker/pkg/mount" |
21ecd5a9 |
"github.com/go-check/check" |
92427b3a |
"github.com/gotestyourself/gotestyourself/icmd" |
069fdc8a |
"golang.org/x/sys/unix" |
9c4570a9 |
)
|
006d58d7 |
// TestDaemonRestartWithPluginEnabled tests state restore for an enabled plugin
func (s *DockerDaemonSuite) TestDaemonRestartWithPluginEnabled(c *check.C) { |
ebff8c79 |
testRequires(c, IsAmd64, Network) |
7781a1bf |
|
c502fb49 |
s.d.Start(c) |
511a7058 |
|
a08ffa0e |
if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { |
006d58d7 |
c.Fatalf("Could not install plugin: %v %s", err, out) |
511a7058 |
}
|
6d36431e |
defer func() { |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { |
6d36431e |
c.Fatalf("Could not disable plugin: %v %s", err, out)
} |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { |
6d36431e |
c.Fatalf("Could not remove plugin: %v %s", err, out)
}
}()
|
c502fb49 |
s.d.Restart(c) |
9c4570a9 |
|
006d58d7 |
out, err := s.d.Cmd("plugin", "ls") |
9c4570a9 |
if err != nil { |
006d58d7 |
c.Fatalf("Could not list plugins: %v %s", err, out) |
9c4570a9 |
} |
a08ffa0e |
c.Assert(out, checker.Contains, pName) |
006d58d7 |
c.Assert(out, checker.Contains, "true")
} |
9c4570a9 |
|
4d009084 |
// TestDaemonRestartWithPluginDisabled tests state restore for a disabled plugin |
006d58d7 |
func (s *DockerDaemonSuite) TestDaemonRestartWithPluginDisabled(c *check.C) { |
ebff8c79 |
testRequires(c, IsAmd64, Network) |
7781a1bf |
|
c502fb49 |
s.d.Start(c) |
9c4570a9 |
|
a08ffa0e |
if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName, "--disable"); err != nil { |
006d58d7 |
c.Fatalf("Could not install plugin: %v %s", err, out) |
9c4570a9 |
}
|
6d36431e |
defer func() { |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { |
6d36431e |
c.Fatalf("Could not remove plugin: %v %s", err, out)
}
}()
|
c502fb49 |
s.d.Restart(c) |
9c4570a9 |
|
006d58d7 |
out, err := s.d.Cmd("plugin", "ls")
if err != nil {
c.Fatalf("Could not list plugins: %v %s", err, out) |
e07d78d2 |
} |
a08ffa0e |
c.Assert(out, checker.Contains, pName) |
006d58d7 |
c.Assert(out, checker.Contains, "false") |
9c4570a9 |
} |
863ab9ab |
|
4a44cf1d |
// TestDaemonKillLiveRestoreWithPlugins SIGKILLs daemon started with --live-restore.
// Plugins should continue to run.
func (s *DockerDaemonSuite) TestDaemonKillLiveRestoreWithPlugins(c *check.C) { |
ebff8c79 |
testRequires(c, IsAmd64, Network) |
7781a1bf |
|
c502fb49 |
s.d.Start(c, "--live-restore") |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { |
863ab9ab |
c.Fatalf("Could not install plugin: %v %s", err, out)
}
defer func() { |
c502fb49 |
s.d.Restart(c, "--live-restore") |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { |
863ab9ab |
c.Fatalf("Could not disable plugin: %v %s", err, out)
} |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { |
863ab9ab |
c.Fatalf("Could not remove plugin: %v %s", err, out)
}
}()
if err := s.d.Kill(); err != nil {
c.Fatalf("Could not kill daemon: %v", err) |
4a44cf1d |
}
|
87e3fcfe |
icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) |
4a44cf1d |
}
// TestDaemonShutdownLiveRestoreWithPlugins SIGTERMs daemon started with --live-restore.
// Plugins should continue to run.
func (s *DockerDaemonSuite) TestDaemonShutdownLiveRestoreWithPlugins(c *check.C) { |
ebff8c79 |
testRequires(c, IsAmd64, Network) |
7781a1bf |
|
c502fb49 |
s.d.Start(c, "--live-restore") |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { |
4a44cf1d |
c.Fatalf("Could not install plugin: %v %s", err, out)
}
defer func() { |
c502fb49 |
s.d.Restart(c, "--live-restore") |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { |
4a44cf1d |
c.Fatalf("Could not disable plugin: %v %s", err, out)
} |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { |
4a44cf1d |
c.Fatalf("Could not remove plugin: %v %s", err, out)
}
}()
|
48de91a3 |
if err := s.d.Interrupt(); err != nil { |
4a44cf1d |
c.Fatalf("Could not kill daemon: %v", err) |
863ab9ab |
}
|
87e3fcfe |
icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) |
863ab9ab |
}
// TestDaemonShutdownWithPlugins shuts down running plugins.
func (s *DockerDaemonSuite) TestDaemonShutdownWithPlugins(c *check.C) { |
cb663317 |
testRequires(c, IsAmd64, Network, SameHostDaemon) |
7781a1bf |
|
c502fb49 |
s.d.Start(c) |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { |
863ab9ab |
c.Fatalf("Could not install plugin: %v %s", err, out)
}
defer func() { |
c502fb49 |
s.d.Restart(c) |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { |
863ab9ab |
c.Fatalf("Could not disable plugin: %v %s", err, out)
} |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { |
863ab9ab |
c.Fatalf("Could not remove plugin: %v %s", err, out)
}
}()
|
48de91a3 |
if err := s.d.Interrupt(); err != nil { |
863ab9ab |
c.Fatalf("Could not kill daemon: %v", err)
}
|
64483c3b |
for { |
069fdc8a |
if err := unix.Kill(s.d.Pid(), 0); err == unix.ESRCH { |
64483c3b |
break
}
} |
863ab9ab |
|
87e3fcfe |
icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Expected{
ExitCode: 1, |
303b1d20 |
Error: "exit status 1", |
87e3fcfe |
}) |
cb663317 |
|
b748debb |
s.d.Start(c)
icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success)
}
// TestDaemonKillWithPlugins leaves plugins running.
func (s *DockerDaemonSuite) TestDaemonKillWithPlugins(c *check.C) {
testRequires(c, IsAmd64, Network, SameHostDaemon)
s.d.Start(c)
if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil {
c.Fatalf("Could not install plugin: %v %s", err, out)
}
defer func() {
s.d.Restart(c)
if out, err := s.d.Cmd("plugin", "disable", pName); err != nil {
c.Fatalf("Could not disable plugin: %v %s", err, out)
}
if out, err := s.d.Cmd("plugin", "remove", pName); err != nil {
c.Fatalf("Could not remove plugin: %v %s", err, out)
}
}()
if err := s.d.Kill(); err != nil {
c.Fatalf("Could not kill daemon: %v", err)
}
// assert that plugins are running. |
87e3fcfe |
icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) |
863ab9ab |
} |
21ecd5a9 |
// TestVolumePlugin tests volume creation using a plugin.
func (s *DockerDaemonSuite) TestVolumePlugin(c *check.C) { |
ebff8c79 |
testRequires(c, IsAmd64, Network) |
7781a1bf |
|
21ecd5a9 |
volName := "plugin-volume"
destDir := "/tmp/data/"
destFile := "foo"
|
c502fb49 |
s.d.Start(c) |
a08ffa0e |
out, err := s.d.Cmd("plugin", "install", pName, "--grant-all-permissions") |
21ecd5a9 |
if err != nil {
c.Fatalf("Could not install plugin: %v %s", err, out)
} |
c54b717c |
pluginID, err := s.d.Cmd("plugin", "inspect", "-f", "{{.Id}}", pName)
pluginID = strings.TrimSpace(pluginID)
if err != nil {
c.Fatalf("Could not retrieve plugin ID: %v %s", err, pluginID)
}
mountpointPrefix := filepath.Join(s.d.RootDir(), "plugins", pluginID, "rootfs") |
21ecd5a9 |
defer func() { |
a08ffa0e |
if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { |
21ecd5a9 |
c.Fatalf("Could not disable plugin: %v %s", err, out)
} |
c54b717c |
|
a08ffa0e |
if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { |
21ecd5a9 |
c.Fatalf("Could not remove plugin: %v %s", err, out)
} |
c54b717c |
exists, err := existsMountpointWithPrefix(mountpointPrefix)
c.Assert(err, checker.IsNil)
c.Assert(exists, checker.Equals, false)
|
21ecd5a9 |
}()
|
a08ffa0e |
out, err = s.d.Cmd("volume", "create", "-d", pName, volName) |
21ecd5a9 |
if err != nil {
c.Fatalf("Could not create volume: %v %s", err, out)
}
defer func() {
if out, err := s.d.Cmd("volume", "remove", volName); err != nil {
c.Fatalf("Could not remove volume: %v %s", err, out)
}
}()
|
59c45f7c |
out, err = s.d.Cmd("volume", "ls")
if err != nil {
c.Fatalf("Could not list volume: %v %s", err, out)
}
c.Assert(out, checker.Contains, volName) |
a08ffa0e |
c.Assert(out, checker.Contains, pName) |
59c45f7c |
|
21ecd5a9 |
mountPoint, err := s.d.Cmd("volume", "inspect", volName, "--format", "{{.Mountpoint}}")
if err != nil {
c.Fatalf("Could not inspect volume: %v %s", err, mountPoint)
}
mountPoint = strings.TrimSpace(mountPoint)
out, err = s.d.Cmd("run", "--rm", "-v", volName+":"+destDir, "busybox", "touch", destDir+destFile)
c.Assert(err, checker.IsNil, check.Commentf(out)) |
c54b717c |
path := filepath.Join(s.d.RootDir(), "plugins", pluginID, "rootfs", mountPoint, destFile) |
21ecd5a9 |
_, err = os.Lstat(path)
c.Assert(err, checker.IsNil)
|
c54b717c |
exists, err := existsMountpointWithPrefix(mountpointPrefix)
c.Assert(err, checker.IsNil)
c.Assert(exists, checker.Equals, true)
}
|
50021047 |
func (s *DockerDaemonSuite) TestGraphdriverPlugin(c *check.C) { |
677fa036 |
testRequires(c, Network, IsAmd64, DaemonIsLinux, overlay2Supported, ExperimentalDaemon) |
50021047 |
s.d.Start(c)
// install the plugin
plugin := "cpuguy83/docker-overlay2-graphdriver-plugin"
out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", plugin)
c.Assert(err, checker.IsNil, check.Commentf(out))
// restart the daemon with the plugin set as the storage driver |
e4ebc92e |
s.d.Restart(c, "-s", plugin, "--storage-opt", "overlay2.override_kernel_check=1") |
50021047 |
// run a container
out, err = s.d.Cmd("run", "--rm", "busybox", "true") // this will pull busybox using the plugin
c.Assert(err, checker.IsNil, check.Commentf(out))
}
|
6ef1060c |
func (s *DockerDaemonSuite) TestPluginVolumeRemoveOnRestart(c *check.C) {
testRequires(c, DaemonIsLinux, Network, IsAmd64)
s.d.Start(c, "--live-restore=true")
out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName)
c.Assert(err, checker.IsNil, check.Commentf(out))
c.Assert(strings.TrimSpace(out), checker.Contains, pName)
out, err = s.d.Cmd("volume", "create", "--driver", pName, "test")
c.Assert(err, checker.IsNil, check.Commentf(out))
s.d.Restart(c, "--live-restore=true")
out, err = s.d.Cmd("plugin", "disable", pName)
c.Assert(err, checker.NotNil, check.Commentf(out))
c.Assert(out, checker.Contains, "in use") |
8cb2229c |
out, err = s.d.Cmd("volume", "rm", "test")
c.Assert(err, checker.IsNil, check.Commentf(out))
out, err = s.d.Cmd("plugin", "disable", pName)
c.Assert(err, checker.IsNil, check.Commentf(out))
out, err = s.d.Cmd("plugin", "rm", pName)
c.Assert(err, checker.IsNil, check.Commentf(out)) |
6ef1060c |
}
|
c54b717c |
func existsMountpointWithPrefix(mountpointPrefix string) (bool, error) {
mounts, err := mount.GetMounts()
if err != nil {
return false, err
}
for _, mnt := range mounts {
if strings.HasPrefix(mnt.Mountpoint, mountpointPrefix) {
return true, nil
}
}
return false, nil |
21ecd5a9 |
} |
a66e0dc3 |
func (s *DockerDaemonSuite) TestPluginListFilterEnabled(c *check.C) { |
362d082b |
testRequires(c, IsAmd64, Network) |
a66e0dc3 |
s.d.Start(c)
out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable")
c.Assert(err, check.IsNil, check.Commentf(out))
defer func() {
if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil {
c.Fatalf("Could not remove plugin: %v %s", err, out)
}
}()
out, err = s.d.Cmd("plugin", "ls", "--filter", "enabled=true")
c.Assert(err, checker.IsNil)
c.Assert(out, checker.Not(checker.Contains), pName)
out, err = s.d.Cmd("plugin", "ls", "--filter", "enabled=false")
c.Assert(err, checker.IsNil)
c.Assert(out, checker.Contains, pName)
c.Assert(out, checker.Contains, "false")
out, err = s.d.Cmd("plugin", "ls")
c.Assert(err, checker.IsNil)
c.Assert(out, checker.Contains, pName)
} |
99d91ada |
func (s *DockerDaemonSuite) TestPluginListFilterCapability(c *check.C) { |
362d082b |
testRequires(c, IsAmd64, Network) |
99d91ada |
s.d.Start(c)
out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable")
c.Assert(err, check.IsNil, check.Commentf(out))
defer func() {
if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil {
c.Fatalf("Could not remove plugin: %v %s", err, out)
}
}()
out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=volumedriver")
c.Assert(err, checker.IsNil)
c.Assert(out, checker.Contains, pName)
out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=authz")
c.Assert(err, checker.IsNil)
c.Assert(out, checker.Not(checker.Contains), pName)
out, err = s.d.Cmd("plugin", "ls")
c.Assert(err, checker.IsNil)
c.Assert(out, checker.Contains, pName)
} |