github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/integration-cli/docker_cli_daemon_plugins_test.go (about) 1 // +build linux 2 3 package main 4 5 import ( 6 "strings" 7 8 "github.com/docker/docker/integration-cli/checker" 9 "github.com/docker/docker/pkg/mount" 10 "github.com/go-check/check" 11 "github.com/gotestyourself/gotestyourself/icmd" 12 "golang.org/x/sys/unix" 13 ) 14 15 // TestDaemonRestartWithPluginEnabled tests state restore for an enabled plugin 16 func (s *DockerDaemonSuite) TestDaemonRestartWithPluginEnabled(c *check.C) { 17 testRequires(c, IsAmd64, Network) 18 19 s.d.Start(c) 20 21 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { 22 c.Fatalf("Could not install plugin: %v %s", err, out) 23 } 24 25 defer func() { 26 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { 27 c.Fatalf("Could not disable plugin: %v %s", err, out) 28 } 29 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { 30 c.Fatalf("Could not remove plugin: %v %s", err, out) 31 } 32 }() 33 34 s.d.Restart(c) 35 36 out, err := s.d.Cmd("plugin", "ls") 37 if err != nil { 38 c.Fatalf("Could not list plugins: %v %s", err, out) 39 } 40 c.Assert(out, checker.Contains, pName) 41 c.Assert(out, checker.Contains, "true") 42 } 43 44 // TestDaemonRestartWithPluginDisabled tests state restore for a disabled plugin 45 func (s *DockerDaemonSuite) TestDaemonRestartWithPluginDisabled(c *check.C) { 46 testRequires(c, IsAmd64, Network) 47 48 s.d.Start(c) 49 50 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName, "--disable"); err != nil { 51 c.Fatalf("Could not install plugin: %v %s", err, out) 52 } 53 54 defer func() { 55 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { 56 c.Fatalf("Could not remove plugin: %v %s", err, out) 57 } 58 }() 59 60 s.d.Restart(c) 61 62 out, err := s.d.Cmd("plugin", "ls") 63 if err != nil { 64 c.Fatalf("Could not list plugins: %v %s", err, out) 65 } 66 c.Assert(out, checker.Contains, pName) 67 c.Assert(out, checker.Contains, "false") 68 } 69 70 // TestDaemonKillLiveRestoreWithPlugins SIGKILLs daemon started with --live-restore. 71 // Plugins should continue to run. 72 func (s *DockerDaemonSuite) TestDaemonKillLiveRestoreWithPlugins(c *check.C) { 73 testRequires(c, IsAmd64, Network) 74 75 s.d.Start(c, "--live-restore") 76 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { 77 c.Fatalf("Could not install plugin: %v %s", err, out) 78 } 79 defer func() { 80 s.d.Restart(c, "--live-restore") 81 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { 82 c.Fatalf("Could not disable plugin: %v %s", err, out) 83 } 84 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { 85 c.Fatalf("Could not remove plugin: %v %s", err, out) 86 } 87 }() 88 89 if err := s.d.Kill(); err != nil { 90 c.Fatalf("Could not kill daemon: %v", err) 91 } 92 93 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) 94 } 95 96 // TestDaemonShutdownLiveRestoreWithPlugins SIGTERMs daemon started with --live-restore. 97 // Plugins should continue to run. 98 func (s *DockerDaemonSuite) TestDaemonShutdownLiveRestoreWithPlugins(c *check.C) { 99 testRequires(c, IsAmd64, Network) 100 101 s.d.Start(c, "--live-restore") 102 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { 103 c.Fatalf("Could not install plugin: %v %s", err, out) 104 } 105 defer func() { 106 s.d.Restart(c, "--live-restore") 107 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { 108 c.Fatalf("Could not disable plugin: %v %s", err, out) 109 } 110 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { 111 c.Fatalf("Could not remove plugin: %v %s", err, out) 112 } 113 }() 114 115 if err := s.d.Interrupt(); err != nil { 116 c.Fatalf("Could not kill daemon: %v", err) 117 } 118 119 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) 120 } 121 122 // TestDaemonShutdownWithPlugins shuts down running plugins. 123 func (s *DockerDaemonSuite) TestDaemonShutdownWithPlugins(c *check.C) { 124 testRequires(c, IsAmd64, Network, SameHostDaemon) 125 126 s.d.Start(c) 127 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { 128 c.Fatalf("Could not install plugin: %v %s", err, out) 129 } 130 131 defer func() { 132 s.d.Restart(c) 133 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { 134 c.Fatalf("Could not disable plugin: %v %s", err, out) 135 } 136 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { 137 c.Fatalf("Could not remove plugin: %v %s", err, out) 138 } 139 }() 140 141 if err := s.d.Interrupt(); err != nil { 142 c.Fatalf("Could not kill daemon: %v", err) 143 } 144 145 for { 146 if err := unix.Kill(s.d.Pid(), 0); err == unix.ESRCH { 147 break 148 } 149 } 150 151 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Expected{ 152 ExitCode: 1, 153 Error: "exit status 1", 154 }) 155 156 s.d.Start(c) 157 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) 158 } 159 160 // TestDaemonKillWithPlugins leaves plugins running. 161 func (s *DockerDaemonSuite) TestDaemonKillWithPlugins(c *check.C) { 162 testRequires(c, IsAmd64, Network, SameHostDaemon) 163 164 s.d.Start(c) 165 if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { 166 c.Fatalf("Could not install plugin: %v %s", err, out) 167 } 168 169 defer func() { 170 s.d.Restart(c) 171 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { 172 c.Fatalf("Could not disable plugin: %v %s", err, out) 173 } 174 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { 175 c.Fatalf("Could not remove plugin: %v %s", err, out) 176 } 177 }() 178 179 if err := s.d.Kill(); err != nil { 180 c.Fatalf("Could not kill daemon: %v", err) 181 } 182 183 // assert that plugins are running. 184 icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) 185 } 186 187 // TestVolumePlugin tests volume creation using a plugin. 188 func (s *DockerDaemonSuite) TestVolumePlugin(c *check.C) { 189 testRequires(c, IsAmd64, Network) 190 191 volName := "plugin-volume" 192 destDir := "/tmp/data/" 193 destFile := "foo" 194 195 s.d.Start(c) 196 out, err := s.d.Cmd("plugin", "install", pName, "--grant-all-permissions") 197 if err != nil { 198 c.Fatalf("Could not install plugin: %v %s", err, out) 199 } 200 defer func() { 201 if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { 202 c.Fatalf("Could not disable plugin: %v %s", err, out) 203 } 204 205 if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { 206 c.Fatalf("Could not remove plugin: %v %s", err, out) 207 } 208 }() 209 210 out, err = s.d.Cmd("volume", "create", "-d", pName, volName) 211 if err != nil { 212 c.Fatalf("Could not create volume: %v %s", err, out) 213 } 214 defer func() { 215 if out, err := s.d.Cmd("volume", "remove", volName); err != nil { 216 c.Fatalf("Could not remove volume: %v %s", err, out) 217 } 218 }() 219 220 out, err = s.d.Cmd("volume", "ls") 221 if err != nil { 222 c.Fatalf("Could not list volume: %v %s", err, out) 223 } 224 c.Assert(out, checker.Contains, volName) 225 c.Assert(out, checker.Contains, pName) 226 227 out, err = s.d.Cmd("run", "--rm", "-v", volName+":"+destDir, "busybox", "touch", destDir+destFile) 228 c.Assert(err, checker.IsNil, check.Commentf(out)) 229 230 out, err = s.d.Cmd("run", "--rm", "-v", volName+":"+destDir, "busybox", "ls", destDir+destFile) 231 c.Assert(err, checker.IsNil, check.Commentf(out)) 232 } 233 234 func (s *DockerDaemonSuite) TestGraphdriverPlugin(c *check.C) { 235 testRequires(c, Network, IsAmd64, DaemonIsLinux, overlay2Supported, ExperimentalDaemon) 236 237 s.d.Start(c) 238 239 // install the plugin 240 plugin := "cpuguy83/docker-overlay2-graphdriver-plugin" 241 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", plugin) 242 c.Assert(err, checker.IsNil, check.Commentf(out)) 243 244 // restart the daemon with the plugin set as the storage driver 245 s.d.Restart(c, "-s", plugin, "--storage-opt", "overlay2.override_kernel_check=1") 246 247 // run a container 248 out, err = s.d.Cmd("run", "--rm", "busybox", "true") // this will pull busybox using the plugin 249 c.Assert(err, checker.IsNil, check.Commentf(out)) 250 } 251 252 func (s *DockerDaemonSuite) TestPluginVolumeRemoveOnRestart(c *check.C) { 253 testRequires(c, DaemonIsLinux, Network, IsAmd64) 254 255 s.d.Start(c, "--live-restore=true") 256 257 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName) 258 c.Assert(err, checker.IsNil, check.Commentf(out)) 259 c.Assert(strings.TrimSpace(out), checker.Contains, pName) 260 261 out, err = s.d.Cmd("volume", "create", "--driver", pName, "test") 262 c.Assert(err, checker.IsNil, check.Commentf(out)) 263 264 s.d.Restart(c, "--live-restore=true") 265 266 out, err = s.d.Cmd("plugin", "disable", pName) 267 c.Assert(err, checker.NotNil, check.Commentf(out)) 268 c.Assert(out, checker.Contains, "in use") 269 270 out, err = s.d.Cmd("volume", "rm", "test") 271 c.Assert(err, checker.IsNil, check.Commentf(out)) 272 273 out, err = s.d.Cmd("plugin", "disable", pName) 274 c.Assert(err, checker.IsNil, check.Commentf(out)) 275 276 out, err = s.d.Cmd("plugin", "rm", pName) 277 c.Assert(err, checker.IsNil, check.Commentf(out)) 278 } 279 280 func existsMountpointWithPrefix(mountpointPrefix string) (bool, error) { 281 mounts, err := mount.GetMounts() 282 if err != nil { 283 return false, err 284 } 285 for _, mnt := range mounts { 286 if strings.HasPrefix(mnt.Mountpoint, mountpointPrefix) { 287 return true, nil 288 } 289 } 290 return false, nil 291 } 292 293 func (s *DockerDaemonSuite) TestPluginListFilterEnabled(c *check.C) { 294 testRequires(c, IsAmd64, Network) 295 296 s.d.Start(c) 297 298 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable") 299 c.Assert(err, check.IsNil, check.Commentf(out)) 300 301 defer func() { 302 if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil { 303 c.Fatalf("Could not remove plugin: %v %s", err, out) 304 } 305 }() 306 307 out, err = s.d.Cmd("plugin", "ls", "--filter", "enabled=true") 308 c.Assert(err, checker.IsNil) 309 c.Assert(out, checker.Not(checker.Contains), pName) 310 311 out, err = s.d.Cmd("plugin", "ls", "--filter", "enabled=false") 312 c.Assert(err, checker.IsNil) 313 c.Assert(out, checker.Contains, pName) 314 c.Assert(out, checker.Contains, "false") 315 316 out, err = s.d.Cmd("plugin", "ls") 317 c.Assert(err, checker.IsNil) 318 c.Assert(out, checker.Contains, pName) 319 } 320 321 func (s *DockerDaemonSuite) TestPluginListFilterCapability(c *check.C) { 322 testRequires(c, IsAmd64, Network) 323 324 s.d.Start(c) 325 326 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable") 327 c.Assert(err, check.IsNil, check.Commentf(out)) 328 329 defer func() { 330 if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil { 331 c.Fatalf("Could not remove plugin: %v %s", err, out) 332 } 333 }() 334 335 out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=volumedriver") 336 c.Assert(err, checker.IsNil) 337 c.Assert(out, checker.Contains, pName) 338 339 out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=authz") 340 c.Assert(err, checker.IsNil) 341 c.Assert(out, checker.Not(checker.Contains), pName) 342 343 out, err = s.d.Cmd("plugin", "ls") 344 c.Assert(err, checker.IsNil) 345 c.Assert(out, checker.Contains, pName) 346 }