github.com/wozhu6104/docker@v20.10.10+incompatible/integration-cli/docker_cli_daemon_plugins_test.go (about)

     1  // +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  }