Browse code

Remove use of global volume driver store

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>

Brian Goff authored on 2018/03/20 06:18:52
Showing 9 changed files
... ...
@@ -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
 }