docker_cli_authz_plugin_v2_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // +build !windows
  2. package main
  3. import (
  4. "fmt"
  5. "strings"
  6. "github.com/docker/docker/pkg/integration/checker"
  7. "github.com/go-check/check"
  8. )
  9. var (
  10. authzPluginName = "riyaz/authz-no-volume-plugin"
  11. authzPluginTag = "latest"
  12. authzPluginNameWithTag = authzPluginName + ":" + authzPluginTag
  13. authzPluginBadManifestName = "riyaz/authz-plugin-bad-manifest"
  14. nonexistentAuthzPluginName = "riyaz/nonexistent-authz-plugin"
  15. )
  16. func init() {
  17. check.Suite(&DockerAuthzV2Suite{
  18. ds: &DockerSuite{},
  19. })
  20. }
  21. type DockerAuthzV2Suite struct {
  22. ds *DockerSuite
  23. d *Daemon
  24. }
  25. func (s *DockerAuthzV2Suite) SetUpTest(c *check.C) {
  26. testRequires(c, DaemonIsLinux, ExperimentalDaemon, Network)
  27. s.d = NewDaemon(c)
  28. c.Assert(s.d.Start(), check.IsNil)
  29. }
  30. func (s *DockerAuthzV2Suite) TearDownTest(c *check.C) {
  31. s.d.Stop()
  32. s.ds.TearDownTest(c)
  33. }
  34. func (s *DockerAuthzV2Suite) TestAuthZPluginAllowNonVolumeRequest(c *check.C) {
  35. // Install authz plugin
  36. _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginNameWithTag)
  37. c.Assert(err, checker.IsNil)
  38. // start the daemon with the plugin and load busybox, --net=none build fails otherwise
  39. // because it needs to pull busybox
  40. c.Assert(s.d.Restart("--authorization-plugin="+authzPluginNameWithTag), check.IsNil)
  41. c.Assert(s.d.LoadBusybox(), check.IsNil)
  42. // defer disabling the plugin
  43. defer func() {
  44. c.Assert(s.d.Restart(), check.IsNil)
  45. _, err = s.d.Cmd("plugin", "disable", authzPluginNameWithTag)
  46. c.Assert(err, checker.IsNil)
  47. _, err = s.d.Cmd("plugin", "rm", authzPluginNameWithTag)
  48. c.Assert(err, checker.IsNil)
  49. }()
  50. // Ensure docker run command and accompanying docker ps are successful
  51. out, err := s.d.Cmd("run", "-d", "busybox", "top")
  52. c.Assert(err, check.IsNil)
  53. id := strings.TrimSpace(out)
  54. out, err = s.d.Cmd("ps")
  55. c.Assert(err, check.IsNil)
  56. c.Assert(assertContainerList(out, []string{id}), check.Equals, true)
  57. }
  58. func (s *DockerAuthzV2Suite) TestAuthZPluginRejectVolumeRequests(c *check.C) {
  59. // Install authz plugin
  60. _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginNameWithTag)
  61. c.Assert(err, checker.IsNil)
  62. // restart the daemon with the plugin
  63. c.Assert(s.d.Restart("--authorization-plugin="+authzPluginNameWithTag), check.IsNil)
  64. // defer disabling the plugin
  65. defer func() {
  66. c.Assert(s.d.Restart(), check.IsNil)
  67. _, err = s.d.Cmd("plugin", "disable", authzPluginNameWithTag)
  68. c.Assert(err, checker.IsNil)
  69. _, err = s.d.Cmd("plugin", "rm", authzPluginNameWithTag)
  70. c.Assert(err, checker.IsNil)
  71. }()
  72. out, err := s.d.Cmd("volume", "create")
  73. c.Assert(err, check.NotNil)
  74. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  75. out, err = s.d.Cmd("volume", "ls")
  76. c.Assert(err, check.NotNil)
  77. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  78. // The plugin will block the command before it can determine the volume does not exist
  79. out, err = s.d.Cmd("volume", "rm", "test")
  80. c.Assert(err, check.NotNil)
  81. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  82. out, err = s.d.Cmd("volume", "inspect", "test")
  83. c.Assert(err, check.NotNil)
  84. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  85. out, err = s.d.Cmd("volume", "prune", "-f")
  86. c.Assert(err, check.NotNil)
  87. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  88. }
  89. func (s *DockerAuthzV2Suite) TestAuthZPluginBadManifestFailsDaemonStart(c *check.C) {
  90. // Install authz plugin with bad manifest
  91. _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginBadManifestName)
  92. c.Assert(err, checker.IsNil)
  93. // start the daemon with the plugin, it will error
  94. c.Assert(s.d.Restart("--authorization-plugin="+authzPluginBadManifestName), check.NotNil)
  95. // restarting the daemon without requiring the plugin will succeed
  96. c.Assert(s.d.Restart(), check.IsNil)
  97. }
  98. func (s *DockerAuthzV2Suite) TestNonexistentAuthZPluginFailsDaemonStart(c *check.C) {
  99. // start the daemon with a non-existent authz plugin, it will error
  100. c.Assert(s.d.Restart("--authorization-plugin="+nonexistentAuthzPluginName), check.NotNil)
  101. // restarting the daemon without requiring the plugin will succeed
  102. c.Assert(s.d.Restart(), check.IsNil)
  103. }