github.com/uriddle/docker@v0.0.0-20210926094723-4072e6aeb013/volume/drivers/adapter.go (about) 1 package volumedrivers 2 3 import ( 4 "github.com/docker/docker/pkg/plugins" 5 "github.com/docker/docker/volume" 6 ) 7 8 type volumeDriverAdapter struct { 9 name string 10 proxy *volumeDriverProxy 11 } 12 13 func (a *volumeDriverAdapter) Name() string { 14 return a.name 15 } 16 17 func (a *volumeDriverAdapter) Create(name string, opts map[string]string) (volume.Volume, error) { 18 // First try a Get. For drivers that support Get this will return any 19 // existing volume. 20 v, err := a.proxy.Get(name) 21 if v != nil { 22 return &volumeAdapter{ 23 proxy: a.proxy, 24 name: v.Name, 25 driverName: a.Name(), 26 eMount: v.Mountpoint, 27 }, nil 28 } 29 30 // Driver didn't support Get or volume didn't exist. Perform Create. 31 err = a.proxy.Create(name, opts) 32 if err != nil { 33 return nil, err 34 } 35 return &volumeAdapter{ 36 proxy: a.proxy, 37 name: name, 38 driverName: a.name}, nil 39 } 40 41 func (a *volumeDriverAdapter) Remove(v volume.Volume) error { 42 return a.proxy.Remove(v.Name()) 43 } 44 45 func (a *volumeDriverAdapter) List() ([]volume.Volume, error) { 46 ls, err := a.proxy.List() 47 if err != nil { 48 return nil, err 49 } 50 51 var out []volume.Volume 52 for _, vp := range ls { 53 out = append(out, &volumeAdapter{ 54 proxy: a.proxy, 55 name: vp.Name, 56 driverName: a.name, 57 eMount: vp.Mountpoint, 58 }) 59 } 60 return out, nil 61 } 62 63 func (a *volumeDriverAdapter) Get(name string) (volume.Volume, error) { 64 v, err := a.proxy.Get(name) 65 if err != nil { 66 // TODO: remove this hack. Allows back compat with volume drivers that don't support this call 67 if !plugins.IsNotFound(err) { 68 return nil, err 69 } 70 return a.Create(name, nil) 71 } 72 73 return &volumeAdapter{ 74 proxy: a.proxy, 75 name: v.Name, 76 driverName: a.Name(), 77 eMount: v.Mountpoint, 78 }, nil 79 } 80 81 type volumeAdapter struct { 82 proxy *volumeDriverProxy 83 name string 84 driverName string 85 eMount string // ephemeral host volume path 86 } 87 88 type proxyVolume struct { 89 Name string 90 Mountpoint string 91 } 92 93 func (a *volumeAdapter) Name() string { 94 return a.name 95 } 96 97 func (a *volumeAdapter) DriverName() string { 98 return a.driverName 99 } 100 101 func (a *volumeAdapter) Path() string { 102 if len(a.eMount) > 0 { 103 return a.eMount 104 } 105 m, _ := a.proxy.Path(a.name) 106 return m 107 } 108 109 func (a *volumeAdapter) Mount() (string, error) { 110 var err error 111 a.eMount, err = a.proxy.Mount(a.name) 112 return a.eMount, err 113 } 114 115 func (a *volumeAdapter) Unmount() error { 116 return a.proxy.Unmount(a.name) 117 }