Instead of using a global store for volume drivers, scope the driver
store to the caller (e.g. the volume store). This makes testing much
simpler.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
| ... | ... |
@@ -1145,17 +1145,15 @@ func setDefaultMtu(conf *config.Config) {
|
| 1145 | 1145 |
} |
| 1146 | 1146 |
|
| 1147 | 1147 |
func (daemon *Daemon) configureVolumes(rootIDs idtools.IDPair) (*store.VolumeStore, error) {
|
| 1148 |
- volumesDriver, err := local.New(daemon.configStore.Root, rootIDs) |
|
| 1148 |
+ volumeDriver, err := local.New(daemon.configStore.Root, rootIDs) |
|
| 1149 | 1149 |
if err != nil {
|
| 1150 | 1150 |
return nil, err |
| 1151 | 1151 |
} |
| 1152 |
- |
|
| 1153 |
- volumedrivers.RegisterPluginGetter(daemon.PluginStore) |
|
| 1154 |
- |
|
| 1155 |
- if !volumedrivers.Register(volumesDriver, volumesDriver.Name()) {
|
|
| 1152 |
+ drivers := volumedrivers.NewStore(daemon.PluginStore) |
|
| 1153 |
+ if !drivers.Register(volumeDriver, volumeDriver.Name()) {
|
|
| 1156 | 1154 |
return nil, errors.New("local volume driver could not be registered")
|
| 1157 | 1155 |
} |
| 1158 |
- return store.New(daemon.configStore.Root) |
|
| 1156 |
+ return store.New(daemon.configStore.Root, drivers) |
|
| 1159 | 1157 |
} |
| 1160 | 1158 |
|
| 1161 | 1159 |
// IsShuttingDown tells whether the daemon is shutting down or not |
| ... | ... |
@@ -13,7 +13,6 @@ import ( |
| 13 | 13 |
_ "github.com/docker/docker/pkg/discovery/memory" |
| 14 | 14 |
"github.com/docker/docker/pkg/idtools" |
| 15 | 15 |
"github.com/docker/docker/pkg/truncindex" |
| 16 |
- "github.com/docker/docker/volume" |
|
| 17 | 16 |
volumedrivers "github.com/docker/docker/volume/drivers" |
| 18 | 17 |
"github.com/docker/docker/volume/local" |
| 19 | 18 |
"github.com/docker/docker/volume/store" |
| ... | ... |
@@ -121,7 +120,8 @@ func initDaemonWithVolumeStore(tmp string) (*Daemon, error) {
|
| 121 | 121 |
repository: tmp, |
| 122 | 122 |
root: tmp, |
| 123 | 123 |
} |
| 124 |
- daemon.volumes, err = store.New(tmp) |
|
| 124 |
+ drivers := volumedrivers.NewStore(nil) |
|
| 125 |
+ daemon.volumes, err = store.New(tmp, drivers) |
|
| 125 | 126 |
if err != nil {
|
| 126 | 127 |
return nil, err |
| 127 | 128 |
} |
| ... | ... |
@@ -130,7 +130,7 @@ func initDaemonWithVolumeStore(tmp string) (*Daemon, error) {
|
| 130 | 130 |
if err != nil {
|
| 131 | 131 |
return nil, err |
| 132 | 132 |
} |
| 133 |
- volumedrivers.Register(volumesDriver, volumesDriver.Name()) |
|
| 133 |
+ drivers.Register(volumesDriver, volumesDriver.Name()) |
|
| 134 | 134 |
|
| 135 | 135 |
return daemon, nil |
| 136 | 136 |
} |
| ... | ... |
@@ -208,7 +208,6 @@ func TestContainerInitDNS(t *testing.T) {
|
| 208 | 208 |
if err != nil {
|
| 209 | 209 |
t.Fatal(err) |
| 210 | 210 |
} |
| 211 |
- defer volumedrivers.Unregister(volume.DefaultDriverName) |
|
| 212 | 211 |
|
| 213 | 212 |
c, err := daemon.load(containerID) |
| 214 | 213 |
if err != nil {
|
| ... | ... |
@@ -19,7 +19,6 @@ import ( |
| 19 | 19 |
"github.com/docker/docker/pkg/sysinfo" |
| 20 | 20 |
"github.com/docker/docker/pkg/system" |
| 21 | 21 |
"github.com/docker/docker/registry" |
| 22 |
- "github.com/docker/docker/volume/drivers" |
|
| 23 | 22 |
"github.com/docker/go-connections/sockets" |
| 24 | 23 |
"github.com/sirupsen/logrus" |
| 25 | 24 |
) |
| ... | ... |
@@ -196,7 +195,7 @@ func (daemon *Daemon) SystemVersion() types.Version {
|
| 196 | 196 |
func (daemon *Daemon) showPluginsInfo() types.PluginsInfo {
|
| 197 | 197 |
var pluginsInfo types.PluginsInfo |
| 198 | 198 |
|
| 199 |
- pluginsInfo.Volume = volumedrivers.GetDriverList() |
|
| 199 |
+ pluginsInfo.Volume = daemon.volumes.GetDriverList() |
|
| 200 | 200 |
pluginsInfo.Network = daemon.GetNetworkDriverList() |
| 201 | 201 |
// The authorization plugins are returned in the order they are |
| 202 | 202 |
// used as they constitute a request/response modification chain. |
| ... | ... |
@@ -7,6 +7,7 @@ import ( |
| 7 | 7 |
"sort" |
| 8 | 8 |
"sync" |
| 9 | 9 |
|
| 10 |
+ "github.com/docker/docker/errdefs" |
|
| 10 | 11 |
"github.com/docker/docker/pkg/locker" |
| 11 | 12 |
getter "github.com/docker/docker/pkg/plugingetter" |
| 12 | 13 |
"github.com/docker/docker/volume" |
| ... | ... |
@@ -14,14 +15,6 @@ import ( |
| 14 | 14 |
"github.com/sirupsen/logrus" |
| 15 | 15 |
) |
| 16 | 16 |
|
| 17 |
-// currently created by hand. generation tool would generate this like: |
|
| 18 |
-// $ extpoint-gen Driver > volume/extpoint.go |
|
| 19 |
- |
|
| 20 |
-var drivers = &driverExtpoint{
|
|
| 21 |
- extensions: make(map[string]volume.Driver), |
|
| 22 |
- driverLock: &locker.Locker{},
|
|
| 23 |
-} |
|
| 24 |
- |
|
| 25 | 17 |
const extName = "VolumeDriver" |
| 26 | 18 |
|
| 27 | 19 |
// NewVolumeDriver returns a driver has the given name mapped on the given client. |
| ... | ... |
@@ -53,53 +46,21 @@ type volumeDriver interface {
|
| 53 | 53 |
Capabilities() (capabilities volume.Capability, err error) |
| 54 | 54 |
} |
| 55 | 55 |
|
| 56 |
-type driverExtpoint struct {
|
|
| 57 |
- extensions map[string]volume.Driver |
|
| 58 |
- sync.Mutex |
|
| 56 |
+// Store is an in-memory store for volume drivers |
|
| 57 |
+type Store struct {
|
|
| 58 |
+ extensions map[string]volume.Driver |
|
| 59 |
+ mu sync.Mutex |
|
| 59 | 60 |
driverLock *locker.Locker |
| 60 |
- plugingetter getter.PluginGetter |
|
| 61 |
+ pluginGetter getter.PluginGetter |
|
| 61 | 62 |
} |
| 62 | 63 |
|
| 63 |
-// RegisterPluginGetter sets the plugingetter |
|
| 64 |
-func RegisterPluginGetter(plugingetter getter.PluginGetter) {
|
|
| 65 |
- drivers.plugingetter = plugingetter |
|
| 66 |
-} |
|
| 67 |
- |
|
| 68 |
-// Register associates the given driver to the given name, checking if |
|
| 69 |
-// the name is already associated |
|
| 70 |
-func Register(extension volume.Driver, name string) bool {
|
|
| 71 |
- if name == "" {
|
|
| 72 |
- return false |
|
| 73 |
- } |
|
| 74 |
- |
|
| 75 |
- drivers.Lock() |
|
| 76 |
- defer drivers.Unlock() |
|
| 77 |
- |
|
| 78 |
- _, exists := drivers.extensions[name] |
|
| 79 |
- if exists {
|
|
| 80 |
- return false |
|
| 64 |
+// NewStore creates a new volume driver store |
|
| 65 |
+func NewStore(pg getter.PluginGetter) *Store {
|
|
| 66 |
+ return &Store{
|
|
| 67 |
+ extensions: make(map[string]volume.Driver), |
|
| 68 |
+ driverLock: locker.New(), |
|
| 69 |
+ pluginGetter: pg, |
|
| 81 | 70 |
} |
| 82 |
- |
|
| 83 |
- if err := validateDriver(extension); err != nil {
|
|
| 84 |
- return false |
|
| 85 |
- } |
|
| 86 |
- |
|
| 87 |
- drivers.extensions[name] = extension |
|
| 88 |
- |
|
| 89 |
- return true |
|
| 90 |
-} |
|
| 91 |
- |
|
| 92 |
-// Unregister dissociates the name from its driver, if the association exists. |
|
| 93 |
-func Unregister(name string) bool {
|
|
| 94 |
- drivers.Lock() |
|
| 95 |
- defer drivers.Unlock() |
|
| 96 |
- |
|
| 97 |
- _, exists := drivers.extensions[name] |
|
| 98 |
- if !exists {
|
|
| 99 |
- return false |
|
| 100 |
- } |
|
| 101 |
- delete(drivers.extensions, name) |
|
| 102 |
- return true |
|
| 103 | 71 |
} |
| 104 | 72 |
|
| 105 | 73 |
type driverNotFoundError string |
| ... | ... |
@@ -113,18 +74,21 @@ func (driverNotFoundError) NotFound() {}
|
| 113 | 113 |
// lookup returns the driver associated with the given name. If a |
| 114 | 114 |
// driver with the given name has not been registered it checks if |
| 115 | 115 |
// there is a VolumeDriver plugin available with the given name. |
| 116 |
-func lookup(name string, mode int) (volume.Driver, error) {
|
|
| 117 |
- drivers.driverLock.Lock(name) |
|
| 118 |
- defer drivers.driverLock.Unlock(name) |
|
| 116 |
+func (s *Store) lookup(name string, mode int) (volume.Driver, error) {
|
|
| 117 |
+ if name == "" {
|
|
| 118 |
+ return nil, errdefs.InvalidParameter(errors.New("driver name cannot be empty"))
|
|
| 119 |
+ } |
|
| 120 |
+ s.driverLock.Lock(name) |
|
| 121 |
+ defer s.driverLock.Unlock(name) |
|
| 119 | 122 |
|
| 120 |
- drivers.Lock() |
|
| 121 |
- ext, ok := drivers.extensions[name] |
|
| 122 |
- drivers.Unlock() |
|
| 123 |
+ s.mu.Lock() |
|
| 124 |
+ ext, ok := s.extensions[name] |
|
| 125 |
+ s.mu.Unlock() |
|
| 123 | 126 |
if ok {
|
| 124 | 127 |
return ext, nil |
| 125 | 128 |
} |
| 126 |
- if drivers.plugingetter != nil {
|
|
| 127 |
- p, err := drivers.plugingetter.Get(name, extName, mode) |
|
| 129 |
+ if s.pluginGetter != nil {
|
|
| 130 |
+ p, err := s.pluginGetter.Get(name, extName, mode) |
|
| 128 | 131 |
if err != nil {
|
| 129 | 132 |
return nil, errors.Wrap(err, "error looking up volume plugin "+name) |
| 130 | 133 |
} |
| ... | ... |
@@ -133,7 +97,7 @@ func lookup(name string, mode int) (volume.Driver, error) {
|
| 133 | 133 |
if err := validateDriver(d); err != nil {
|
| 134 | 134 |
if mode > 0 {
|
| 135 | 135 |
// Undo any reference count changes from the initial `Get` |
| 136 |
- if _, err := drivers.plugingetter.Get(name, extName, mode*-1); err != nil {
|
|
| 136 |
+ if _, err := s.pluginGetter.Get(name, extName, mode*-1); err != nil {
|
|
| 137 | 137 |
logrus.WithError(err).WithField("action", "validate-driver").WithField("plugin", name).Error("error releasing reference to plugin")
|
| 138 | 138 |
} |
| 139 | 139 |
} |
| ... | ... |
@@ -141,9 +105,9 @@ func lookup(name string, mode int) (volume.Driver, error) {
|
| 141 | 141 |
} |
| 142 | 142 |
|
| 143 | 143 |
if p.IsV1() {
|
| 144 |
- drivers.Lock() |
|
| 145 |
- drivers.extensions[name] = d |
|
| 146 |
- drivers.Unlock() |
|
| 144 |
+ s.mu.Lock() |
|
| 145 |
+ s.extensions[name] = d |
|
| 146 |
+ s.mu.Unlock() |
|
| 147 | 147 |
} |
| 148 | 148 |
return d, nil |
| 149 | 149 |
} |
| ... | ... |
@@ -158,75 +122,88 @@ func validateDriver(vd volume.Driver) error {
|
| 158 | 158 |
return nil |
| 159 | 159 |
} |
| 160 | 160 |
|
| 161 |
-// GetDriver returns a volume driver by its name. |
|
| 162 |
-// If the driver is empty, it looks for the local driver. |
|
| 163 |
-func GetDriver(name string) (volume.Driver, error) {
|
|
| 161 |
+// Register associates the given driver to the given name, checking if |
|
| 162 |
+// the name is already associated |
|
| 163 |
+func (s *Store) Register(d volume.Driver, name string) bool {
|
|
| 164 | 164 |
if name == "" {
|
| 165 |
- name = volume.DefaultDriverName |
|
| 165 |
+ return false |
|
| 166 |
+ } |
|
| 167 |
+ |
|
| 168 |
+ s.mu.Lock() |
|
| 169 |
+ defer s.mu.Unlock() |
|
| 170 |
+ |
|
| 171 |
+ if _, exists := s.extensions[name]; exists {
|
|
| 172 |
+ return false |
|
| 173 |
+ } |
|
| 174 |
+ |
|
| 175 |
+ if err := validateDriver(d); err != nil {
|
|
| 176 |
+ return false |
|
| 166 | 177 |
} |
| 167 |
- return lookup(name, getter.Lookup) |
|
| 178 |
+ |
|
| 179 |
+ s.extensions[name] = d |
|
| 180 |
+ return true |
|
| 181 |
+} |
|
| 182 |
+ |
|
| 183 |
+// GetDriver returns a volume driver by its name. |
|
| 184 |
+// If the driver is empty, it looks for the local driver. |
|
| 185 |
+func (s *Store) GetDriver(name string) (volume.Driver, error) {
|
|
| 186 |
+ return s.lookup(name, getter.Lookup) |
|
| 168 | 187 |
} |
| 169 | 188 |
|
| 170 | 189 |
// CreateDriver returns a volume driver by its name and increments RefCount. |
| 171 | 190 |
// If the driver is empty, it looks for the local driver. |
| 172 |
-func CreateDriver(name string) (volume.Driver, error) {
|
|
| 173 |
- if name == "" {
|
|
| 174 |
- name = volume.DefaultDriverName |
|
| 175 |
- } |
|
| 176 |
- return lookup(name, getter.Acquire) |
|
| 191 |
+func (s *Store) CreateDriver(name string) (volume.Driver, error) {
|
|
| 192 |
+ return s.lookup(name, getter.Acquire) |
|
| 177 | 193 |
} |
| 178 | 194 |
|
| 179 | 195 |
// ReleaseDriver returns a volume driver by its name and decrements RefCount.. |
| 180 | 196 |
// If the driver is empty, it looks for the local driver. |
| 181 |
-func ReleaseDriver(name string) (volume.Driver, error) {
|
|
| 182 |
- if name == "" {
|
|
| 183 |
- name = volume.DefaultDriverName |
|
| 184 |
- } |
|
| 185 |
- return lookup(name, getter.Release) |
|
| 197 |
+func (s *Store) ReleaseDriver(name string) (volume.Driver, error) {
|
|
| 198 |
+ return s.lookup(name, getter.Release) |
|
| 186 | 199 |
} |
| 187 | 200 |
|
| 188 | 201 |
// GetDriverList returns list of volume drivers registered. |
| 189 | 202 |
// If no driver is registered, empty string list will be returned. |
| 190 |
-func GetDriverList() []string {
|
|
| 203 |
+func (s *Store) GetDriverList() []string {
|
|
| 191 | 204 |
var driverList []string |
| 192 |
- drivers.Lock() |
|
| 193 |
- for driverName := range drivers.extensions {
|
|
| 205 |
+ s.mu.Lock() |
|
| 206 |
+ for driverName := range s.extensions {
|
|
| 194 | 207 |
driverList = append(driverList, driverName) |
| 195 | 208 |
} |
| 196 |
- drivers.Unlock() |
|
| 209 |
+ s.mu.Unlock() |
|
| 197 | 210 |
sort.Strings(driverList) |
| 198 | 211 |
return driverList |
| 199 | 212 |
} |
| 200 | 213 |
|
| 201 | 214 |
// GetAllDrivers lists all the registered drivers |
| 202 |
-func GetAllDrivers() ([]volume.Driver, error) {
|
|
| 215 |
+func (s *Store) GetAllDrivers() ([]volume.Driver, error) {
|
|
| 203 | 216 |
var plugins []getter.CompatPlugin |
| 204 |
- if drivers.plugingetter != nil {
|
|
| 217 |
+ if s.pluginGetter != nil {
|
|
| 205 | 218 |
var err error |
| 206 |
- plugins, err = drivers.plugingetter.GetAllByCap(extName) |
|
| 219 |
+ plugins, err = s.pluginGetter.GetAllByCap(extName) |
|
| 207 | 220 |
if err != nil {
|
| 208 | 221 |
return nil, fmt.Errorf("error listing plugins: %v", err)
|
| 209 | 222 |
} |
| 210 | 223 |
} |
| 211 | 224 |
var ds []volume.Driver |
| 212 | 225 |
|
| 213 |
- drivers.Lock() |
|
| 214 |
- defer drivers.Unlock() |
|
| 226 |
+ s.mu.Lock() |
|
| 227 |
+ defer s.mu.Unlock() |
|
| 215 | 228 |
|
| 216 |
- for _, d := range drivers.extensions {
|
|
| 229 |
+ for _, d := range s.extensions {
|
|
| 217 | 230 |
ds = append(ds, d) |
| 218 | 231 |
} |
| 219 | 232 |
|
| 220 | 233 |
for _, p := range plugins {
|
| 221 | 234 |
name := p.Name() |
| 222 | 235 |
|
| 223 |
- if _, ok := drivers.extensions[name]; ok {
|
|
| 236 |
+ if _, ok := s.extensions[name]; ok {
|
|
| 224 | 237 |
continue |
| 225 | 238 |
} |
| 226 | 239 |
|
| 227 | 240 |
ext := NewVolumeDriver(name, p.ScopedPath, p.Client()) |
| 228 | 241 |
if p.IsV1() {
|
| 229 |
- drivers.extensions[name] = ext |
|
| 242 |
+ s.extensions[name] = ext |
|
| 230 | 243 |
} |
| 231 | 244 |
ds = append(ds, ext) |
| 232 | 245 |
} |
| ... | ... |
@@ -7,13 +7,14 @@ import ( |
| 7 | 7 |
) |
| 8 | 8 |
|
| 9 | 9 |
func TestGetDriver(t *testing.T) {
|
| 10 |
- _, err := GetDriver("missing")
|
|
| 10 |
+ s := NewStore(nil) |
|
| 11 |
+ _, err := s.GetDriver("missing")
|
|
| 11 | 12 |
if err == nil {
|
| 12 | 13 |
t.Fatal("Expected error, was nil")
|
| 13 | 14 |
} |
| 14 |
- Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 15 |
+ s.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 15 | 16 |
|
| 16 |
- d, err := GetDriver("fake")
|
|
| 17 |
+ d, err := s.GetDriver("fake")
|
|
| 17 | 18 |
if err != nil {
|
| 18 | 19 |
t.Fatal(err) |
| 19 | 20 |
} |
| ... | ... |
@@ -5,7 +5,6 @@ import ( |
| 5 | 5 |
|
| 6 | 6 |
"github.com/boltdb/bolt" |
| 7 | 7 |
"github.com/docker/docker/volume" |
| 8 |
- "github.com/docker/docker/volume/drivers" |
|
| 9 | 8 |
"github.com/sirupsen/logrus" |
| 10 | 9 |
) |
| 11 | 10 |
|
| ... | ... |
@@ -33,7 +32,7 @@ func (s *VolumeStore) restore() {
|
| 33 | 33 |
var v volume.Volume |
| 34 | 34 |
var err error |
| 35 | 35 |
if meta.Driver != "" {
|
| 36 |
- v, err = lookupVolume(meta.Driver, meta.Name) |
|
| 36 |
+ v, err = lookupVolume(s.drivers, meta.Driver, meta.Name) |
|
| 37 | 37 |
if err != nil && err != errNoSuchVolume {
|
| 38 | 38 |
logrus.WithError(err).WithField("driver", meta.Driver).WithField("volume", meta.Name).Warn("Error restoring volume")
|
| 39 | 39 |
return |
| ... | ... |
@@ -59,7 +58,7 @@ func (s *VolumeStore) restore() {
|
| 59 | 59 |
} |
| 60 | 60 |
|
| 61 | 61 |
// increment driver refcount |
| 62 |
- volumedrivers.CreateDriver(meta.Driver) |
|
| 62 |
+ s.drivers.CreateDriver(meta.Driver) |
|
| 63 | 63 |
|
| 64 | 64 |
// cache the volume |
| 65 | 65 |
s.globalLock.Lock() |
| ... | ... |
@@ -18,11 +18,11 @@ func TestRestore(t *testing.T) {
|
| 18 | 18 |
assert.NilError(t, err) |
| 19 | 19 |
defer os.RemoveAll(dir) |
| 20 | 20 |
|
| 21 |
+ drivers := volumedrivers.NewStore(nil) |
|
| 21 | 22 |
driverName := "test-restore" |
| 22 |
- volumedrivers.Register(volumetestutils.NewFakeDriver(driverName), driverName) |
|
| 23 |
- defer volumedrivers.Unregister("test-restore")
|
|
| 23 |
+ drivers.Register(volumetestutils.NewFakeDriver(driverName), driverName) |
|
| 24 | 24 |
|
| 25 |
- s, err := New(dir) |
|
| 25 |
+ s, err := New(dir, drivers) |
|
| 26 | 26 |
assert.NilError(t, err) |
| 27 | 27 |
defer s.Shutdown() |
| 28 | 28 |
|
| ... | ... |
@@ -36,7 +36,7 @@ func TestRestore(t *testing.T) {
|
| 36 | 36 |
|
| 37 | 37 |
s.Shutdown() |
| 38 | 38 |
|
| 39 |
- s, err = New(dir) |
|
| 39 |
+ s, err = New(dir, drivers) |
|
| 40 | 40 |
assert.NilError(t, err) |
| 41 | 41 |
|
| 42 | 42 |
v, err := s.Get("test1")
|
| ... | ... |
@@ -66,13 +66,14 @@ func (v volumeWrapper) CachedPath() string {
|
| 66 | 66 |
|
| 67 | 67 |
// New initializes a VolumeStore to keep |
| 68 | 68 |
// reference counting of volumes in the system. |
| 69 |
-func New(rootPath string) (*VolumeStore, error) {
|
|
| 69 |
+func New(rootPath string, drivers *drivers.Store) (*VolumeStore, error) {
|
|
| 70 | 70 |
vs := &VolumeStore{
|
| 71 | 71 |
locks: &locker.Locker{},
|
| 72 | 72 |
names: make(map[string]volume.Volume), |
| 73 | 73 |
refs: make(map[string]map[string]struct{}),
|
| 74 | 74 |
labels: make(map[string]map[string]string), |
| 75 | 75 |
options: make(map[string]map[string]string), |
| 76 |
+ drivers: drivers, |
|
| 76 | 77 |
} |
| 77 | 78 |
|
| 78 | 79 |
if rootPath != "" {
|
| ... | ... |
@@ -157,7 +158,7 @@ func (s *VolumeStore) Purge(name string) {
|
| 157 | 157 |
v, exists := s.names[name] |
| 158 | 158 |
if exists {
|
| 159 | 159 |
driverName := v.DriverName() |
| 160 |
- if _, err := volumedrivers.ReleaseDriver(driverName); err != nil {
|
|
| 160 |
+ if _, err := s.drivers.ReleaseDriver(driverName); err != nil {
|
|
| 161 | 161 |
logrus.WithError(err).WithField("driver", driverName).Error("Error releasing reference to volume driver")
|
| 162 | 162 |
} |
| 163 | 163 |
} |
| ... | ... |
@@ -175,7 +176,8 @@ func (s *VolumeStore) Purge(name string) {
|
| 175 | 175 |
type VolumeStore struct {
|
| 176 | 176 |
// locks ensures that only one action is being performed on a particular volume at a time without locking the entire store |
| 177 | 177 |
// since actions on volumes can be quite slow, this ensures the store is free to handle requests for other volumes. |
| 178 |
- locks *locker.Locker |
|
| 178 |
+ locks *locker.Locker |
|
| 179 |
+ drivers *drivers.Store |
|
| 179 | 180 |
// globalLock is used to protect access to mutable structures used by the store object |
| 180 | 181 |
globalLock sync.RWMutex |
| 181 | 182 |
// names stores the volume name -> volume relationship. |
| ... | ... |
@@ -226,7 +228,7 @@ func (s *VolumeStore) list() ([]volume.Volume, []string, error) {
|
| 226 | 226 |
warnings []string |
| 227 | 227 |
) |
| 228 | 228 |
|
| 229 |
- drivers, err := volumedrivers.GetAllDrivers() |
|
| 229 |
+ drivers, err := s.drivers.GetAllDrivers() |
|
| 230 | 230 |
if err != nil {
|
| 231 | 231 |
return nil, nil, err |
| 232 | 232 |
} |
| ... | ... |
@@ -329,7 +331,7 @@ func (s *VolumeStore) checkConflict(name, driverName string) (volume.Volume, err |
| 329 | 329 |
if driverName != "" {
|
| 330 | 330 |
// Retrieve canonical driver name to avoid inconsistencies (for example |
| 331 | 331 |
// "plugin" vs. "plugin:latest") |
| 332 |
- vd, err := volumedrivers.GetDriver(driverName) |
|
| 332 |
+ vd, err := s.drivers.GetDriver(driverName) |
|
| 333 | 333 |
if err != nil {
|
| 334 | 334 |
return nil, err |
| 335 | 335 |
} |
| ... | ... |
@@ -341,7 +343,7 @@ func (s *VolumeStore) checkConflict(name, driverName string) (volume.Volume, err |
| 341 | 341 |
|
| 342 | 342 |
// let's check if the found volume ref |
| 343 | 343 |
// is stale by checking with the driver if it still exists |
| 344 |
- exists, err := volumeExists(v) |
|
| 344 |
+ exists, err := volumeExists(s.drivers, v) |
|
| 345 | 345 |
if err != nil {
|
| 346 | 346 |
return nil, errors.Wrapf(errNameConflict, "found reference to volume '%s' in driver '%s', but got an error while checking the driver: %v", name, vDriverName, err) |
| 347 | 347 |
} |
| ... | ... |
@@ -366,8 +368,8 @@ func (s *VolumeStore) checkConflict(name, driverName string) (volume.Volume, err |
| 366 | 366 |
|
| 367 | 367 |
// volumeExists returns if the volume is still present in the driver. |
| 368 | 368 |
// An error is returned if there was an issue communicating with the driver. |
| 369 |
-func volumeExists(v volume.Volume) (bool, error) {
|
|
| 370 |
- exists, err := lookupVolume(v.DriverName(), v.Name()) |
|
| 369 |
+func volumeExists(store *drivers.Store, v volume.Volume) (bool, error) {
|
|
| 370 |
+ exists, err := lookupVolume(store, v.DriverName(), v.Name()) |
|
| 371 | 371 |
if err != nil {
|
| 372 | 372 |
return false, err |
| 373 | 373 |
} |
| ... | ... |
@@ -412,7 +414,10 @@ func (s *VolumeStore) create(name, driverName string, opts, labels map[string]st |
| 412 | 412 |
} |
| 413 | 413 |
} |
| 414 | 414 |
|
| 415 |
- vd, err := volumedrivers.CreateDriver(driverName) |
|
| 415 |
+ if driverName == "" {
|
|
| 416 |
+ driverName = volume.DefaultDriverName |
|
| 417 |
+ } |
|
| 418 |
+ vd, err := s.drivers.CreateDriver(driverName) |
|
| 416 | 419 |
if err != nil {
|
| 417 | 420 |
return nil, &OpErr{Op: "create", Name: name, Err: err}
|
| 418 | 421 |
} |
| ... | ... |
@@ -421,7 +426,7 @@ func (s *VolumeStore) create(name, driverName string, opts, labels map[string]st |
| 421 | 421 |
if v, _ = vd.Get(name); v == nil {
|
| 422 | 422 |
v, err = vd.Create(name, opts) |
| 423 | 423 |
if err != nil {
|
| 424 |
- if _, err := volumedrivers.ReleaseDriver(driverName); err != nil {
|
|
| 424 |
+ if _, err := s.drivers.ReleaseDriver(driverName); err != nil {
|
|
| 425 | 425 |
logrus.WithError(err).WithField("driver", driverName).Error("Error releasing reference to volume driver")
|
| 426 | 426 |
} |
| 427 | 427 |
return nil, err |
| ... | ... |
@@ -455,7 +460,10 @@ func (s *VolumeStore) GetWithRef(name, driverName, ref string) (volume.Volume, e |
| 455 | 455 |
s.locks.Lock(name) |
| 456 | 456 |
defer s.locks.Unlock(name) |
| 457 | 457 |
|
| 458 |
- vd, err := volumedrivers.GetDriver(driverName) |
|
| 458 |
+ if driverName == "" {
|
|
| 459 |
+ driverName = volume.DefaultDriverName |
|
| 460 |
+ } |
|
| 461 |
+ vd, err := s.drivers.GetDriver(driverName) |
|
| 459 | 462 |
if err != nil {
|
| 460 | 463 |
return nil, &OpErr{Err: err, Name: name, Op: "get"}
|
| 461 | 464 |
} |
| ... | ... |
@@ -510,7 +518,7 @@ func (s *VolumeStore) getVolume(name string) (volume.Volume, error) {
|
| 510 | 510 |
} |
| 511 | 511 |
|
| 512 | 512 |
if meta.Driver != "" {
|
| 513 |
- vol, err := lookupVolume(meta.Driver, name) |
|
| 513 |
+ vol, err := lookupVolume(s.drivers, meta.Driver, name) |
|
| 514 | 514 |
if err != nil {
|
| 515 | 515 |
return nil, err |
| 516 | 516 |
} |
| ... | ... |
@@ -520,7 +528,7 @@ func (s *VolumeStore) getVolume(name string) (volume.Volume, error) {
|
| 520 | 520 |
} |
| 521 | 521 |
|
| 522 | 522 |
var scope string |
| 523 |
- vd, err := volumedrivers.GetDriver(meta.Driver) |
|
| 523 |
+ vd, err := s.drivers.GetDriver(meta.Driver) |
|
| 524 | 524 |
if err == nil {
|
| 525 | 525 |
scope = vd.Scope() |
| 526 | 526 |
} |
| ... | ... |
@@ -528,7 +536,7 @@ func (s *VolumeStore) getVolume(name string) (volume.Volume, error) {
|
| 528 | 528 |
} |
| 529 | 529 |
|
| 530 | 530 |
logrus.Debugf("Probing all drivers for volume with name: %s", name)
|
| 531 |
- drivers, err := volumedrivers.GetAllDrivers() |
|
| 531 |
+ drivers, err := s.drivers.GetAllDrivers() |
|
| 532 | 532 |
if err != nil {
|
| 533 | 533 |
return nil, err |
| 534 | 534 |
} |
| ... | ... |
@@ -552,8 +560,11 @@ func (s *VolumeStore) getVolume(name string) (volume.Volume, error) {
|
| 552 | 552 |
// If the driver returns an error that is not communication related the |
| 553 | 553 |
// error is logged but not returned. |
| 554 | 554 |
// If the volume is not found it will return `nil, nil`` |
| 555 |
-func lookupVolume(driverName, volumeName string) (volume.Volume, error) {
|
|
| 556 |
- vd, err := volumedrivers.GetDriver(driverName) |
|
| 555 |
+func lookupVolume(store *drivers.Store, driverName, volumeName string) (volume.Volume, error) {
|
|
| 556 |
+ if driverName == "" {
|
|
| 557 |
+ driverName = volume.DefaultDriverName |
|
| 558 |
+ } |
|
| 559 |
+ vd, err := store.GetDriver(driverName) |
|
| 557 | 560 |
if err != nil {
|
| 558 | 561 |
return nil, errors.Wrapf(err, "error while checking if volume %q exists in driver %q", volumeName, driverName) |
| 559 | 562 |
} |
| ... | ... |
@@ -585,7 +596,7 @@ func (s *VolumeStore) Remove(v volume.Volume) error {
|
| 585 | 585 |
return &OpErr{Err: errVolumeInUse, Name: v.Name(), Op: "remove", Refs: s.getRefs(name)}
|
| 586 | 586 |
} |
| 587 | 587 |
|
| 588 |
- vd, err := volumedrivers.GetDriver(v.DriverName()) |
|
| 588 |
+ vd, err := s.drivers.GetDriver(v.DriverName()) |
|
| 589 | 589 |
if err != nil {
|
| 590 | 590 |
return &OpErr{Err: err, Name: v.DriverName(), Op: "remove"}
|
| 591 | 591 |
} |
| ... | ... |
@@ -627,7 +638,7 @@ func (s *VolumeStore) Refs(v volume.Volume) []string {
|
| 627 | 627 |
|
| 628 | 628 |
// FilterByDriver returns the available volumes filtered by driver name |
| 629 | 629 |
func (s *VolumeStore) FilterByDriver(name string) ([]volume.Volume, error) {
|
| 630 |
- vd, err := volumedrivers.GetDriver(name) |
|
| 630 |
+ vd, err := s.drivers.GetDriver(name) |
|
| 631 | 631 |
if err != nil {
|
| 632 | 632 |
return nil, &OpErr{Err: err, Name: name, Op: "list"}
|
| 633 | 633 |
} |
| ... | ... |
@@ -686,3 +697,10 @@ func unwrapVolume(v volume.Volume) volume.Volume {
|
| 686 | 686 |
func (s *VolumeStore) Shutdown() error {
|
| 687 | 687 |
return s.db.Close() |
| 688 | 688 |
} |
| 689 |
+ |
|
| 690 |
+// GetDriverList gets the list of volume drivers from the configured volume driver |
|
| 691 |
+// store. |
|
| 692 |
+// TODO(@cpuguy83): This should be factored out into a separate service. |
|
| 693 |
+func (s *VolumeStore) GetDriverList() []string {
|
|
| 694 |
+ return s.drivers.GetDriverList() |
|
| 695 |
+} |
| ... | ... |
@@ -10,7 +10,7 @@ import ( |
| 10 | 10 |
"testing" |
| 11 | 11 |
|
| 12 | 12 |
"github.com/docker/docker/volume" |
| 13 |
- "github.com/docker/docker/volume/drivers" |
|
| 13 |
+ volumedrivers "github.com/docker/docker/volume/drivers" |
|
| 14 | 14 |
volumetestutils "github.com/docker/docker/volume/testutils" |
| 15 | 15 |
"github.com/google/go-cmp/cmp" |
| 16 | 16 |
"github.com/gotestyourself/gotestyourself/assert" |
| ... | ... |
@@ -18,18 +18,12 @@ import ( |
| 18 | 18 |
) |
| 19 | 19 |
|
| 20 | 20 |
func TestCreate(t *testing.T) {
|
| 21 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 22 |
- defer volumedrivers.Unregister("fake")
|
|
| 23 |
- dir, err := ioutil.TempDir("", "test-create")
|
|
| 24 |
- if err != nil {
|
|
| 25 |
- t.Fatal(err) |
|
| 26 |
- } |
|
| 27 |
- defer os.RemoveAll(dir) |
|
| 21 |
+ t.Parallel() |
|
| 22 |
+ |
|
| 23 |
+ s, cleanup := setupTest(t) |
|
| 24 |
+ defer cleanup() |
|
| 25 |
+ s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 28 | 26 |
|
| 29 |
- s, err := New(dir) |
|
| 30 |
- if err != nil {
|
|
| 31 |
- t.Fatal(err) |
|
| 32 |
- } |
|
| 33 | 27 |
v, err := s.Create("fake1", "fake", nil, nil)
|
| 34 | 28 |
if err != nil {
|
| 35 | 29 |
t.Fatal(err) |
| ... | ... |
@@ -53,19 +47,13 @@ func TestCreate(t *testing.T) {
|
| 53 | 53 |
} |
| 54 | 54 |
|
| 55 | 55 |
func TestRemove(t *testing.T) {
|
| 56 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 57 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
|
|
| 58 |
- defer volumedrivers.Unregister("fake")
|
|
| 59 |
- defer volumedrivers.Unregister("noop")
|
|
| 60 |
- dir, err := ioutil.TempDir("", "test-remove")
|
|
| 61 |
- if err != nil {
|
|
| 62 |
- t.Fatal(err) |
|
| 63 |
- } |
|
| 64 |
- defer os.RemoveAll(dir) |
|
| 65 |
- s, err := New(dir) |
|
| 66 |
- if err != nil {
|
|
| 67 |
- t.Fatal(err) |
|
| 68 |
- } |
|
| 56 |
+ t.Parallel() |
|
| 57 |
+ |
|
| 58 |
+ s, cleanup := setupTest(t) |
|
| 59 |
+ defer cleanup() |
|
| 60 |
+ |
|
| 61 |
+ s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 62 |
+ s.drivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
|
|
| 69 | 63 |
|
| 70 | 64 |
// doing string compare here since this error comes directly from the driver |
| 71 | 65 |
expected := "no such volume" |
| ... | ... |
@@ -91,20 +79,19 @@ func TestRemove(t *testing.T) {
|
| 91 | 91 |
} |
| 92 | 92 |
|
| 93 | 93 |
func TestList(t *testing.T) {
|
| 94 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 95 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("fake2"), "fake2")
|
|
| 96 |
- defer volumedrivers.Unregister("fake")
|
|
| 97 |
- defer volumedrivers.Unregister("fake2")
|
|
| 94 |
+ t.Parallel() |
|
| 95 |
+ |
|
| 98 | 96 |
dir, err := ioutil.TempDir("", "test-list")
|
| 99 |
- if err != nil {
|
|
| 100 |
- t.Fatal(err) |
|
| 101 |
- } |
|
| 97 |
+ assert.NilError(t, err) |
|
| 102 | 98 |
defer os.RemoveAll(dir) |
| 103 | 99 |
|
| 104 |
- s, err := New(dir) |
|
| 105 |
- if err != nil {
|
|
| 106 |
- t.Fatal(err) |
|
| 107 |
- } |
|
| 100 |
+ drivers := volumedrivers.NewStore(nil) |
|
| 101 |
+ drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 102 |
+ drivers.Register(volumetestutils.NewFakeDriver("fake2"), "fake2")
|
|
| 103 |
+ |
|
| 104 |
+ s, err := New(dir, drivers) |
|
| 105 |
+ assert.NilError(t, err) |
|
| 106 |
+ |
|
| 108 | 107 |
if _, err := s.Create("test", "fake", nil, nil); err != nil {
|
| 109 | 108 |
t.Fatal(err) |
| 110 | 109 |
} |
| ... | ... |
@@ -124,7 +111,7 @@ func TestList(t *testing.T) {
|
| 124 | 124 |
} |
| 125 | 125 |
|
| 126 | 126 |
// and again with a new store |
| 127 |
- s, err = New(dir) |
|
| 127 |
+ s, err = New(dir, drivers) |
|
| 128 | 128 |
if err != nil {
|
| 129 | 129 |
t.Fatal(err) |
| 130 | 130 |
} |
| ... | ... |
@@ -138,18 +125,12 @@ func TestList(t *testing.T) {
|
| 138 | 138 |
} |
| 139 | 139 |
|
| 140 | 140 |
func TestFilterByDriver(t *testing.T) {
|
| 141 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 142 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
|
|
| 143 |
- defer volumedrivers.Unregister("fake")
|
|
| 144 |
- defer volumedrivers.Unregister("noop")
|
|
| 145 |
- dir, err := ioutil.TempDir("", "test-filter-driver")
|
|
| 146 |
- if err != nil {
|
|
| 147 |
- t.Fatal(err) |
|
| 148 |
- } |
|
| 149 |
- s, err := New(dir) |
|
| 150 |
- if err != nil {
|
|
| 151 |
- t.Fatal(err) |
|
| 152 |
- } |
|
| 141 |
+ t.Parallel() |
|
| 142 |
+ s, cleanup := setupTest(t) |
|
| 143 |
+ defer cleanup() |
|
| 144 |
+ |
|
| 145 |
+ s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 146 |
+ s.drivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
|
|
| 153 | 147 |
|
| 154 | 148 |
if _, err := s.Create("fake1", "fake", nil, nil); err != nil {
|
| 155 | 149 |
t.Fatal(err) |
| ... | ... |
@@ -171,17 +152,12 @@ func TestFilterByDriver(t *testing.T) {
|
| 171 | 171 |
} |
| 172 | 172 |
|
| 173 | 173 |
func TestFilterByUsed(t *testing.T) {
|
| 174 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 175 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
|
|
| 176 |
- dir, err := ioutil.TempDir("", "test-filter-used")
|
|
| 177 |
- if err != nil {
|
|
| 178 |
- t.Fatal(err) |
|
| 179 |
- } |
|
| 174 |
+ t.Parallel() |
|
| 175 |
+ s, cleanup := setupTest(t) |
|
| 176 |
+ defer cleanup() |
|
| 180 | 177 |
|
| 181 |
- s, err := New(dir) |
|
| 182 |
- if err != nil {
|
|
| 183 |
- t.Fatal(err) |
|
| 184 |
- } |
|
| 178 |
+ s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 179 |
+ s.drivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
|
|
| 185 | 180 |
|
| 186 | 181 |
if _, err := s.CreateWithRef("fake1", "fake", "volReference", nil, nil); err != nil {
|
| 187 | 182 |
t.Fatal(err) |
| ... | ... |
@@ -213,16 +189,10 @@ func TestFilterByUsed(t *testing.T) {
|
| 213 | 213 |
} |
| 214 | 214 |
|
| 215 | 215 |
func TestDerefMultipleOfSameRef(t *testing.T) {
|
| 216 |
- volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 217 |
- dir, err := ioutil.TempDir("", "test-same-deref")
|
|
| 218 |
- if err != nil {
|
|
| 219 |
- t.Fatal(err) |
|
| 220 |
- } |
|
| 221 |
- defer os.RemoveAll(dir) |
|
| 222 |
- s, err := New(dir) |
|
| 223 |
- if err != nil {
|
|
| 224 |
- t.Fatal(err) |
|
| 225 |
- } |
|
| 216 |
+ t.Parallel() |
|
| 217 |
+ s, cleanup := setupTest(t) |
|
| 218 |
+ defer cleanup() |
|
| 219 |
+ s.drivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
|
|
| 226 | 220 |
|
| 227 | 221 |
v, err := s.CreateWithRef("fake1", "fake", "volReference", nil, nil)
|
| 228 | 222 |
if err != nil {
|
| ... | ... |
@@ -240,17 +210,12 @@ func TestDerefMultipleOfSameRef(t *testing.T) {
|
| 240 | 240 |
} |
| 241 | 241 |
|
| 242 | 242 |
func TestCreateKeepOptsLabelsWhenExistsRemotely(t *testing.T) {
|
| 243 |
+ t.Parallel() |
|
| 244 |
+ s, cleanup := setupTest(t) |
|
| 245 |
+ defer cleanup() |
|
| 246 |
+ |
|
| 243 | 247 |
vd := volumetestutils.NewFakeDriver("fake")
|
| 244 |
- volumedrivers.Register(vd, "fake") |
|
| 245 |
- dir, err := ioutil.TempDir("", "test-same-deref")
|
|
| 246 |
- if err != nil {
|
|
| 247 |
- t.Fatal(err) |
|
| 248 |
- } |
|
| 249 |
- defer os.RemoveAll(dir) |
|
| 250 |
- s, err := New(dir) |
|
| 251 |
- if err != nil {
|
|
| 252 |
- t.Fatal(err) |
|
| 253 |
- } |
|
| 248 |
+ s.drivers.Register(vd, "fake") |
|
| 254 | 249 |
|
| 255 | 250 |
// Create a volume in the driver directly |
| 256 | 251 |
if _, err := vd.Create("foo", nil); err != nil {
|
| ... | ... |
@@ -273,6 +238,8 @@ func TestCreateKeepOptsLabelsWhenExistsRemotely(t *testing.T) {
|
| 273 | 273 |
} |
| 274 | 274 |
|
| 275 | 275 |
func TestDefererencePluginOnCreateError(t *testing.T) {
|
| 276 |
+ t.Parallel() |
|
| 277 |
+ |
|
| 276 | 278 |
var ( |
| 277 | 279 |
l net.Listener |
| 278 | 280 |
err error |
| ... | ... |
@@ -286,6 +253,9 @@ func TestDefererencePluginOnCreateError(t *testing.T) {
|
| 286 | 286 |
} |
| 287 | 287 |
defer l.Close() |
| 288 | 288 |
|
| 289 |
+ s, cleanup := setupTest(t) |
|
| 290 |
+ defer cleanup() |
|
| 291 |
+ |
|
| 289 | 292 |
d := volumetestutils.NewFakeDriver("TestDefererencePluginOnCreateError")
|
| 290 | 293 |
p, err := volumetestutils.MakeFakePlugin(d, l) |
| 291 | 294 |
if err != nil {
|
| ... | ... |
@@ -293,19 +263,7 @@ func TestDefererencePluginOnCreateError(t *testing.T) {
|
| 293 | 293 |
} |
| 294 | 294 |
|
| 295 | 295 |
pg := volumetestutils.NewFakePluginGetter(p) |
| 296 |
- volumedrivers.RegisterPluginGetter(pg) |
|
| 297 |
- defer volumedrivers.RegisterPluginGetter(nil) |
|
| 298 |
- |
|
| 299 |
- dir, err := ioutil.TempDir("", "test-plugin-deref-err")
|
|
| 300 |
- if err != nil {
|
|
| 301 |
- t.Fatal(err) |
|
| 302 |
- } |
|
| 303 |
- defer os.RemoveAll(dir) |
|
| 304 |
- |
|
| 305 |
- s, err := New(dir) |
|
| 306 |
- if err != nil {
|
|
| 307 |
- t.Fatal(err) |
|
| 308 |
- } |
|
| 296 |
+ s.drivers = volumedrivers.NewStore(pg) |
|
| 309 | 297 |
|
| 310 | 298 |
// create a good volume so we have a plugin reference |
| 311 | 299 |
_, err = s.Create("fake1", d.Name(), nil, nil)
|
| ... | ... |
@@ -329,8 +287,9 @@ func TestRefDerefRemove(t *testing.T) {
|
| 329 | 329 |
t.Parallel() |
| 330 | 330 |
|
| 331 | 331 |
driverName := "test-ref-deref-remove" |
| 332 |
- s, cleanup := setupTest(t, driverName) |
|
| 333 |
- defer cleanup(t) |
|
| 332 |
+ s, cleanup := setupTest(t) |
|
| 333 |
+ defer cleanup() |
|
| 334 |
+ s.drivers.Register(volumetestutils.NewFakeDriver(driverName), driverName) |
|
| 334 | 335 |
|
| 335 | 336 |
v, err := s.CreateWithRef("test", driverName, "test-ref", nil, nil)
|
| 336 | 337 |
assert.NilError(t, err) |
| ... | ... |
@@ -348,8 +307,9 @@ func TestGet(t *testing.T) {
|
| 348 | 348 |
t.Parallel() |
| 349 | 349 |
|
| 350 | 350 |
driverName := "test-get" |
| 351 |
- s, cleanup := setupTest(t, driverName) |
|
| 352 |
- defer cleanup(t) |
|
| 351 |
+ s, cleanup := setupTest(t) |
|
| 352 |
+ defer cleanup() |
|
| 353 |
+ s.drivers.Register(volumetestutils.NewFakeDriver(driverName), driverName) |
|
| 353 | 354 |
|
| 354 | 355 |
_, err := s.Get("not-exist")
|
| 355 | 356 |
assert.Assert(t, is.ErrorContains(err, "")) |
| ... | ... |
@@ -373,8 +333,9 @@ func TestGetWithRef(t *testing.T) {
|
| 373 | 373 |
t.Parallel() |
| 374 | 374 |
|
| 375 | 375 |
driverName := "test-get-with-ref" |
| 376 |
- s, cleanup := setupTest(t, driverName) |
|
| 377 |
- defer cleanup(t) |
|
| 376 |
+ s, cleanup := setupTest(t) |
|
| 377 |
+ defer cleanup() |
|
| 378 |
+ s.drivers.Register(volumetestutils.NewFakeDriver(driverName), driverName) |
|
| 378 | 379 |
|
| 379 | 380 |
_, err := s.GetWithRef("not-exist", driverName, "test-ref")
|
| 380 | 381 |
assert.Assert(t, is.ErrorContains(err, "")) |
| ... | ... |
@@ -397,32 +358,22 @@ func TestGetWithRef(t *testing.T) {
|
| 397 | 397 |
|
| 398 | 398 |
var cmpVolume = cmp.AllowUnexported(volumetestutils.FakeVolume{}, volumeWrapper{})
|
| 399 | 399 |
|
| 400 |
-func setupTest(t *testing.T, name string) (*VolumeStore, func(*testing.T)) {
|
|
| 401 |
- t.Helper() |
|
| 402 |
- s, cleanup := newTestStore(t) |
|
| 403 |
- |
|
| 404 |
- volumedrivers.Register(volumetestutils.NewFakeDriver(name), name) |
|
| 405 |
- return s, func(t *testing.T) {
|
|
| 406 |
- cleanup(t) |
|
| 407 |
- volumedrivers.Unregister(name) |
|
| 408 |
- } |
|
| 409 |
-} |
|
| 410 |
- |
|
| 411 |
-func newTestStore(t *testing.T) (*VolumeStore, func(*testing.T)) {
|
|
| 400 |
+func setupTest(t *testing.T) (*VolumeStore, func()) {
|
|
| 412 | 401 |
t.Helper() |
| 413 | 402 |
|
| 414 |
- dir, err := ioutil.TempDir("", "store-root")
|
|
| 403 |
+ dirName := strings.Replace(t.Name(), string(os.PathSeparator), "_", -1) |
|
| 404 |
+ dir, err := ioutil.TempDir("", dirName)
|
|
| 415 | 405 |
assert.NilError(t, err) |
| 416 | 406 |
|
| 417 |
- cleanup := func(t *testing.T) {
|
|
| 407 |
+ cleanup := func() {
|
|
| 418 | 408 |
err := os.RemoveAll(dir) |
| 419 | 409 |
assert.Check(t, err) |
| 420 | 410 |
} |
| 421 | 411 |
|
| 422 |
- s, err := New(dir) |
|
| 412 |
+ s, err := New(dir, volumedrivers.NewStore(nil)) |
|
| 423 | 413 |
assert.Check(t, err) |
| 424 |
- return s, func(t *testing.T) {
|
|
| 414 |
+ return s, func() {
|
|
| 425 | 415 |
s.Shutdown() |
| 426 |
- cleanup(t) |
|
| 416 |
+ cleanup() |
|
| 427 | 417 |
} |
| 428 | 418 |
} |