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