docker_cli_authz_plugin_v2_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // +build !windows
  2. package main
  3. import (
  4. "fmt"
  5. "github.com/docker/docker/integration-cli/checker"
  6. "github.com/docker/docker/integration-cli/daemon"
  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.Daemon
  24. }
  25. func (s *DockerAuthzV2Suite) SetUpTest(c *check.C) {
  26. testRequires(c, DaemonIsLinux, Network, SameHostDaemon)
  27. s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{
  28. Experimental: testEnv.ExperimentalDaemon(),
  29. })
  30. s.d.Start(c)
  31. }
  32. func (s *DockerAuthzV2Suite) TearDownTest(c *check.C) {
  33. if s.d != nil {
  34. s.d.Stop(c)
  35. s.ds.TearDownTest(c)
  36. }
  37. }
  38. func (s *DockerAuthzV2Suite) TestAuthZPluginAllowNonVolumeRequest(c *check.C) {
  39. testRequires(c, DaemonIsLinux, IsAmd64, Network)
  40. // Install authz plugin
  41. _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginNameWithTag)
  42. c.Assert(err, checker.IsNil)
  43. // start the daemon with the plugin and load busybox, --net=none build fails otherwise
  44. // because it needs to pull busybox
  45. s.d.Restart(c, "--authorization-plugin="+authzPluginNameWithTag)
  46. s.d.LoadBusybox(c)
  47. // defer disabling the plugin
  48. defer func() {
  49. s.d.Restart(c)
  50. _, err = s.d.Cmd("plugin", "disable", authzPluginNameWithTag)
  51. c.Assert(err, checker.IsNil)
  52. _, err = s.d.Cmd("plugin", "rm", authzPluginNameWithTag)
  53. c.Assert(err, checker.IsNil)
  54. }()
  55. // Ensure docker run command and accompanying docker ps are successful
  56. _, err = s.d.Cmd("run", "-d", "busybox", "top")
  57. c.Assert(err, check.IsNil)
  58. }
  59. func (s *DockerAuthzV2Suite) TestAuthZPluginDisable(c *check.C) {
  60. testRequires(c, DaemonIsLinux, IsAmd64, Network)
  61. // Install authz plugin
  62. _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginNameWithTag)
  63. c.Assert(err, checker.IsNil)
  64. // start the daemon with the plugin and load busybox, --net=none build fails otherwise
  65. // because it needs to pull busybox
  66. s.d.Restart(c, "--authorization-plugin="+authzPluginNameWithTag)
  67. s.d.LoadBusybox(c)
  68. // defer removing the plugin
  69. defer func() {
  70. s.d.Restart(c)
  71. _, err = s.d.Cmd("plugin", "rm", "-f", authzPluginNameWithTag)
  72. c.Assert(err, checker.IsNil)
  73. }()
  74. out, err := s.d.Cmd("volume", "create")
  75. c.Assert(err, check.NotNil)
  76. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  77. // disable the plugin
  78. _, err = s.d.Cmd("plugin", "disable", authzPluginNameWithTag)
  79. c.Assert(err, checker.IsNil)
  80. // now test to see if the docker api works.
  81. _, err = s.d.Cmd("volume", "create")
  82. c.Assert(err, checker.IsNil)
  83. }
  84. func (s *DockerAuthzV2Suite) TestAuthZPluginRejectVolumeRequests(c *check.C) {
  85. testRequires(c, DaemonIsLinux, IsAmd64, Network)
  86. // Install authz plugin
  87. _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginNameWithTag)
  88. c.Assert(err, checker.IsNil)
  89. // restart the daemon with the plugin
  90. s.d.Restart(c, "--authorization-plugin="+authzPluginNameWithTag)
  91. // defer disabling the plugin
  92. defer func() {
  93. s.d.Restart(c)
  94. _, err = s.d.Cmd("plugin", "disable", authzPluginNameWithTag)
  95. c.Assert(err, checker.IsNil)
  96. _, err = s.d.Cmd("plugin", "rm", authzPluginNameWithTag)
  97. c.Assert(err, checker.IsNil)
  98. }()
  99. out, err := s.d.Cmd("volume", "create")
  100. c.Assert(err, check.NotNil)
  101. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  102. out, err = s.d.Cmd("volume", "ls")
  103. c.Assert(err, check.NotNil)
  104. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  105. // The plugin will block the command before it can determine the volume does not exist
  106. out, err = s.d.Cmd("volume", "rm", "test")
  107. c.Assert(err, check.NotNil)
  108. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  109. out, err = s.d.Cmd("volume", "inspect", "test")
  110. c.Assert(err, check.NotNil)
  111. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  112. out, err = s.d.Cmd("volume", "prune", "-f")
  113. c.Assert(err, check.NotNil)
  114. c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
  115. }
  116. func (s *DockerAuthzV2Suite) TestAuthZPluginBadManifestFailsDaemonStart(c *check.C) {
  117. testRequires(c, DaemonIsLinux, IsAmd64, Network)
  118. // Install authz plugin with bad manifest
  119. _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginBadManifestName)
  120. c.Assert(err, checker.IsNil)
  121. // start the daemon with the plugin, it will error
  122. c.Assert(s.d.RestartWithError("--authorization-plugin="+authzPluginBadManifestName), check.NotNil)
  123. // restarting the daemon without requiring the plugin will succeed
  124. s.d.Restart(c)
  125. }
  126. func (s *DockerAuthzV2Suite) TestNonexistentAuthZPluginFailsDaemonStart(c *check.C) {
  127. testRequires(c, DaemonIsLinux, Network)
  128. // start the daemon with a non-existent authz plugin, it will error
  129. c.Assert(s.d.RestartWithError("--authorization-plugin="+nonexistentAuthzPluginName), check.NotNil)
  130. // restarting the daemon without requiring the plugin will succeed
  131. s.d.Start(c)
  132. }