manager_linux_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package plugin // import "github.com/docker/docker/plugin"
  2. import (
  3. "io"
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7. "testing"
  8. "github.com/docker/docker/api/types"
  9. "github.com/docker/docker/pkg/mount"
  10. "github.com/docker/docker/pkg/system"
  11. "github.com/docker/docker/plugin/v2"
  12. specs "github.com/opencontainers/runtime-spec/specs-go"
  13. "github.com/pkg/errors"
  14. )
  15. func TestManagerWithPluginMounts(t *testing.T) {
  16. root, err := ioutil.TempDir("", "test-store-with-plugin-mounts")
  17. if err != nil {
  18. t.Fatal(err)
  19. }
  20. defer system.EnsureRemoveAll(root)
  21. s := NewStore()
  22. managerRoot := filepath.Join(root, "manager")
  23. p1 := newTestPlugin(t, "test1", "testcap", managerRoot)
  24. p2 := newTestPlugin(t, "test2", "testcap", managerRoot)
  25. p2.PluginObj.Enabled = true
  26. m, err := NewManager(
  27. ManagerConfig{
  28. Store: s,
  29. Root: managerRoot,
  30. ExecRoot: filepath.Join(root, "exec"),
  31. CreateExecutor: func(*Manager) (Executor, error) { return nil, nil },
  32. LogPluginEvent: func(_, _, _ string) {},
  33. })
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. if err := s.Add(p1); err != nil {
  38. t.Fatal(err)
  39. }
  40. if err := s.Add(p2); err != nil {
  41. t.Fatal(err)
  42. }
  43. // Create a mount to simulate a plugin that has created it's own mounts
  44. p2Mount := filepath.Join(p2.Rootfs, "testmount")
  45. if err := os.MkdirAll(p2Mount, 0755); err != nil {
  46. t.Fatal(err)
  47. }
  48. if err := mount.Mount("tmpfs", p2Mount, "tmpfs", ""); err != nil {
  49. t.Fatal(err)
  50. }
  51. if err := m.Remove(p1.Name(), &types.PluginRmConfig{ForceRemove: true}); err != nil {
  52. t.Fatal(err)
  53. }
  54. if mounted, err := mount.Mounted(p2Mount); !mounted || err != nil {
  55. t.Fatalf("expected %s to be mounted, err: %v", p2Mount, err)
  56. }
  57. }
  58. func newTestPlugin(t *testing.T, name, cap, root string) *v2.Plugin {
  59. rootfs := filepath.Join(root, name)
  60. if err := os.MkdirAll(rootfs, 0755); err != nil {
  61. t.Fatal(err)
  62. }
  63. p := v2.Plugin{PluginObj: types.Plugin{Name: name}}
  64. p.Rootfs = rootfs
  65. iType := types.PluginInterfaceType{Capability: cap, Prefix: "docker", Version: "1.0"}
  66. i := types.PluginConfigInterface{Socket: "plugins.sock", Types: []types.PluginInterfaceType{iType}}
  67. p.PluginObj.Config.Interface = i
  68. p.PluginObj.ID = name
  69. return &p
  70. }
  71. type simpleExecutor struct {
  72. }
  73. func (e *simpleExecutor) Create(id string, spec specs.Spec, stdout, stderr io.WriteCloser) error {
  74. return errors.New("Create failed")
  75. }
  76. func (e *simpleExecutor) Restore(id string, stdout, stderr io.WriteCloser) error {
  77. return nil
  78. }
  79. func (e *simpleExecutor) IsRunning(id string) (bool, error) {
  80. return false, nil
  81. }
  82. func (e *simpleExecutor) Signal(id string, signal int) error {
  83. return nil
  84. }
  85. func TestCreateFailed(t *testing.T) {
  86. root, err := ioutil.TempDir("", "test-create-failed")
  87. if err != nil {
  88. t.Fatal(err)
  89. }
  90. defer system.EnsureRemoveAll(root)
  91. s := NewStore()
  92. managerRoot := filepath.Join(root, "manager")
  93. p := newTestPlugin(t, "create", "testcreate", managerRoot)
  94. m, err := NewManager(
  95. ManagerConfig{
  96. Store: s,
  97. Root: managerRoot,
  98. ExecRoot: filepath.Join(root, "exec"),
  99. CreateExecutor: func(*Manager) (Executor, error) { return &simpleExecutor{}, nil },
  100. LogPluginEvent: func(_, _, _ string) {},
  101. })
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. if err := s.Add(p); err != nil {
  106. t.Fatal(err)
  107. }
  108. if err := m.enable(p, &controller{}, false); err == nil {
  109. t.Fatalf("expected Create failed error, got %v", err)
  110. }
  111. if err := m.Remove(p.Name(), &types.PluginRmConfig{ForceRemove: true}); err != nil {
  112. t.Fatal(err)
  113. }
  114. }