driver.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package devmapper
  2. import (
  3. "fmt"
  4. "github.com/dotcloud/docker/archive"
  5. "github.com/dotcloud/docker/graphdriver"
  6. "os"
  7. "path"
  8. )
  9. func init() {
  10. graphdriver.Register("devicemapper", Init)
  11. }
  12. // Placeholder interfaces, to be replaced
  13. // at integration.
  14. // End of placeholder interfaces.
  15. type Driver struct {
  16. *DeviceSet
  17. home string
  18. }
  19. func Init(home string) (graphdriver.Driver, error) {
  20. d := &Driver{
  21. DeviceSet: NewDeviceSet(home),
  22. home: home,
  23. }
  24. if err := d.DeviceSet.ensureInit(); err != nil {
  25. return nil, err
  26. }
  27. return d, nil
  28. }
  29. func (d *Driver) String() string {
  30. return "devicemapper"
  31. }
  32. func (d *Driver) Cleanup() error {
  33. return d.DeviceSet.Shutdown()
  34. }
  35. func (d *Driver) Create(id string, parent string) error {
  36. return d.DeviceSet.AddDevice(id, parent)
  37. }
  38. func (d *Driver) Remove(id string) error {
  39. return d.DeviceSet.RemoveDevice(id)
  40. }
  41. func (d *Driver) Get(id string) (string, error) {
  42. mp := path.Join(d.home, "mnt", id)
  43. if err := d.mount(id, mp); err != nil {
  44. return "", err
  45. }
  46. return mp, nil
  47. }
  48. func (d *Driver) Diff(id string) (archive.Archive, error) {
  49. return nil, fmt.Errorf("Not implemented")
  50. }
  51. func (d *Driver) DiffSize(id string) (int64, error) {
  52. return -1, fmt.Errorf("Not implemented")
  53. }
  54. func (d *Driver) Changes(id string) ([]archive.Change, error) {
  55. return nil, fmt.Errorf("Not implemented")
  56. }
  57. func (d *Driver) mount(id, mp string) error {
  58. // Create the target directories if they don't exist
  59. if err := os.MkdirAll(mp, 0755); err != nil && !os.IsExist(err) {
  60. return err
  61. }
  62. // If mountpoint is already mounted, do nothing
  63. if mounted, err := Mounted(mp); err != nil {
  64. return fmt.Errorf("Error checking mountpoint: %s", err)
  65. } else if mounted {
  66. return nil
  67. }
  68. // Mount the device
  69. return d.DeviceSet.MountDevice(id, mp, false)
  70. }