gopkg.in/docker/docker.v20@v20.10.27/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  }