|
@@ -6,6 +6,7 @@ import (
|
|
"fmt"
|
|
"fmt"
|
|
"sync"
|
|
"sync"
|
|
|
|
|
|
|
|
+ "github.com/docker/docker/pkg/locker"
|
|
"github.com/docker/docker/pkg/plugins"
|
|
"github.com/docker/docker/pkg/plugins"
|
|
"github.com/docker/docker/volume"
|
|
"github.com/docker/docker/volume"
|
|
)
|
|
)
|
|
@@ -13,7 +14,7 @@ import (
|
|
// currently created by hand. generation tool would generate this like:
|
|
// currently created by hand. generation tool would generate this like:
|
|
// $ extpoint-gen Driver > volume/extpoint.go
|
|
// $ extpoint-gen Driver > volume/extpoint.go
|
|
|
|
|
|
-var drivers = &driverExtpoint{extensions: make(map[string]volume.Driver)}
|
|
|
|
|
|
+var drivers = &driverExtpoint{extensions: make(map[string]volume.Driver), driverLock: &locker.Locker{}}
|
|
|
|
|
|
const extName = "VolumeDriver"
|
|
const extName = "VolumeDriver"
|
|
|
|
|
|
@@ -49,16 +50,19 @@ type volumeDriver interface {
|
|
type driverExtpoint struct {
|
|
type driverExtpoint struct {
|
|
extensions map[string]volume.Driver
|
|
extensions map[string]volume.Driver
|
|
sync.Mutex
|
|
sync.Mutex
|
|
|
|
+ driverLock *locker.Locker
|
|
}
|
|
}
|
|
|
|
|
|
// Register associates the given driver to the given name, checking if
|
|
// Register associates the given driver to the given name, checking if
|
|
// the name is already associated
|
|
// the name is already associated
|
|
func Register(extension volume.Driver, name string) bool {
|
|
func Register(extension volume.Driver, name string) bool {
|
|
- drivers.Lock()
|
|
|
|
- defer drivers.Unlock()
|
|
|
|
if name == "" {
|
|
if name == "" {
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ drivers.Lock()
|
|
|
|
+ defer drivers.Unlock()
|
|
|
|
+
|
|
_, exists := drivers.extensions[name]
|
|
_, exists := drivers.extensions[name]
|
|
if exists {
|
|
if exists {
|
|
return false
|
|
return false
|
|
@@ -71,6 +75,7 @@ func Register(extension volume.Driver, name string) bool {
|
|
func Unregister(name string) bool {
|
|
func Unregister(name string) bool {
|
|
drivers.Lock()
|
|
drivers.Lock()
|
|
defer drivers.Unlock()
|
|
defer drivers.Unlock()
|
|
|
|
+
|
|
_, exists := drivers.extensions[name]
|
|
_, exists := drivers.extensions[name]
|
|
if !exists {
|
|
if !exists {
|
|
return false
|
|
return false
|
|
@@ -83,12 +88,16 @@ func Unregister(name string) bool {
|
|
// driver with the given name has not been registered it checks if
|
|
// driver with the given name has not been registered it checks if
|
|
// there is a VolumeDriver plugin available with the given name.
|
|
// there is a VolumeDriver plugin available with the given name.
|
|
func Lookup(name string) (volume.Driver, error) {
|
|
func Lookup(name string) (volume.Driver, error) {
|
|
|
|
+ drivers.driverLock.Lock(name)
|
|
|
|
+ defer drivers.driverLock.Unlock(name)
|
|
|
|
+
|
|
drivers.Lock()
|
|
drivers.Lock()
|
|
ext, ok := drivers.extensions[name]
|
|
ext, ok := drivers.extensions[name]
|
|
drivers.Unlock()
|
|
drivers.Unlock()
|
|
if ok {
|
|
if ok {
|
|
return ext, nil
|
|
return ext, nil
|
|
}
|
|
}
|
|
|
|
+
|
|
pl, err := plugins.Get(name, extName)
|
|
pl, err := plugins.Get(name, extName)
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error looking up volume plugin %s: %v", name, err)
|
|
return nil, fmt.Errorf("Error looking up volume plugin %s: %v", name, err)
|
|
@@ -118,9 +127,11 @@ func GetDriver(name string) (volume.Driver, error) {
|
|
// If no driver is registered, empty string list will be returned.
|
|
// If no driver is registered, empty string list will be returned.
|
|
func GetDriverList() []string {
|
|
func GetDriverList() []string {
|
|
var driverList []string
|
|
var driverList []string
|
|
|
|
+ drivers.Lock()
|
|
for driverName := range drivers.extensions {
|
|
for driverName := range drivers.extensions {
|
|
driverList = append(driverList, driverName)
|
|
driverList = append(driverList, driverName)
|
|
}
|
|
}
|
|
|
|
+ drivers.Unlock()
|
|
return driverList
|
|
return driverList
|
|
}
|
|
}
|
|
|
|
|
|
@@ -144,6 +155,7 @@ func GetAllDrivers() ([]volume.Driver, error) {
|
|
if ok {
|
|
if ok {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+
|
|
ext = NewVolumeDriver(p.Name, p.Client)
|
|
ext = NewVolumeDriver(p.Name, p.Client)
|
|
drivers.extensions[p.Name] = ext
|
|
drivers.extensions[p.Name] = ext
|
|
ds = append(ds, ext)
|
|
ds = append(ds, ext)
|