11 "github.com/docker/docker/integration-cli/checker"
12 "github.com/docker/docker/pkg/mount"
13 icmd "github.com/docker/docker/pkg/testutil/cmd"
14 "github.com/go-check/check"
17 // TestDaemonRestartWithPluginEnabled tests state restore for an enabled plugin
18 func (s *DockerDaemonSuite) TestDaemonRestartWithPluginEnabled(c *check.C) {
19 c.Skip("Plugins aren't supported")
21 testRequires(c, IsAmd64, Network)
25 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil {
26 c.Fatalf("Could not install plugin: %v %s", err, out)
30 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil {
31 c.Fatalf("Could not disable plugin: %v %s", err, out)
33 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil {
34 c.Fatalf("Could not remove plugin: %v %s", err, out)
40 out, err := s.d.Cmd("plugin", "ls")
42 c.Fatalf("Could not list plugins: %v %s", err, out)
44 c.Assert(out, checker.Contains, pName)
45 c.Assert(out, checker.Contains, "true")
48 // TestDaemonRestartWithPluginDisabled tests state restore for a disabled plugin
49 func (s *DockerDaemonSuite) TestDaemonRestartWithPluginDisabled(c *check.C) {
50 c.Skip("Plugins aren't supported")
52 testRequires(c, IsAmd64, Network)
56 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName, "--disable"); err != nil {
57 c.Fatalf("Could not install plugin: %v %s", err, out)
61 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil {
62 c.Fatalf("Could not remove plugin: %v %s", err, out)
68 out, err := s.d.Cmd("plugin", "ls")
70 c.Fatalf("Could not list plugins: %v %s", err, out)
72 c.Assert(out, checker.Contains, pName)
73 c.Assert(out, checker.Contains, "false")
76 // TestDaemonKillLiveRestoreWithPlugins SIGKILLs daemon started with --live-restore.
77 // Plugins should continue to run.
78 func (s *DockerDaemonSuite) TestDaemonKillLiveRestoreWithPlugins(c *check.C) {
79 c.Skip("Plugins aren't supported")
81 testRequires(c, IsAmd64, Network)
83 s.d.Start(c, "--live-restore")
84 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil {
85 c.Fatalf("Could not install plugin: %v %s", err, out)
88 s.d.Restart(c, "--live-restore")
89 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil {
90 c.Fatalf("Could not disable plugin: %v %s", err, out)
92 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil {
93 c.Fatalf("Could not remove plugin: %v %s", err, out)
97 if err := s.d.Kill(); err != nil {
98 c.Fatalf("Could not kill daemon: %v", err)
101 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success)
104 // TestDaemonShutdownLiveRestoreWithPlugins SIGTERMs daemon started with --live-restore.
105 // Plugins should continue to run.
106 func (s *DockerDaemonSuite) TestDaemonShutdownLiveRestoreWithPlugins(c *check.C) {
107 c.Skip("Plugins aren't supported")
109 testRequires(c, IsAmd64, Network)
111 s.d.Start(c, "--live-restore")
112 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil {
113 c.Fatalf("Could not install plugin: %v %s", err, out)
116 s.d.Restart(c, "--live-restore")
117 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil {
118 c.Fatalf("Could not disable plugin: %v %s", err, out)
120 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil {
121 c.Fatalf("Could not remove plugin: %v %s", err, out)
125 if err := s.d.Interrupt(); err != nil {
126 c.Fatalf("Could not kill daemon: %v", err)
129 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success)
132 // TestDaemonShutdownWithPlugins shuts down running plugins.
133 func (s *DockerDaemonSuite) TestDaemonShutdownWithPlugins(c *check.C) {
134 c.Skip("Plugins aren't supported")
136 testRequires(c, IsAmd64, Network, SameHostDaemon)
139 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil {
140 c.Fatalf("Could not install plugin: %v %s", err, out)
145 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil {
146 c.Fatalf("Could not disable plugin: %v %s", err, out)
148 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil {
149 c.Fatalf("Could not remove plugin: %v %s", err, out)
153 if err := s.d.Interrupt(); err != nil {
154 c.Fatalf("Could not kill daemon: %v", err)
158 if err := syscall.Kill(s.d.Pid(), 0); err == syscall.ESRCH {
163 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Expected{
165 Error: "exit status 1",
169 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success)
172 // TestDaemonKillWithPlugins leaves plugins running.
173 func (s *DockerDaemonSuite) TestDaemonKillWithPlugins(c *check.C) {
174 c.Skip("Plugins aren't supported")
176 testRequires(c, IsAmd64, Network, SameHostDaemon)
179 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil {
180 c.Fatalf("Could not install plugin: %v %s", err, out)
185 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil {
186 c.Fatalf("Could not disable plugin: %v %s", err, out)
188 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil {
189 c.Fatalf("Could not remove plugin: %v %s", err, out)
193 if err := s.d.Kill(); err != nil {
194 c.Fatalf("Could not kill daemon: %v", err)
197 // assert that plugins are running.
198 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success)
201 // TestVolumePlugin tests volume creation using a plugin.
202 func (s *DockerDaemonSuite) TestVolumePlugin(c *check.C) {
203 c.Skip("Plugins aren't supported")
205 testRequires(c, IsAmd64, Network)
207 volName := "plugin-volume"
208 destDir := "/tmp/data/"
212 out, err := s.d.Cmd("plugin", "install", pName, "--grant-all-permissions")
214 c.Fatalf("Could not install plugin: %v %s", err, out)
216 pluginID, err := s.d.Cmd("plugin", "inspect", "-f", "{{.Id}}", pName)
217 pluginID = strings.TrimSpace(pluginID)
219 c.Fatalf("Could not retrieve plugin ID: %v %s", err, pluginID)
221 mountpointPrefix := filepath.Join(s.d.RootDir(), "plugins", pluginID, "rootfs")
223 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil {
224 c.Fatalf("Could not disable plugin: %v %s", err, out)
227 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil {
228 c.Fatalf("Could not remove plugin: %v %s", err, out)
231 exists, err := existsMountpointWithPrefix(mountpointPrefix)
232 c.Assert(err, checker.IsNil)
233 c.Assert(exists, checker.Equals, false)
237 out, err = s.d.Cmd("volume", "create", "-d", pName, volName)
239 c.Fatalf("Could not create volume: %v %s", err, out)
242 if out, err := s.d.Cmd("volume", "remove", volName); err != nil {
243 c.Fatalf("Could not remove volume: %v %s", err, out)
247 out, err = s.d.Cmd("volume", "ls")
249 c.Fatalf("Could not list volume: %v %s", err, out)
251 c.Assert(out, checker.Contains, volName)
252 c.Assert(out, checker.Contains, pName)
254 mountPoint, err := s.d.Cmd("volume", "inspect", volName, "--format", "{{.Mountpoint}}")
256 c.Fatalf("Could not inspect volume: %v %s", err, mountPoint)
258 mountPoint = strings.TrimSpace(mountPoint)
260 out, err = s.d.Cmd("run", "--rm", "-v", volName+":"+destDir, "busybox", "touch", destDir+destFile)
261 c.Assert(err, checker.IsNil, check.Commentf(out))
262 path := filepath.Join(s.d.RootDir(), "plugins", pluginID, "rootfs", mountPoint, destFile)
263 _, err = os.Lstat(path)
264 c.Assert(err, checker.IsNil)
266 exists, err := existsMountpointWithPrefix(mountpointPrefix)
267 c.Assert(err, checker.IsNil)
268 c.Assert(exists, checker.Equals, true)
271 func (s *DockerDaemonSuite) TestGraphdriverPlugin(c *check.C) {
272 c.Skip("Plugins aren't supported")
274 testRequires(c, Network, IsAmd64, DaemonIsLinux, overlay2Supported, ExperimentalDaemon)
278 // install the plugin
279 plugin := "cpuguy83/docker-overlay2-graphdriver-plugin"
280 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", plugin)
281 c.Assert(err, checker.IsNil, check.Commentf(out))
283 // restart the daemon with the plugin set as the storage driver
284 s.d.Restart(c, "-s", plugin, "--storage-opt", "overlay2.override_kernel_check=1")
287 out, err = s.d.Cmd("run", "--rm", "busybox", "true") // this will pull busybox using the plugin
288 c.Assert(err, checker.IsNil, check.Commentf(out))
291 func (s *DockerDaemonSuite) TestPluginVolumeRemoveOnRestart(c *check.C) {
292 c.Skip("Plugins aren't supported")
294 testRequires(c, DaemonIsLinux, Network, IsAmd64)
296 s.d.Start(c, "--live-restore=true")
298 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName)
299 c.Assert(err, checker.IsNil, check.Commentf(out))
300 c.Assert(strings.TrimSpace(out), checker.Contains, pName)
302 out, err = s.d.Cmd("volume", "create", "--driver", pName, "test")
303 c.Assert(err, checker.IsNil, check.Commentf(out))
305 s.d.Restart(c, "--live-restore=true")
307 out, err = s.d.Cmd("plugin", "disable", pName)
308 c.Assert(err, checker.NotNil, check.Commentf(out))
309 c.Assert(out, checker.Contains, "in use")
311 out, err = s.d.Cmd("volume", "rm", "test")
312 c.Assert(err, checker.IsNil, check.Commentf(out))
314 out, err = s.d.Cmd("plugin", "disable", pName)
315 c.Assert(err, checker.IsNil, check.Commentf(out))
317 out, err = s.d.Cmd("plugin", "rm", pName)
318 c.Assert(err, checker.IsNil, check.Commentf(out))
321 func existsMountpointWithPrefix(mountpointPrefix string) (bool, error) {
322 mounts, err := mount.GetMounts()
326 for _, mnt := range mounts {
327 if strings.HasPrefix(mnt.Mountpoint, mountpointPrefix) {
334 func (s *DockerDaemonSuite) TestPluginListFilterEnabled(c *check.C) {
335 c.Skip("Plugins aren't supported")
337 testRequires(c, IsAmd64, Network)
341 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable")
342 c.Assert(err, check.IsNil, check.Commentf(out))
345 if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil {
346 c.Fatalf("Could not remove plugin: %v %s", err, out)
350 out, err = s.d.Cmd("plugin", "ls", "--filter", "enabled=true")
351 c.Assert(err, checker.IsNil)
352 c.Assert(out, checker.Not(checker.Contains), pName)
354 out, err = s.d.Cmd("plugin", "ls", "--filter", "enabled=false")
355 c.Assert(err, checker.IsNil)
356 c.Assert(out, checker.Contains, pName)
357 c.Assert(out, checker.Contains, "false")
359 out, err = s.d.Cmd("plugin", "ls")
360 c.Assert(err, checker.IsNil)
361 c.Assert(out, checker.Contains, pName)
364 func (s *DockerDaemonSuite) TestPluginListFilterCapability(c *check.C) {
365 c.Skip("Plugins aren't supported")
367 testRequires(c, IsAmd64, Network)
371 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable")
372 c.Assert(err, check.IsNil, check.Commentf(out))
375 if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil {
376 c.Fatalf("Could not remove plugin: %v %s", err, out)
380 out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=volumedriver")
381 c.Assert(err, checker.IsNil)
382 c.Assert(out, checker.Contains, pName)
384 out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=authz")
385 c.Assert(err, checker.IsNil)
386 c.Assert(out, checker.Not(checker.Contains), pName)
388 out, err = s.d.Cmd("plugin", "ls")
389 c.Assert(err, checker.IsNil)
390 c.Assert(out, checker.Contains, pName)