github.com/mika/distribution@v2.2.2-0.20160108133430-a75790e3d8e0+incompatible/registry/storage/driver/factory/factory.go (about) 1 package factory 2 3 import ( 4 "fmt" 5 6 storagedriver "github.com/docker/distribution/registry/storage/driver" 7 ) 8 9 // driverFactories stores an internal mapping between storage driver names and their respective 10 // factories 11 var driverFactories = make(map[string]StorageDriverFactory) 12 13 // StorageDriverFactory is a factory interface for creating storagedriver.StorageDriver interfaces 14 // Storage drivers should call Register() with a factory to make the driver available by name 15 type StorageDriverFactory interface { 16 // Create returns a new storagedriver.StorageDriver with the given parameters 17 // Parameters will vary by driver and may be ignored 18 // Each parameter key must only consist of lowercase letters and numbers 19 Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) 20 } 21 22 // Register makes a storage driver available by the provided name. 23 // If Register is called twice with the same name or if driver factory is nil, it panics. 24 func Register(name string, factory StorageDriverFactory) { 25 if factory == nil { 26 panic("Must not provide nil StorageDriverFactory") 27 } 28 _, registered := driverFactories[name] 29 if registered { 30 panic(fmt.Sprintf("StorageDriverFactory named %s already registered", name)) 31 } 32 33 driverFactories[name] = factory 34 } 35 36 // Create a new storagedriver.StorageDriver with the given name and 37 // parameters. To use a driver, the StorageDriverFactory must first be 38 // registered with the given name. If no drivers are found, an 39 // InvalidStorageDriverError is returned 40 func Create(name string, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { 41 driverFactory, ok := driverFactories[name] 42 if !ok { 43 return nil, InvalidStorageDriverError{name} 44 } 45 return driverFactory.Create(parameters) 46 } 47 48 // InvalidStorageDriverError records an attempt to construct an unregistered storage driver 49 type InvalidStorageDriverError struct { 50 Name string 51 } 52 53 func (err InvalidStorageDriverError) Error() string { 54 return fmt.Sprintf("StorageDriver not registered: %s", err.Name) 55 }