manager_linux_test.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package plugin
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "github.com/docker/docker/api/types"
  8. "github.com/docker/docker/pkg/mount"
  9. "github.com/docker/docker/pkg/system"
  10. "github.com/docker/docker/plugin/v2"
  11. )
  12. func TestManagerWithPluginMounts(t *testing.T) {
  13. root, err := ioutil.TempDir("", "test-store-with-plugin-mounts")
  14. if err != nil {
  15. t.Fatal(err)
  16. }
  17. defer system.EnsureRemoveAll(root)
  18. s := NewStore()
  19. managerRoot := filepath.Join(root, "manager")
  20. p1 := newTestPlugin(t, "test1", "testcap", managerRoot)
  21. p2 := newTestPlugin(t, "test2", "testcap", managerRoot)
  22. p2.PluginObj.Enabled = true
  23. m, err := NewManager(
  24. ManagerConfig{
  25. Store: s,
  26. Root: managerRoot,
  27. ExecRoot: filepath.Join(root, "exec"),
  28. CreateExecutor: func(*Manager) (Executor, error) { return nil, nil },
  29. LogPluginEvent: func(_, _, _ string) {},
  30. })
  31. if err != nil {
  32. t.Fatal(err)
  33. }
  34. if err := s.Add(p1); err != nil {
  35. t.Fatal(err)
  36. }
  37. if err := s.Add(p2); err != nil {
  38. t.Fatal(err)
  39. }
  40. // Create a mount to simulate a plugin that has created it's own mounts
  41. p2Mount := filepath.Join(p2.Rootfs, "testmount")
  42. if err := os.MkdirAll(p2Mount, 0755); err != nil {
  43. t.Fatal(err)
  44. }
  45. if err := mount.Mount("tmpfs", p2Mount, "tmpfs", ""); err != nil {
  46. t.Fatal(err)
  47. }
  48. if err := m.Remove(p1.Name(), &types.PluginRmConfig{ForceRemove: true}); err != nil {
  49. t.Fatal(err)
  50. }
  51. if mounted, err := mount.Mounted(p2Mount); !mounted || err != nil {
  52. t.Fatalf("expected %s to be mounted, err: %v", p2Mount, err)
  53. }
  54. }
  55. func newTestPlugin(t *testing.T, name, cap, root string) *v2.Plugin {
  56. rootfs := filepath.Join(root, name)
  57. if err := os.MkdirAll(rootfs, 0755); err != nil {
  58. t.Fatal(err)
  59. }
  60. p := v2.Plugin{PluginObj: types.Plugin{Name: name}}
  61. p.Rootfs = rootfs
  62. iType := types.PluginInterfaceType{Capability: cap, Prefix: "docker", Version: "1.0"}
  63. i := types.PluginConfigInterface{Socket: "plugins.sock", Types: []types.PluginInterfaceType{iType}}
  64. p.PluginObj.Config.Interface = i
  65. p.PluginObj.ID = name
  66. return &p
  67. }