driver.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package graphdriver
  2. import (
  3. "fmt"
  4. "github.com/dotcloud/docker/archive"
  5. "github.com/dotcloud/docker/utils"
  6. "os"
  7. "path"
  8. )
  9. type InitFunc func(root string) (Driver, error)
  10. type Driver interface {
  11. String() string
  12. Create(id, parent string) error
  13. Remove(id string) error
  14. Get(id string) (dir string, err error)
  15. Exists(id string) bool
  16. Status() [][2]string
  17. Cleanup() error
  18. }
  19. type Differ interface {
  20. Diff(id string) (archive.Archive, error)
  21. Changes(id string) ([]archive.Change, error)
  22. ApplyDiff(id string, diff archive.Archive) error
  23. DiffSize(id string) (bytes int64, err error)
  24. }
  25. var (
  26. DefaultDriver string
  27. // All registred drivers
  28. drivers map[string]InitFunc
  29. // Slice of drivers that should be used in an order
  30. priority = []string{
  31. "aufs",
  32. "devicemapper",
  33. "vfs",
  34. }
  35. )
  36. func init() {
  37. drivers = make(map[string]InitFunc)
  38. }
  39. func Register(name string, initFunc InitFunc) error {
  40. if _, exists := drivers[name]; exists {
  41. return fmt.Errorf("Name already registered %s", name)
  42. }
  43. drivers[name] = initFunc
  44. return nil
  45. }
  46. func GetDriver(name, home string) (Driver, error) {
  47. if initFunc, exists := drivers[name]; exists {
  48. return initFunc(path.Join(home, name))
  49. }
  50. return nil, fmt.Errorf("No such driver: %s", name)
  51. }
  52. func New(root string) (driver Driver, err error) {
  53. for _, name := range []string{os.Getenv("DOCKER_DRIVER"), DefaultDriver} {
  54. if name != "" {
  55. return GetDriver(name, root)
  56. }
  57. }
  58. // Check for priority drivers first
  59. for _, name := range priority {
  60. if driver, err = GetDriver(name, root); err != nil {
  61. utils.Debugf("Error loading driver %s: %s", name, err)
  62. continue
  63. }
  64. return driver, nil
  65. }
  66. // Check all registered drivers if no priority driver is found
  67. for _, initFunc := range drivers {
  68. if driver, err = initFunc(root); err != nil {
  69. continue
  70. }
  71. return driver, nil
  72. }
  73. return nil, err
  74. }