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  }