github.com/lusis/distribution@v2.0.1+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 parameters 37 // To run in-process, the StorageDriverFactory must first be registered with the given name 38 // If no in-process drivers are found with the given name, this attempts to create an IPC driver 39 // If no in-process or external drivers are found, an 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 // NOTE(stevvooe): We are disabling storagedriver ipc for now, as the 46 // server and client need to be updated for the changed API calls and 47 // there were some problems libchan hanging. We'll phase this 48 // functionality back in over the next few weeks. 49 50 // No registered StorageDriverFactory found, try ipc 51 // driverClient, err := ipc.NewDriverClient(name, parameters) 52 // if err != nil { 53 // return nil, InvalidStorageDriverError{name} 54 // } 55 // err = driverClient.Start() 56 // if err != nil { 57 // return nil, err 58 // } 59 // return driverClient, nil 60 } 61 return driverFactory.Create(parameters) 62 } 63 64 // InvalidStorageDriverError records an attempt to construct an unregistered storage driver 65 type InvalidStorageDriverError struct { 66 Name string 67 } 68 69 func (err InvalidStorageDriverError) Error() string { 70 return fmt.Sprintf("StorageDriver not registered: %s", err.Name) 71 }