github.com/kaisenlinux/docker@v0.0.0-20230510090727-ea55db55fac7/engine/integration-cli/docker_cli_daemon_plugins_test.go (about) 1 //go:build linux 2 // +build linux 3 4 package main 5 6 import ( 7 "strings" 8 "testing" 9 10 "golang.org/x/sys/unix" 11 "gotest.tools/v3/assert" 12 "gotest.tools/v3/icmd" 13 ) 14 15 // TestDaemonRestartWithPluginEnabled tests state restore for an enabled plugin 16 func (s *DockerDaemonSuite) TestDaemonRestartWithPluginEnabled(c *testing.T) { 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 assert.Assert(c, strings.Contains(out, pName)) 41 assert.Assert(c, strings.Contains(out, "true")) 42 } 43 44 // TestDaemonRestartWithPluginDisabled tests state restore for a disabled plugin 45 func (s *DockerDaemonSuite) TestDaemonRestartWithPluginDisabled(c *testing.T) { 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 assert.Assert(c, strings.Contains(out, pName)) 67 assert.Assert(c, strings.Contains(out, "false")) 68 } 69 70 // TestDaemonKillLiveRestoreWithPlugins SIGKILLs daemon started with --live-restore. 71 // Plugins should continue to run. 72 func (s *DockerDaemonSuite) TestDaemonKillLiveRestoreWithPlugins(c *testing.T) { 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 *testing.T) { 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 *testing.T) { 124 testRequires(c, IsAmd64, Network) 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 *testing.T) { 162 testRequires(c, IsAmd64, Network) 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 *testing.T) { 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 assert.Assert(c, strings.Contains(out, volName)) 225 assert.Assert(c, strings.Contains(out, pName)) 226 227 out, err = s.d.Cmd("run", "--rm", "-v", volName+":"+destDir, "busybox", "touch", destDir+destFile) 228 assert.NilError(c, err, out) 229 230 out, err = s.d.Cmd("run", "--rm", "-v", volName+":"+destDir, "busybox", "ls", destDir+destFile) 231 assert.NilError(c, err, out) 232 } 233 234 func (s *DockerDaemonSuite) TestPluginVolumeRemoveOnRestart(c *testing.T) { 235 testRequires(c, IsAmd64, Network) 236 237 s.d.Start(c, "--live-restore=true") 238 239 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName) 240 assert.NilError(c, err, out) 241 assert.Assert(c, strings.Contains(out, pName)) 242 243 out, err = s.d.Cmd("volume", "create", "--driver", pName, "test") 244 assert.NilError(c, err, out) 245 246 s.d.Restart(c, "--live-restore=true") 247 248 out, err = s.d.Cmd("plugin", "disable", pName) 249 assert.ErrorContains(c, err, "", out) 250 assert.Assert(c, strings.Contains(out, "in use")) 251 252 out, err = s.d.Cmd("volume", "rm", "test") 253 assert.NilError(c, err, out) 254 255 out, err = s.d.Cmd("plugin", "disable", pName) 256 assert.NilError(c, err, out) 257 258 out, err = s.d.Cmd("plugin", "rm", pName) 259 assert.NilError(c, err, out) 260 } 261 262 func (s *DockerDaemonSuite) TestPluginListFilterEnabled(c *testing.T) { 263 testRequires(c, IsAmd64, Network) 264 265 s.d.Start(c) 266 267 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable") 268 assert.NilError(c, err, out) 269 270 defer func() { 271 if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil { 272 c.Fatalf("Could not remove plugin: %v %s", err, out) 273 } 274 }() 275 276 out, err = s.d.Cmd("plugin", "ls", "--filter", "enabled=true") 277 assert.NilError(c, err, out) 278 assert.Assert(c, !strings.Contains(out, pName)) 279 280 out, err = s.d.Cmd("plugin", "ls", "--filter", "enabled=false") 281 assert.NilError(c, err, out) 282 assert.Assert(c, strings.Contains(out, pName)) 283 assert.Assert(c, strings.Contains(out, "false")) 284 285 out, err = s.d.Cmd("plugin", "ls") 286 assert.NilError(c, err, out) 287 assert.Assert(c, strings.Contains(out, pName)) 288 } 289 290 func (s *DockerDaemonSuite) TestPluginListFilterCapability(c *testing.T) { 291 testRequires(c, IsAmd64, Network) 292 293 s.d.Start(c) 294 295 out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pNameWithTag, "--disable") 296 assert.NilError(c, err, out) 297 298 defer func() { 299 if out, err := s.d.Cmd("plugin", "remove", pNameWithTag); err != nil { 300 c.Fatalf("Could not remove plugin: %v %s", err, out) 301 } 302 }() 303 304 out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=volumedriver") 305 assert.NilError(c, err, out) 306 assert.Assert(c, strings.Contains(out, pName)) 307 308 out, err = s.d.Cmd("plugin", "ls", "--filter", "capability=authz") 309 assert.NilError(c, err, out) 310 assert.Assert(c, !strings.Contains(out, pName)) 311 312 out, err = s.d.Cmd("plugin", "ls") 313 assert.NilError(c, err, out) 314 assert.Assert(c, strings.Contains(out, pName)) 315 }